Да, это имеет значение.
(256,1) создает (1D) блок 256 потоков в Х-измерении, все из которых имеют у-индекс 0.
(128,2) создает (2D) блок из 128x2 потоков, т.е. 128 в x-размерности и 2 в y-размерности. Эти потоки будут иметь индекс x в диапазоне от 0 до 127 и индекс y от 0 до 1
Структура кода ядра должна понимать индексирование/нумерацию потоков.
Например, если ваш код ядра начинается что-то вроде:
int idx=threadIdx.x+blockDim.x*blockIdx.x;
и не создает какой-либо другие переменный индекс, это, вероятно, предполагая 1D threadblock и 1D сетку.
Если, с другой стороны, ваш код ядра начинается что-то вроде:
int idx = threadIdx.x+blockDim.x*blockIdx.x;
int idy = threadIdx.y+blockDim.y*blockIdx.y;
Это, вероятно, ожидает 2D сетки и 2D threadblocks.
В общем случае эти два подхода не являются взаимозаменяемыми, что означает, что вы не можете запустить ядро, которое ожидает 1D-сетку с 2D-сеткой и ожидает, что все будет работать нормально, и наоборот.
На самом деле я тоже прочитал эту тему, но это не отвечает на мой вопрос, так как обсуждение касается только общего размера блока и определения его в идеальном случае. Мой вопрос: о том, делает ли это (производительность) разницу, если я беру размер блока 256 и вызывать его в (256,1,1) или в (128,2,1) или в (64,2, 2) мода. Конечно, с учетом адаптированной реализации. – user2267896