выясняя, сколько блоков и потоков для ядра cuda и как их использовать

Я пытался понять, как сделать то, что, как я думал, было бы простым ядром, чтобы брать среднее значение в 2-мерной матрице, но у меня возникли некоторые проблемы с точным изложением моего мыслительного процесса.

Согласно моему выводу deviceQuery, мой графический процессор имеет 16MP, 32 ядра / mp, максимальное количество блоков 1024x1024x64, а у меня максимальное количество потоков / block = 1024.

Итак, я работаю над обработкой некоторых больших изображений. Может быть, 5000 x 3500 пикселей или что-то в этом роде. Одно из моих ядер принимает средние значения по всем пикселям изображения.

В существующем коде изображения хранятся в виде 2D-массива [строки] [столбцы]. Итак, это ядро ​​в 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 похоже, вы ожидаете, с циклом по строкам и циклом по столбцам, с вычислением посередине.

Итак, как мне настроить часть вычисления измерения этого кода в 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 похоже, вы ожидаете, с циклом по строкам и циклом по столбцам с вычислением посередине.

Итак, как мне настроить часть вычисления размерности этого кода в 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

Итак, как мне настроить часть вычисления размеров этого кода в 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

Итак, как мне настроить часть вычисления размеров этого кода в 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-массив на устройстве?

Любые полезные советы! Спасибо!

6
задан caf 27 January 2011 в 05:07
поделиться