我使用VS2010在Windows 7 x64和我的大学项目的CUDA工具包4.0版。我想acheive简单的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];
毫无效果。我在这里丢失。
任何人也有类似的东西吗?所有的帮助表示赞赏。
你只能创建“h_c”,但还没有初始化“h_c”。我认为这就是问题所在。无内存复制问题