我一直在寻找适用于C++的库/扩展,可以在高级别上进行基于GPU的处理。我不是GPU编程的专家,也不想深入了解。我有一个由具有虚拟函数的类组成的神经网络。我需要一个库,基本上为我执行GPU分配 - 在高级别上。有个人写了一篇关于名为GPU ++ 的系统的论文,它为您处理大部分GPU操作。我无法在任何地方找到代码,只有他的论文。
是否有人知道类似的库,或者有GPU ++的代码吗?像CUDA这样的库太底层了,不能处理我的大多数操作(至少不能不重写所有的过程和算法 - 我不想这样做)。
我一直在寻找适用于C++的库/扩展,可以在高级别上进行基于GPU的处理。我不是GPU编程的专家,也不想深入了解。我有一个由具有虚拟函数的类组成的神经网络。我需要一个库,基本上为我执行GPU分配 - 在高级别上。有个人写了一篇关于名为GPU ++ 的系统的论文,它为您处理大部分GPU操作。我无法在任何地方找到代码,只有他的论文。
是否有人知道类似的库,或者有GPU ++的代码吗?像CUDA这样的库太底层了,不能处理我的大多数操作(至少不能不重写所有的过程和算法 - 我不想这样做)。
有许多专用于GPGPU编程的高级库。由于它们依赖于CUDA和/或OpenCL,因此必须明智选择(基于CUDA的程序将无法在AMD的GPU上运行,除非通过像gpuocelot这样的项目进行预处理)。
您可以在NVIDIA website上找到一些CUDA库的示例。
作为@Ashwin指出,Thrust的类似STL的语法使其成为开发CUDA程序时广泛选择的库。快速查看示例可了解如果决定使用该库,将编写的代码类型。NVIDIA的网站介绍了该库的关键特性。此外还提供了一份视频演示(来自GTC 2012)。Thrust是一个类似于C++标准模板库(STL)的并行算法库。 Thrust的高级接口大大提高了程序员的生产力,同时实现了GPU和多核CPU之间的性能可移植性。 与已建立的技术(如CUDA、TBB和OpenMP)的互操作性有助于与现有软件集成。
CUB为CUDA编程模式的每个层提供最先进的可重用软件组件。它是一个灵活的协作线程块基元库和其他CUDA内核编程实用程序。
CUB提供设备级、块级和warp级并行基元,如并行排序、前缀扫描、约简、直方图等。
它是开源的,可在GitHub上获得。从实现的角度来看,它不是高级的(您可以在CUDA内核中开发),但提供了高级算法和例程。
这个库主要用于机器学习,并依赖于表达式模板。
Bolt是一个针对异构计算进行优化的C++模板库。Bolt旨在为常见算法(如扫描、归约、转换和排序)提供高性能的库实现。Bolt接口是基于C++标准模板库(STL)建模的。熟悉STL的开发人员将会认识到许多Bolt API和自定义技术。
Boost.Compute:正如@Kyle Lutz所说,Boost.Compute为OpenCL提供了类似STL的接口。请注意,这不是官方的Boost库(尚未)。
SkelCL“是一个提供高级抽象的库,用于减轻现代并行异构系统的编程难度”。该库依赖于骨架编程,您可以在他们的研究论文中找到更多信息。
虽然这不是这个问题的范围,但其他编程语言也有类似的支持:
看一下Boost.Compute。它提供了一个高级的、类似STL的接口,包括容器,如vector<T>
和算法,如transform()
和sort()
。
它基于OpenCL构建,因此可以在大多数现代GPU和CPU上运行,包括NVIDIA、AMD和Intel的设备。
#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;
}
我尽可能地让它直观易懂(通常只需用ecuda::替换std::即可)。如果你了解STL,那么ecuda应该能够做出你所期望的基于CUDA的C++扩展功能。
#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;
}
C++ AMP就是你正在寻找的答案。