Таксономия Флинна — это классификация компьютерных архитектур , предложенная Майклом Дж. Флинном в 1966 году [1] и расширенная в 1972 году. [2] Система классификации закрепилась и использовалась в качестве инструмента при проектировании современных процессоров и их функциональных возможностей. С появлением многопроцессорных центральных процессоров (ЦП) контекст многопрограммирования развился как расширение системы классификации. Векторная обработка , охватываемая таксономией Дункана , [3] отсутствует в работе Флинна, поскольку Cray-1 был выпущен в 1977 году: вторая статья Флинна была опубликована в 1972 году.
Четыре первоначальные классификации, определенные Флинном, основаны на количестве параллельных потоков инструкций (или управления) и потоков данных, доступных в архитектуре. [4] Флинн определил три дополнительные подкатегории SIMD в 1972 году. [2]
Последовательный компьютер, который не использует параллелизм ни в потоках инструкций, ни в потоках данных. Один блок управления (CU) извлекает из памяти один поток инструкций (IS). Затем CU генерирует соответствующие сигналы управления, чтобы направить один процессорный элемент (PE) на работу с одним потоком данных (DS), т. е. одну операцию за раз.
Примерами архитектур SISD являются традиционные однопроцессорные машины, такие как старые персональные компьютеры (ПК) (к 2010 году многие ПК имели несколько ядер) и мэйнфреймы .
Одна инструкция одновременно применяется к нескольким различным потокам данных. Инструкции могут выполняться последовательно, например, конвейеризацией, или параллельно несколькими функциональными блоками. В статье Флинна 1972 года SIMD подразделяется на три дополнительные категории: [2]
Современный термин для процессора массива — « одна инструкция, несколько потоков » (SIMT). Это отдельная классификация в таксономии Флинна 1972 года как подкатегория SIMD. Она идентифицируется по параллельным подэлементам, имеющим собственный независимый регистровый файл и память (кэш и память данных). В оригинальных работах Флинна приводятся два исторических примера процессоров SIMT: SOLOMON и ILLIAC IV .
Nvidia обычно использует этот термин в своих маркетинговых материалах и технических документах, где она доказывает новизну своей архитектуры. [6] SOLOMON опередил Nvidia более чем на 60 лет.
Aspex Microelectronics Associative String Processor (ASP) [7] в своих маркетинговых материалах классифицировал себя как «массивный широкий SIMD», но имел битовые ALU и битовую предикацию (таксономия Флинна: ассоциативная обработка), и каждый из 4096 процессоров имел свои собственные регистры и память (таксономия Флинна: обработка массивов). Linedancer, выпущенный в 2010 году, содержал 4096 2-битовых предицированных SIMD ALU, каждое со своей собственной адресуемой по содержимому памятью , и был способен выполнять 800 миллиардов инструкций в секунду. [8] Aspex ASP associative array SIMT процессор предшествовал NVIDIA на 20 лет. [9] [10]
В то время, когда Флинн написал свою статью 1972 года, многие системы использовали основную память как ресурс, из которого конвейеры читали и писали. Когда ресурс, из которого все «конвейеры» читают и пишут, является файлом регистра, а не основной памятью, получаются современные варианты SIMD. Примерами являются Altivec , NEON и AVX .
Альтернативное название для этого типа SIMD на основе регистров - "упакованный SIMD" [11] и еще одно - SIMD в регистре (SWAR) . Когда применяется предикация, она становится ассоциативной обработкой (ниже)
Современный термин для ассоциативного процессора — « предикативный » (или маскированный) SIMD. Примеры включают AVX-512 .
Некоторые современные разработки ( в частности, графические процессоры ) используют черты более чем одной из этих подкатегорий: современные графические процессоры являются SIMT, но также являются ассоциативными, то есть каждый элемент обработки в массиве SIMT также предицируется.
Несколько инструкций работают с одним потоком данных. Это необычная архитектура, которая обычно используется для обеспечения отказоустойчивости. Гетерогенные системы работают с одним и тем же потоком данных и должны согласовывать результаты. Примерами служат компьютер управления полетом Space Shuttle . [12]
Несколько автономных процессоров одновременно выполняют различные инструкции на различных данных. Архитектуры MIMD включают многоядерные суперскалярные процессоры и распределенные системы , использующие либо одно общее пространство памяти, либо распределенное пространство памяти.
Эти четыре архитектуры показаны ниже визуально. Каждый процессорный блок (PU) показан для одноядерного или многоядерного компьютера:
По состоянию на 2006 год [update]все 10 лучших и большинство суперкомпьютеров TOP500 основаны на архитектуре MIMD.
Хотя это и не является частью работы Флинна, некоторые далее делят категорию MIMD на две категории ниже, [13] [14] [15] [16] [17] и иногда рассматриваются даже более поздние подразделения. [18]
Несколько автономных процессоров одновременно выполняют одну и ту же программу (но в независимых точках, а не в режиме lockstep , который накладывает SIMD) на разных данных. Также называется одиночным процессом, множественными данными [17] — использование этой терминологии для SPMD технически неверно, поскольку SPMD — это модель параллельного выполнения, предполагающая выполнение программы несколькими взаимодействующими процессорами. SPMD — наиболее распространенный стиль явного параллельного программирования. [19] Модель SPMD и термин были предложены Фредерикой Даремой из команды RP3. [20]
Несколько автономных процессоров одновременно работают по крайней мере с двумя независимыми программами. В контексте HPC такие системы часто выбирают один узел в качестве «хоста» («явная модель программирования хост/узел») или «менеджера» (стратегия «менеджер/работник»), который запускает одну программу, которая передает данные всем остальным узлам, которые запускают вторую программу. Затем эти другие узлы возвращают свои результаты непосредственно менеджеру. Примером этого может служить игровая консоль Sony PlayStation 3 с ее процессором SPU/PPU .
MPMD распространен в не-HPC-контекстах. Например, система сборки make может создавать несколько зависимостей параллельно, используя целевые программы в дополнение к самому исполняемому файлу make. MPMD также часто принимает форму конвейеров. Простая команда оболочки Unix, например ls | grep "A" | more, запускает три процесса, выполняющих отдельные программы параллельно, при этом вывод одного из них используется в качестве ввода для следующего.
Оба они отличаются от явного параллельного программирования, используемого в HPC, тем, что отдельные программы являются общими строительными блоками, а не реализуют часть конкретного параллельного алгоритма. В подходе конвейеризации объем доступного параллелизма не увеличивается с размером набора данных.