Я пытался выяснить, как сделать то, что, как я думал, было бы простым ядром, чтобы получить среднее значение в 2-мерной матрице, но у меня возникли некоторые проблемы с наведением моего мыслительного процесса на это.
Согласно моему выводу deviceQuery, мой GPU имеет 16MP, 32cores / mp, максимальное количество блоков составляет 1024x1024x64, а максимальное число потоков / блок = 1024.
Итак, я работаю над обработкой некоторых больших изображений.Возможно 5000px x 3500px или что-то в этом роде.Одно из моих ядер принимает среднее значение некоторых значений по всем пикселям изображения.
В существующем коде изображения хранятся в виде двумерного массива [rows] [cols].Таким образом, ядро в C выглядит так, как вы и ожидаете, с циклом над строками и циклом над столбцами, с вычислением в середине.
Итак, как настроить часть вычисления измерения дляэтот код в CUDA?Я посмотрел на код сокращения в SDK, но это для одноразмерного массива.В нем нет упоминания о том, как настроить количество блоков и потоков для случая, когда у вас есть что-то 2D.
Я думаю, что на самом деле мне нужно было бы настроить его так, и именно здеськак кто-то, кто вмешивается и помогает:
num_threads=1024;
blocksX = num_cols/sqrt(num_threads);
blocksY = num_rows/sqrt(num_threads);
num_blocks = (num_rows*num_cols)/(blocksX*blocksY);
dim3 dimBlock(blocksX, blocksY, 1);
dim3 dimGrid(num_blocks, 1, 1);
Имеет ли это смысл для установки?
А затем в ядре, чтобы работать с определенной строкой или столбцом, я 'Я должен использовать
rowidx = (blockIdx.x * blockDim.x) + threadId.x colidx = (blockIdx.y * blockDim.y) + threadId.y
По крайней мере, я думаюэто будет работать для получения строки и столбца.
Как мне тогда получить доступ к этой конкретной строке r и столбцу c в ядре?В руководстве по программированию cuda я нашел следующий код:
// Host code int width = 64, height = 64;
float* devPtr; size_t pitch;
cudaMallocPitch(&devPtr, &pitch, width * sizeof(float), height);
MyKernel<<<100, 512>>>(devPtr, pitch, width, height);
// Device code __global__ void MyKernel(float* devPtr, size_t pitch, int width, int height)
{
for (int r = 0; r < height; ++r)
{
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c)
{
float element = row[c];
}
}
}
, который похож на то, как вы используете malloc в C для объявления 2D-массива, но в нем нет упоминания о доступе к этому массиву в вашемсобственное ядро.Я предполагаю, что в своем коде я буду использовать этот вызов cudaMallocPitch, а затем выполнить memcpy для передачи моих данных в 2D-массив на устройстве?
Любые советы приветствуются!Спасибо!