Est-il possible d'utiliser L'accélération GPU pour compiler plusieurs programmes sur un compilateur gcc?
Existe-t-il un moyen ou un outil pour appliquer L'accélération GPU sur la compilation de programmes avec compilateur GCC? En ce moment j'ai créé un programme pour compiler la liste donnée de programmes itérativement. Il ne prend que quelques minutes. Je connais quelques programmes comme Pyrit qui aide à appliquer L'accélération GPU pour précomputer des hash.
S'il n'y a pas de tels outils disponibles, veuillez indiquer S'il faut utiliser OpenCL ou autre chose pour reprogrammer mon code.
2 réponses
A. dans un langage de programmation impératif, les instructions sont exécutées dans l'ordre, et chaque instruction peut changer l'état du programme. L'analyse des unités de traduction est donc par nature séquentielle.
un exemple: regardez comment la propagation constante peut fonctionner -
a = 5;
b = a + 7;
c = a + b + 9;
vous devez passer en revue ces énoncés de façon séquentielle avant de comprendre que les valeurs attribuées à b
et c
sont des constantes à la compilation temps.
(cependant des blocs de base séparés peuvent éventuellement être compilés et optimisés en parallèle les uns avec les autres.)
B. en plus de cela, des passes différentes doivent s'exécuter de façon séquentielle et s'affecter les unes les autres.
un exemple: basé sur un calendrier d'instructions, vous attribuez des registres, puis vous trouvez que vous avez besoin de renverser un registre en mémoire, donc vous avez besoin de générer de nouvelles instructions. Cela modifie l'annexe encore.
donc vous ne pouvez pas non plus exécuter des 'passes' comme 'l'allocation de registre' et 'l'ordonnancement' en parallèle (en fait, je penser il y a des articles où les informaticiens/mathématiciens ont essayé de résoudre ces deux problèmes ensemble, mais ne nous y attardons pas).
(Encore une fois, on peut obtenir parallélisme par pipeline passe.)
de plus, les GPU ne conviennent pas particulièrement parce que:
les GPU sont bons en calcul à virgule flottante. Quelque chose compilateurs n'ont pas besoin ou utiliser beaucoup (sauf lors de l'optimisation arithmétique flottante dans le programme)
les GPU sont bons à SIMD. c'est à dire la fonction opération sur plusieurs entrées. Encore une fois, ce n'est pas quelque chose qu'un compilateur doit faire. Il y a être un avantage si le compilateur doit, disons, optimiser plusieurs centaines de points flottants opérations à distance (un exemple wild serait: le programmeur a défini plusieurs grands tableaux FP, leur a assigné des constantes, et a ensuite écrit le code pour opérer sur ceux-ci. Un programme très mal écrit en effet.)
donc à part la compilation parallélisante des blocs de base et des passes de pipelinage, il n'y a pas beaucoup de parallélisme à être avait au niveau de "dans la compilation D'un fichier C". Mais le parallélisme est possible, facile à mettre en œuvre, et constamment niveau supérieur. GNU Make
, par exemple, a l' -j=N
argument. Ce qui signifie en gros: tant Qu'il trouve N
jobs indépendants (habituellement, compiler un tas de fichiers est ce que GNU Make
est utilisé de toute façon), il fraye N
(ou N
cas de gcc
compiler différents fichiers en parallèle).
si ce que vous demandez est, "Pouvez-vous écrire automatiquement le code GPU-accéléré pour l'utiliser avec GCC et LLVM?"la réponse est oui. NVIDIA et Google le rendre open-source de LLVM base compilateur projets:
NVIDIA CUDA LLVM:
GOOGLE GPUCC:
si votre question Est, " puis-je utiliser le GPU pour accélérer la compilation de code générique non-CUDA?"la réponse est actuellement pas. Le GPU est bon à certaines choses comme les tâches parallèles, mauvais à d'autres comme les branches qui les compilateurs. La bonne nouvelle est que vous pouvez utiliser un réseau de PC avec CPUs pour obtenir des vitesses de compilation 2-10x, en fonction de l'optimisation de votre code est déjà, et vous pouvez obtenir le plus rapide multi-core CPU et haute vitesse SSD disponible pour votre bureau pour obtenir des gains pour moins de tracas avant que vous recouriez à des constructions de réseau.
il existe des outils pour distribuer des tâches de compilateur C/C++/ObjC à un réseau d'ordinateurs comme Distcc. Il était inclus dans les anciennes versions de XCode mais a été supprimé, et il n'y a aucun support pour L'utiliser avec Swift.
il existe un outil commercial similaire à Distcc appelé Incredibuild qui supporte Visual Studio C / C++ et les environnements de développement Linux:
il y a quelques bons articles sur l'utilisation réelle D'Incredibuild vs Distcc et les compromis comparés au support de construction incrémental dans le compilateur natif pour faire de petites modifications comme une ligne simple dans un seul fichier sans recompiler tout le reste. Points à considérer:
- vous pouvez accélérer une base de code de manière significative en pré-compilant des en-têtes, en utilisant plusieurs DLLs, et en utilisant des constructions incrémentielles sur une seule machine.
- Incredibuild est une solution plus complète pour distribuer automatiquement le travail et garantir le même résultat qu'une compilation en série par rapport à le faire gratuitement avec distcc où vous devez faire beaucoup plus travailler pour les mêmes résultats et la compatibilité avec tout autre que gcc.
- pour un examen détaillé, voir http://gamesfromwithin.com/how-incredible-is-incredibuild