2
我在CUDA C中編寫了一些非常簡單的GPU代碼,將數組nums複製到數組vals中。 Nums是[4,7,1,9,2]。這是我想每個元素複製過來:與CUDA並行傳輸陣列
__global__ void makeArray(int*);
int main()
{
int* d_nums;
int nums[5];
nums[0] = 4;
nums[1] = 7;
nums[2] = 1;
nums[3] = 9;
nums[4] = 2;
cudaMalloc(&d_nums, sizeof(int)*5);
makeArray<<<2,16>>>(d_nums);
cudaMemcpy(nums, d_nums, sizeof(int)*5, cudaMemcpyDeviceToHost);
for (int i = 0; i < 5; i++)
cout << i << " " << nums[i] << endl;
return 0;
}
__global__ void makeArray(int* nums)
{
int vals[5];
int threadIndex = blockIdx.x * blockDim.x + threadIdx.x;
vals[threadIndex%5] = nums[threadIndex%5];
__syncthreads();
if (threadIndex < 5)
nums[threadIndex] = vals[threadIndex];
}
從長遠來看,我想用這種方法從CPU到GPU共享內存傳輸一個數組,但我甚至無法得到這個簡單練習文件工作。我期待的輸出是這個樣子:
0 4
1 7
2 1
3 9
4 2
但我發現了這一點:
0 219545856
1 219546112
2 219546368
3 219546624
4 219546880
我的思維過程是通過使用線程索引,這是更大的彈性模量比這個數組中的元素數量多,我可以覆蓋所有5個數據點,而不用擔心讀取數組。我還可以同時分配每個陣列點,每個線程一個,然後在末尾分配__syncthreads()以確保每個線程都完成複製。顯然,這是行不通的。幫幫我!
哇。不能相信我錯過了這一點。非常感謝! – Goldy267