【问题标题】:copying data from device to host not working将数据从设备复制到主机不起作用
【发布时间】:2011-11-30 11:54:51
【问题描述】:

我在 Windows 7 x64 上使用 vs2010,在我的大学项目中使用 CUDA 工具包 v4.0。我想完成一个简单的 gpu-vs-cpu 测试,大部分都完成了,但是我的 cuda 测试都没有返回任何结果。我用调试器检查了内存,设备内存包含了我需要的所有东西,只是内存复制失败了。

host_vector<int> addWithCuda(host_vector<int> h_a, host_vector<int> h_b)
{
int size = h_a.size();
host_vector<int> h_c(size);

// Choose which GPU to run on, change this on a multi-GPU system.
cudaError_t cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess) {
    fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
    return h_c;
}
else{
    // Allocate GPU buffers for three vectors (two input, one output).
    // Copy input vectors from host memory to GPU buffers.
    device_vector<int> d_c=h_c;
    device_vector<int> d_a=h_a;
    device_vector<int> d_b=h_b;

    int*d_a_ptr = raw_pointer_cast(&d_a[0]);
    int*d_b_ptr = raw_pointer_cast(&d_b[0]);
    int*d_c_ptr = raw_pointer_cast(&d_c[0]);
    int*h_c_ptr = raw_pointer_cast(&h_c[0]);

    // Launch a kernel on the GPU with one thread for each element.
    addKernel<<<1, size>>>(d_c_ptr, d_a_ptr, d_b_ptr);

    // cudaDeviceSynchronize waits for the kernel to finish, and returns
    // any errors encountered during the launch.
    cudaStatus = cudaDeviceSynchronize();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
        return h_c;
    }
    thrust::device_vector<int>::iterator d_it;
    thrust::host_vector<int>::iterator h_it;
    // Copy output vector from GPU buffer to host memory.
    h_c=d_c;
    printf("||Debug h_c[0]=%d\td_c[0]=%d\n",h_c[0],d_c[0]);
}
cudaStatus = cudaDeviceReset();
if (cudaStatus != cudaSuccess) {
    fprintf(stderr, "cudaDeviceReset failed!");
}
return h_c;
}

注意代码行“h_c=d_c;”。在推力上,这应该将数据从 d_c(设备向量)复制到 h_c(主机向量)。此行不会失败,但也不会正确执行。 h_c 一直保持为 0。

我尝试了其他几种方法,例如

thrust::copy(d_c.begin(),d_c.end(),h_c.begin()); 

cudaMemcpy(h_c_ptr,d_c_ptr,size*sizeof(int),cudaMemcpyDeviceToHost);

甚至

for(int i=0;i < size;++i)h_c[i]=d_c[i];

没有任何效果。我迷路了。

有人有类似的吗?感谢所有帮助。

【问题讨论】:

  • 您确定addKernel 工作正常吗?
  • 是的,就像我说的,我检查了我的 d_c 向量的内容,它有正确的值。问题是 d_c 的内容没有被复制到 h_c
  • 如果省略cudaDeviceSynchronize 会发生什么?在这个例子中实际上没有必要。另外,size 的值是多少?
  • 删除 cudaDeviceSyncronize 不会改变任何东西。 size的值设置为常数500万;此上下文中的所有向量都具有相同的大小。
  • 如果size 是 500 万,您的内核不会启动。线程块的最大大小约为 1024。内核启动后始终检查 CUDA 错误。

标签: visual-studio-2010 cuda thrust


【解决方案1】:

你只创建了“h_c”,还没有初始化“h_c”。我认为这就是问题所在。没有内存拷贝问题

【讨论】:

  • 据我所知,thrust 自动初始化它的变量,我直到现在才初始化它们并且它们工作......
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 2017-08-27
  • 2011-08-24
  • 2011-09-09
  • 2018-03-15
  • 2020-03-07
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多