2016-12-19 2 views
0

Ich habe einen OpenCL-Code, der perfekt auf meinem MAC funktioniert. Aber wenn ich Portierung auf eine EC2 g2.2xlarge Instanz, der gibtArray im OpenCL-Kernel deklarieren funktioniert nicht. (clBuildProgram (-11))

Exception 
ERROR: clBuildProgram(-11) 

nun nach vielen Debugging, fand ich heraus, dass der Kernel einen Syntaxfehler hat. Nachdem es Verengung weiter nach unten, fand ich, dass der Fehler in der folgenden Zeile ist:

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

Wenn ich versuche:

int aliveIndividualsIndex[40]; 

dann funktioniert es auf der EC2-Instanz zu.

Warum unterscheiden sich MAC und EC2-Instanz vom selben Kernel-Code? Warum erkennt einer von ihnen den Code und warum gibt der andere einen Syntaxfehler? Wie repariere ich es? Weil ich [size_a] benutzen muss.

Beide verwenden OpenCL 1.2. Wenn Sie weitere Informationen über die Versionen von gcc oder g ++ oder etwas anderes benötigen, fragen Sie bitte, ich werde sie zur Verfügung stellen.

+2

Es ist Es ist nicht möglich, dynamische Laufzeitarrays in CL zu erstellen. Der Speicherbedarf sollte zur Kompilierungszeit bekannt sein, um eine ordnungsgemäße Speicherzuweisung für den Kernel zu ermöglichen. Wenn der Code unter einigen Plattformen nicht fehlschlägt, scheint er einen permissiven Compiler zu verwenden, weil er auf der CPU läuft. – DarkZeros

Antwort

1

Die Größe von Arrays in OpenCL-Kernels sollte zur Kompilierzeit bekannt sein. Als solches Ihr Problem zu lösen, stellen numberOfDevices eine Kompilierung Konstante, indem diese auf die Build-Optionen der clBuildProgram() Funktion mit der "-D name=definition" Option vorbei, zum Beispiel:

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); 

Es ist auch eine Konstante machen kann notwendig sein, size_a in Ihre Kernel-Quellcode, zB:

#define SIZE_A POP_SIZE/4/NUMBER_OF_DEVICES; 

Sie jetzt das Array innerhalb des Kernels erklären kann:

aliveIndividualsIndex[SIZE_A]; 
Verwandte Themen