Извлечь и установить части массива в CUDA - PullRequest
0 голосов
/ 17 марта 2012

Я должен извлечь разделы из массива и установить кусок в другой массив.

Например, у меня есть 2d массив (в формате 1d) как A [32 X 32]; есть еще один массив B [64 X 64], и я хотел бы скопировать фрагмент 8X8 из B, начиная с (0,8) из B, и поместить его в (8,8) из A.

В настоящее время я, вероятно, использовал бы что-то вроде приведенного ниже ядра для получения части данных при передаче смещений. Аналогичный также можно использовать для установки фрагментов в больший массив.

__global__ void get_chunk (double *data, double *sub, int xstart, int ystart, int rows, int cols, int subset)
 {
    int i,j;
    i = blockIdx.x * blockDim.x + threadIdx.x;

    for (j = 0; j < subset; j++)
            sub[i*subset+j] = data[i*cols + (xstart*cols + ystart)+j];

 }

Я думаю, что то же самое можно сделать, используя вариант cudamemCpy * (возможно, cudamemCpyArray (...)), но я не уверен, как это сделать. Мне нужны примеры кода или указания, как это можно сделать.

PS У меня был точно такой же вопрос на форумах nvidia, я не получил ответа, поэтому пробую здесь. http://forums.nvidia.com/index.php?showtopic=223386

Спасибо.

1 Ответ

1 голос
/ 17 марта 2012

Нет необходимости в ядре, если вы просто хотите скопировать данные из одного массива в другой на устройстве.

Если у вас есть указатели устройства с исходными данными и указанным целевым указателем в коде хоста:

псевдокод:

//source and target device pointers
double * source_d, target_d;

//get offseted source pointer
double * offTarget_d + offset * sizeof(double);

//copy n elements from offseted source data to target device pointer
cudaMemcpy(offTarget_d, source_d, n * sizeof(double), cudaMemcpyDeviceToDevice);

Было неясно, хотите ли вы просто скопировать диапазон одномерного массива или если вы хотите скопировать диапазон каждой строки в двумерном массиве в целевую строку другого двумерного массива

...