Я искал библиотеки / расширения для C ++, которые позволят обработку на GPU на высоком уровне. Я не эксперт в программировании на GPU и не хочу копать слишком глубоко. У меня есть нейронная сеть, состоящая из классов с виртуальными функциями. Мне нужна библиотека, которая в основном выполняет распределение GPU для меня — на высоком уровне. Есть парень, который написал диссертацию о системе под названием GPU ++, которая делает большую часть работы с GPU для вас. Я нигде не могу найти код, только его тезис.
Кто-нибудь знает подобную библиотеку, или у кого-нибудь есть код для GPU ++? Библиотеки, такие как CUDA, находятся на слишком низком уровне и не могут обрабатывать большинство моих операций (по крайней мере, без переписывания всех моих процессов и алгоритмов — что я не хочу делать).
осевая нагрузка Библиотека предоставляет контейнеры, параллельные примитивы и алгоритмы. Все эти функциональные возможности красиво обернуты в STL-подобный синтаксис. Итак, если вы знакомы с STL, вы можете писать целые программы на CUDA, используя только Thrust, без необходимости писать одно ядро CUDA. Посмотрите на простые примеры в Инструкция по началу работы чтобы увидеть, какие программы высокого уровня вы можете написать с помощью Thrust.
Есть много высокоуровневых библиотек, посвященных программированию GPGPU. Поскольку они полагаются на CUDA и / или OpenCL, их нужно выбирать с умом (программа на основе CUDA не будет работать на графических процессорах AMD, если она не пройдет этап предварительной обработки с такими проектами, как gpuocelot).
Вы можете найти несколько примеров библиотек CUDA на NVIDIA Веб-сайт.
Thrust — библиотека параллельных алгоритмов, напоминающая стандарт C ++
Библиотека шаблонов (STL). Интерфейс Thrust высокого уровня значительно улучшает
продуктивность программиста при обеспечении переносимости производительности между
GPU и многоядерные процессоры. Совместимость с установленными
технологии (такие как CUDA, TBB и OpenMP) облегчают интеграцию
с существующим программным обеспечением.
Как @Ashwin Как отмечалось, STL-подобный синтаксис Thrust делает его широко выбранной библиотекой при разработке программ CUDA. Беглый взгляд на примеры показывает, какой код вы будете писать, если решите использовать эту библиотеку. Сайт NVIDIA представляет ключевая особенность этой библиотеки. видео презентация (из GTC 2012) также доступна.
CUB предоставляет современные, многократно используемые программные компоненты для каждого уровня режима программирования CUDA. Это гибкая библиотека кооперативных примитивов потоковых блоков и других утилит для программирования ядра CUDA.
Он обеспечивает параллельные примитивы для всего устройства, для всего блока и для деформации, такие как параллельная сортировка, сканирование префиксов, уменьшение, гистограмма и т. Д.
Это с открытым исходным кодом и доступно на GitHub. Он не является высокоуровневым с точки зрения реализации (вы разрабатываете в ядрах CUDA), но предоставляет высокоуровневые алгоритмы и процедуры.
Эта библиотека в основном используется для машинного обучения и опирается на шаблоны выражений.
Начиная с Eigen 3.3, теперь можно использовать объекты и алгоритмы Eigen в ядрах CUDA. Однако поддерживается только подмножество функций, чтобы убедиться, что динамическое распределение не запускается в ядре CUDA.
Обратите внимание, что OpenCL выполняет больше, чем вычисления на GPGPU, поскольку поддерживает гетерогенные платформы (многоядерные процессоры, графические процессоры и т. д.).
Интерфейс прикладной программы OpenACC описывает набор
директивы компилятора для указания циклов и областей кода в стандарте
C, C ++ и Fortran будут выгружены с центрального процессора на подключенный
ускоритель, обеспечивающий переносимость между операционными системами, хост-процессорами
и ускорители.
Bolt — это библиотека шаблонов C ++, оптимизированная для разнородных вычислений.
Bolt предназначен для обеспечения высокопроизводительных библиотечных реализаций.
для распространенных алгоритмов, таких как сканирование, уменьшение, преобразование и сортировка.
Интерфейс болта был смоделирован на стандартной библиотеке шаблонов C ++ (STL).
Разработчики, знакомые с STL, распознают многие API-интерфейсы Bolt.
и методы настройки.
Boost.Compute: как @ Кайл Лутц сказал, что Boost.Compute предоставляет STL-подобный интерфейс для OpenCL. Обратите внимание, что это не официальная библиотека Boost (пока).
SkelCL «это библиотека, предоставляющая высокоуровневые абстракции для облегченного программирования современных параллельных гетерогенных систем». Эта библиотека опирается на скелетное программирование, и вы можете найти больше информации в их научно-исследовательские работы.
Хотя это и не входит в сферу применения этого вопроса, есть также такая же поддержка для других языков программирования:
Если вам нужно выполнить линейную алгебру (например) или другие конкретные операции, выделенные математические библиотеки также доступны для CUDA и OpenCL (например, ViennaCL, CUBLAS, МАГМА так далее.).
Также обратите внимание, что использование этих библиотек не мешает вам выполнять некоторые низкоуровневые операции, если вам нужно выполнить очень специфические вычисления.
Наконец, мы можем упомянуть будущее стандартной библиотеки C ++. Была проделана большая работа по добавлению поддержки параллелизма. Это все еще техническая спецификация, и графические процессоры явно не упоминаются как AFAIK (хотя непосредственно участвует разработчик Thrust Джаред Хоберок из NVIDIA), но желание воплотить это в жизнь определенно есть.
Взгляни на Boost.Compute. Он обеспечивает высокоуровневый STL-подобный интерфейс, включая такие контейнеры, как vector<T>
и алгоритмы, такие как transform()
а также sort()
.
Он построен на OpenCL что позволяет ему работать на большинстве современных графических процессоров и процессоров, включая NVIDIA, AMD и Intel.
Еще одна библиотека высокого уровня VexCL — библиотека шаблонов векторного выражения для OpenCL. Он обеспечивает интуитивно понятную запись для векторных операций и доступен под лицензией MIT.
Если вы ищете контейнеры более высокой размерности и возможность передавать и манипулировать этими контейнерами в коде ядра, я потратил последние несколько лет на разработку ecuda API, чтобы помочь в моих собственных научно-исследовательских проектах (так что он прошел через все). Надеюсь, это может занять необходимую нишу. Краткий пример того, как его можно использовать (здесь используются функции C ++ 11, но ecuda будет хорошо работать с компиляторами до C ++ 11):
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <vector>
#include <ecuda/ecuda.hpp>
// kernel function
__global__
void calcColumnSums(
typename ecuda::matrix<double>::const_kernel_argument mat,
typename ecuda::vector<double>::kernel_argument vec
)
{
const std::size_t t = threadIdx.x;
auto col = mat.get_column(t);
vec[t] = ecuda::accumulate( col.begin(), col.end(), static_cast<double>(0) );
}
int main( int argc, char* argv[] )
{
// allocate 1000x1000 hardware-aligned device memory matrix
ecuda::matrix<double> deviceMatrix( 1000, 1000 );
// generate random values row-by-row and copy to matrix
std::vector<double> hostRow( 1000 );
for( std::size_t i = 0; i < 1000; ++i ) {
for( double& x : hostRow ) x = static_cast<double>(rand())/static_cast<double>(RAND_MAX);
ecuda::copy( hostRow.begin(), hostRow.end(), deviceMatrix[i].begin() );
}
// allocate device memory for column sums
ecuda::vector<double> deviceSums( 1000 );
CUDA_CALL_KERNEL_AND_WAIT(
calcColumnSums<<<1,1000>>>( deviceMatrix, deviceSums )
);
// copy columns sums to host and print
std::vector<double> hostSums( 1000 );
ecuda::copy( deviceSums.begin(), deviceSums.end(), hostSums.begin() );
std::cout << "SUMS =";
for( const double& x : hostSums ) std::cout << " " << std::fixed << x;
std::cout << std::endl;
return 0;
}
Я написал его как можно более интуитивно понятным (обычно так же просто, как заменить std :: на ecuda: :). Если вы знаете STL, то ecuda должен делать то, что вы логически ожидаете от расширения C ++ на основе CUDA.
Проект cpp-opencl предоставляет способ, облегчающий программисту программирование. Это позволяет вам реализовать параллелизм данных на GPU непосредственно в C ++ вместо использования OpenCL.
Посмотри пожалуйста http://dimitri-christodoulou.blogspot.com/2014/02/implement-data-parallelism-on-gpu.html
И исходный код: https://github.com/dimitrs/cpp-opencl
Смотрите пример ниже. Код в лямбда-функции parallel_for_each выполняется на GPU, а все остальное — на CPU. Более конкретно, функция «квадрат» выполняется как на процессоре (через вызов std :: transform), так и на графическом процессоре (через вызов compute ::rallel_for_each).
#include <vector>
#include <stdio.h>
#include "ParallelForEach.h"
template<class T>
T square(T x)
{
return x * x;
}
void func() {
std::vector<int> In {1,2,3,4,5,6};
std::vector<int> OutGpu(6);
std::vector<int> OutCpu(6);
compute::parallel_for_each(In.begin(), In.end(), OutGpu.begin(), [](int x){
return square(x);
});std::transform(In.begin(), In.end(), OutCpu.begin(), [](int x) {
return square(x);
});
//
// Do something with OutCpu and OutGpu …..........
//
}
int main() {
func();
return 0;
}
Новый OpenMP версия 4 теперь включает поддержку разгрузки акселератора.
GPA AFAIK считаются ускорителями.
C ++ AMP — это ответ, который вы ищете.