Открытые инструменты для GPU-вычислений

от автора

Вычисления на 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *