以下代码与intel / nVidia OpenCL编译器(均基于LLVM)编译:
struct Foo{ float2 bar; };
void baz(){
global struct Foo* foo;
((float*)(&foo->bar))[1]=1;
}
AMD编译器说invalid type conversion
,并且仅接受global
限定的代码:
((global float*))(&foo->bar))[1]=1;
根据规范,哪一个是正确的? (并且:我应该在某处报告不合格的编译器吗?)
答案 0 :(得分:1)
OpenCL规范允许在转换指针时具有几乎无限的灵活性。基本上,规则是程序员知道您为特定硬件做了什么。它没有解决跨内存空间进行转换的特定问题,因此这应该被视为未定义的行为。供应商之间的差异是可以预期的。
随着CL规范的逐渐成熟,你可以预期上述问题会被明确解决,我猜。