Я работаю над некоторыми cuda tutorial конвертирует изображение RGBA в оттенки серого. Но я не мог понять, почему изменение blockSize
и gridSize
делает X33-временную модернизацию.Почему изменение размера блока и сетки оказывает такое большое влияние на время выполнения?
__global__
void rgba_to_greyscale(const uchar4* const rgbaImage,
unsigned char* const greyImage,
int numRows, int numCols)
{
int i = blockIdx.x*numCols + threadIdx.x;
float channelSum = .299f * rgbaImage[i].x + .587f * rgbaImage[i].y + .114f * rgbaImage[i].z;
greyImage[i]= channelSum;
}
void your_rgba_to_greyscale(const uchar4 * const h_rgbaImage, uchar4 * const d_rgbaImage,
unsigned char* const d_greyImage, size_t numRows, size_t numCols)
{
const dim3 blockSize(numCols, 1, 1);
const dim3 gridSize(numRows, 1 , 1);
rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);
cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError());
}
Когда я установил, как описано выше:
const dim3 blockSize(numCols, 1, 1);
const dim3 gridSize(numRows, 1 , 1);
Я получаю Your code executed in 0.030304 ms
Когда я установил:
const dim3 blockSize(1, 1, 1);
const dim3 gridSize(numRows, numCols , 1);
и обновление функции потоков для работы с новым индексом:
int i = blockIdx.x*numCols + blockIdx.y;
Я получаю Your code executed in 0.995456 ms
.
- Я хотел бы ожидать, что это будет наоборот, так как графический процессор может рассчитать все пиксель отдельно на второй сетке расщеплению Связан ли это вопросам когерентности кэша? почему я получаю эти результаты?
- Какова лучшая теория теории и размер блока для этой проблемы? можно ли вычислить его во время выполнения?
FYI:
numRows = 313 numCols =557
Технические характеристики:
#uname -a && /usr/bin/nvidia-settings -v
Linux ip-10-16-23-92 3.2.0-39-virtual #62-Ubuntu SMP Thu Feb 28 00:48:27 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
nvidia-settings: version 304.54 ([email protected])
Быстрый ответ в том, что график графических процессоров NVIDIA, принеси, диспетчерская, и выполнить команду в группах нитей, называемых деформациями. Для вычислительной способности 1. * - 3. * устройства размер основы равен 32. Если вы запускаете блоки, содержащие только 1 поток, аппаратное обеспечение делит блок на 1 warp, состоящий из 1 активного потока и 32 неактивных потоков.Эффективность выполнения математических трубок и LSU будет 1/32 (вы видите 32X). –