arrays - 如何在 CUDA 中的主机和设备之间正确分配和复制二维数组
问题描述
是否可以复制这样分配的 2D 主机阵列
h_A=(int**)malloc(N*sizeof(int*));
for(i=0;i<N;i++)
{
h_A[i]=(int*)malloc(3*sizeof(int));
}
到这样分配的 2D 设备数组
cudaMallocPitch((void**)&d_A, &pitch, 3*sizeof(int), N);
我尝试从主机复制到设备并返回到主机以检查该过程是否有效,结果是只有前 2 行正确复制
https://drive.google.com/file/d/1gXpChyYd2Div0pDjTRxZhwYd7GHRfjXN/view?usp=sharing
从主机阵列 h_A 复制到设备阵列 d_A
cudaMemcpy2D(d_A, pitch, h_A, 3*sizeof(int), 3*sizeof(int), N, cudaMemcpyHostToDevice);
从设备阵列 d_A 复制到主机阵列 d_B
cudaMemcpy2D(h_B, pitch, d_A, 3*sizeof(int), 3*sizeof(int), N, cudaMemcpyDeviceToHost);
解决方案
如果您分配一个指针数组来存储行,如下所示:
h_A=(int**)malloc(N*sizeof(int*));
for(i=0;i<N;i++)
{
h_A[i]=(int*)malloc(3*sizeof(int));
}
然后使用传统设备内存将其分配并移动到类似的设备端结构需要:
dh_A=(int**)malloc(N*sizeof(int*));
for(i=0;i<N;i++)
{
int* p;
cudaMalloc(&p, 3*sizeof(int))
cudaMemcpy(p, h_A[i], 3*sizeof(int), cudaMemcpyHostToDevice);
dh_A[i]=p;
}
int** d_A = cudaMalloc(&d_A, sizeof(int*) * N);
cudaMemcpy(d_A, dh_A, N*sizeof(int*), cudaMemcpyHostToDevice);
[注意:所有代码都是在浏览器中编写的,不保证能正确编译或工作]
我将把它作为练习留给读者如何执行设备到主机副本。此时,您可能会得出结论,在主机和设备上都使用线性内存更简单。它将更简单,更快。
推荐阅读
- html - 离子cordova popover组件中的img不显示
- kotlin - 如何将人分组?
- asp.net-core - 视图中未显示 ASP .NET Core MVC 模型
- c# - 将会议请求发送到 Exchange Online 会议室邮箱
- postgresql - PostgreSQL 慢查询
- java - 如何使用 javac 注释处理器在 webapp 中生成 xhtml 文件
- java - 生产者-消费者。消费者等待所有生产者完成,毒丸
- nginx - 使用 Nginx 和 SNI 时未知主机的后备配置?
- html - 在移动设备上仅针对某些容器而不是整个页面水平滚动
- time-series - adf 测试结果明显错误并与 kpss 测试对比