OpenCL中的常量地址空间限定符是什么?

时间:2014-12-18 13:42:18

标签: c opencl osx-yosemite

我正在尝试运行XCode文档中包含的噪声OpenCL示例项目。

我有一个我不明白的错误:

----------------------------------------------------------------------
Using active OpenGL context...
----------------------------------------------------------------------
Connecting to NVIDIA GeForce 320M...
----------------------------------------------------------------------
Loading kernel source from file 'noise_kernel.cl'...
----------------------------------------------------------------------
Building compute program...
[CL_DEVICE_NOT_AVAILABLE] : OpenCL Error : Error: Build Program driver returned (10007)
Break on OpenCLErrorBreak to debug.
OpenCL Warning : clBuildProgram failed: could not build program for 0x1022600 (GeForce 320M) (err:-2)
Break on OpenCLWarningBreak to debug.
[CL_BUILD_ERROR] : OpenCL Build Error : Compiler build log:
<program source>:58:21: error: global variables must have a constant address space qualifier
static const float4 ZERO_F4 = (float4)(0.0f, 0.0f, 0.0f, 0.0f);

最后一行有一个错误,涉及一个const变量。你怎么解释这个?看起来编译器拒绝ZERO_F4,因为它不是const,但正如你所看到的,它实际上是。

1 个答案:

答案 0 :(得分:8)

  

看起来编译器拒绝ZERO_F4,因为它不是   const,但正如你所看到的,它确实是。

编译器拒绝它,因为ZERO_F4不在__constant地址空间中(这与const无关)。我相信这是XCode样本中的一个错误,因为OpenCL C规范明确指出:

  

第6.5节地址空间限定符:

     

所有程序范围变量必须在__constant地址空间中声明。

因此请更换:

static const float4 ZERO_F4 = (float4){ 0.0f, 0.0f, 0.0f, 0.0f };
static const float4 ONE_F4  = (float4){ 1.0f, 1.0f, 1.0f, 1.0f };

有了这个:

__constant float4 ZERO_F4 = (float4){ 0.0f, 0.0f, 0.0f, 0.0f };
__constant float4 ONE_F4  = (float4){ 1.0f, 1.0f, 1.0f, 1.0f };

它应该有用。