2014-01-31 41 views
0

我有以下數據結構在我的主機:如何在CUDA中將設備內存分配給我的指針數組?

typedef struct point{ 
    int x; 
    int y; 
}Point; 

typedef struct pair{ 
    Point i; 
    Point j; 
    float cost; 
}Pair; 

Pair* pairs[n]; // allocates an array of pointers to pair 

現在,我已經爲「對」複製到GPU。因此,我宣佈以下指針:

Pair **d_pair; 

,並使用分配的內存如下:

cudaMalloc((void**)d_pair,(sizeof(Pair)+sizeof(Pair*))*n); 

現在,我從主機複製到設備:

cudaMempy(d_pair,pair,(sizeof(Pair)+sizeof(Pair*))*n),cudaMemcpyHostToDevice); 

內核的原型接收d_pair爲:

__global__ my_kernel(Pair* d_pair[], ...){ 
... 
} 

上述報表序列是否按預期工作?如果不是,我做了什麼修改?基本上,我想複製Pair *對[n];就像「d_pair」一樣。我該怎麼做呢?

+1

如果您可以切換到Pair對象的數組,而不是指向Pair的指針數組,那麼您的數據複製可以很簡單,只需對所列出的序列進行相對較小的更改即可。否則,這個過程要複雜得多,並且需要一個包含多個步驟的循環。如果您在cuda二維數組上進行搜索(一組指向數據的指針實際上是一個二維數組),您將會了解複雜性。 –

回答

2

它不起作用:你發送一個指針數組,但不發送對象本身。 你需要有對的陣列(或向量):

Pair pairs[n]; 

然後:

Pair *d_pair; 
cudaMalloc((void**)&d_pair,sizeof(Pair)*n); 
cudaMempy(d_pair,pairs,sizeof(Pair)*n,cudaMemcpyHostToDevice); 

順便說一句,這一點:

cudaMempy(d_pair,pair,(sizeof(Pair)+sizeof(Pair*))*n),cudaMemcpyHostToDevice); 

是非感,你爲指針和Pair分配空間。您的副本使用相同的(sizeof(Pair)+ sizeof(Pair *))* n)表達式,但數組對是(n * sizeof(Pair *)),因此您正在複製未定義的內存。

+0

你能告訴我我必須對代碼做些什麼改變嗎? – pymd

+0

我更新了我的答案 – Joky

+1

我不相信更新是正確的。它應該是'Pair * d_pair; cudaMalloc((void **)&d_pair,sizeof(Pair)* n); cudaMemcpy(d_pair,pairs,sizeof(Pair)* n,cudaMemcpyHostToDevice);' –

相關問題