OpenCL 编译器之间的语法差异 [关闭]
Posted
技术标签:
【中文标题】OpenCL 编译器之间的语法差异 [关闭]【英文标题】:Syntax differences between OpenCL compilers [closed] 【发布时间】:2012-02-25 02:19:33 【问题描述】:以下代码使用 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;
根据规范,哪些是正确的? (并且:我应该在某处报告不合格的编译器吗?)
【问题讨论】:
可能是 AMD 编译器,因为 nVidia 编译器通常更宽松。 Intel/nVidia 编译器是否接受具有全局资格的代码?global
的变体被所有人接受。
抱歉,我们真的不再鼓励列出问题了。
【参考方案1】:
OpenCL 规范在转换指针方面提供了几乎无限的灵活性。基本上,规则是你的程序员知道你在为你的特定硬件做什么。它没有解决跨内存空间转换的具体问题,因此这可能应该被视为未定义的行为。供应商之间的差异是意料之中的。
我猜,随着 CL 规范随着时间的推移逐渐成熟,您可以期待明确解决上述问题。
【讨论】:
强制转换(当然)并不意味着跨越内存空间,英特尔/nVidia 编译器正确解释它(即目标指针空间是被强制转换的指针之一)。好吧,我将开始写下这些问题。是否有可能将问题转换为 wiki 类型的问题,以便在此处收集此类问题? 是的 - 我认为您可以将其作为社区 wiki 问题,因为您是 OP。以上是关于OpenCL 编译器之间的语法差异 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Intel 编译器的 Windows 和 Linux 之间的性能差异:查看程序集