Привет, я смог понять CTA, который представляет собой совместные массивы потоков. Но что такое CGA? Какая связь между cta и cga. Я не вижу документа, который мог бы объяснить это.
пример опубликованной ссылки: Developer.nvidia.com/blog/… «совместный массив сеток (CGA)»
CGA — это новое дополнение к кооперативным группам в архитектуре Hopper.
Чтобы устранить неоднозначность:
Новая функция кластера блоков потоков обеспечивает программный контроль локальности с степенью детализации, превышающей один блок потоков на одном SM. Это расширяет модель программирования CUDA, добавляя еще один уровень в иерархию программирования, который теперь включает потоки, блоки потоков, кластеры блоков потоков и сетки. Кластеры позволяют нескольким блокам потоков работать одновременно на нескольких SM для синхронизации и совместной выборки и обмена данными.
Досадно, что здесь это называют thread block cluster
, а не cooperative grid array
. А еще в документах Ampere слово cluster
использовалось в другом контексте.
Все эти группировки реализуются с помощью API кооперативных групп.
См.: Кооперативные группы в CUDA
Документация находится здесь: https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cooperative-groups
Сообщение в блоге находится здесь: https://developer.nvidia.com/blog/cooperative-groups/
CGA
конкретно упоминается в техническом блоке новых возможностей CUDA 12 (для Hopper), а именно:
Поддержка встроенных функций C для смягчения барьеров кооперативного массива сетки (CGA).
Они описаны здесь в руководстве по программированию CUDA как:
Функции-члены барьера_arrive и барьер_ожидания были добавлены для Grid_group и Thread_block. Описание API доступно здесь.
Эти барьеры имеют большое значение, потому что именно так потоки могут синхронизироваться, что жизненно важно для их гармоничного сотрудничества. Мы всегда могли бы сделать это через глобальную память, но это должно проходить через кеш L2 (200 циклов) или даже через основную память (500 циклов). В Hopper это может проходить через специальную матричную шину между общей памятью (которая представляет собой кэш L1), что обеспечивает гораздо более быструю связь.
Данное нововведение реализуется следующим образом. В Ampere и более ранних версиях каждый SM (он же блок) имеет свою собственную общую область памяти. Однако в Hopper каждый SM может получить доступ к общей памяти любого другого SM, что NVidia называет cluster
. Это обеспечивает очень эффективную межблочную связь между SM. Эти новые барьеры реализуются с помощью быстрого доступа к общей памяти между блоками кластера.
Этот механизм доступа к общей памяти других блоков не описан в руководстве по программированию CUDA, но подробно описан в документации PTX ISA.
В руководстве по программированию CUDA он скрыт в разделе memcpy_async
.
*) В Volta и более поздних версиях потоки в варпе могут расходиться, но это требует больших вычислительных затрат.
Спасибо. Кстати, ты знаешь, что такое? Я знаю, что smem->общая память, gmem->глобальная память, rmem->регистровая память. Но что такое?
кооперативный массив сетки.....