Как планировщики деформации графического процессора nVIDIA CC 2.1 выдают по две инструкции за один раз?
Примечание. Этот вопрос относится только к устройствам nVIDIA Compute Capability 2.1. Следующая информация получена из Руководства по программированию CUDA v4.1:
В вычислительных возможностях 2.1 устройства каждый SM имеет 48 SP (ядер) для целочисленных операций и операций с плавающей запятой. Каждая основа состоит из 32 последовательных нитей. Каждый SM имеет 2 планировщика основы. При каждом выпуске инструкций один планировщик деформации выбирает готовую деформацию потоков и выдает 2 инструкции для деформации на ядрах.
Мои сомнения:
- Один поток будет выполняться на одном ядре. Как устройство может выдать 2 инструкции потоку за один такт или одну многоцикловую операцию?
- Означает ли это, что 2 инструкции должны быть независимы друг от друга?
- Что две инструкции могут выполняться параллельно на ядре, возможно, потому что они используют разные исполнительные блоки в ядре? Означает ли это также, что варп будет готов следующим только после того, как будут выполнены 2 инструкции, или это после одной из них?
1 ответ
Это параллелизм на уровне команд (ILP). Инструкции, выдаваемые одновременно из основы, должны быть независимы друг от друга. Они выдаются планировщиком команд SM для разделения функциональных блоков в SM.
Например, если в потоке команд деформации есть две независимые инструкции FMAD, которые готовы к выдаче, а у SM есть два доступных набора единиц FMAD, для которых их можно выдать, обе они могут быть выполнены в одном и том же цикле. (Инструкции могут издаваться вместе в различных комбинациях, но я их не запомнил, поэтому не буду здесь подробно описывать.)
Единицы исполнения FMAD/IMAD в SM 2.1 имеют ширину 16 SP. Это означает, что требуется 2 цикла, чтобы выдать команду деформации (32 потока) для одного из 16 блоков выполнения. Существует несколько (3) из этих 16 исполнительных блоков шириной (всего 48 SP) на SM, а также специальные функциональные блоки. Каждый планировщик деформации может выдавать до двух из них за цикл.
Предположим, что исполнительные блоки FMAD pipe_A
, pipe_B
а также pipe_C
, Допустим, что в цикле 135 есть две независимые инструкции FMAD fmad_1
а также fmad_2
которые ждут:
- В цикле 135 планировщик команд выдаст первую половину деформации (16 потоков)
fmad_1
в FMADpipe_A
и первая половина основыfmad_2
в FMADpipe_B
, - В цикле 136 первая половина деформации
fmad_1
перейдет к следующему этапу в FMADpipe_A
и аналогично первой половине деформацииfmad_2
перейдет к следующему этапу в FMADpipe_B
, Планировщик деформации теперь выдает вторую половину деформацииfmad_1
в FMADpipe_A
и вторая половина перекосаfmad_2
в FMADpipe_B
,
Таким образом, требуется 2 цикла для выдачи 2 инструкций из одной и той же основы. Но, как упоминает OP, есть два планировщика деформации, что означает, что весь этот процесс может выполняться одновременно для инструкций из другого деформации (при условии, что имеется достаточно функциональных единиц). Следовательно, максимальная скорость выдачи составляет 2 инструкции деформации за цикл. Обратите внимание, что это абстрагированное представление для точки зрения программиста - фактические детали архитектуры низкого уровня могут отличаться.
Что касается вашего вопроса о том, когда варп будет готов следующим, если есть больше инструкций, которые не зависят от каких-либо невыполненных (уже выпущенных, но не вышедших из строя) инструкций, то они могут быть выпущены в следующем цикле. Но как только единственные доступные инструкции зависят от инструкций в полете, деформация не сможет быть выполнена. Однако именно здесь появляются другие деформации - SM может выдавать инструкции для любого резидента, имеющего доступные (не блокированные) инструкции. Это произвольное переключение между перекосами - это то, что обеспечивает "скрытие задержки", от которого зависят графические процессоры для высокой пропускной способности.