2017-03-31 41 views
0

我用實例電子書閱讀Cuda的使用cudaMalloc()返回,我碰到這句話來:執行算術主機代碼

然而,這是程序員的責任不取消引用指針由cudaMalloc()從主機上執行的代碼返回的 。主機代碼可能會通過該指針傳遞該指針,對其執行算術運算,甚至將其轉換爲其他類型的 類型。但是你不能用它來從內存中讀取或寫入。

具體來說,'如何完成對cudaMalloc()返回的指針的算術運算?

我試着在調用內核之前和之後運行下面的附加代碼,但是它對輸出沒有任何影響(這是12或者沒有這些行)。

#include <iostream> 
#include <cuda_runtime.h> 
#include <device_launch_parameters.h> 

__global__ 
void add(int a, int b, int *c) 
{ 
    *c += a + b; 
} 

int main() 
{ 
    int *c, d; 
    cudaMalloc((void**)&c, sizeof(int)); 
    *c = 10; 
    add << <1,1>> > (5,7,c); 
    *c += 5; 
    cudaMemcpy(&d, c, sizeof(int), cudaMemcpyDeviceToHost); 
    std::cout << d<<std::endl; 
    return 0; 
} 

我是個初學者,感謝你的幫助。

回答

2

pointer arithmetic是一個與C和C++相關的概念,它不是CUDA的唯一或特定的概念。

這不是指針算法的一個例子:

*c = 10; 

也不是這樣的:

*c += 5; 

這是什麼指針指向,而不是指針本身的兩種修飾。指針運算涉及對指針值本身的調整。 (順便說一句,你在CUDA中顯示的代碼是非法的 - 在主機代碼中取消引用普通設備指針是不合法的。*c取消引用指針c的操作。它與指針算術不同。)

假設我有1024個int數量的設備內存分配:

cudaMalloc(&data, 1024 * sizeof(int)); 

現在假設我想引起CUDA內核的第一次調用啓動對數組的開始工作,並且第二次調用的CUDA內核開始在陣列的中點工作,但除此之外執行s艾米工作。

我可能會做這樣的事情,第二個內核調用具有涉及指針算法參數:

kernel<<<...>>>(data, 512); 
kernel<<<...>>>(data+512, 512); 

data+512參數包括指針運算。這將傳遞一個指向內核的指針,指向數據數組的中點,而不是數組的開始。如果我想在主機代碼中攜帶這個指針,我可以這樣做:

int *datahalf = data+512; 
+0

解釋完美。謝謝。 –