¿Cómo puedo compilar código CUDA y luego vincularlo a un proyecto C++?


Estoy buscando ayuda para comenzar con un proyecto que involucre a CUDA. Mi objetivo es tener un proyecto que pueda compilar en el compilador nativo de g++ pero que utilice código CUDA. Entiendo que tengo que compilar mi código CUDA en el compilador nvcc, pero desde mi entendimiento de alguna manera puedo compilar el código CUDA en un archivo cubin o un archivo ptx.

Aquí están mis preguntas:

  1. ¿Cómo uso nvcc para compilar en un archivo cubin o un archivo ptx? ¿No necesito a-c o algo así?
  2. Que tipo de archivo que quiero usar?
  3. ¿Cuáles son los comandos de g++ para compilar y vincular correctamente el proyecto?

Supongamos lo siguiente:

  1. Tengo un archivo llamado " main.cpp " que tiene una función principal en él e incluye cuda.h.
  2. Tengo otro archivo llamado "cudaFunc.cu" que tiene código CUDA en ella. Digamos, por ejemplo, que quiero agregar dos matrices enteras que existen en main.cpp.
Author: Shadow, 2012-02-24

3 answers

Pude resolver mi problema con un par de publicaciones diferentes, incluidas estas. No olvide que si está utilizando una máquina de 64 bits para enlazar a la biblioteca de 64 bits! Parece obvio, pero para payasos como yo, eso es algo que olvidé. Aquí está el archivo make que ahora uso... si usted puede digerir este archivo make, usted debe ser capaz de hacer lo que estaba tratando de hacer que era la compilación separada de código cuda y otro código G++. También tenga en cuenta que usted tiene que tener el gcc, g++ compiladores en ciertas versiones (estoy usando g++-4.4 y está funcionando para mí) De todos modos, aquí está el archivo make...

all: program

program: cudacode.o
    g++ -o program -L/usr/local/cuda/lib64 -lcuda -lcudart main.cpp  cudacode.o 

cudacode.o:
    nvcc -c -arch=sm_20 cudacode.cu 

clean: rm -rf *o program

Esperemos que pueda ver que lo primero que hago es compilar el cudacode (que se ha guardado como un .cu) utilizando el compilador nvcc y la opción-c (también tenga en cuenta que es posible que desee eliminar el-arch=sm_20). Esto creó un cudacode.o. Luego utilizo el compilador g++ con la opción-o y enlace a la biblioteca lib64 y enlace los archivos lcuda y lcudart junto con la compilación de mi principal.cpp y luego vincular el cudacode.o. Espero que esto ayude a alguien!

 44
Author: Matthew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-29 19:18:18

Mi respuesta a esta pregunta reciente probablemente describe lo que necesita.

Un par de notas adicionales:

  1. No necesitas compilar tu. cu a a .cubin or .archivo ptx. Necesitas compilarlo en a .o archivo de objeto y luego vincularlo con el .o archivos objeto de su .archivos cpp compilados con g++.
  2. Además de poner su código de kernel cuda en cudaFunc.cu, también necesita poner una función de envoltura C o C++ en ese archivo que lanza el núcleo (a menos que están utilizando la API de controlador CUDA, que es poco probable y no se recomienda). También agregue un archivo de encabezado con el prototipo de esta función de envoltura para que pueda incluirlo en su código C++ que necesita llamar al código CUDA. A continuación, enlaza los archivos utilizando la línea de enlace estándar de g++.

Estoy empezando a repetir mi otra respuesta, así que recomiendo simplemente leerla. :)

 11
Author: harrism,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:51

Encontré que vincular el código objeto cuda compilado con g++ puede ser problemático. Intenta compilarlo así:

all:
nvcc cudafile.cu mainfile.cpp -o executable

clean: rm -rf *.o
 9
Author: Jean-Luc Nacif Coelho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-25 11:39:11