Artikel-ID: 000086479 Inhaltstyp: Fehlerbehebung Letzte Überprüfung: 13.12.2018

Warum erhalte ich den Fehler "CL_INVALID_ARG_SIZE", wenn ich den Typ lange als OpenCL-Kernel-Argument™ im Hostcode verwende?

Umgebung

    Intel® Quartus® Prime Standard Edition
    Intel® Quartus® Prime Pro Edition
    Intel® FPGA SDK for OpenCL™ Pro Edition
BUILT IN - ARTICLE INTRO SECOND COMPONENT
Beschreibung

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.

Lösung

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

Zugehörige Produkte

Dieser Artikel bezieht sich auf 1 Produkte

Intel® programmierbare Geräte

1

Der Inhalt dieser Seite ist eine Kombination aus menschlicher und computerbasierter Übersetzung des originalen, englischsprachigen Inhalts. Dieser Inhalt wird zum besseren Verständnis und nur zur allgemeinen Information bereitgestellt und sollte nicht als vollständig oder fehlerfrei betrachtet werden. Sollte es Widersprüche zwischen der englischsprachigen Version dieser Seite und der Übersetzung geben, gilt die englische Version. Englische Version dieser Seite anzeigen.