docs: add GPGPU, CUDA, OpenCL historical section with references

This commit is contained in:
Andrew 2025-12-08 23:11:02 +07:00
parent de5fba4b2d
commit 1a7a00609a
2 changed files with 100 additions and 0 deletions

View file

@ -257,6 +257,38 @@ OpenMP появился как дополнение к MPI -- в этой биб
#pagebreak()
= Появление GPGPU и ломка парадигм
== Исторические предпосылки
К началу 2000-х годов графические процессоры превратились в высокоспециализированные устройства, предназначенные исключительно для обработки графики и визуализации. Их архитектура развивалась по траектории, радикально отличавшейся от центральных процессоров: вместо сложных систем предсказания ветвлений и многоуровневых кэшей GPU делали ставку на массовый параллелизм. Типичный графический процессор того времени содержал десятки -- затем и сотни -- простых вычислительных ядер, способных одновременно обрабатывать множество пикселей или вершин геометрии.
Ключевой концепцией стала модель SIMT (Single Instruction, Multiple Threads), которая представляла собой эволюцию классической SIMD-архитектуры. Ключевым различием между SIMD и SIMT является "строгое исполнение" (lockstep execution) -- что означает выполнение одного и того же выражения (инструкции) всеми процессорами одновременно. Эта модель идеально подходила для графических задач, где миллионы пикселей требовали одинаковой обработки с разными входными данными.
Исследовательское сообщество увидело потенциал использования GPU для неграфических вычислений еще в начале 2000-х. Первые работы демонстрировали, что с помощью графических API, такие как OpenGL и DirectX, можно производить произвольные вычислений через манипуляции с текстурами и шейдерными программами. Однако этот подход требовал глубокой переработки алгоритмов вычислительных задач, дабы их можно было "уложить" в графические примитивы, что создавало значительный концептуальный барьер для программистов.
== Появление CUDA
В ноябре 2006 года NVIDIA представила CUDA, которая изменила подход к программированию графических процессоров для неграфических нужд. CUDA обеспечила прямой доступ к вычислительным ресурсам GPU через расширение языка C, освободив разработчиков от необходимости работать через графические API. Появление CUDA обозначило переход от косвенного использования графического конвейера к явной вычислительной модели@nickolls_gpu_2010@garland_parallel_2008.
Архитектура CUDA ввела иерархическую модель организации вычислений, которая отражала аппаратную структуру GPU. Программист организовывал вычисления в виде сетки блоков, где каждый блок содержал группу потоков, способных взаимодействовать через быструю разделяемую память@nickolls_scalable_2008. Варп (warp) -- группы из 32 потоков, выполняющихся синхронно на одном мультипроцессоре -- стал основной единицей выполнения. Эффективное программирование требовало понимания того, как варпы выполняют инструкции и как расхождение потоков ветвлений внутри варпа может снизить производительность.
NVIDIA приняла решение создать закрытую экосистему вокруг CUDA. Технология работала исключительно на GPU их производства, в то же время компания инвестировала значительные ресурсы в развитие библиотек, инструментов разработки и образовательных программ. Этот подход отражал убеждение, что вертикальная интеграция аппаратного обеспечения и программного стека позволит достичь максимальной производительности и ускорить внедрение новых возможностей. NVIDIA развивала богатую экосистему специализированных библиотек, таких как cuBLAS для линейной алгебры и cuFFT для преобразований Фурье, которые обеспечивали оптимизированные реализации распространенных алгоритмов.
Согласно исследованиям начала эры CUDA, производительность GPU для определенных классов задач могла превышать производительность центральных процессоров на порядки величины, что стимулировало стремительное принятие технологии в научных вычислениях и машинном обучении.
== OpenCL как альтернативная модель
В ответ на доминирование CUDA консорциум Khronos Group в 2008 году представил OpenCL (Open Computing Language) как открытый стандарт для гетерогенных параллельных вычислений@munshi_opencl_2009. OpenCL воплощал в себе переносимость и универсальность, позволяя одному и тому же коду выполняться на GPU различных производителей, центральных процессорах, и других ускорителях. Стандарт поддерживался коалицией компаний, включая AMD, Intel, Apple и даже NVIDIA.
Архитектура OpenCL строилась вокруг абстрактной модели выполнения, которая не привязывалась к специфике конкретного оборудования. Программисты описывали вычисления в терминах "рабочих групп" и "рабочих элементов", которые затем выполнялись на аппаратном обеспечении драйвером и компилятором. Эта модель обеспечивала гибкость и создавала дополнительные уровни абстракции между программой и железом.
Конкуренция между CUDA и OpenCL отражала противоречие в индустрии высокопроизводительных вычислений. CUDA предлагала более тесную интеграцию с аппаратным обеспечением NVIDIA, что часто приводило к превосходной производительности и более удобным инструментам разработки, а библиотеки CUDA были глубоко оптимизированы под конкретные архитектуры GPU -- поэтому компания могла быстро внедрять поддержку новых аппаратных функций. В то же время OpenCL обещала переносимость кода между различными платформами, что было критически важно для организаций, использующих гетерогенную инфраструктуру или стремящихся избежать привязки к одному поставщику.
Практический опыт показал, что достижение сопоставимой производительности на OpenCL часто требовало куда больших усилий по оптимизации под каждую конкретную платформу, что частично нивелировало преимущества переносимости. Тем не менее OpenCL сохранила свою нишу в приложениях, где важна поддержка широкого спектра оборудования, таких как системы компьютерного зрения или графических приложениях, работающих на различных платформах.
#pagebreak()
#align(
center,
pad(
@ -278,6 +310,8 @@ SIMD (Single Instruction, Multiple Data) -- вычислительный под
MIMD (Multiple Instruction, Multiple Data) -- вычислительный подход, когда множество инструкций исполняется над множеством потоков данных
CUDA (Compute Unified Device Architecture) -- программно-аппаратная архитектура параллельных вычислений, которая позволяет существенно увеличить вычислительную производительность благодаря использованию графических процессоров фирмы NVIDIA
#pagebreak()
#align(

View file

@ -212,3 +212,69 @@
year = {1978},
pages = {666--677},
}
@article{nickolls_gpu_2010,
title = {The {GPU} {Computing} {Era}},
volume = {30},
copyright = {https://ieeexplore.ieee.org/Xplorehelp/downloads/license-information/IEEE.html},
issn = {0272-1732},
url = {http://ieeexplore.ieee.org/document/5446251/},
doi = {10.1109/MM.2010.41},
number = {2},
urldate = {2025-12-08},
journal = {IEEE Micro},
author = {Nickolls, John and Dally, William J},
month = mar,
year = {2010},
pages = {56--69},
}
@article{nickolls_scalable_2008,
title = {Scalable {Parallel} {Programming} with {CUDA}: {Is} {CUDA} the parallel programming model that application developers have been waiting for?},
volume = {6},
issn = {1542-7730, 1542-7749},
shorttitle = {Scalable {Parallel} {Programming} with {CUDA}},
url = {https://dl.acm.org/doi/10.1145/1365490.1365500},
doi = {10.1145/1365490.1365500},
abstract = {The advent of multicore CPUs and manycore GPUs means that mainstream processor chips are now parallel systems. Furthermore, their parallelism continues to scale with Moores law. The challenge is to develop mainstream application software that transparently scales its parallelism to leverage the increasing number of processor cores, much as 3D graphics applications transparently scale their parallelism to manycore GPUs with widely varying numbers of cores.},
language = {en},
number = {2},
urldate = {2025-12-08},
journal = {Queue},
author = {Nickolls, John and Buck, Ian and Garland, Michael and Skadron, Kevin},
month = mar,
year = {2008},
pages = {40--53},
}
@article{garland_parallel_2008,
title = {Parallel {Computing} {Experiences} with {CUDA}},
volume = {28},
copyright = {https://ieeexplore.ieee.org/Xplorehelp/downloads/license-information/IEEE.html},
issn = {0272-1732},
url = {http://ieeexplore.ieee.org/document/4626815/},
doi = {10.1109/MM.2008.57},
number = {4},
urldate = {2025-12-08},
journal = {IEEE Micro},
author = {Garland, Michael and Le Grand, Scott and Nickolls, John and Anderson, Joshua and Hardwick, Jim and Morton, Scott and Phillips, Everett and Zhang, Yao and Volkov, Vasily},
month = jul,
year = {2008},
pages = {13--27},
}
@inproceedings{munshi_opencl_2009,
address = {Stanford, CA, USA},
title = {The {OpenCL} specification},
copyright = {https://doi.org/10.15223/policy-029},
isbn = {9781467388733},
url = {https://ieeexplore.ieee.org/document/7478342/},
doi = {10.1109/HOTCHIPS.2009.7478342},
urldate = {2025-12-08},
booktitle = {2009 {IEEE} {Hot} {Chips} 21 {Symposium} ({HCS})},
publisher = {IEEE},
author = {Munshi, Aaftab},
month = aug,
year = {2009},
pages = {1--314},
}