C++; 我一直在研究C++的库/扩展,这将允许基于GPU的高级别处理。我不是GPU编程方面的专家,我不想挖得太深。我有一个由虚拟函数类组成的神经网络。我需要一个库,基本上为我做的GPU分配-在高水平上。有一个家伙写了一篇关于一个叫GPU++的系统的论文,这个系统为你做了大部分GPU的事情。我到处都找不到密码,只有他的论文

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++的代码吗?像CUDA这样的库的级别太低,无法处理我的大多数操作(至少在不重写我的所有流程和算法的情况下是这样,我不想这样做)。

看看。它提供了一个类似STL的高级接口,包括类似容器的接口和类似和的算法


它的基础是允许它在大多数现代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)也可用

  • :官方描述告诉我们:
CUB为CUDA编程模式的每一层提供最先进、可重用的软件组件。它是用于CUDA内核编程的协作线程块原语和其他实用程序的灵活库

它提供设备范围、块范围和扭曲范围的并行原语,如并行排序、前缀扫描、缩减、直方图等

它是开源的,可在上获得。从实现的角度来看,它不是高级的(您在CUDA内核中开发),而是提供高级算法和例程

  • :C++/CUDA中的轻量级CPU/GPU矩阵/张量模板库
该库主要用于机器学习,并依赖于

  • :已使用新的Tensor类支持CUDA。它在年被谷歌使用,目前仍处于实验阶段
从Eigen 3.3开始,现在可以在CUDA内核中使用Eigen的对象和算法。但是,仅支持一部分功能,以确保CUDA内核中不会触发动态分配

开放运算语言 请注意,这不仅仅是GPGPU计算,因为它支持异构平台(多核CPU、GPU等)

  • :此项目为GPGPU提供类似OpenMP的支持。大部分编程是由编译器和运行时API隐式完成的。你可以在他们的网站上找到
OpenACC应用程序接口描述了 编译器指令,用于在标准中指定代码的循环和区域 C、C++和FORTRAN从主机CPU卸载到附件 加速器,提供跨操作系统、主机CPU的可移植性 还有加速器

  • :具有类似STL接口的开源库

螺栓是一种优化异构计算的C++模板库。 Bolt旨在提供高性能的库实现 用于扫描、减少、变换和排序等常用算法。这个 螺栓接口是基于C++标准模板库(STL)的。 熟悉STL的开发人员可以识别许多Bolt API 和定制技术

  • :如前所述,Boost.Compute为OpenCL提供了类似STL的接口。请注意,这不是一个官方的Boost库(目前)

  • “是一个为减轻现代并行异构系统编程负担提供高级抽象的库”。此库依赖于,您可以在其中找到更多信息

CUDA+OpenCL
  • 是一个开源(以前是专有的)GPGPU编程库。他们最初的目标是CUDA,但现在也支持OpenCL。您可以在线查看可用的。NVIDIA的网站提供了一系列关键功能
补充资料 虽然这不在本问题的范围内,但对其他编程语言也有同样的支持:

  • Python:用于CUDA和OpenCL。这是有道理的
  • Java:对于CUDA和OpenCL,您可以检查此项
  • JavaScript:用于WebGl
如果您需要执行线性代数(例如)或其他特定操作,CUDA和OpenCL(例如,等等)也可以使用专用的数学库

还请注意,使用这些库并不会阻止
#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;

}