Подтвердить что ты не робот

Помогите мне понять куду

У меня возникли проблемы с пониманием потоков в архитектуре NVIDIA gpu с cuda. ​​

Пожалуйста, кто-нибудь может прояснить эту информацию: 8800 gpu имеет 16 SM с 8 SP каждый. поэтому у нас есть 128 SP.

Я просматривал презентацию в формате stanford, и он говорил, что каждый SP способен выполнять 96 потоков одновременно. означает ли это, что он (SP) может запускать 96/32 = 3 перекоса одновременно?

Кроме того, поскольку каждый SP может запускать 96 потоков, и у нас есть 8 SP в каждом SM. означает ли это, что каждый SM может запускать 96 * 8 = 768 потоков одновременно? но если каждый SM может запускать один блок за раз, а максимальное количество потоков в блоке равно 512, то какова цель одновременного запуска потоков 768 и имеет максимум 512 потоков?

более общий вопрос: как блоки, потоки и перекосы распределяются по SM и SP? я читаю, что каждый SM получает один блок для выполнения за один раз, а потоки в блоке делятся на warps (32 потока), а SPs выполняют warps.

4b9b3361

Ответ 1

Вы должны проверить веб-семинары на веб-сайте NVIDIA, вы можете присоединиться к живому сеансу или просмотреть предварительно записанные сеансы. Ниже приведен краткий обзор, но я настоятельно рекомендую вам смотреть веб-семинары, они действительно помогут, поскольку вы можете увидеть диаграммы и объяснить это в то же время.

Когда вы выполняете функцию (ядро) на графическом процессоре, она выполняется как сетка блоков потоков.

  • Нить - лучшая степень детализации, каждый поток имеет уникальный идентификатор в блоке (threadIdx), который используется для выбора данных для работы. Поток может иметь относительно большое количество регистров, а также иметь частную область памяти, известную как локальная память, которая используется для пролистывания файла регистров и любых больших автоматических переменных.
  • Блок представляет собой группу потоков, которые выполняются вместе в пакете. Основная причина такого уровня детализации заключается в том, что потоки внутри блока могут взаимодействовать посредством обмена данными с использованием быстрой общей памяти. Каждый блок имеет уникальный идентификатор (blockIdx), который в сочетании с threadIdx используется для выбора данных.
  • Сетка представляет собой набор блоков, которые вместе выполняют операцию GPU.

Это логическая иерархия. Вам действительно нужно понять логическую иерархию для реализации функции на графическом процессоре, однако для получения производительности вам необходимо понять аппаратное обеспечение, которое является SM и SP.

Графический процессор состоит из SM, и каждый SM содержит несколько SP. В настоящее время существует 8 SP для каждого SM и от 1 до 30 SM на GPU, но действительно фактическое число не является серьезной проблемой, пока вы не получите действительно продвинутый.

Первое, что нужно учитывать для производительности, - это перекос. Warp представляет собой набор из 32 потоков (если у вас есть 128 потоков в блоке (например), то потоки 0-31 будут в одном деформировании, 32-63 в следующем и т.д. Деформации очень важны по нескольким причинам, самое важное:

  • Потоки внутри деформации связаны друг с другом, если один поток внутри warp спускается с "if" стороны блока if-else, а остальные спускаются по "else", тогда фактически все 32 потока спускаются с обеих сторон, Функционально нет проблем, те потоки, которые не должны были принимать ветку, отключены, поэтому вы всегда получите правильный результат, но если обе стороны длинны, то важно оценить производительность.
  • Потоки внутри warp (на самом деле половина warp, но если вы правильно это сделаете для перекосов, тогда вы тоже в безопасности для следующего поколения) извлеките данные из памяти вместе, поэтому, если вы можете гарантировать, что все потоки будут извлекать данные в том же "сегменте", то вы заплатите только одну транзакцию памяти, и если все они будут выбраны из случайных адресов, вы заплатите 32 транзакции памяти. Подробнее об этом см. В разделе Advanced CUDA C, но только когда вы будете готовы!
  • Потоки внутри warp (опять-таки полурефлектор на текущих графических процессорах) совместно используют общую память, и если вы не будете осторожны, у вас появятся "банковские конфликты", где потоки должны стоять в очереди друг за другом, чтобы получить доступ к памяти.

Итак, поняв, что такое деформация, конечной точкой является то, как блоки и сетка отображаются на графический процессор.

Каждый блок запускается на одном SM и останется там до его завершения. Как только он завершится, он уйдет в отставку, и на SM будет запущен другой блок. Это динамическое планирование, которое дает GPU масштабируемость - если у вас есть один SM, тогда все блоки работают на одном SM в одной большой очереди, если у вас есть 30 SM, тогда блоки будут плавно распределяться по SM. Поэтому вы должны убедиться, что при запуске функции GPU ваша сетка состоит из большого количества блоков (не менее сотен), чтобы обеспечить масштабирование на любом графическом процессоре.

Конечная точка заключается в том, что SM может выполнять более одного блока в любой момент времени. Это объясняет, почему SM может обрабатывать 768 потоков (или более на некоторых графических процессорах), в то время как блок имеет только до 512 потоков (в настоящее время). По существу, если SM имеет доступные ресурсы (регистры и разделяемая память), тогда он будет принимать дополнительные блоки (до 8). Таблица электронных таблиц окклюзии (включенная в SDK) поможет вам определить, сколько блоков может выполнить в любой момент.

Извините за свалку мозга, посмотрите веб-семинары - это будет проще!

Ответ 2

Сначала это немного запутывает, но помогает понять, что каждый SP делает что-то вроде 4-way SMT - он циклически проходит через 4 потока, выдавая одну инструкцию за такт, с задержкой в ​​4 цикла для каждой команды. Итак, как вы получите 32 потока на warp, работающих на 8 SP.

Вместо того, чтобы перебирать все остальное с помощью перекосов, блоков, потоков и т.д., я отсылаю вас к nVidia CUDA Forums, где этот вопрос возникает регулярно, и есть уже некоторые хорошие объяснения.