与CUDA并行传输阵列
Transfer Array in Parallel with CUDA
我在CUDA C中编写了一些非常简单的GPU代码,将数组nums复制到数组vals中。Nums为[4,7,1,9,2]。这就是我想要复制每个元素的方式:
__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()以确保每个线程都完成复制。显然,这不起作用。的帮助!
编辑后,我们可以看到d_nums
指向未初始化的内存。你只是分配了它,没有填充任何东西。如果你想让GPU访问数据,你必须复制它:
cudaMemcpy(d_nums, nums, sizeof(nums), cudaMemcpyHostToDevice);
在之前运行内核
相关文章:
- OpenMP阵列性能较差
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- C++17中的并行执行策略
- 英特尔并行工作室 2015 C++中的 2D 动态分配全局阵列
- 从一个文件读取到三个并行阵列
- 将数据从阵列火阵列传输到犰狳结构
- 将多维阵列甚至元素传输到一个维数阵列
- 比较从文本文件中读取的并行阵列
- 如何自动并行化堆阵列
- 使用Emscripten C Web Worker的大型阵列有效传输:JavaScript设计更好
- 分段故障核心转储的并行阵列
- 使用并行阵列的初学者编程学生
- 并行写入阵列
- 使用OpenMP原子并行更新矩阵列
- 用c++ OpenMP和文件传输并行化.性能问题
- 与CUDA并行传输阵列
- C++并行化:快速"reinitialize"阵列
- CUDA 并行化依赖的 2D 阵列