Вычисления на GPU могут быть полезны многим разработчикам, поскольку они позволяют повысить производительность кода. Эта технология доступна, но для ускорения выполнения кода или создания красочной визуализации нельзя просто перенести вычисления с CPU на GPU — для этого требуются специальные компиляторы и библиотеки.
Сегодня собрали несколько интересных решений, которые пригодятся в разнообразных задачах: от ускорения высоконагруженных вычислений до генерации графики.
ILGPU
ILGPU — это компилятор для реализации GPU-вычислений на .NET-языках, представленный в 2021 году. Он поддерживает технологию just-in-time, которая переводит код на машинный язык в процессе исполнения программы. ILGPU распространяют по open source лицензии NCSA. Она разрешает использовать, модифицировать и распространять ПО при сохранении отметки об авторских правах.
ILGPU написан на C# и сочетает в себе возможности C++ AMP и CUDA. Решение обеспечивает высокую скорость диспетчеризации, а типобезопасные делегаты позволяют избежать боксинга, то есть преобразования размерных типов данных языка из значимых в ссылочные. Также ILGPU позволяет адаптировать код под целевую архитектуру, будь то x86 или x64, без необходимости вносить изменения вручную.
В то же время компилятор поддерживает работу не только со статической, но и с динамической разделяемой памятью. Последние версии ILGPU позволяют выделять её для каждого ядра по отдельности.
class ... { static void SharedMemKernel(ArrayView<int> data) { var staticMemory = SharedMemory.Allocate<int>>(1024); var dynamicMemory = SharedMemory.GetDynamic<int>>(); ... var dynamicMemory2 = SharedMemory.GetDynamic<double>>(); ... } static void ...(...) { using var context = Context.CreateDefault(); using var accl = context.CreateCudaAccelerator(0); var config = SharedMemoryConfig.RequestDynamic<byte>(<GroupSize> * sizeof(int)); var config2 = SharedMemoryConfig.RequestDynamic<int>(<GroupSize>); ... kernel((<UserGridDim>, <UserGroupDim>, config), buffer.View); ... } }
Компилятор позволяет применять стандартные отладчики .NET для поиска и исправления ошибок в коде и поддерживает однопоточное выполнение программ.
Из других возможностей ILGPU можно отметить атомарные операции и низкоуровневые механизмы, такие как функции warp-перемешивания. Поддержка высокопроизводительных математических функций дополнительно ускоряет вычисления, особенно при работе с 32-битной арифметикой. Интересно, что с помощью компилятора смоделировали игру «Жизнь» с частотой обновления 300+ FPS.
В инструмент также входит библиотека ILGPU.Algorithms. Она предлагает набор вспомогательных алгоритмов высокого уровня, например, для сортировки и вычисления префиксных сумм, которые поддерживаются на всех типах ускорителей.
Дополнительную информацию можно почерпнуть в репозитории на GitHub и Discord-сообществе, участники которого готовы делиться опытом.
ComputeSharp
Это — библиотека .NET для работы с графикой, которая распространяется под лицензией MIT. Она была разработана Microsoft несколько лет назад, и её до сих пор применяют в продуктах компании: Microsoft Store и Paint.NET.
Программные интерфейсы ComputeSharp позволяют получать доступ к GPU-устройствам, перемещать данные между GPU-буферами и оперативной памятью, а также писать шейдеры на C#.
ComputeSharp поддерживает диспетчеризацию многомерных групп потоков и позволяет использовать различные типы данных, включая векторные типы .NET и HLSL для сложных вычислений.
Например, вот пример шейдера, который применяет многопеременную логистическую функцию (softmax function) ко всем элементам в заданном буфере. Обычно её используют в задачах классификации в машинном обучении.
[ThreadGroupSize(DefaultThreadGroupSizes.X)] [GeneratedComputeShaderDescriptor]. public readonly partial struct SoftmaxActivation( ReadWriteBuffer<float> buffer, float k) : IComputeShader { public void Execute() { float exp = Hlsl.Exp(k * buffer[ThreadIds.X]); float log = Hlsl.Log(1 + exp); buffer[ThreadIds.X] = log / k; } }
Стоит учесть, что работа на DX12 ограничивает применимость библиотеки. Как минимум этот факт делает ComputeSharp менее универсальной по сравнению с аналогами, например, ILGPU, ShaderGen.
gpu.cpp
Это — открытая библиотека для GPU-вычислений на С++. Она была представлена в июле 2024 года научно-исследовательской лабораторией Answer AI, основанной бывшим CEO Kaggle. Библиотека распространяется под лицензией Apache 2.0.
Разработчики библиотеки отмечают, что решения для вычислений на персональных устройствах в основном предназначены для игровых движков и ML-компиляторов, но не учитывают интересы программистов из других сфер. Проект имеет множество применений, включая автономный рендеринг графики и построение симуляций процессов, происходящих в реальном мире (различные примеры есть в репозитории).
Под капотом gpu.cpp — библиотека Dawn для обеспечения базовой функциональности WebGPU. Dawn — это кроссплатформенная реализация стандарта WebGPU с открытым исходным кодом, предоставляющая основные инструменты для разработки WebGPU-приложений, включая заголовки C/C++ и поддержку D3D12, Metal, Vulkan и OpenGL. В библиотеку встроен компилятор языка шейдеров под названием Tint.
Stardust
Это — библиотека для рендеринга с использованием GPU (WebGL). Цель проекта — упростить и ускорить создание визуализаций без отвлечений на управление шейдерами и буферами API. Библиотека предназначена в первую очередь для веб-разработчиков, специалистов по исследованию данных и дизайнеров, которым необходимо генерировать интерактивную 2D- и 3D-графику.
Среди ключевых возможностей Stardust можно выделить рендеринг в реальном времени — библиотека обрабатывает десятки тысяч графических элементов (в проекте они называются «маркерами»). Авторы приводят простой пример на сайте проекта — код для рендеринга нескольких геометрических фигур.
<script type="text/javascript"> var canvas = document.getElementById("main-canvas"); var width = 960; var height = 500; var platform = Stardust.platform("webgl-2d", canvas, width, height); var data = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; var circleSpec = Stardust.mark.circle(); var circles = Stardust.mark.create(circleSpec, platform); circles.attr("center", (d) => [ d * 80, 250 ]); circles.attr("radius", (d) => d * 3); circles.attr("color", [ 0, 0, 0, 1 ]); circles.data(data); circles.render(); </script>
На портале приведены и комплексные примеры: построение графиков с применением глифов и визуализации с использованием three.js. Также в документации проекта можно найти обучающие материалы, а в песочнице опробовать их на практике.
Когда речь идет о доступности вычислительных ресурсов, часто упоминается виртуальная инфраструктура с GPU для машинного обучения, аналитики, рендеринга и 3D-моделирования. Однако проекты бывают разными — виртуальные рабочие места с графическими ресурсами (VDI GPU) эффективно справляются с задачами 3D-рендеринга и проектирования на обычных ПК без необходимости приобретать дорогостоящие графические станции.
В проектах большого масштаба может возникнуть необходимость в развертывании виртуальной ИТ-инфраструктуры для решения комплексных задач. Сейчас доступные облачные сервисы можно использовать со скидкой в течение шести месяцев. Подробнее об этом вы можете узнать на сайте.
ссылка на оригинал статьи https://habr.com/ru/articles/840904/
Добавить комментарий