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

CUDA-将设备数据复制到主机?,cuda,copy,new-operator,device,allocation,Cuda,Copy,New Operator,Device,Allocation,我有一个设备变量,在这个变量中,我在设备中分配并填充一个数组,但是我在将数据获取到主机时遇到了一个问题cudaMemcpy()返回cudaErrorInvalidValue错误。我怎么做 PS:代码只是一个例子,我知道,在这个特殊情况下,我可以使用cudamaloc,因为我知道数组的大小,但在我的实际代码中,它计算设备中数组的大小,需要立即分配内存 PS2:我发现了一个类似的问题,但我仍然不知道,我该如何解决它 PS3:我已经更新了代码,但仍然不起作用:{ PS4:我只是想用Nvidia GT

我有一个设备变量,在这个变量中,我在设备中分配并填充一个数组,但是我在将数据获取到主机时遇到了一个问题
cudaMemcpy()
返回
cudaErrorInvalidValue
错误。我怎么做

PS:代码只是一个例子,我知道,在这个特殊情况下,我可以使用cudamaloc,因为我知道数组的大小,但在我的实际代码中,它计算设备中数组的大小,需要立即分配内存

PS2:我发现了一个类似的问题,但我仍然不知道,我该如何解决它

PS3:我已经更新了代码,但仍然不起作用:{

PS4:我只是想用Nvidia GT 520MX(最新游戏驱动程序)在笔记本上运行此代码,但不起作用:(

thx

#包括
#包括
#定义n400
__设备uuu int*d_阵列;
__全局\无效allocDeviceMemory()
{
d_数组=新整数[N];
对于(int i=0;i
启动内核后,需要同步(
cudaDeviceSynchronize()
)以分配内存


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

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

什么???我有CUDA 4.1、开发者驱动程序、Win7 x64、VS 2008和GTS450。其他人可以测试代码吗?是否添加了一些额外的编译器参数?我刚刚将gpu架构设置为“sm_21”和x64目标机器平台。我仍然得到相同的错误。这很奇怪!我使用Win7 x64,VS 2010。运行在GTX580.GPU架构上的sm_20和x64目标机器。当我运行它时,它会打印正确的值:h_数组:123,0。这是我的exe文件上的链接,你能帮我测试一下吗,我认为问题可能在我的硬件或驱动程序中:S抱歉,但我将无法运行它,因为我仍然使用CUDA 4.0。我没有正确的dll文件。如果您也上载了正确的dll文件,我可以试试。其中一个dll文件是cudart64_41_28.dll
#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;
}