2014-12-18 5 views
4

Я пытаюсь запустить шум проекта OpenCL, включенного в документацию 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); 

Там есть ошибка в этой последней строке, которая включает в себя константную переменную. Как вы это понимаете? Похоже, что компилятор отклоняет ZERO_F4, потому что он не const, но, как вы можете видеть, это на самом деле.

ответ

7

Похоже, что компилятор отвергает 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 }; 

И он должен работать.

+0

Были ли внесены некоторые изменения в компиляторы, которые нарушают предыдущий (предположительно рабочий?) Код? Я сейчас исправляю другой пример кода с той же проблемой (Grass ..) – alecail

+0

Я полагаю, что это ошибка, которая, возможно, была исправлена, поскольку образцы были написаны, да. Сама спецификация всегда указывала, что переменные глобальной области должны быть '__constant'. –