Вопрос про Warp

Здравствуйте!

Просветите, пожалуйста по вопросу о работе CUDA.

Как я понял из документации (Programming Guide от NVIDIA), что мультипроцессор выбирает из сетки (grid) и исполняет последовательно один блок за другим. Исполняемый блок является активным, внутри активного блока имеются исполняющиеся потоки, собранные в группы, называющиеся Warps. И именно, warps обрабатывается мультипроцессором параллельно в пределах мультипроцессора. Набор таких warps со всех мультипроцессоров образует временной срез.

Но я не понял, действительно ли параллельно исполняются потоки внутри warps или они только синхронизируются и возможна скрытая очередь?

Ведь в руководстве сказано, что максимальное количество этих варпов = 32, а в мультипроцессор, например, для 8800 GTX или GTS (на чипе G92) (16 мультипроцессоров, всего 128 потоковых процессоров) входит 8 потоковых процессоров, имеющих общую разделяемую (shared) память и механизм синхронизации потоков. И вроде бы, по крайней мере, на момент публикации руководства, не было чипов от Nvidia с более чем 8-ми процессорами в мультипроцессоре. Откуда 32 потока взялось?

И ещё один вопрос. Не пойму, что происходит в чипах от NVIDIA, если SIMD потоки из-за наличия условных инструкций (if и др.) разделяются. Из-за этого сразу часть потоков встаёт в очередь и резко проседает производительность или может как-то хитро обходиться?

Forums: 

Извиняюсь, неточно

Извиняюсь, неточно выразился.

"что максимальное количество этих варпов = 32," следует читать как "что максимальное количество потоков в варпе = 32"

Не понимаю, вроде ответил, а

Не понимаю, вроде ответил, а куда делся ответ.... придется повторно, и наверное лучше в другом порядке.

1. CUDA - это SIMD, во всех threads одного Warp исполняется одна и та же инструкция.
Поэтому с if действительно возможно проседание производительности - если исполнение разошлось, то это эквиалентно тому, что у вас стало два Warp вместо одного, а загрузка - неполная.

Это немного лечится предикатными инструкциями, смысл которых в том, что "если предикат верен - исполняем инструкцию, иначе nop" т.е. конструкции вида
if(a>b)
c++;
будут работать с полной скоростью. А вот с более длинными телами if - все хуже

Про это у Кирка написано в презентации (в 10-й из этого списка:
http://courses.ece.uiuc.edu/ece498/al1/Syllabus.html)

2. Про исполнение.
Warp из 32 тредов исполняется на одном мультипроцессоре (8SP+2SFU), как я понимаю - за 4 такта. При этом, это SIMD - т.е. у всех исполняемых потоков одного варпа - исполняется одна и та же инструкция.

Спасибо за ответ! Кое-что

Спасибо за ответ!

Кое-что прояснилось. Хотя по поводу 4-х тактов не на 100% понял. Более одного такта нужны мультипроцессору для любого количества тредов в Warp (хоть для одного) или только когда их больше 8?

P.S. Удалиться ответ мог из-за нечаянного автообновления страницы перед постингом. У меня первый вариант сообщения тоже не сохранился :)

Как я понимаю, там есть

Как я понимаю, там есть задержка доступа к shared memory (и к регистрам), поэтому если нет второй половинки, то должны просто простаивать.

Но в этом месте у меня тоже путаница в голове. Одна из проблем связана с тем, что совершенно непонятно какие такты имеются в виду в документации и презентациях- внешние или внутренние (а разница вдвое). Я даже спрашивал NVidia об этом, но ответ уже забыл

mrshurik

по документации 4 такта обрабатывается 32 потока (warp). но реально за 4 такта обрабатывается 4 разных warp, в каждом успевает обработать по 8 потоков. разные warp переключаются каждый такт, это даёт возможность маскировать задержки памяти.

не обязательно 4 разных

не обязательно 4 разных ворпа. 98% пиковой арифметической пропускной способности можно выжать и всего на 2х ворпах на мультипроцессор. Но меньше 2х навряд ли получится, по всей видимости из-за особенностей строения файла регистров.

Гранулярность обработки потоков по-моему всё таки 16, а не 8. На это указывают особенности доступа к различным видам памяти.

Кроме задержек памяти есть ещё задержки конвейера. Они правда достаточно маленькие чтобы получалось обходить их одним параллелизмом уровня инструкций.

имеется ввиду не логические

для 8800 в один текстурный кластер входят 2 мультипроцессора, каждый 8-word SIMD + local store. это даёт грануляцию 8.

не уверен, что 8 SP на

не уверен, что 8 SP на мультипроцессор нужно понимать как 8-way SIMD. Это даёт лишь пропускную способность для некоторого подмножества операций, пусть и подавляющего. Другие операции идут через конвейеры SFU, и, насколько я понимаю, количество SP для этих операций вообще не релевантно.