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
?
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.