我花了2天試圖找出這一點,並獲得無處不在。說我有一個結構,看起來像這樣:如何將C++數組結構傳遞給CUDA設備?
struct Thing {
bool is_solid;
double matrix[9];
}
我想創建一個結構數組稱爲things
,然後處理GPU上的數組。喜歡的東西:
Thing *things;
int num_of_things = 100;
cudaMallocManaged((void **)&things, num_of_things * sizeof(Thing));
// Something missing here? Malloc individual structs? Everything I try doesn't work.
things[10].is_solid = true; // Segfaults
它甚至最好的做法去做這種方式,而不是通過與被num_of_things
大陣列的單個結構?這似乎對我來說,能得到非常討厭尤其是當你已經陣列(如matrix
,這將需要9 * num_of_things
。
任何信息,將不勝感激!
你的代碼適合我。 [這是我的完整測試用例](http://pastebin.com/tBXqFF1C)(你應該提供這樣的東西)。你的方法沒有錯;對於如何在受管方案中執行此操作通常會很常見。很可能你正在犯下幾個錯誤之一:1.你不是爲cc3.0 +設備編譯。 2.您沒有在cc3.0 +設備上運行。 3.您的環境[不支持管理內存的使用情況(http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#um-requirements)。 –
在任何情況下,最好的建議是採用[適當CUDA錯誤檢查(http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using- cuda-runtime-api)任何時候你遇到一個cuda代碼的問題,我已經在我的測試用例中演示過了。嘗試在我的測試用例中運行代碼,看看你得到了什麼樣的輸出;我認爲這會對發生的事情有所啓發。 –
非常感謝!原來我做錯了,因爲編譯器沒有足夠的參數,所以我傳遞了第三個參數'0'到'cudaMallocManaged'。我不認爲這是相關的,所以我把它放在了問題之外。它需要的是'cudaMemAttachGlobal'或'cudaMemAttachHost'作爲一個非常善良單獨指出在freenode /#CUDA。 –