Comstackz un programme C avec GCC, de sorte qu’il puisse utiliser tous les cœurs de processeur dans Linux

J’ai un exemple de programme C à append. Lorsque je comstack et l’exécute avec GCC, il n’utilise qu’un seul cœur de processeur.

Existe-t-il un moyen de comstackr un programme C pour qu’il puisse utiliser tous les cœurs de processeur sous Linux.

J’avais l’habitude de comstackr comme gcc -O3 malloc.c

Code:

 #include  #include  #include  int main() { float *ptr; unsigned long long i; ptr = (float*) malloc(8000000000 * sizeof(float)); for(i=0; i<8000000000; i++) { ptr[i] = i/10000; } clock_t tic = clock(); for(i=0; i<8000000000; i++) { ptr[i] = (i/10000)+1.0; } clock_t toc = clock(); printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC); return 0; } 

Existe-t-il un moyen de comstackr un programme C pour qu’il puisse utiliser tous les cœurs de processeur sous Linux.

Non , pas aussi magiquement que vous le souhaitez. La parallélisation des programmes est un sujet très difficile et ne peut généralement pas être réalisée de manière automatique. En passant, les programmes parallèles peuvent ne pas être aussi efficaces que vous le souhaitez (soyez au courant de la loi d’ Amdahl ).

Cependant, vous pouvez concevoir et coder un programme parallèle. Vous pouvez par exemple utiliser des threads posix . Attention, c’est délicat! Lisez d’abord quelques tutoriels sur Pthread . Vous ne serez pas sûr que tous les cœurs seront utilisés (car ils sont gérés par le kernel ), mais c’est très probable dans la pratique. Lisez aussi sur l’ affinité du processeur .

Vous pouvez également utiliser OpenMP ou OpenACC . Vous pouvez coder certains de vos kernelx numériques en utilisant OpenCL . Vous pouvez utiliser une approche multitraitement (par exemple forger plusieurs processus , en utilisant des communications entre processus ), éventuellement en utilisant MPI . Regardez également dans l’approche MapReduce , la bibliothèque 0mq (et beaucoup d’autres).

Vous pouvez lire quelque chose sur les systèmes d’exploitation, par exemple, Systèmes d’exploitation: Trois pièces faciles . Vous pouvez également lire quelque chose sur la programmation système Linux, par exemple Programmation avancée Linux (ou un livre plus récent). Voir aussi intro (2) et appels système (2) & pthreads (7) .

Sachez qu’il est très difficile de concevoir, de coder et de déboguer une application parallèle (ou simultanée ou dissortingbuée ). Tenez compte du coût du temps de développement (et du temps, probablement années , nécessaire pour acquérir les compétences pertinentes). Il n’y a pas d’argent balle !

(il n’est pas très réaliste de transformer une application séquentielle existante dans la vie réelle en une application parallèle; vous devez généralement concevoir un programme parallèle à partir de zéro)

Essayez d’append le pragma suivant juste au-dessus de vos boucles for :

 #pragma omp parallel for for(i=0; i<8000000000; i++) { ptr[i] = i/10000; } 

Et ajoutez l'option -fopenmp à vos options de construction lorsque vous appelez gcc. Par défaut, OpenMP créera autant de threads que de cœurs dans votre machine et partagera la charge de travail de manière égale entre eux.

Vous pouvez consulter cet article pour plus d'informations sur OpenMP.

Vous devez créer plusieurs threads. Sinon, il n’y a qu’un seul thread et il s’exécute sur un seul cœur (à la fois).

Consultez un didacticiel sur les threads, en particulier les pthreads , pour savoir comment utiliser les threads. Vous pouvez également utiliser l’appel système fork pour fractionner votre programme en plusieurs processus, avec un thread chacun.

Vous pouvez créer n (n nombre de cœurs supposés) dans votre programme, puis définir CPU affinité CPU de chaque thread de sorte qu’il soit lié à un CPU Core particulier. sched_setaffinity ou pthread_setaffinity_np est celui qui vous permet de définir CPU affinité du CPU .