声明OpenCL内核中的数组不起作用。 (clBuildProgram(-11))

时间:2016-12-19 09:59:38

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

我有一个在我的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 ++或其他任何版本的更多信息,请询问,我会提供。

1 个答案:

答案 0 :(得分:1)

OpenCL内核中的数组大小应该在编译时知道。因此,要解决您的问题,请将numberOfDevices作为"-D name=definition"函数的clBuildProgram()函数的构建选项传递给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];

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

SELECT eq FROM Equipements eq
LEFT JOIN eq.checks check
LEFT JOIN check.responses resp 
LEFT JOIN resp.missions mission WITH mission.id = :idmiss
WHERE eq.id = :idEqp
ORDER BY check.id