2

以下代码使用 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;

根据规范,其中哪一个是正确的?(并且:我应该在某处报告不合格的编译器吗?)

4

1 回答 1

1

OpenCL 规范在转换指针方面提供了几乎无限的灵活性。基本上,规则是你的程序员知道你在为你的特定硬件做什么。它没有解决跨内存空间转换的具体问题,因此这可能应该被视为未定义的行为。供应商之间的差异是可以预料的。

随着 CL 规范随着时间的推移而成熟,我猜你可以期望像上面这样的问题会得到明确的解决。

于 2012-02-02T18:53:39.347 回答