Bla*_*iwi 7 c vector clang opencl
我正在编写一个测试程序来习惯Clang对OpenCL样式向量的语言扩展.我可以让代码工作,但我遇到了问题的一个方面.我似乎无法弄清楚如何让clang恰好从标量数组中加载一个向量.
目前我必须做一些事情:
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]};
Run Code Online (Sandbox Code Playgroud)
我理想的喜欢这样的事情:
byte16 va = *(byte16 *)(&(argv[1][start]));
Run Code Online (Sandbox Code Playgroud)
我可以轻松地使用适用于ARM或x86的内在函数.但是该代码会导致程序崩溃,尽管它会编译.
小智 5
在x86上发生崩溃的原因之一是由于对齐问题.我没有在我的系统上使用clang来重现问题,但我可以在GCC的例子中证明这一点.
如果您执行以下操作:
/* Define a vector type of 16 characters. */
typedef char __attribute__ ((vector_size (16))) byte16;
/* Global pointer. */
char * foo;
byte16 test ()
{
return *(byte16 *)&foo[1];
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你在支持向量的x86上编译它:
$ gcc -O3 -march=native -mtune=native a.c
Run Code Online (Sandbox Code Playgroud)
您将获得以下程序集进行测试:
test:
movq foo(%rip), %rax
vmovdqa 1(%rax), %xmm0
ret
Run Code Online (Sandbox Code Playgroud)
请注意,此举是一致的,这当然是错误的.现在,如果你将这个函数内联到main中,你会得到类似的东西:
int main ()
{
foo = __builtin_malloc (22);
byte16 x = *(byte16 *)&foo[1];
return x[0];
}
Run Code Online (Sandbox Code Playgroud)
你会没事的,你会得到不对齐的指示.这是一种错误,它没有在编译一个很好的修复,因为这需要过程间的优化与增加新的数据结构等的
问题的起源是编译器假定矢量类型一致,所以当你提领对准矢量类型的数组,你可以使用一个一致的举动.作为GCC中问题的解决方法,可以定义一个未对齐的向量类型,如:
typedef char __attribute__ ((vector_size (16),aligned (1))) unaligned_byte16;
Run Code Online (Sandbox Code Playgroud)
并使用它来取消引用未对齐的内存.
我不确定您是否在设置中遇到了这个问题,但我建议通过检查编译器的汇编输出来检查这个问题.