2012-11-30 75 views
0

是否存在使用cudamemcopy(...,devicetohost)傳輸數據的最佳數據結構?我發現數組的工作速度比結構快很多。有沒有這個原因,並有一個更優化的方法?cudamemcopy的最佳數據結構

編輯 -

看來我的時間沒有被正確地記錄下來。結構和數組的時間應該大致相等。我會嘗試使用cuda事件API來記錄時間。

+1

只要數據是連續的並且可以使用單個指針進行傳輸,底層數據排列的內容就沒有區別。如果數據不是連續而是有序的,cudaMemcpy2D可能會有所幫助。單個cudaMemcpy調用將所有內容都解析爲一個指針以及該指針之後要傳輸的字節序列。因此,例如,只要字節總數相同,int和array結構之間應該沒有區別。現在,如果結構數組在結構中具有填充或其他未使用的空間,那麼效率會較低 –

+0

數據在結構中是連續的。該結構有四個整數和一個浮點數。我將這個結構體的數組分配到GPU上。我也有一個5倍的陣列。我也將它分配到GPU上。當我將內存從gpu複製到cpu上時,比結構體中字節數多的數組傳遞得比結構體更快。所以我的印象是,陣列可以更快地從設備的內存複製到主機。您是否有任何問題可以幫助驗證此問題? – napl

+0

您的複印操作計時方法可能有問題。在內核調用後定時操作(例如,從gpu到cpu的數據的memcopy)沒有考慮到內核調用立即返回到主機的控制權,但是複製操作直到內核被啓動纔開始完成。請發佈(編輯您的問題)一個簡單,完整,可編輯的例子,演示時間差異。你使用cuda事件api來做時機嗎? –

回答

1

結構 - 的陣列在內核當從/向全局存儲器將數據加載到共享/寄存器時通常比的Structs陣列-的-更好。但是,當將數據從/從主機複製到/從設備(在一個大的memcopy事務中)時,我認爲SoA和AoS之間沒有任何性能差異。畢竟,數據量是相同的。

唯一的例外是,如果一些額外的填充字節是在該結構的端部加入,以實現AOS的元件的某些存儲器對準。

我覺得可能是爲什麼你正在經歷的性能差異某些其他原因。

0

就個人而言,我懷疑性能差異是由於副本。

也許你的數據結構的方式,還有空缺口對齊。

第二個原因可能是由於內存頁面對齊處理。當你使用malloc獲取內存時,它可以被分割成類似於Windows文件系統的佈局。碎片的級別可以非常高,但是說如果你對malloc進行一次調用就可以獲得持續對齊的內存,而如果你做了很多調用,就可以得到有缺口的內存。

CUDA的內存拷貝已通過檢查頁面逐一手動將它們轉移到GPU來處理這個額外的開銷。


真正解決您的問題將使用cudaMallocHost分配內存的CPU不必擔心。嘗試這樣做,看看它是否修復你的問題。

相關問題