【问题标题】:Syntax differences between OpenCL compilers [closed]OpenCL 编译器之间的语法差异 [关闭]
【发布时间】: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 的变体被所有人接受。
  • 抱歉,我们真的不再鼓励列出问题了。

标签: opencl intel nvidia amd-processor


【解决方案1】:

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

我猜,随着 CL 规范随着时间的推移逐渐成熟,您可以期待明确解决上述问题。

【讨论】:

  • 强制转换(当然)并不意味着跨越内存空间,英特尔/nVidia 编译器正确解释它(即目标指针空间是被强制转换的指针之一)。好吧,我将开始写下这些问题。是否有可能将问题转换为 wiki 类型的问题,以便在此处收集此类问题?
  • 是的 - 我认为您可以将其作为社区 wiki 问题,因为您是 OP。
猜你喜欢
  • 2020-10-16
  • 1970-01-01
  • 2021-01-15
  • 2014-02-12
  • 2015-04-02
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
相关资源
最近更新 更多