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