C++; 我一直在研究C++的库/扩展,这将允许基于GPU的高级别处理。我不是GPU编程方面的专家,我不想挖得太深。我有一个由虚拟函数类组成的神经网络。我需要一个库,基本上为我做的GPU分配-在高水平上。有一个家伙写了一篇关于一个叫GPU++的系统的论文,这个系统为你做了大部分GPU的事情。我到处都找不到密码,只有他的论文
有人知道类似的库吗,或者有人有GPU++的代码吗?像CUDA这样的库的级别太低,无法处理我的大多数操作(至少在不重写我的所有流程和算法的情况下是这样,我不想这样做)。看看。它提供了一个类似STL的高级接口,包括类似容器的接口和类似和的算法C++; 我一直在研究C++的库/扩展,这将允许基于GPU的高级别处理。我不是GPU编程方面的专家,我不想挖得太深。我有一个由虚拟函数类组成的神经网络。我需要一个库,基本上为我做的GPU分配-在高水平上。有一个家伙写了一篇关于一个叫GPU++的系统的论文,这个系统为你做了大部分GPU的事情。我到处都找不到密码,只有他的论文,c++,cuda,gpu,C++,Cuda,Gpu,有人知道类似的库吗,或者有人有GPU++的代码吗?像CUDA这样的库的级别太低,无法处理我的大多数操作(至少在不重写我的所有流程和算法的情况下是这样,我不想这样做)。看看。它提供了一个类似STL的高级接口,包括类似容器的接口和类似和的算法 它的基础是允许它在大多数现代GPU和CPU上运行,包括NVIDIA、AMD和Intel的CPU。库提供容器、并行原语和算法。所有这些功能都用类似STL的语法很好地包装起来。因此,如果您熟悉STL,您实际上可以只使用推力编写整个CUDA程序,而无需编写单个CUD
它的基础是允许它在大多数现代GPU和CPU上运行,包括NVIDIA、AMD和Intel的CPU。库提供容器、并行原语和算法。所有这些功能都用类似STL的语法很好地包装起来。因此,如果您熟悉STL,您实际上可以只使用推力编写整个CUDA程序,而无需编写单个CUDA内核。查看中的简单示例,了解可以使用推力编写的高级程序。有许多专用于GPGPU编程的高级库。由于它们依赖于CUDA和/或OpenCL,因此必须明智地选择它们(基于CUDA的程序不会在AMD的GPU上运行,除非它通过预处理步骤处理诸如以下项目) 库达
你可以在英伟达找到一些CUDA库的例子。
- :官方的描述不言自明
推力是一种类似C++标准的并行算法库 模板库(STL)。推力的高级接口大大增强了 程序员的工作效率,同时实现性能可移植性 GPU和多核CPU。与现有系统的互操作性 技术(如CUDA、TBB和OpenMP)促进了集成 使用现有软件
正如所指出的,在开发CUDA程序时,类似STL的推力语法使其成为广泛选择的库。如果您决定使用这个库,那么快速查看一下这些示例将显示您将要编写的代码类型。NVIDIA的网站提供了该图书馆的最新信息。A(来自GTC 2012)也可用- :官方描述告诉我们:
- :C++/CUDA中的轻量级CPU/GPU矩阵/张量模板库
- :已使用新的Tensor类支持CUDA。它在年被谷歌使用,目前仍处于实验阶段
- :此项目为GPGPU提供类似OpenMP的支持。大部分编程是由编译器和运行时API隐式完成的。你可以在他们的网站上找到
- :具有类似STL接口的开源库
螺栓是一种优化异构计算的C++模板库。 Bolt旨在提供高性能的库实现 用于扫描、减少、变换和排序等常用算法。这个 螺栓接口是基于C++标准模板库(STL)的。 熟悉STL的开发人员可以识别许多Bolt API 和定制技术
- :如前所述,Boost.Compute为OpenCL提供了类似STL的接口。请注意,这不是一个官方的Boost库(目前)
- “是一个为减轻现代并行异构系统编程负担提供高级抽象的库”。此库依赖于,您可以在其中找到更多信息
- 是一个开源(以前是专有的)GPGPU编程库。他们最初的目标是CUDA,但现在也支持OpenCL。您可以在线查看可用的。NVIDIA的网站提供了一系列关键功能
- Python:用于CUDA和OpenCL。这是有道理的
- Java:对于CUDA和OpenCL,您可以检查此项
- JavaScript:用于WebGl
#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;
}
#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;
}