【发布时间】:2013-05-03 00:54:05
【问题描述】:
我在 CUDA 中编写了以下代码
__global__ void test(int *b_dev)
{
int index=blockDim.x*blockIdx.x+threadIdx.x;
b_dev[index]=1;
}
int main()
{
int **a;
int *b_dev;
a=(int**)malloc(sizeof(int*)*4);
for(i=0;i<4;i++)
a[i]=(int*)malloc(sizeof(int)*4);
//initialise array a here with 0
cudaMalloc((void**)&b_dev,sizeof(int)*16);
cudaMemcpy(b_dev,a,sizeof(int)*16,cudaMemcpyHostToDevice);
test<<<4,4>>>(dev_b);
cudaMemcpy(a,b_dev,sizeof(int)*16,cudaMemcpyDeviceToHost);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
cout<<a[i][j];
}
我在主机中有这个二维数组,我将它展平为一维数组并在 gpu 中处理,但是当我尝试在主机中打印数组 a 时,这段代码会产生分段错误,但是当我注释掉 b_dev[valindex]=1 行时在内核中,它使用初始化的零打印数组a。可视化 c++ 调试器表明
CXX0030:无法评估错误表达式。
请带我继续
【问题讨论】:
-
您将数据错误地复制到 gpu 或从 gpu 复制。以这种方式分配的 2D 数组不能通过使用单个内存副本直接复制。另外,指定的语句不应该是
b_dev[index]=1;吗? -
是的,它是 b_dev[index]=1。这是一个错字..你能告诉我如何实现这一点
-
或者有其他方法吗?
-
如果你有一个二维数组,你将需要多个 memcpy 调用。您是否需要使用二维数组,还是只能在任何地方使用一维数组?
-
如果我将主机 2d 数组展平为主机 1d 数组,我是否能够运行它?如果这样就足够了
标签: cuda