2014-06-12 24 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