ejecutar con compilar compilador como gcc compiler-construction gpu hardware-acceleration

con - ¿Es posible utilizar la aceleración de la GPU para compilar múltiples programas en un compilador gcc?



gcc wikipedia (2)

¿Hay alguna forma o herramienta para aplicar la aceleración de la GPU en la compilación de programas con el compilador GCC? En este momento he creado un programa para compilar la lista dada de programas iterativamente. Tarda unos minutos. Conozco algunos programas como Pyrit que ayuda a aplicar la aceleración de la GPU para los hashes de precomputación.

Si no hay tales herramientas disponibles, por favor asesórese sobre si usar OpenCL o cualquier otra cosa para reprogramar mi código.


SI lo que estás preguntando es, "¿Puedes escribir automáticamente código acelerado por GPU para utilizarlo con GCC y LLVM?" la respuesta es sí. NVIDIA y Google realizan proyectos de compilación basados ​​en LLVM de código abierto:

NVIDIA CUDA LLVM:

GOOGLE GPUCC:

Si su pregunta es, "¿puedo usar la GPU para acelerar la compilación de código genérico que no es de CUDA?" la respuesta es actualmente no. La GPU es buena en ciertas cosas, como tareas paralelas, mal en otras, como las ramas de las que se tratan los compiladores. La buena noticia es que puede usar una red de PC con CPU para obtener aceleraciones de compilación de 2-10x, dependiendo de cuán optimizado sea su código, y puede obtener la CPU de núcleo múltiple más rápida y la SSD de alta velocidad disponibles para su escritorio para obtener ganancias por menos problemas antes de recurrir a construcciones de red.

Existen herramientas para distribuir tareas del compilador C / C ++ / ObjC a una red de computadoras como Distcc. Se incluyó en versiones anteriores de XCode pero se eliminó, y no hay soporte para usarlo con Swift.

Existe una herramienta comercial similar a Distcc llamada Incredibuild que admite entornos de desarrollo de Visual Studio C / C ++ y Linux:

Hay algunos buenos artículos sobre el uso en el mundo real de Incredibuild vs Distcc y las compensaciones en comparación con el soporte de compilación incremental en el compilador nativo para hacer pequeños cambios como una sola línea en un solo archivo sin recompilar todo lo demás. Puntos a considerar:

  • Puede acelerar una base de código de manera significativa precompilando encabezados, utilizando varias DLL y usando compilaciones incrementales en una sola máquina.
  • Incredibuild es una solución más completa para distribuir automáticamente el trabajo y garantizar el mismo resultado que una compilación en serie, en comparación con hacerlo de forma gratuita con distcc, donde debe trabajar mucho más con los mismos resultados y compatibilidad con cualquier otra cosa que no sea gcc.
  • Para una revisión detallada, vea http://gamesfromwithin.com/how-incredible-is-incredibuild

A. En un lenguaje de programación imperativo, las declaraciones se ejecutan en secuencia, y cada enunciado puede cambiar el estado del programa. Entonces, el análisis de las unidades de traducción es intrínsecamente secuencial.

Un ejemplo: compruebe cómo podría funcionar la propagación constante:

a = 5; b = a + 7; c = a + b + 9;

Necesitará revisar esas declaraciones secuencialmente antes de descubrir que los valores asignados a c son constantes en tiempo de compilación.

(Sin embargo, es posible compilar y optimizar bloques paralelos separados en paralelo).

B. Además de esto, las diferentes pasadas deben ejecutarse secuencialmente también, y se afectan entre sí.

Un ejemplo: según un cronograma de instrucciones, asigna registros, luego encuentra que necesita derramar un registro en la memoria, por lo que debe generar nuevas instrucciones. Esto cambia el cronograma nuevamente.

Por lo tanto, no puede ejecutar ''pases'' como ''registrar asignación'' y ''programación'' en paralelo tampoco (de hecho, creo que hay artículos en los que científicos informáticos / matemáticos han intentado resolver estos dos problemas juntos, pero no entremos en eso). .

(De nuevo, uno puede lograr cierto paralelismo mediante pasos de canalización).

Además, las GPU especialmente no se ajustan porque:

  1. Las GPU son buenas en matemáticas de coma flotante. Algo que los compiladores no necesitan o no usan mucho (excepto cuando se optimiza la aritmética de punto flotante en el programa)

  2. Las GPU son buenas en SIMD. es decir, realizar la misma operación en múltiples entradas. De nuevo, esto no es algo que un compilador deba hacer. Puede haber un beneficio si el compilador necesita, por ejemplo, optimizar varios cientos de operaciones de coma flotante (Un ejemplo salvaje sería: el programador definió varias matrices grandes de FP, se le asignaron constantes y luego escribió el código para operar en ellas. programa muy mal escrito de hecho.)

Por lo tanto, aparte de paralelizar la compilación de bloques básicos y pases de canalización, no hay mucho paralelismo en el nivel de ''dentro de la compilación de un archivo C''. Pero el paralelismo es posible, fácil de implementar y constantemente utilizado en un nivel superior. GNU Make , por ejemplo, tiene el argumento -j=N Lo que básicamente significa: siempre que encuentre N trabajos independientes (por lo general, compilar un conjunto de archivos es lo que se usa GNU Make de todos modos), genera N procesos (o N instancias de gcc compilan diferentes archivos en paralelo).