2013-11-19 5 views
0

У меня есть основной вопрос для моего понимания. Приносим извинения, если какая-либо ссылка на ответ приведена в некоторых документах. Я не мог найти ничего связанного с этим в руководстве по программированию C.CUDA: GPU Working

У меня есть Архитектура Ферми GPU Geforce GTX 470. Он имеет
14 потоковых мультипроцессоры 32 потоковых ядер на СМ

Я хотел понять, нить за преимущественный механизм с примером. Предположим, что у меня есть простейшее ядро ​​с оператором 'printf' (вывести идентификатор потока). И я использую следующие размеры сетки и блоки

dim3 grid, block; 
grid.x = 14; 
grid.y = 1; 
grid.z = 1; 

block.x = 32; 
block.y = 1; 
block.z = 1; 

Так как я понимаю, 14 блоков будет назначено 14 потоковых мульти-процессоров. И поскольку каждый потоковый мультипроцессор имеет 32 ядра, каждое ядро ​​будет выполнять одно ядро ​​(один поток). Это верно?

Если это так, то что произойдет в следующем случае?

grid.x = 14; 
grid.y = 1; 
grid.z = 1; 

block.x = 64; 
block.y = 1; 
block.z = 1; 

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

1) Используются те же критерии для потоков потоков.
2) Но, как я уже говорил, у меня есть инструкция printf и нет общего использования ресурсов, что происходит в этом случае? После выполнения 32 потоков выполняются остальные 32 потока? 3) Если у меня также есть y-размер в блоке, тогда какая последовательность? Это первые 32 потока в x-размерности для всех y-размерностей, а затем остальные?

Может кто-нибудь прокомментировать это?

+0

Что касается вашего первого примера, это зависит от операций, которые будут выполнены. В техническом документе Fermi написано, что _a CUDA core выполняет инструкцию с плавающей точкой или целым числом в часах для потока_. Таким образом, операции двойной точности будут занимать два ядра. Поэтому я не думаю, что утверждение «ядро» будет выполнять одно ядро ​​(один поток) _, как правило, правильно. – JackOLantern

+0

Я полагаю, что одна операция двойной точности будет использовать один FPU на GPU Fermi, а не два ядра. –

ответ

3

Итак, как я понимаю, 14 блоков будут запланированы на 14 потоковых мультипроцессоров.

Не обязательно. Единственного блока с 32 потоками недостаточно для насыщения SM, поэтому несколько блоков могут быть запланированы на одном SM, а некоторые не используются. По мере увеличения количества блоков вы дойдете до точки, где они будут равномерно распределены по всем SM.

И поскольку каждый многопроцессор имеет 32 ядра, каждое ядро ​​будет выполнять одно ядро ​​(один поток).

Сердечники CUDA сильно конвейерны, поэтому каждое ядро ​​обрабатывает много потоков одновременно. Каждая нить находится в другом этапе трубопровода. Существует также различное количество различных типов ресурсов.

Более подробно рассмотрим Fermi SM (см. Ниже), вы увидите 32 CUDA Cores (маркетинг говорит ALU), каждый из которых может содержать около 20 потоков в своих конвейерах. Но есть только 16 блоков LD/ST (Load/Store) и только 4 модуля SFU (Special Function). Итак, когда варп получает инструкцию, которая не поддерживается ALU, варп будет назначаться несколько раз. Например, если для команды требуются единицы SFU, деформация будет назначена на 8 (32/4) раз.

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

1) Используются те же критерии для потоков потоков.

Поскольку архитектура CUDA гарантирует, что все потоки в блоке будут иметь доступ к одной и той же общей памяти, блок никогда не сможет перемещаться между SM. Когда первый бит для блока был запланирован на данном SM, все остальные перекосы в этом блоке будут выполняться на том же SM независимо от того, какие ресурсы станут доступными для других SM.

2) Но, как я уже упоминал, у меня есть инструкция printf и нет общего использования ресурсов, что происходит в этом случае? После выполнения 32 потоков выполняются остальные 32 потока?

Рассматривайте блоки как наборы перекосов, которые гарантированно работают на одном и том же SM. Таким образом, в вашем примере 64 потока (2 искажения) каждого блока будут выполняться на одном и том же SM. На первых часах запланирована первая инструкция одного варпа. На вторых часах эта команда переместила один шаг в конвейеры, чтобы используемый ресурс был свободен принять либо вторую инструкцию из той же самой основы, либо первую команду из второго warp. Поскольку в трубопроводах ALU на Ферми имеется около 20 шагов, 2 перекоса не будут содержать достаточно явного параллелизма для заполнения всех этапов в трубопроводе, и они, вероятно, не будут содержать достаточно ILP.

3) Если у меня также есть y-размер в блоке, тогда какая последовательность? Это первые 32 потока в x-размерности для всех y-размерностей, а затем остальные?

Размеры предназначены только для того, чтобы обеспечить разгрузку генерации индексов 2D и 3D потоков для выделенного оборудования. Планировщики видят блоки как 1D массив перекосов. Порядок, в котором они ищут подходящие основы, не определен. Планировщик будет искать в довольно небольшом наборе «активных» перекосов для основы, которая имеет текущую инструкцию, которая нуждается в ресурсе, который в настоящее время открыт. Когда деформация будет завершена, в активный набор будет добавлен новый. Таким образом, порядок, в котором завершаются перекосы, становится непредсказуемым.

Fermi SM:

Fermi SM

+0

Роджер ответ очень подробно. Могу ли я попросить любые ссылки, откуда вы получили эту информацию. – Psypher

+0

Спасибо, хотя это действительно касается только того, что происходит, на чипе. С течением времени я собирал вещи из разных источников. @GregSmith имеет ряд действительно хороших ответов на SO, которые подробно описывают работу архитектуры. –

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