CUDA - 将设备数据复制到主机?

时间:2012-02-05 16:27:48

标签: cuda copy new-operator device allocation

我有设备变量,在这个变量中,我在设备中分配并填充一个数组,但是我有一个问题就是要将数据提供给主机。 cudaMemcpy()返回cudaErrorInvalidValue错误。我怎么能这样做?

PS:代码只是示例,我知道,在这种特殊情况下,我可以使用cudaMalloc,因为我知道数组的大小,但是在我的REAL代码中,它计算了数组的大小设备,它需要立即分配内存。

PS2:我发现了类似的问题,但我仍然不知道,我该如何解决呢? - copy data which is allocated in device from device to host

PS3:我已经更新了代码,但仍无效:{

PS4:我只是试图在Nvidia GT 520MX(最新游戏驱动程序)的笔记本上运行此代码并且也不起作用:(

THX

#include <cuda.h>
#include <stdio.h>

#define N 400
__device__ int* d_array;

__global__ void allocDeviceMemory()
{
    d_array = new int[N];
    for(int i=0; i < N; i++)
         d_array[i] = 123;
}

int main()
{
    allocDeviceMemory<<<1, 1>>>();

    cudaDeviceSynchronize();

    int* d_a = NULL;
    cudaMemcpyFromSymbol((void**)&d_a, "d_array", sizeof(d_a), 0, cudaMemcpyDeviceToHost);
    printf("gpu adress: %lld\n", d_a);


    int* h_array = (int*)malloc(N*sizeof(int));
    cudaError_t errr = cudaMemcpy(h_array, d_a, N*sizeof(int), cudaMemcpyDeviceToHost);
    printf("h_array: %d, %d\n", h_array[0], errr);

    getchar();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

启动内核后需要同步(cudaDeviceSynchronize())以分配内存。

您还可以检查同步和所有其他CUDA API调用的返回值吗?

答案 1 :(得分:1)

我测试了你的代码,这里没有错误。我正在运行CUDA 4.0。

相关问题