2014-06-12 23 views
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()以確保每個線程都完成複製。顯然,這是行不通的。幫幫我!

回答

0

編輯完成後,我們可以看到d_nums指向未初始化的內存。你只是分配它,並沒有填充任何東西。如果您想將GPU訪問的數據,你必須複製它:你運行內核

cudaMemcpy(d_nums, nums, sizeof(nums), cudaMemcpyHostToDevice); 

之前

+0

哇。不能相信我錯過了這一點。非常感謝! – Goldy267