首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从设备复制到主机不起作用

将数据从设备复制到主机不起作用
EN

Stack Overflow用户
提问于 2011-10-04 16:20:30
回答 1查看 1.6K关注 0票数 0

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

代码语言:javascript
复制
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。

我已经尝试了其他几种方法,比如

代码语言:javascript
复制
thrust::copy(d_c.begin(),d_c.end(),h_c.begin()); 

代码语言:javascript
复制
cudaMemcpy(h_c_ptr,d_c_ptr,size*sizeof(int),cudaMemcpyDeviceToHost);

甚至是

代码语言:javascript
复制
for(int i=0;i < size;++i)h_c[i]=d_c[i];

什么都不管用。我在这里迷路了。

有没有人有类似的经历?所有帮助都已收到。

EN

回答 1

Stack Overflow用户

发布于 2011-10-05 14:21:35

您只创建了h_c,还没有初始化h_c。我认为这就是问题所在。不是内存复制问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7645036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档