2016-12-19 119 views
0

我有一個在我的MAC上完美運行的OpenCL代碼。但是,當我把它移植到一個EC2實例g2.2xlarge,它有很多的調試後給人的在OpenCL內核中聲明數組不工作。 (clBuildProgram(-11))

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 ++或其他任何版本的更多信息,請問,我會提供。

+2

它是:

#define SIZE_A POP_SIZE/4/NUMBER_OF_DEVICES; 

現在,您可以在內核中聲明數組不可能在CL中創建動態運行時數組,應該在編譯時知道內存佔用情況,以便爲內核分配適當的內存。如果代碼在一些平臺下沒有失敗,就好像它使用寬容的編譯器,因爲它將在CPU上運行。 – DarkZeros

回答

1

OpenCL內核中的數組大小在編譯時應該已知。因此,要解決你的問題,請numberOfDevices編譯時間常數通過它傳遞給clBuildProgram()功能的編譯選項與"-D name=definition"選項,如:

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在恆定你的內核源代碼,例如:

aliveIndividualsIndex[SIZE_A];