Pregunta

Estoy intentando modificar un programa GPL escrito en C. Mi objetivo es reemplazar un método con una implementación CUDA, lo que significa que necesito compilar con NVCC en lugar de GCC. Necesito ayuda para construir el proyecto: no implementarlo (no necesita saber nada sobre Cuda C para ayudar, no creo).

Esta es la primera vez que trato de cambiar un proyecto C de complejidad moderada que involucre una. Configuración y MakeFile. Honestamente, esta es la primera vez que hago cualquier cosa en C en mucho tiempo, incluida cualquier cosa que involucre GCC o G ++, por lo que estoy bastante perdido.

No estoy muy interesado en aprender Configurar y Makefiles: esto es más un experimento. Me gustaría ver si la implementación del proyecto va bien antes de pasar tiempo creando un script de compilación adecuado. (No está dispuesto a aprender según sea necesario, solo tratando de dar una idea del alcance).

Dicho esto, ¿cuáles son mis opciones para construir este proyecto? Tengo una gran cantidad de preguntas ...

  • Intenté agregar "cc = nvcc" al archivo configure.in después de ac_prog_cc. Esto parecía funcionar: la salida de Ejecutar Configuración y Make mostró NVCC como el compilador. Sin embargo, Make no pudo compilar el archivo fuente con el núcleo CUDA, sin reconocer la sintaxis específica de CUDA. No sé por qué, esperaba que esto solo funcionara.

  • ¿Es posible compilar un archivo fuente con NVCC y luego incluirlo en el paso de enlace en el proceso de fabricación para el programa principal? ¿Si es así, cómo? (Es posible que esta pregunta no tenga sentido, estoy muy oxidado en esto)

  • ¿Cuál es la forma correcta de hacer esto?

  • ¿Hay una forma rápida y sucia que pueda usar para fines de prueba?

  • ¿Hay alguna herramienta secreta que todos usan para configurar y comprender estos configuraciones y makefiles? Esto es incluso peor que los scripts de Ant Ant a los que estoy acostumbrado (sí, estoy fuera de mi reino)

¿Fue útil?

Solución

No necesitas compilar todo con NVCC. Su suposición de que puede compilar su código CUDA con NVCC y dejar todo lo demás (excepto vincular) es correcto. Aquí está el enfoque que usaría para comenzar.

  1. Agregue un 1 encabezado nuevo (por ejemplo, mycudaimplementation.h) y 1 nuevo archivo fuente (con extensión .cu, por ejemplo, mycudaimplementation.cu). El archivo fuente contiene su implementación del kernel tanto como una función de envoltura C (host) C que invoca el núcleo con la configuración de ejecución apropiada (también conocido como <<<>>>) y argumentos. El archivo de encabezado contiene el prototipo para la función de envoltura C. Llamemos a esa función de envoltura runCudaImplementation()

  2. También proporcionaría otra función de host C en el archivo fuente (con prototipo en el encabezado) que consultan y configura los dispositivos GPU presentes y devuelve verdadero si es exitoso, falso si no. Llamemos a esta función configureCudaDevice().

  3. Ahora en su código C original, donde normalmente llamaría a su implementación de CPU, puede hacerlo.

    // must include your new header
    #include "myCudaImplementation.h"
    
    // at app initialization
    // store this variable somewhere you can access it later
    bool deviceConfigured = configureCudaDevice;          
    ...                             
    // then later, at run time
    if (deviceConfigured) 
        runCudaImplementation();
    else
        runCpuImplementation(); // run the original code
    
  4. Ahora, dado que coloca todo su código CUDA en un nuevo archivo .cu, solo tiene que compilar ese archivo con NVCC. Todo lo demás permanece igual, excepto que debe vincular en el archivo de objeto que emite NVCC. p.ej

    nvcc -c -o myCudaImplementation.o myCudaImplementation.cu <other necessary arguments>
    

Luego agregue mycudaimplementation.o a su línea de enlace (algo así como :) g ++ -o myapp mycudaimplementation.o

Ahora, si tiene una aplicación compleja con la que trabajar que usa Configuración y ya tiene un MAKEFILE complejo, puede estar más involucrado que lo anterior, pero este es el enfoque general. La conclusión es que no desea compilar todos sus archivos fuente con NVCC, solo los .cu. Use su compilador de host para todo lo demás.

No soy experto con Configuración, así que realmente no puedo ayudar allí. Es posible que pueda ejecutar Configurar para generar un archivo Make y luego editar ese makfile: no será una solución general, pero lo hará comenzar.

Tenga en cuenta que en algunos casos también puede necesitar separar la compilación de su .cu archivos para vincularlos. En este caso, debe usar la funcionalidad de compilación y vinculación separada de NVCC, para la cual Esta publicación de blog podría ser útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top