В вычислительной технике вычислительное ядро — это процедура, скомпилированная для высокопроизводительных ускорителей (таких как графические процессоры (GPU), цифровые сигнальные процессоры (DSP) или программируемые пользователем вентильные матрицы (FPGA)), отдельная от основной программы (обычно работающей на центральном процессоре ), но используемая ею. Иногда их называют вычислительными шейдерами , разделяя исполнительные блоки с вершинными шейдерами и пиксельными шейдерами на GPU, но не ограничиваются выполнением на одном классе устройств или графических API . [1] [2]
Вычислительные ядра примерно соответствуют внутренним циклам при реализации алгоритмов на традиционных языках (за исключением того, что не подразумевается последовательная операция) или коду, передаваемому внутренним итераторам .
Они могут быть определены отдельным языком программирования , таким как « OpenCL C » (управляемым API OpenCL ), как «вычислительные шейдеры », написанные на языке шейдеров (управляемом графическим API, таким как OpenGL ), или встроены непосредственно в код приложения , написанный на языке высокого уровня , как в случае C++AMP .
Эта парадигма программирования хорошо соответствует векторным процессорам : предполагается, что каждый вызов ядра в пакете независим, что позволяет выполнять параллельные данные . Однако атомарные операции иногда могут использоваться для синхронизации между элементами (для взаимозависимой работы) в некоторых сценариях. Отдельным вызовам присваиваются индексы (в 1 или более измерениях), из которых может выполняться произвольная адресация данных буфера (включая операции scatter-gaze ), при условии соблюдения предположения о неперекрываемости.
API Vulkan предоставляет промежуточное представление SPIR-V для описания как графических шейдеров , так и вычислительных ядер в языково-независимой и машинно-независимой манере. Цель состоит в том, чтобы облегчить эволюцию языка и предоставить более естественную возможность использовать вычислительные возможности GPU в соответствии с разработками оборудования, такими как унифицированная архитектура памяти и гетерогенная архитектура системы . Это обеспечивает более тесное взаимодействие между CPU и GPU.