cuda - 如何在 gpu 中创建矩阵并在 cpu 上打印?
问题描述
这是在 gpu 上创建矩阵并在 cpu 上打印出来的代码。谁能告诉我哪里出错了。谢谢你。
# include <stdio.h>
__global__ void create(int **d_a){
int i = threadIdx.x;
int j = threadIdx.y;
d_a[i][j] = 1;
}
void errorCheck(){
cudaError_t error = cudaGetLastError();
if(error != cudaSuccess){
// print the CUDA error message and exit
printf("CUDA error: %s\n", cudaGetErrorString(error));
exit(-1);
}
}
# define N 5
int main(){
int **d_a, **a;
a = (int**)malloc(N * sizeof(int*));
for (int i =0; i < N; i++){
a[i] = (int*)malloc(N*sizeof(int));
}
cudaMalloc((void***)&d_a, N*sizeof(int*));
for (int i =0; i < N; i++){
cudaMalloc((void**)&d_a,N*sizeof(int));
}
errorCheck();
create <<<1, N>>>(d_a);
errorCheck();
cudaMemcpy(a, d_a, (N*N)*sizeof(int),cudaMemcpyDeviceToHost);
for (int i =0; i < N; i++ ){
for (int j = 0; j < N; j++ ){
printf("%d", a[i][j]);
}
printf("\n");
}
cudaFree(d_a);
free(a);
return 0;
}
内存分配或 memcpy 有问题吗?
解决方案
内存分配或 memcpy 有问题吗?
是的。
这个:
cudaMalloc((void***)&d_a, N*sizeof(int*));
for (int i =0; i < N; i++){
cudaMalloc((void**)&d_a,N*sizeof(int));
}
必须这样做:
cudaMalloc((void***)&d_a, N*sizeof(int*));
for (int i=0; i < N; i++){
int *row;
cudaMalloc((void**)&row, N*sizeof(int));
cudaMemcpy(d_a+i, &row, sizeof(int*), cudaMemcpyHostToDevice);
}
然后这个:
create <<<1, N>>>(d_a);
errorCheck();
cudaMemcpy(a, d_a, (N*N)*sizeof(int),cudaMemcpyDeviceToHost);
必须这样做:
create <<<1, dim3(N,N)>>>(d_a);
errorCheck();
for(int i=0; i<N; i++) {
int* row;
cudaMemcpy(&row, d_a+i, sizeof(int*), cudaMemcpyDeviceToHost);
cudaMemcpy(a[i], row, sizeof(int) * N, cudaMemcpyDeviceToHost);
}
[所有代码在浏览器中编写且未经测试,使用风险自负]
简而言之,您已决定使用指针数组。这需要额外的 CUDA API 操作,因为 GPU 副本中的行指针无法通过标准分配在主机上访问。您必须cudaMemcpy
在每种情况下使用。
推荐阅读
- discord.py - 检查提到的成员是否不是作者和离线和机器人
- git - 冲突情况的 Git 合并将本地副本替换为共同祖先副本
- java - 嗨,有人可以告诉我如何录制 android Lollipop 的内部音频
- .net - 使用 Location 将 Nginx 重定向到特定的 Docker 容器
- reactjs - Cookie“connect.sid”因域无效而被拒绝
- java - 如何将 JSON 密钥从骆驼案例更改为 POJO 的蛇案例?
- firebase - 如何使用 CDN 的 Firebase 版本 9 兼容性?
- c++ - 如何互相访问2个类的成员
- python - 如何获取谷歌表格名称
- python-3.x - 在 django 中发布后如何重定向到同一页面?