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

    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 eine Diskrepanz zwischen der englischsprachigen Version dieser Seite und der Übersetzung auftreten, gilt die englische Version. Englische Version dieser Seite anzeigen.