docs: add section on vector and supercomputers, including compiler optimizations

This commit is contained in:
Andrew 2025-12-08 20:20:14 +07:00
parent 8a25539f91
commit b1e278944e
2 changed files with 122 additions and 0 deletions

View file

@ -171,6 +171,46 @@ Lisp позже повлияли на Python (list comprehensions), JavaScript (
#pagebreak()
= Векторные- и суперкомпьютеры
== Концепция векторных вычислений
Векторные вычисления представляют собой фундаментальную ступень развития высокопроизводительных вычислительных систем, которая позволила достичь качественного скачка в производительности при решении задач, требующих обработки больших однородных массивов данных.
=== Суперкомпьютеры Cray и становление векторной обработки
Компания Cray Research, основанная Сеймуром Креем в 1972 году, стала пионером в области векторных суперкомпьютеров. Первая машина серии Cray-1, представленная в 1976 году, продемонстрировала революционный подход к организации вычислений@noauthor__nodate. Архитектура системы была построена на принципе конвейерной обработки векторных данных, что позволяло выполнять одну операцию над множеством элементов данных одновременно. Главная память машины состояла из 16 независимых блоков по 64 тысячи машинных слов каждый, а 12 функциональных модулей позволяли выполнять логические, скалярные и векторные операции над этими данными с высокой степенью параллелизма.
Ключевое преимущество векторной архитектуры заключалось в том, что одна векторная инструкция заменяла целый цикл скалярных операций. Это сокращало количество необходимых к исполнению команд и устраняло накладные расходы на управление циклами. Для научных и инженерных расчетов, где типичными являются операции с матрицами и массивами данных, такой подход обеспечивал многократное ускорение по сравнению со скалярными процессорами того времени.
=== Модель SIMD как основа векторизации
Концептуальной основой векторных вычислений стала модель SIMD, сформулированная в таксономии Флинна@flynn_very_1966. В своей ранней реализации эта модель предполагала, что один поток команд управляет обработкой множества потоков данных параллельно. Векторный процессор фактически реализовывал данную парадигму аппаратно: единственная векторная инструкция запускала идентичную операцию над всеми элементами векторного регистра.
Важно отметить, что ранняя форма SIMD в векторных суперкомпьютерах и современные векторные расширения процессоров существенно отличаются. Векторные машины работали с векторами переменной длины и обладали специализированными конвейерами для различных типов операций, а SIMD-расширения современных процессоров оперируют фиксированными по размеру векторами для исполнения этих операций ничего кроме самого процессора не требуется.
=== Векторные расширения в языке Fortran
Параллельно с развитием аппаратных векторных систем происходила эволюция программных средств, позволяющих эффективно использовать возможности векторной обработки@chang_support_2004. Язык Fortran в стандарте Fortran 90 получил расширение в виде конструкции для работы с массивами как с едиными объектами, что позволяло программистам того времени выражать векторные операции в знакомой математической нотации.
Компиляторы Fortran получили возможность автоматической векторизации циклов, распознавая паттерны кода, которые могли быть преобразованы в векторные инструкции@allen_automatic_1987. Это означало, что существующий код мог быть оптимизирован для векторных архитектур без полного переписывания, хотя наибольшая эффективность достигалась при использовании явных векторных конструкций языка. Появление директив компилятора также позволило программистам явно управлять процессом векторизации, указывая компилятору на возможности параллелизма в коде.
Развитие векторных вычислений заложило основу для современных параллельных архитектур и продолжает оставаться актуальным в контексте современных процессоров с SIMD-расширениями и графических ускорителей, использующих сходные принципы обработки данных.
== Новые компиляторные оптимизации
Параллельно с развитием векторных архитектур происходила модернизация в технологиях компиляции, направленная на максимальное использование возможностей современного оборудования. Компиляторы превращались из простых трансляторов высокоуровневого кода в машинный в сложные системы оптимизации, способные радикально трансформировать программу для достижения максимальной производительности.
Центральной задачей стала векторизация циклов. Компиляторы научились анализировать структуру циклов и определять, можно ли безопасно преобразовать последовательные итерации в единую векторную операцию. Для успешной векторизации цикла компилятору необходимо доказать, что между итерациями отсутствуют зависимости, так как в обратном случае применение векторных оперций приведёт к некорректным результатам вычисления.
Неполное разворачивание циклов стало одной из ключевых техник оптимизации -- компилятор мог группировать несколько итераций цикла, что давало ему возможность переупорядочить инструкции и уже затем, возможно, заменить их векторными операциями. Цикл всё ещё присутствует, но он может быть значительно меньше оригинального варианта.
Компиляторы, такие как для TI ASC и Cray Fortran, анализировали циклы на отсутствие зависимостей данных между итерациями, чтобы преобразовать последовательный код в векторные операции@morgan_compiling_2018. Это обеспечивало безопасность параллелизма без изменения результатов программы. Методы включали решение систем диофантовых уравнений для доказательства независимости.
Программисты использовали директивы (например, Cray VECTOR directives@noauthor_vectorization_nodate) для подсказок компилятору о безопасной векторизации при неполном статическом анализе. Межпроцедурный анализ учитывал вызовы функций для глобальной векторизации, как в Convex Application Compiler. Эти нововведения легли в основу современных компиляторов.
#pagebreak()
#align(
center,
pad(
@ -188,6 +228,8 @@ HPC (High-Performance Computing) -- высокопроизводительные
GPU (Graphics Processing Unit) -- графический процессор
SIMD (Single Instruction, Multiple Data) -- вычислительный подход, когда одна инструкция исполняется над некоторым массивом данных в один проход
#pagebreak()
#align(

View file

@ -99,3 +99,83 @@
author = {Hecht, Matthew S.},
year = {1977},
}
@misc{noauthor__nodate,
title = {Архитектура {Cray}-1 {\textbar} {PARALLEL}.{RU} - Информационно-аналитический центр по параллельным вычислениям},
url = {https://parallel.ru/history/cray1.html},
urldate = {2025-12-08},
}
@article{flynn_very_1966,
title = {Very high-speed computing systems},
volume = {54},
copyright = {https://ieeexplore.ieee.org/Xplorehelp/downloads/license-information/IEEE.html},
issn = {0018-9219},
url = {http://ieeexplore.ieee.org/document/1447203/},
doi = {10.1109/PROC.1966.5273},
number = {12},
urldate = {2025-12-08},
journal = {Proceedings of the IEEE},
author = {Flynn, M.J.},
year = {1966},
pages = {1901--1909},
}
@article{chang_support_2004,
title = {Support and optimization for parallel sparse programs with array intrinsics of {Fortran} 90},
volume = {30},
copyright = {https://www.elsevier.com/tdm/userlicense/1.0/},
issn = {01678191},
url = {https://linkinghub.elsevier.com/retrieve/pii/S0167819104000286},
doi = {10.1016/j.parco.2004.02.004},
language = {en},
number = {4},
urldate = {2025-12-08},
journal = {Parallel Computing},
author = {Chang, Rong-Guey and Chuang, Tyng-Ruey and Lee, Jenq Kuen},
month = apr,
year = {2004},
pages = {527--550},
}
@article{allen_automatic_1987,
title = {Automatic translation of {FORTRAN} programs to vector form},
volume = {9},
issn = {0164-0925, 1558-4593},
url = {https://dl.acm.org/doi/10.1145/29873.29875},
doi = {10.1145/29873.29875},
abstract = {The recent success of vector computers such as the Cray-1 and array processors such as those manufactured by Floating Point Systems has increased interest in making vector operations available to the FORTRAN programmer. The FORTRAN standards committee is currently considering a successor to FORTRAN 77, usually called FORTRAN 8x, that will permit the programmer to explicitly specify vector and array operations.
Although FORTRAN 8x will make it convenient to specify explicit vector operations in new programs, it does little for existing code. In order to benefit from the power of vector hardware, existing programs will need to be rewritten in some language (presumably FORTRAN 8x) that permits the explicit specification of vector operations. One way to avoid a massive manual recoding effort is to provide a translator that discovers the parallelism implicit in a FORTRAN program and automatically rewrites that program in FORTRAN 8x.
Such a translation from FORTRAN to FORTRAN 8x is not straightforward because FORTRAN DO loops are not always semantically equivalent to the corresponding FORTRAN 8x parallel operation. The semantic difference between these two constructs is precisely captured by the concept of
dependence
. A translation from FORTRAN to FORTRAN 8x preserves the semantics of the original program if it preserves the dependences in that program.
The theoretical background is developed here for employing data dependence to convert FORTRAN programs to parallel form. Dependence is defined and characterized in terms of the conditions that give rise to it; accurate tests to determine dependence are presented; and transformations that use dependence to uncover additional parallelism are discussed.},
language = {en},
number = {4},
urldate = {2025-12-08},
journal = {ACM Transactions on Programming Languages and Systems},
author = {Allen, Randy and Kennedy, Ken},
month = oct,
year = {1987},
pages = {491--542},
}
@misc{morgan_compiling_2018,
title = {Compiling {History} {To} {Understand} {The} {Future}},
url = {https://www.nextplatform.com/2018/11/02/compiling-history-to-understand-the-future/},
abstract = {If you want to understand where we are going with computer architectures and the compilers that drive them, it is instructive to look at how compilers},
language = {en-US},
urldate = {2025-12-08},
journal = {The Next Platform},
author = {Morgan, Timothy Prickett},
month = nov,
year = {2018},
}
@misc{noauthor_vectorization_nodate,
title = {Vectorization {Directives} {\textbar} {Cray} {Fortran} {Reference} {Manual} 8.{7A} {S}-3901},
url = {https://support.hpe.com/hpesc/public/docDisplay?docId=a00113909en_us&page=Vectorization_Directives.html&docLocale=en_US},
urldate = {2025-12-08},
}