Wenn ein langer, langer Typ ohne Vorzeichen in der OpenCL-Hostcode-Funktion™ clSetKernelArg() verwendet wird, wie unten gezeigt
nichtsignierte lange Daten = 1;
clSetKernelArg (Kernel, 0, sizeof (nicht vorzeichenlang), (void*)&data);
dann kann ein Fehler wie der folgende auftreten, wenn der Host-Code unter Verwendung der Intel® SDK für OpenCL™ kompiliert wird.
Kontext-Callback: Argumentgröße ist die falsche Größe
FEHLER: CL_INVALID_ARG_SIZE
Ort: host/src/main.cpp:91
Kernel arg 0 konnte nicht festgelegt werden
Dieser Fehler ist in diesem Fall nicht in Versionen vor 18.1 der Intel® SDK für OpenCL™ aufgetreten. Der Fehler wird jetzt angezeigt, weil die Größe eines nichtsignierten langen Typs im zugrunde liegenden Kernel-Compiler von 8 auf 16 geändert wurde, aber der Host-Aufruf sizeof (unsigned long long) immer noch 8 zurückgibt.
Typen, die lange zeitsigniert /nicht vorsigniert sind, haben keine definierte Größe in C99 oder OpenCL™ Version 1.X, daher ist es dem Host und dem Gerät gestattet, unterschiedliche Größen für den Typ zu verwenden. Als solches sollte man es nie als den Typ eines Argument für den Kernel verwenden. Es ist nicht garantiert, dass es zwischen Compilern, Geräten oder sogar Compiler-Versionen portierbar ist. In der OpenCL™ 2.0-Spezifikation wird ein langer Typ als 128 Bits definiert, aber die C99-Schnittstelle bleibt erhalten. Die OpenCL-Spezifikation™ fügt keinen cl_* Kompatibilitätstyp hinzu, daher ist es nicht möglich, einen langen Typ sicher als Argument zu verwenden.
Die empfohlene Problemumgehung für dieses Problem besteht darin, einen OpenCL-definierten™ Typ wie cl_ulong/unsigned lange in Ihrem Host-/Gerätecode zu verwenden.
Alternativ können Sie den Aufruf sizeof() nicht verwenden und die Größe des langen Arguments wie unten gezeigt auf 16 Byte erzwingen.
clSetKernelArg (Kernel, 0, 16, (void*)&data);