Мне нужно некоторое разъяснение относительно использования dim3 для установки количества потоков в моем ядре CUDA.Cuda блок/размеры сетки: когда использовать dim3?
У меня есть изображение в виде массива 1D поплавка, который я копирование на устройство с:
checkCudaErrors(cudaMemcpy(img_d, img.data, img.row * img.col * sizeof(float), cudaMemcpyHostToDevice));
Теперь нужно установить размеры сетки и блоков, чтобы запустить мое ядро:
dim3 blockDims(512);
dim3 gridDims((unsigned int) ceil(img.row * img.col * 3/blockDims.x));
myKernel<<< gridDims, blockDims>>>(...)
Мне интересно: в этом случае, поскольку данные 1D, имеет значение, если я использую структуру dim3? Любые преимущества по сравнению с использованием
unsigned int num_blocks = ceil(img.row * img.col * 3/blockDims.x));
myKernel<<<num_blocks, 512>>>(...)
вместо этого?
Кроме того, я понимаю правильно, что при использовании DIM3, я буду ссылаться на идентификатор потока 2 индексов внутри моего ядра:
int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;
И когда я не использую DIM3, я буду использовать один индекс?
Большое спасибо,