CUDA - копировать данные устройства на хост? - PullRequest
1 голос
/ 05 февраля 2012

У меня есть переменная устройства, и в этой переменной я выделяю и заполняю массив в устройстве, но у меня проблема с получением данных на хост. cudaMemcpy() возврат cudaErrorInvalidValue ошибка. как я могу это сделать?

PS: Код является лишь примером, я знаю, что в данном конкретном случае я могу использовать cudaMalloc, потому что я знаю размер массива, но в моем РЕАЛЬНОМ коде он вычисляет размер массива в устройстве. и для этого нужно сразу выделить память.

PS2: Я обнаружил похожую проблему, но все еще не знаю, как я могу ее решить? - копировать данные, которые размещены в устройстве, с устройства на хост

PS3: я обновил код, но все еще не работает: {

PS4: я просто пытаюсь запустить этот код на ноутбуке с Nvidia GT 520MX (последний драйвер игры) и тоже не работает: (

ТНХ

#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 ]

1 голос
/ 06 февраля 2012

Я проверил ваш код, и здесь нет ошибок.Я использую CUDA 4.0.

1 голос
/ 06 февраля 2012

Вам необходимо выполнить синхронизацию (cudaDeviceSynchronize()) после запуска ядра для выделения памяти.

Можете ли вы также проверить возвращаемое значение синхронизации и всех других вызовов API CUDA?

...