Помоги мне понять Cuda - PullRequest
       19

Помоги мне понять Cuda

16 голосов
/ 05 февраля 2010

У меня проблемы с пониманием потоков в архитектуре NVIDIA GPU с помощью cuda. ​​

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

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

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

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

Ответы [ 2 ]

55 голосов
/ 06 февраля 2010

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

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 05 февраля 2010

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

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

...