cudamemcpy2D如何正确的传值

qq_34705009 2017-07-10 01:09:31
两个1000*1000的矩阵A,B相加,结果存到C中,先用cudaMallocPitch分配了空间,但是用cudaMemcpy2D将数组A,B从主机传到设备时,设备端数组dev_a,dev_b值全为0是为什么?

代码如下:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <stdlib.h>

#define size 1000

__global__ void addKernel(int *c, int *a, int *b)
{
int i = (blockIdx.x*blockDim.x)+threadIdx.x;
int j = (blockIdx.y*blockDim.y)+threadIdx.y;
if(i<size&&j<size)
c[i*size+j] = a[i*size+j] + b[i*size+j];
}

int main()
{
int i,j;
int *a = (int *)malloc(size*size*sizeof(int));
int *b = (int *)malloc(size*size*sizeof(int));
int *c = (int *)malloc(size*size*sizeof(int));

for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
a[i*size+j] = size*i+j;
b[i*size+j] = 1000+a[i*size+j];
}

system("pause");

cudaError_t cudaStatus;
int *dev_a,*dev_b,*dev_c;
size_t pitch1 = size * sizeof(int);
size_t pitch2_a,pitch2_b,pitch2_c;
size_t width = size * sizeof(int);
size_t height = size;

cudaStatus = cudaMallocPitch((void**)&dev_a,&pitch2_a,width,height);
cudaStatus = cudaMallocPitch((void**)&dev_b,&pitch2_b,width,height);
cudaStatus = cudaMallocPitch((void**)&dev_c,&pitch2_c,width,height);

cudaStatus = cudaMemcpy2D(dev_a, pitch2_a, a , pitch1 , width, height, cudaMemcpyHostToDevice);

cudaStatus = cudaMemcpy2D(dev_b, pitch2_b, b , pitch1 , width, height, cudaMemcpyHostToDevice);

addKernel<<<2048,512>>>(dev_a,dev_b,dev_c);

cudaStatus = cudaMemcpy2D(c, pitch1, dev_c, pitch2_c, width, height, cudaMemcpyDeviceToHost);

system("pause");
free(a);
free(b);
free(c);
cudaFree(a);
cudaFree(b);
cudaFree(c);
return 0;
}
...全文
2574 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
southpaw_wu 2019-10-23
  • 打赏
  • 举报
回复
建议看看所在编译器下,int对应的是16位还是32位,如果是16位的话就会出现溢出的问题

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧