[英]How can I pass a C++ array of structs to a CUDA device?
我花了兩天的時間試圖解決這個問題並且無處可去。 假設我有一個看起來像這樣的結構:
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
。
任何信息將不勝感激!
在評論中的一些對話框之后,似乎OP發布的代碼沒有問題。 我能夠成功編譯並運行圍繞該代碼構建的測試用例,OP也是如此:
$ cat t1005.cu
#include <iostream>
struct Thing {
bool is_solid;
double matrix[9];
};
int main(){
Thing *things;
int num_of_things = 100;
cudaError_t ret = cudaMallocManaged((void **)&things, num_of_things * sizeof(Thing));
if (ret != cudaSuccess) {
std::cout << cudaGetErrorString(ret) << std::endl;
return 1;}
else {
things[10].is_solid = true;
std::cout << "Success!" << std::endl;
return 0;}
}
$ nvcc -arch=sm_30 -o t1005 t1005.cu
$ ./t1005
Success!
$
關於這個問題:
以這種方式執行此操作是否是最佳實踐,而不是使用num_of_things較大的數組傳遞單個結構?
是的,這是一種明智的做法,無論是否使用托管內存,都可以使用。 可以使用單個cudaMemcpy
調用以簡單的方式將一個或多或少任何不包含嵌入式指針的結構數組轉移到GPU(例如,如果未使用托管內存)。
要解決有關cudaMallocManaged
的3rd( flags
)參數的問題:
cudaMemAttachGlobal
的默認參數。 這可以通過查看cuda_runtime.h
文件來確認,或者只是編譯/運行上面的測試代碼。 這個特殊點似乎是對文檔的疏忽,我在NVIDIA上提出了一個內部問題來看一看。 因此,文檔可能會在未來發生變化。 最后,在您遇到CUDA代碼時遇到問題時,總是按順序進行正確的cuda錯誤檢查 ,並且使用這些錯誤檢查可能會對所發生的任何錯誤有所了解。 OP在代碼注釋中報告的seg錯誤幾乎肯定是由於cudaMallocManaged
調用失敗(可能是因為錯誤地提供了零參數),因此有問題的指針( things
)沒有實際分配。 隨后使用該指針將導致seg錯誤。 我的測試代碼演示了如何避免seg故障,即使cudaMallocManaged
調用由於某種原因失敗,並且密鑰是正確的錯誤檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.