Cuda: скопировать 1D массив из процессора в графический процессор - PullRequest
0 голосов
/ 17 декабря 2018

Я новичок в Cuda, пытаюсь скопировать массив с хоста на устройство через cudaMemcpy (...) Однако данные, передаваемые в GPU, кажутся совершенно другими (по цене: совершенно неверно, для G: неправильно после индекса5)

Мои данные - это массив malloc (написанный на C), например, размером 25, я попытался скопировать их следующим образом (MAX = 5):

Объявление:

int *cost, int* G
int *dev_cost, *dev_G;

Распределение:

cost = (int*)malloc(MAX* MAX * sizeof(int));
G = (int*)malloc(MAX* MAX* sizeof(int));
cudaMalloc((void**)&dev_cost, MAX*MAX);
cudaMalloc((void**)&dev_G, MAX*MAX);

Передача данных:

cudaMemcpy(dev_cost, cost, MAX*MAX, cudaMemcpyHostToDevice);
cudaMemcpy(dev_G, G, MAX*MAX, cudaMemcpyHostToDevice);

Запуск ядра:

assignCost<<<1,MAX*MAX>>>(dev_G,dev_cost);

Функция ядра:

__global__ void assignCost(int *G, int *cost)
{
    int tid = threadIdx.x + blockDim.x*blockIdx.x;

    printf("cost[%d]: %d G[%d] = %d\n", tid, cost[tid], tid, G[tid]);
    if(tid<MAX*MAX)
    {
        if (G[tid] == 0)
            cost[tid] = INT_MAX;
        else
            cost[tid] = G[tid];
    }
}

Что-то не так с моим подходом?Если тогда, как я должен изменить?

1 Ответ

0 голосов
/ 17 декабря 2018
cudaMemcpy(dev_cost, cost, MAX*MAX*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_G, G, MAX*MAX*sizeof(int), cudaMemcpyHostToDevice);

Третьим аргументом для cudaMemcpy является число в байтах .Поскольку у вас есть MAX*MAX целых чисел и каждое целое число имеет размер sizeof(int) байтов, замените MAX*MAX на MAX*MAX*sizeof(int)

...