2013-08-22 2 views
1

У меня вопрос о размерах блоков и сеток в (py) CUDA. Я знаю, что существуют ограничения в общем размере блоков, но не в сеткахРазмер сетки и блока в (ру) CUDA

И что фактический размер блока влияет на время выполнения. Но мне интересно: имеет ли значение, если у меня есть блок из 256 потоков, чтобы начать его как (256,1) или запустить его как (128,2), например (64,4) и т. Д. .

Если это имеет значение: что является самым быстрым?

+0

На самом деле я тоже прочитал эту тему, но это не отвечает на мой вопрос, так как обсуждение касается только общего размера блока и определения его в идеальном случае. Мой вопрос: о том, делает ли это (производительность) разницу, если я беру размер блока 256 и вызывать его в (256,1,1) или в (128,2,1) или в (64,2, 2) мода. Конечно, с учетом адаптированной реализации. – user2267896

ответ

3

Да, это имеет значение.

(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-сеткой и ожидает, что все будет работать нормально, и наоборот.

+1

Это понятно. Мой вопрос был больше: Учитывая, что реализация адаптирована, есть ли разница в производительности? Или это просто для убеждения программистов, чтобы иметь возможность использовать более естественный способ индексирования матриц, томов и т. Д.? – user2267896

+3

Не существует разницы в производительности * из-за размеров резьбы *, если общее количество потоков одинаково. Машина создает такое же количество перекосов. Единственным отличием будут отдельные встроенные переменные (например, threadIdx.x и т. Д.), Назначенные каждому потоку. –

Смежные вопросы