2013-08-13 22 views
7

Clang'ın OpenCL stil vektörleri için dil uzantılarına alışmak için bir test programı yazıyorum. Kodu işe yarayabilirim ama bunun bir yönünü ele alarak sorunlarım var. Bir skaler diziden güzelce yüklenen bir vektöre nasıl clang alacağımı anlayamıyorum. Şu anda Vektörleri bellekten daha iyi yükleme. (clang)

ben böyle bir şey yapmak zorunda:

byte16 va = (byte16){ argv[1][start], argv[1][start + 1], argv[1][start + 2], 
         argv[1][start + 3], argv[1][start + 4], argv[1][start + 5], 
         argv[1][start + 6], argv[1][start + 7], argv[1][start + 8], 
         argv[1][start + 9], argv[1][start + 10], argv[1][start + 11], 
         argv[1][start + 12], argv[1][start + 13], argv[1][start + 14], 
         argv[1][start + 15]}; 

isterim ideal böyle bir şey gibi:

kolayca ARM veya x86 uygun intrinsics kullanarak kayıt olabilirsiniz
byte16 va = *(byte16 *)(&(argv[1][start])); 

. Ancak bu kod, program derlense de çökmesine neden olur.

+0

Memcpy (& va, & argv [1] [başlat], sizeof (va)) 'çalışmıyor mu? – jxh

cevap

5

K x86'da meydana gelebilecek çökme nedenlerinden biri hizalama sorunlarından kaynaklanmaktadır. Sorunu çoğaltmak için sistemimde clang yok, ancak bunu GCC örneğinde gösterebilirim.

gibi bir şey yaparsanız: Eğer bir vektör özellikli x86 üzerinde derlemek Şimdi eğer

/* Define a vector type of 16 characters. */ 
typedef char __attribute__ ((vector_size (16))) byte16; 

/* Global pointer. */ 
char * foo; 

byte16 test() 
{ 
    return *(byte16 *)&foo[1]; 
} 

:

$ gcc -O3 -march=native -mtune=native a.c 

Alacaksın test için aşağıdaki montaj olsun:

test: 
    movq foo(%rip), %rax 
    vmovdqa 1(%rax), %xmm0 
    ret 

Lütfen dikkat, hareket hizalanmış, ki bu elbette yanlış. Şimdi, ana içine bu fonksiyonu satır içi olur ve aşağıdakilere benzer bir şey olacak olursa: Sen iyi olacak

int main() 
{ 
    foo = __builtin_malloc (22); 
    byte16 x = *(byte16 *)&foo[1]; 
    return x[0]; 
} 

ve unaligned talimat alacak. Bu, derleyicide çok iyi bir düzeltmeye sahip değildir, çünkü yeni veri yapılarının eklenmesiyle birlikte işlemsel optimizasyon gerektirecektir.

Sorunun kaynağı, derleyicinin vektör türleri hizalıdır, bu yüzden bir dizi hizalanmış vektör türünü dereference yaparken, hizalı bir hareket kullanabilirsiniz. GCC sorun için bir çözüm olarak, bir gibi bir hizalanmamış vektör türünün tanımlayabiliriz:

typedef char __attribute__ ((vector_size (16),aligned (1))) unaligned_byte16; 

ve KQUEUE hizalanmamış bellek için kullanın.

Kurulumunuzda tam olarak bu soruna isabet ettiğinden emin değilim, ancak derlemeden derleme çıktısını denetleyerek kontrol etmenizi tavsiye ederim.

+0

Eh, bu durumda ben Böyle bir şey yapmak için deneyebilirsiniz ... başarısız için bir neden görmüyorum: 'struct b16 { karakter x [16]; }; struct b16 x = * (struct b16 *) & argv [1] [0]; ' –

+1

Clang kullanarak benzer sorunları gördüm ve montajı incelerken (ARM assembly," ': 64' veya" ': 128 '"adres alanında) Yükün ve yükleme talimatlarının hizalanmış sürümlerini kullandığını görebiliyordum. Bu çözüm benim için çalışıyor. – sh1