cudaArray vs. Gerätezeiger

8

Ich bin verwirrt über den Unterschied zwischen der beabsichtigten Verwendung von Gerätezeigern und cudaArray -Strukturen. Könnte jemand bitte erklären, warum ich einen gegen den anderen benutzen würde? Mein grundlegendes Problem ist, dass ich, nachdem ich die Dokumentation gelesen und das Buch "CUDA by Example" gelesen habe, die Absicht der API-Designer nicht verstehe.

Nach dem, was ich gesehen habe, scheint cudaArray für Texturen verwendet zu werden und Zeiger sollten für den direkten Zugriff auf den Speicher verwendet werden. Es scheint auch, dass 3D-Texturen nur mit cudaArray erstellt werden können. Sollen alle Texturen mit cudaArray zugewiesen werden? Zahlreiche Beispiele scheinen nicht zu sein. Warum gibt es auch eine Funktion cudaMallocArray und cudaMallocArray3D , aber keine Entsprechung für cudaMallocArray2D ? Umgekehrt gibt es eine cudaBindTexture und cudaBindTexture2D , aber keine cudaBindTexture3D ?

    
Joe 22.01.2013, 01:14
quelle

2 Antworten

16

cudaArray ist ein undurchsichtiger Speicherblock, der für die Bindung an Texturen optimiert ist. Texturen können Speicher verwenden, der in einer raumfüllenden Kurve gespeichert ist. Dies ermöglicht eine bessere Textur-Cache-Trefferrate aufgrund besserer 2D-Darstellung räumliche Lokalität. Kopieren von Daten in ein cudaArray wird dazu führen, dass es zu einer solchen Kurve formatiert wird.

Somit ist das Speichern von Daten in cudaArray eine Optimierungstechnik, die bessere Trefferraten im Textur-Cache erzielen kann. Auf frühen CUDA-Architekturen kann auch auf den cudaArray nicht von einem Kernel zugegriffen werden. Architekturen der Rechenfähigkeit & gt; = 2.0 können jedoch über CUDA-Oberflächen auf das Array zugreifen.

Die Bestimmung, ob Sie einen cudaArray oder einen regulären Puffer im globalen Speicher verwenden sollten, hängt von der beabsichtigten Verwendung und den Zugriffsmustern für den Speicher ab. Es wird projektspezifisch sein.

cudaMallocArray() weist tatsächlich ein 2D-Array zu, daher denke ich, dass das Problem nur eine inkonsistente Benennung ist. Vielleicht wäre es logischer gewesen, es cudaMallocArray2D() zu nennen.

Ich habe keine 3D-Texturen verwendet. Hoffentlich wird jemand antworten und uns wissen lassen, warum cudaBindTexture3D() nicht nötig ist.

    
Roger Dahl 22.01.2013, 03:27
quelle
1

Sie können cudaBindTextureToArray verwenden, es funktioniert sowohl für 2D als auch für 3D.

    
fliman 18.05.2016 10:50
quelle

Tags und Links