CUDA二维矩阵加法运算

jiang_yuliang 2012-04-25 04:55:36
我在GPU上实现二维矩阵加法运算时,代码如下,可以运行
void main()
{
float (*a)[4]=new float[2][4];
float (*b)[4]=new float[2][4];
float (*dev_a)[4],(*dev_b)[4];
a[0][0]=1;a[0][1]=2;a[0][2]=3;a[0][3]=4;
a[1][0]=5;a[1][1]=6;a[1][2]=7;a[1][3]=8;
cudaMalloc((void **)&dev_a, 2 * 4 * sizeof(float) );
cudaMalloc((void **)&dev_b, 2 * 4 * sizeof(float) );
cudaMemcpy( dev_a, a, 2 * 4 * sizeof(float), cudaMemcpyHostToDevice );
delete []a;
dim3 blocks(1,1);
dim3 threads(2,4);
add<<<blocks,threads>>>(dev_a,dev_b);
cudaMemcpy( b, dev_b, 2 * 4 * sizeof(float), cudaMemcpyDeviceToHost );
cudaFree(dev_a);
cudaFree(dev_b);
cout<<b[0][0]<<endl;cout<<b[0][1]<<endl;cout<<b[0][2]<<endl;cout<<b[0][3]<<endl;
cout<<b[1][0]<<endl;cout<<b[1][1]<<endl;cout<<b[1][2]<<endl;cout<<b[1][3]<<endl;
delete []b;
}
__global__ void add(float m[][4],float n[][4])
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
if(x<2 && y<4)
n[x][y]=m[x][y]+10;
}
问题来了:在GPU上第一次运行生成后,dev_b值变成固定的了,当改变if(x<-2 && y<-4)或者屏蔽掉add<<<blocks,threads>>>(dev_a,dev_b)时dev_b的值依然不变,好像dev_b第一次运行生成的值被写进内存无法更改了似的,请问这是什么问题?
谢谢指教!!
...全文
712 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lf09121723 2012-06-06
  • 打赏
  • 举报
回复
清理解决方案,试下
agathah 2012-04-28
  • 打赏
  • 举报
回复
没看懂……?add只调用了一次啊?
而且即使你调用第二次,改掉if后面的条件,只要dev_a不变,dev_b[i][j]=dev_a[i][j]+10,不管怎么改条件,结果肯定不会变啊?(原本2×4的结果不会改变,新的i,j肯定在原来(2,4)内,即使刷新了也是和原来一样,看上去就是没变)

589

社区成员

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

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