2012-07-02 13 views
7

Ich bin Anfänger in der parallelen Programmierung. Ich habe eine Frage, die vielleicht albern erscheint, aber ich habe keine definitive Antwort bekommen, als ich sie gegoogelt habe.GPU liest von CPU oder CPU schreibt auf die GPU?

Beim GPU-Computing gibt es ein Gerät, d. H. Die GPU und der Host, also die CPU. Ich schrieb ein einfaches Hallo-Welt-Programm, das etwas Speicher auf der GPU zuweist, zwei Parameter (sagen src [] und dest []) an den Kernel übergeben, src String dh Hello World to dest String kopieren und die Zielzeichenfolge von gpu zu erhalten der Gastgeber.

Wird die Zeichenfolge "src" von der GPU gelesen oder schreibt die CPU in die GPU? Auch wenn wir die Zeichenfolge von der GPU zurückbekommen, schreibt die GPU in die CPU oder liest die CPU von der GPU?

In die Daten zurück übertragen und her kann es vier Möglichkeiten 1. CPU sein GPU - CPU schreibt GPU - GPU liest Form CPU 2. GPU CPU - GPU schreibt an die CPU - CPU liest von GPU

Kann jemand bitte erklären, welche von diesen möglich sind und welche nicht?

Antwort

7

In früheren Versionen von CUDA und entsprechenden Hardwaremodellen war die GPU strenger ein Coprozessor im Besitz der CPU; Die CPU schrieb Informationen an die GPU und las die Informationen zurück, wenn die GPU bereit war. Auf der unteren Ebene bedeutete dies, dass wirklich alle vier Dinge passierten: Die CPU schrieb Daten in PCIe, die GPU las Daten von PCIe, die GPU schrieb dann Daten in PCIe und die CPU lies das Ergebnis zurück. Aber Transaktionen wurden von der CPU initiiert.

In jüngerer Zeit (CUDA 3? 4? Vielleicht sogar in 2?), Einige dieser Details sind aus der Anwendungsebene verborgen, so dass GPU-Code kann dazu führen, dass Übertragungen auf die gleiche Weise initiiert werden die CPU kann. Berücksichtigen Sie die einheitliche virtuelle Adressierung, bei der Programmierer auf einen einheitlichen virtuellen Adressraum für CPU- und GPU-Speicher zugreifen können. Wenn die GPU Speicher im CPU-Bereich anfordert, muss dieser eine Übertragung von der CPU initiieren, wobei er im Wesentlichen von der CPU liest. Die Möglichkeit, Daten von der CPU-Seite auf die GPU zu übertragen, wird ebenfalls beibehalten. Grundsätzlich sind jetzt alle Wege möglich, auf der obersten Ebene (bei niedrigen Stufen ist es im Großen und Ganzen die gleiche Art von Protokoll wie immer: sowohl Lesen von und Schreiben in den PCIe-Bus, aber jetzt können GPUs auch Transaktionen initiieren).

+1

Welche, über verschiedene synchronisierte Controller kocht auf DMA (http://en.wikipedia.org/wiki/Direct_memory_access). – Ani

+0

Vielen Dank. Es ist gut zu wissen, dass GPU auch die Transaktionen initiieren kann. Gibt es also einen Weg zu wissen, wer die Transaktionen mit einer der Bibliotheksroutinen in Opencl initiiert hat? oder die Routinen, mit denen ich entweder die CPU oder die GPU zwingen kann, die Transaktion durchzuführen. – Nike

+0

Ich kenne OpenCL nicht so gut wie ich sollte; Davon abgesehen würde ich mich wundern, wenn CUDA Ihnen keine Möglichkeit geben würde, zu überprüfen, wo eine Variable im einheitlichen virtuellen Adressraum lebte. Diese Art von Information kann auch außerhalb des Anwendungsfalles von explizit verwalteten Übertragungen nützlich sein (welche neuere Versionen noch unterstützen sollten). – Patrick87

1

In OpenCL kontrolliert der Host (CPU) ausschließlich alle Datenübertragungen zwischen GPU und GPU. Der Host überträgt Daten mithilfe von Puffern an die GPU. Der Host überträgt (liest) mit Puffern von der GPU zurück. Bei einigen Systemen und Geräten werden bei der Übertragung keine Bytes physisch kopiert, da Host und GPU denselben physischen Speicher verwenden. Dies wird als Nullkopie bezeichnet.

2

Eigentlich keiner von diesen. Ihr CPU-Code initiiert die Kopie der Daten, aber während die Daten vom Speichercontroller in den Speicher der GPU über was auch immer Bus Sie auf Ihrem System übertragen haben. In der Zwischenzeit kann die CPU andere Daten verarbeiten. Wenn die GPU die von Ihnen gestarteten Kernel ausgeführt hat, löst der CPU-Code die Kopie der Daten aus, während GPU und CPU inzwischen andere Daten verarbeiten oder anderen Code ausführen können.

Die Kopien werden als asynchron oder nicht blockierend bezeichnet. Sie können optional blockierende Kopien erstellen, bei denen die CPU darauf wartet, dass die Kopie abgeschlossen wird.

Wenn Sie asynchrone Aufgaben starten, registrieren Sie normalerweise ein "Ereignis", bei dem es sich um eine Art Markierung handelt, die Sie später überprüfen können, um festzustellen, ob die Aufgabe abgeschlossen ist oder nicht.

1

Ich habe gerade in diesem Forum http://devgurus.amd.com/thread/129897, die CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR in clCreateBuffer weist Speicher auf dem Host zu und wird nicht auf das Gerät kopiert.

Es kann Probleme mit der Leistung geben, aber das ist, was ich suche. Ihre Kommentare bitte ..