Estoy tratando de averiguar cómo utilizar un kernel CUDA como parte de una biblioteca, de manera que sólo puedo añadir que la biblioteca de mi C++ existente archivos de origen, y ser capaz de utilizar el kernel cuda.

Entonces, ¿cómo hacer esto? Traté de crear un contenedor, así:

.h archivo:

#ifndef __reductions2d_H_
#define __reductions2d_H_
#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>
extern "C" void getMean_wrapper();
#endif

.cu

 __global__ void getMean(float *devDataPtr, size_t pitch, int rows, int cols)
       {
          for (int r = 0; r < height; ++r)
          { 
             float* row = (float*)((char*)devPtr + r * pitch);
             for (int c = 0; c < width; ++c)
             {
                printf("Row[%i][%i]: %4.3f \n",r,c row[c]);
             }
          }
       }


   void getMean_wrapper()
   {
   //Host code 
     int width = 3, height = 3;
     int N = width*height;
     float* devData; size_t pitch;
     cudaMallocPitch(&devData, &pitch, width * sizeof(float),height);
     int blockSize = 4;
     int nBlocks = N/blockSize + (N%blockSize == 0?0:1);

     getMean<<<nBlocks, blockSize>>>(devData, pitch, width,height);
   }

main.cpp

#include "reductions2d.h"

int main(void){

getMean_wrapper();
return 0;

}

Sin embargo, cuando me reúna con nvcc *.cpp, me dice que no puede encontrar getMean_wrapper(), y cuando intento solo compile con g++ -c main.cpp, me dice que no puede encontrar cuda.h y cuda_runtime.h

Es el mejor método para especificar la ubicación de las bibliotecas de cuda con mi G++ línea de comandos, construir los objetos, la construcción del .cu objetos, a continuación, vincular ellos? Parece una molestia para tener un 3 paso el proceso para agregar en algunos cuda funcionalidad

Gracias

edición:

parece que cuando trato de hacerlo de forma individual,t gallina enlace con

g++ -o runme *.o -lcuda

Puedo obtener

$ g++ -o runme *.o -lcuda
reductions2d.o: In function         `__sti____cudaRegisterAll_47_tmpxft_00007643_00000000_4_reductions2d_cpp1_ii_4ef 611a7()':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x15e): undefined     reference to `__cudaRegisterFatBinary'
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x1b9): undefined reference to `__cudaRegisterFunction'
reductions2d.o: In function `__cudaUnregisterBinaryUtil()':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x1d8): undefined reference to `__cudaUnregisterFatBinary'
reductions2d.o: In function `__device_stub__Z7getMeanPfmii(float*, unsigned long, int, int)':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x20d): undefined reference to `cudaSetupArgument'
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x22f): undefined reference to `cudaSetupArgument'
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x251): undefined reference to `cudaSetupArgument'
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x273): undefined reference to `cudaSetupArgument'
reductions2d.o: In function `getMean_wrapper':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x164c): undefined reference to `cudaConfigureCall'
reductions2d.o: In function `cudaError cudaLaunch<char>(char*)':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text._Z10cudaLaunchIcE9cudaErrorPT_[cudaError cudaLaunch<char>(char*)]+0x11): undefined reference to `cudaLaunch'
reductions2d.o: In function `cudaError cudaMallocPitch<float>(float**, unsigned long*, unsigned long, unsigned long)':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text._Z15cudaMallocPitchIfE9cudaErrorPPT_Pmmm[cudaError cudaMallocPitch<float>(float**, unsigned long*, unsigned long, unsigned long)]+0x29): undefined reference to `cudaMallocPitch'

He leído que debo incluir el cuda bibliotecas de tiempo de ejecución, así que lo hice

ldconfig -p | grep cudart y incluidos /usr/local/cuda/lib64 en mi LD_LIBRARY_PATH y todavía no puede encontrar cudart

InformationsquelleAutor Derek | 2011-01-24

1 Comentario

  1. 5

    incluyen .h en .cu así. nvcc es compilador de c++ y destroza los nombres.

    compilar como:

    nvcc -c file.cu //compile cuda kernel
    nvcc file.o main.cpp //compile and link

    Me gustaría cambiar el código como:

    .ch

    #ifndef __reductions2d_H_
    #define __reductions2d_H_
    void getMean_wrapper(); //c++ linkga
    #endif

    .cu:

    #include "...hpp"
    #include <cuda.h>
    #include <cuda_runtime.h>
    __global__ void getMean(float *devDataPtr, size_t pitch, int rows, int cols)
    {

    que, a continuación, compilar como

    nvcc -c file.cu //compile cuda kernel
    g++ -lcudart file.o main.cpp //no cuda stuff needed save for lib
    • gracias por la respuesta modificada – que hizo el truco! Me acaba de editar la pregunta con algunos errores del vinculador yo estaba tratando de utilizar g++ para hacer la vinculación, y esto me salvó un poco de tiempo!
    • ver la actualización

Dejar respuesta

Please enter your comment!
Please enter your name here