Benchmark der CL_MEM_USE_HOST_PTR und CL_MEM_COPY_HOST_PTR in OpenCL
Habe ich einen Vektor auf den host und ich möchten, halbieren Sie es und senden Sie an das Gerät. Dabei ein benchmark zeigt, dass CL_MEM_ALLOC_HOST_PTR
ist schneller als CL_MEM_USE_HOST_PTR
und viel schneller als CL_MEM_COPY_HOST_PTR
. Auch memory-Analyse-Gerät zeigt keinen Unterschied in der grösse der Puffer erstellt am Gerät. Diese unterscheidet sich von der Dokumentation der genannten Flagge auf Khronos - clCreateBuffer. Weiß jemand was Los ist???
- Hallo, sind Sie mit einer gpu, cpu oder apu-Gerät zum ausführen der kernel? auch, welcher Anbieter? verfügt Ihr system über mehrere Prozessoren (NUMA-Architektur?)
- COPY_HOST_PTR ist eine implizite Kopie, aber ALLOC_HOST_PTR erfordert eine explizite Kopie. Wenn Sie Ihre benchmark für ALLOC_HOST_PTR, sind Sie sicher, dass Sie einschließlich der Sie den zusätzlichen Schritt zum kopieren der Puffer vom host zum Gerät? Wenn nicht, das könnte erklären, warum es so viel schneller.
- Ich bin mit NVIDIA-gpu als device.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst aus und wenn ich Sie richtig verstehe, clCreateSubBuffer ist wahrscheinlich nicht das, was Sie wollen, wie es erzeugt eine sub-Puffer aus einer vorhandenen OpenCL - Puffer-Objekt. Die Dokumentation, die Sie verknüpften sagt uns auch, dass:
Sie sagten, Sie haben einen Vektor auf den host und senden möchten, die Hälfte an das Gerät. Für diese, würde ich mit einem regulären Puffer, der die Hälfte des Vektors size (in bytes) auf das Gerät.
Dann, mit einem regulären Puffer, die Leistung, die Sie sehen, erwartet wird.
CL_MEM_ALLOC_HOST_PTR
nur reserviert Speicher auf dem host, welcher nicht entstehen-transfer an alle: es ist wie ein malloc und füllt den Speicher.CL_MEM_COPY_HOST_PTR
wird keinen Puffer zuweisen auf dem Gerät, wahrscheinlich ist der RAM auf GPUs, und dann kopieren Sie Ihre gesamte host-Puffer über in den Speicher des Geräts.CL_MEM_USE_HOST_PTR
wahrscheinlich weist so genannte Seite gesperrt oder angeheftet Speicher. Diese Art von Speicher ist der Schnellste für host->GPU-Speicher übertragen, und dies ist der empfohlene Weg, um die Kopie.Lesen, wie man richtig mit angehefteten Speicher auf NVidia-Geräte finden Sie im Kapitel 3.1.1 von NVidia-OpenCL-best practices guide. Beachten Sie, dass wenn Sie zu viel gepinnt Speicher kann die Leistung unterschritten wird, einen host-Speicher kopiert.
Den Grund warum pinned memory ist schneller kopiert als Speicher des Gerätes ist gut erklärt in diese Frage ALSO aswell als dieser forum thread es Punkte zu.
CL_MEM_ALLOC_HOST_PTR -- This flag specifies that the application wants the OpenCL implementation to allocate memory from host accessible memory.
Die Antwort von Pompei 2 ist falsch. Die Spezifikation macht keine Garantie, wo der Arbeitsspeicher ist aber nur, wie es ist, aufgeteilt. CL_MEM_ALLOC_HOST_PTR macht die clCreateBuffer zuordnen der host-Seite Speicher für Sie. Sie können dann diese Karte in einem host-pointer mit clEnqueueMapBuffer. CL_MEM_USE_HOST_PTR verursachen wird, die Laufzeit zu schöpfen die Daten, die Sie geben es in ein OpenCL-buffer.
Pinned Speicher wird erreicht durch den Einsatz von CL_MEM_ALLOC_HOST_PTR: die Laufzeit ist in der Lage, um den Speicher, wie es ist.
Alle diese Leistung ist von der Implementierung abhängig. Lesen Abschnitt 3.1.1 genauer wird sich zeigen, dass in einem der Gespräche (ohne CL_MEM flag) NVIDIA ist in der Lage, preallocate ein Gerät Stoßkante, während die andere ruft nur immer die angeheftete gemappten Daten in eine host-Zeiger bereit für das schreiben auf das Gerät.
Pompei2, Sie sagt CL_MEM_ALLOC_HOST_PTR und CL_MEM_USE_HOST_PTR reserviert Speicher auf dem Gerät während der OpenCL-1.1-Spezifikation besagt, dass mit CL_MEM_ALLOC_HOST_PTR oder CL_MEM_USE_HOST_PTR angegebenen Speicher zugeteilt werden (im ersten Fall) auf oder ab (in der zweiten) host-Speicher? Im newble in OpenCL, sondern wollen wissen, wo die Wahrheit ist?)