Single instructions, multiple threads ( SIMT ) — это модель выполнения, используемая в параллельных вычислениях , где single instructions, multiple data (SIMD) сочетается с многопоточностью . Она отличается от SPMD тем, что все инструкции во всех «потоках» выполняются в режиме lock-step. Модель выполнения SIMT реализована на нескольких графических процессорах и актуальна для вычислений общего назначения на графических процессорах (GPGPU), например, некоторые суперкомпьютеры объединяют центральные процессоры с графическими процессорами.
Процессоры, скажем, число p из них, по-видимому, выполняют гораздо больше, чем p задач. Это достигается тем, что каждый процессор имеет несколько "потоков" (или "рабочих элементов" или "последовательности операций SIMD-полосы"), которые выполняются в синхронном режиме и аналогичны полосам SIMD . [1]
Самый простой способ понять SIMT — представить себе многоядерную систему, в которой каждое ядро имеет свой собственный файл регистров, свои собственные АЛУ (как SIMD, так и скалярные) и свой собственный кэш данных, но в отличие от стандартной многоядерной системы, которая имеет несколько независимых кэшей инструкций и декодеров, а также несколько независимых регистров счетчика программ, инструкции синхронно транслируются на все ядра SIMT из одного блока с одним кэшем инструкций и одним декодером инструкций, который считывает инструкции с помощью одного счетчика программ.
Ключевое различие между полосами SIMT и SIMD заключается в том, что каждое из ядер SIMT может иметь совершенно разный указатель стека (и, таким образом, выполнять вычисления с совершенно разными наборами данных), тогда как полосы SIMD являются просто частью АЛУ, которое ничего не знает о памяти как таковой.
SIMT была представлена компанией Nvidia в микроархитектуре графического процессора Tesla с чипом G80. [2] [3] ATI Technologies , ныне AMD , выпустила конкурирующий продукт немного позже, 14 мая 2007 года, — графический процессор «R600» на базе TeraScale 1 .
Поскольку время доступа всех распространенных типов оперативной памяти (например, DDR SDRAM , GDDR SDRAM , XDR DRAM и т. д.) все еще относительно велико, инженеры придумали идею скрыть задержку, которая неизбежно возникает при каждом доступе к памяти. Строго говоря, скрытие задержки является особенностью планирования с нулевыми накладными расходами, реализованного в современных графических процессорах. Это может считаться или не считаться свойством самого «SIMT».
SIMT предназначен для ограничения накладных расходов на выборку инструкций [4] , т. е. задержки, возникающие при доступе к памяти, и используется в современных графических процессорах (например, Nvidia и AMD ) в сочетании со «скрытием задержки» для обеспечения высокопроизводительного выполнения, несмотря на значительную задержку в операциях доступа к памяти. Это когда процессор перегружен вычислительными задачами и может быстро переключаться между задачами, когда в противном случае ему пришлось бы ждать памяти. Эта стратегия сопоставима с многопоточностью в ЦП (не путать с многоядерностью ). [5] Как и в случае с SIMD, еще одним важным преимуществом является совместное использование логики управления многими полосами данных, что приводит к увеличению плотности вычислений. Один блок логики управления может управлять N полосами данных, вместо того чтобы копировать логику управления N раз.
Недостатком выполнения SIMT является тот факт, что поток-специфичный поток управления выполняется с использованием «маскирования», что приводит к плохому использованию, когда потоки процессора следуют разным путям потока управления. Например, для обработки блока IF - ELSE , где различные потоки процессора выполняют разные пути, все потоки должны фактически обрабатывать оба пути (так как все потоки процессора всегда выполняются в блокировке), но маскирование используется для отключения и включения различных потоков по мере необходимости. Маскирование избегается, когда поток управления является согласованным для потоков процессора, т. е. все они следуют одному и тому же пути выполнения. Стратегия маскирования — это то, что отличает SIMT от обычного SIMD, и имеет преимущество недорогой синхронизации между потоками процессора. [6]
Nvidia CUDA | OpenCL | Хеннесси и Паттерсон [7] |
---|---|---|
Нить | Рабочий элемент | Последовательность операций SIMD Lane |
Варп | Фронт волны | Поток инструкций SIMD |
Блокировать | Рабочая группа | Тело векторизованного цикла |
Сетка | NDRange | Векторизованный цикл |