He estado buscando en bibliotecas/extensiones de C++ que permita la GPU de procesamiento basado en un alto nivel. Yo no soy un experto en programación de GPU y no quiero gastar mucho. Tengo una red neuronal consiste de clases con funciones virtuales. Necesito una biblioteca que, básicamente, hace que la GPU de asignación para mí – en un alto nivel. Hay un hombre que escribió una tesis sobre un sistema llamado GPU++ que hace la mayoría de la GPU cosas para usted. No puedo encontrar el código en cualquier lugar, solo de su tesis.

¿Alguien sabe de una biblioteca similar, o ¿alguien tiene el código de la GPU++? Las bibliotecas como CUDA son demasiado bajos y no pueden manejar la mayoría de mis operaciones (al menos no sin tener que reescribir todos mis procesos y algoritmos – que no quiero hacer).

InformationsquelleAutor goocreations | 2013-05-08

8 Comentarios

  1. 28

    La Empuje biblioteca proporciona contenedores, paralelo primitivas y algoritmos. Toda esta funcionalidad está muy bien envuelto en un STL-como la sintaxis. Por lo tanto, si usted está familiarizado con la STL, en realidad se puede escribir toda la CUDA programas utilizando sólo el Empuje, sin tener que escribir una sola kernel CUDA. Eche un vistazo a los ejemplos sencillos en el Guía De Inicio Rápido para ver el tipo de alto nivel de los programas puede escribir mediante Empuje.

    • Esto es lo que yo en realidad estaba buscando. Muchas gracias.
    • no ha sido hasta ahora un sucesor de Empuje llamado a Granel. Jared Hoberock dio una presentación sobre ella. ¿Tiene alguna opinión al respecto? A partir de la presentación, parecía muy avanzada.
  2. 47

    Hay muchos de alto nivel de las bibliotecas dedicado a GPGPU de programación. Puesto que confían en CUDA y/o OpenCL, que tienen que ser elegidos sabiamente (una CUDA-basado en el programa no se ejecuta en AMD Gpu, a menos que pasa a través de un pre-procesamiento de paso, con proyectos tales como gpuocelot).

    CUDA

    Usted puede encontrar algunos ejemplos de bibliotecas de CUDA de NVIDIA sitio web.

    • Empuje: la descripción oficial habla por sí mismo

    De empuje es una de algoritmos paralelos de la biblioteca que se asemeja a el Estándar de C++
    Template Library (STL). El empuje de la interfaz de alto nivel mejora en gran medida
    la productividad de un programador mientras que permite que el rendimiento de la portabilidad entre
    Las GPUs y CPUs multinúcleo. Interoperabilidad con lo establecido
    tecnologías (tales como CUDA, TBB, y OpenMP) facilita la integración
    con el software existente.

    Como @Ashwin señalado, la STL-como la sintaxis de Empuje hace que sea ampliamente elegido de la biblioteca al desarrollo de CUDA programas. Un rápido vistazo a los ejemplos que muestra el tipo de código que va a escribir, si usted decide utilizar esta biblioteca. NVIDIA sitio web presenta la características clave de esta biblioteca. Un vídeo de presentación (desde GTC 2012) también está disponible.

    • CUB: la descripción oficial nos dice:

    CUB proporciona el estado-of-the-art, los componentes de software reutilizables para cada capa de la CUDA modo de programación. Es un flexible de la biblioteca de la cooperativa de threadblock primitivas y otras utilidades para CUDA núcleo de programación.

    Proporciona dispositivo de ancho de bloque de ancho y la urdimbre de ancho paralelo primitivas, tales como la ordenación paralelo, el prefijo de escaneo, reducción, histograma, etc.

    Es de código abierto y está disponible en GitHub. No es de alto nivel de una aplicación de punto de vista (que se desarrollan en los núcleos CUDA), pero proporciona un alto nivel de algoritmos y rutinas.

    • mshadow: ligero de la CPU/GPU/matriz del tensor de la plantilla de la biblioteca en C++/CUDA.

    Esta biblioteca se utiliza sobre todo para el aprendizaje de máquina, y se basa en la expresión de plantillas.

    A partir de Eigen 3.3, ahora es posible utilizar Eigen de los objetos y de los algoritmos dentro de los núcleos CUDA. Sin embargo, sólo un subconjunto de características son compatibles para asegurarse de que no la asignación dinámica es activa en un kernel CUDA.

    OpenCL

    Nota que OpenCL hace más de GPGPU computing, ya que soporta plataformas heterogéneas (multi-core Cpu, Gpu, etc.).

    • OpenACC: este proyecto ofrece a los OpenMP-como soporte para GPGPU. Una gran parte de la programación se la realiza de forma implícita por el compilador y la API de tiempo de ejecución. Usted puede encontrar un código de ejemplo en su página web.

    La OpenACC Interfaz de Programa de Aplicación describe una colección de
    directivas de compilador para especificar los bucles y las regiones de código en el estándar de
    C, C++ y Fortran para ser descargadas desde un host CPU a un
    acelerador, que proporciona portabilidad entre sistemas operativos, host Cpu
    y aceleradores.

    • Perno: de fuente abierta de la biblioteca STL-como el interfaz.

    Perno es una biblioteca de plantillas C++ optimizado para el cómputo heterogéneo.
    Tornillo está diseñado para proporcionar un alto rendimiento de la biblioteca de implementaciones
    para el común de los algoritmos tales como la exploración, reducir, transformar, y ordenar. El
    Perno de la interfaz se basa en el C++ Biblioteca de plantillas Estándar (STL).
    Los desarrolladores familiarizados con la STL se reconocen muchas de las Perno de la Api
    y técnicas de personalización.

    • Boost.Calcular: como @Kyle Lutz dijo, Boost.Calcular la STL proporciona una interfaz similar a la de OpenCL. Tenga en cuenta que este no es un funcionario de Impulso de la biblioteca (todavía).

    • SkelCL «es una biblioteca que proporciona alto nivel de abstracción para aliviarse de programación de paralelos modernos sistemas heterogéneos». Esta biblioteca se basa en esqueleto de programación, y usted puede encontrar más información en su documentos de investigación.

    CUDA + OpenCL

    • ArrayFire es un código abierto (que solía ser de propiedad) GPGPU la programación de la biblioteca. Ellos primero se dirigió a CUDA, pero ahora soporte OpenCL así. Puede comprobar el ejemplos disponible en línea. NVIDIA del sitio web proporciona una buen resumen de sus principales características.

    Información complementaria

    Aunque esto no es realmente en el alcance de esta pregunta, también existe el mismo tipo de soporte para otros lenguajes de programación:

    Si usted necesita para hacer de álgebra lineal (por ejemplo) u otras operaciones específicas, dedicado bibliotecas matemáticas también están disponibles para CUDA y OpenCL (por ejemplo,ViennaCL, CUBLAS, MAGMA etc.).

    También tenga en cuenta que el uso de estas bibliotecas no le impide hacer algunas operaciones de bajo nivel si usted necesita para hacer algunas muy específicas de computación.

    Finalmente, podemos mencionar el futuro del estándar de C++ biblioteca. Ha habido un extenso trabajo para agregar el paralelismo de apoyo. Este es todavía una especificación técnica, y la Gpu no son explícitamente mencionados AFAIK (aunque NVIDIA Jared Hoberock, desarrollador de Empuje, está directamente involucrado), pero la voluntad de hacer de esto una realidad, es definitivamente allí.

    • Considere la posibilidad de marcar esta la respuesta correcta ?
    • He utilizado Eigen para invertir matrices grandes y sólo se ejecuta 2 veces más rápido que el uso de un código de subproceso
  3. 2

    Otro de alto nivel de la biblioteca es VexCL — un vector de expresión de la plantilla de la biblioteca de OpenCL. Ofrece intuitiva notación para las operaciones vectoriales y está disponible bajo la licencia MIT.

  4. 2

    Si usted está buscando para los de mayores dimensiones de los contenedores y la capacidad de transmitir y manipular los recipientes en el código del kernel, he pasado los últimos años en el desarrollo de la ecuda API para ayudar en mis propios proyectos de investigación científica (por lo que ha sido puesto a través de los pasos). Esperemos que se puede llenar un necesario nicho. Un breve ejemplo de cómo se puede utilizar C++11 características que se utilizan aquí, pero ecuda funcionará bien con pre-C++11 compiladores):

    #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;
    }

    Escribí a ser tan intuitivo como sea posible (normalmente tan simple como la sustitución de std:: con ecuda::). Si usted sabe STL, entonces ecuda debe hacer lo que le lógicamente esperar un CUDA-C++ basado en la extensión de hacer.

    • ecuda evita la memoria de transferencia en la siguiente llamada a funciones?. ¿Cuál es el rendimiento?. Qué esconde el complejo de asignación de memoria y transferencias?
  5. 1

    El cpp-opencl proyecto proporciona una manera para hacer que la programación de GPUs fácil para el desarrollador. Esto le permite implementar el paralelismo de datos en una GPU directamente en C++ en lugar de usar OpenCL.

    Consulte http://dimitri-christodoulou.blogspot.com/2014/02/implement-data-parallelism-on-gpu.html

    Y el código fuente: https://github.com/dimitrs/cpp-opencl

    Vea el ejemplo de abajo. El código de la parallel_for_each lambda función se ejecuta en la GPU, y todo el resto se ejecuta en la CPU. Más específicamente, el «cuadrado» de la función se ejecuta tanto en la CPU (a través de una llamada a std::transformar) y la GPU (a través de una llamada a calcular::parallel_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;
    }
  6. 1

    La nueva OpenMP la versión 4 incluye ahora acelerador de descarga de apoyo.

    AFAIK GPUs son considerados como los aceleradores.

  7. 0

    C++ AMP es La respuesta que usted está buscando.

    • Buscando algo de la cruz-plataforma. AMP parece específicos de Windows.
    • Microsoft & AMD lanzó un C++ AMP «con el soporte de linux». Es C++APLICACIONES de un nivel más alto de la biblioteca, que esconde el Opencl o es una solución diferente?

Dejar respuesta

Please enter your comment!
Please enter your name here