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