【问题标题】:Declaring array inside OpenCL kernel not working. (clBuildProgram(-11))在 OpenCL 内核中声明数组不起作用。 (clBuildProgram(-11))
【发布时间】:2017-05-04 08:23:39
【问题描述】:

我有一个可以在我的 MAC 上完美运行的 OpenCL 代码。但是当我将它移植到 EC2 g2.2xlarge 实例时,它给出了

Exception
ERROR: clBuildProgram(-11)

现在经过大量调试,我发现内核有语法错误。进一步缩小范围后,我发现错误在以下行:

int size_a = POP_SIZE / 4 / numberOfDevices;
int aliveIndividualsIndex[size_a];

如果我尝试:

int aliveIndividualsIndex[40];

那么它也适用于 EC2 实例。

为什么 MAC 和 EC2 实例处理相同内核代码的方式会有所不同?为什么其中一个可以识别代码,而另一个为什么会出现语法错误?我如何解决它?因为我需要使用 [size_a]。

他们都使用 OpenCL 1.2。如果您需要有关 gcc 或 g++ 或其他任何版本的更多信息,请询问,我会提供。

【问题讨论】:

  • 不可能在 CL 中创建动态运行时数组,应该在编译时知道内存占用,以便为内核正确分配内存。如果代码在某些平台上没有失败,似乎它正在使用许可编译器,因为它将在 CPU 上运行。

标签: c++ amazon-ec2 kernel opencl build-error


【解决方案1】:

在编译时应该知道 OpenCL 内核中的数组大小。因此,要解决您的问题,请使用 "-D name=definition" 选项将 numberOfDevices 传递给 clBuildProgram() 函数的构建选项,从而使 numberOfDevices 成为编译时间常数,例如:

char * buildOptions;     // Should be allocated with enough space
unsigned int numDevices; // Initialize with number of devices
...
// Use snprint instead if available
sprintf(buildOption, "-D NUMBER_OF_DEVICES=%u", numDevices);
...
// Build program with specified compiler options
clBuildProgram(prog, numDevices, deviceLst, buildOptions, NULL, NULL);

可能还需要在内核源代码中将size_a 设为常量,例如:

#define SIZE_A POP_SIZE / 4 / NUMBER_OF_DEVICES;

您现在可以在内核中声明数组:

aliveIndividualsIndex[SIZE_A];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2019-07-26
    • 2019-08-26
    • 1970-01-01
    • 2023-03-28
    • 2016-08-17
    • 2018-10-14
    相关资源
    最近更新 更多