mundo - lenguaje cuda c
¿Cómo puedo compilar el código CUDA y luego vincularlo a un proyecto C++? (3)
Estoy buscando ayuda para comenzar con un proyecto que involucra a CUDA. Mi objetivo es tener un proyecto que pueda compilar en el compilador nativo de g ++ pero que use el código CUDA. Entiendo que tengo que compilar mi código CUDA en el compilador nvcc, pero según tengo entendido, de alguna manera puedo compilar el código CUDA en un archivo cubin o un archivo ptx.
Aquí están mis preguntas:
- ¿Cómo uso nvcc para compilar en un archivo cubin o un archivo ptx? ¿No necesito un -c o algo?
- ¿Qué tipo de archivo quiero usar?
- ¿Cuáles son los comandos g ++ para compilar y vincular correctamente el proyecto?
Supongamos lo siguiente:
- Tengo un archivo llamado "main.cpp" que tiene una función principal e incluye cuda.h.
- Tengo otro archivo llamado "cudaFunc.cu" que tiene un código CUDA. Digamos, por ejemplo, que quiero agregar dos matrices de enteros que existen en main.cpp.
Descubrí que vincular el código del objeto cuda compilado con g ++ puede ser problemático. Intenta compilarlo así:
all:
nvcc cudafile.cu mainfile.cpp -o executable
clean: rm -rf *.o
Mi respuesta a esta pregunta reciente probablemente describe lo que necesitas.
Un par de notas adicionales:
- No necesita compilar su .cu en un archivo .cubin o .ptx. Debe compilarlo en un archivo de objeto .o y luego vincularlo con los archivos de objeto .o de sus archivos .cpp compilados con g ++.
- Además de poner el código del kernel de cuda en cudaFunc.cu, también debe poner una función de envoltorio de C o C ++ en ese archivo que inicia el kernel (a menos que esté utilizando la API del controlador CUDA, lo cual 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 debe llamar al código CUDA. Luego, se vinculan los archivos utilizando su línea de enlace g ++ estándar.
Estoy empezando a repetir mi otra respuesta , así que recomiendo simplemente leerla. :)
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 con la biblioteca de 64 bits! Parece algo obvio, pero para payasos como yo, eso es algo que olvidé. Aquí está el archivo make que ahora uso ... si puede digerir este archivo make, debería poder hacer lo que estaba tratando de hacer, que era una compilación separada de código cuda y otro código G ++. También tenga en cuenta que debe tener los compiladores gcc, g ++ 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 .cu) usando 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 uso el compilador g ++ con la opción -o, me vinculo a la biblioteca lib64 y vinculo los archivos lcuda y lcudart junto con la compilación de mi main.cpp y luego vinculo el cudacode.o. ¡Espero que esto ayude a alguien!