копирование данных с устройства на хост не работает - PullRequest
0 голосов
/ 04 октября 2011

Я использую vs2010 для Windows 7 x64 и инструментарий 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];

Ничего не сработало. Я здесь потерян.

У кого-нибудь было что-нибудь подобное? Вся помощь оценена.

1 Ответ

1 голос
/ 05 октября 2011

Вы только создаете "h_c", но не инициализировали "h_c".Я думаю, что это проблема.Нет проблемы с копированием памяти

...