Ответ 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) поможет вам определить, сколько блоков может выполнить в любой момент.
Извините за свалку мозга, посмотрите веб-семинары - это будет проще!