SIMD-16 и SIMD-32 преимущества / недостатки?
Совсем недавно AMD выпустила новую архитектуру GPU под названием rDNA в своей новой линейке графических процессоров Navi. После прочтения определенной статьи и видео о глубоком погружении в архитектуру я понял следующее (не стесняйтесь исправлять, если я ошибаюсь):
Небольшие рабочие нагрузки, для выполнения которых требуется аналогичная инструкция, называются "потоками".
Затем планировщик организует группу из тех потоков, для которых требуется одна и та же инструкция. В частности, в случае AMD GPU, GCN и рДНК предназначены для обработки 64 и 32 потоков соответственно.
SIMD затем обрабатывает эти кластерные потоки. Но разница в том, что AMD GCN использует SIMD16, что означает, что 16 потоков могут обрабатываться одновременно, а AMD rDNA использует SIMD32, то есть 32 потока могут обрабатываться одновременно.
Все должно работать безупречно, если в GPU есть все 64 потока, которые будут выполняться, но было бы неприятно, если бы ему нужно было выполнить только 1 поток. Таким образом, только 1 векторный модуль SIMD16 действительно делает что-то продуктивное, в то время как остальные три просто пугают.
Изменения в архитектуре означают, что с SIMD32 графический процессор может устранить потенциальную бутылочную горлышко.
Однако каждый из этих источников постоянно повторяет: "Дизайн SIMD16 лучше подходит для вычислительной нагрузки"... Это подняло у меня вопрос:
1) Разве дизайн SIMD32 не лучше всего в SIMD16 во всех отношениях? Если нет, то в чем именно заключается преимущество SIMD16 в вычислительной работе?
2) Для каждых 64 потоков 4 SIMD16 выполняют обработку одновременно или последовательно? Причина, по которой я спрашиваю это, на видео от Engadget изображен процесс как сериализованный, в то время как видео от Linus Tech Tips, похоже, намекает на его параллельность. Это чертовски смутило меня.
Если все последовательно, то почему AMD просто не идет на SIMD64 или что-то еще?
Если все параллельно, то я, честно говоря, вообще не вижу преимущества SIMD. На GCN у вас есть 4 SIMD16, а на рДНК у вас есть 2 SIMD32. Если вы обрабатываете 1 поток в GCN с SIMD16, время запуска 1 SIMD16 должно быть равно времени, когда вы запускаете 4 SIMD16, потому что, опять же, они параллельны. Переходя к 2 SIMD32, время, которое вы обрабатываете 1 SIMD32, должно быть равно времени, которое вы обрабатываете 2 из них. В обоих случаях у вас все еще есть 63 неиспользованных потока. Так в чем смысл точно.
Я знаю, что мое понимание должно быть ошибочным в какой-то момент, поэтому я хотел бы получить несколько глубоких объяснений. Спасибо вам.
1 ответ
Просто длинный комментарий.
В gcn есть только 1 скалярная единица на 4 вектора (длина 16). Но в rdna есть 2 скалярных единицы на 1 вектор (длина 32). Это должно быть серьезным преимуществом в сложных алгоритмах, которые создают давление на скалярную единицу. И эта скалярная единица новее, не так ли? Так что это хорошее решение проблемы с одним потоком вместо того, чтобы ожидать от разработчиков полностью оптимизированной вычислительной нагрузки. Теперь обход дерева может быть лучше?
В gcn каждый 16-значный вектор генерируется за один цикл, а весь gcn - за 4 цикла. 4 цикла на 64 трубопровода. Но в РДНА это 1 цикл на 32 конвейера, поэтому он параллелен. Это, опять же, означает очень хорошее преимущество для некоторых проблем с задержкой. Когда 2 блока работают вместе, это все равно 1 цикл на 64 конвейера, так как они независимы два 32 широких вектора.
До сих пор у нас было в 4 раза больше уловок на "проблемную" производительность и в 8 раз уловки на "скалярных" рабочих нагрузках.
Попадая в параллелизм на уровне потоков, он завершает те же волновые фронты быстрее, чем gcn, с указанными выше преимуществами или без них. Это уменьшает давление регистра. Меньшее давление в регистре обеспечивает запас для большего количества потоков в полете. Это дополнительно увеличено с 1024 регистрами на вектор, что отлично по сравнению с 256 потоками gcn. Больше потоков на линию, более быстрые линии, лучшая система кэширования и т. Д., Это становится быстрее и эффективнее.
Масштабируемость архитектуры, должно быть, остановила их на 32 дорожках вместо 64 128 и т. Д. Или меньше, например 16 8 4. Возможно, наличие 64-полосного вектора не может получить достаточную пропускную способность от кэшей? Я не знаю. Но есть транзисторный бюджет. Где бы вы обрезать, чтобы иметь более широкий simd? Кэш означает меньший или меньший кэш и меньший или меньший кэш на конвейер. Я бы тоже не обрезал скалярную единицу. Возможно текстурирование юнитов и ропов, но геймеры тоже купят это. Проникновение на рынок.
Похоже, они хорошо сыграли на параллелизме на уровне потоков, и им, возможно, не нужно добавлять больше физических потоков в один и тот же вектор. 80 волновых фронтов на двух векторах (когда они работают вместе) уже хороши для tlp, и, таким образом, гораздо больше проблем с ilp стало бы меньшей проблемой сейчас. Создание 16 или 8 широких векторов на одной и той же области потребовало бы 160 потоков в пролете на конвейер. Есть ли 160 уникальных операций на конвейер? Я не знаю. Даже 80 уникальных операций выглядит для меня слишком много. Это все равно, что использовать все математические функции и функции памяти rdna одновременно. Просто предположение.
На данный момент ограничение 80 волновых фронтов означает, что вы можете попытаться использовать до 80 x 2560 рабочих элементов в алгоритме, если есть проблемы с протоколом ilp или другие проблемы. Может быть, не очень полезен в простых алгоритмах, таких как naive nbody, но полезен в таких вещах, как смешанная точность int float string, которые все вычисляются в одном окне инструкций. Возможно, именно поэтому они сказали, что 16wide лучше.
В gcn в конвейере было до 40 потоков на конвейер. Nvidia еще меньше, чем 32 или 16. Теперь в rdna есть 80, и это быстрее. Абсолютно лучше. Но не может быть, когда у вас есть только 2560 частиц в алгоритме nbody. По этой причине запрашиваемая ширина симд 64+ может быть лучше для меньшего количества частиц (возможно). Но по мере увеличения количества частиц, больше tlp выглядит лучше, следовательно, меньше ширина на вычислительную единицу при том же количестве транзисторов.