OpenMP set num threads () ne fonctionne pas

j'écris un programme parallèle en utilisant OpenMP en C++.

je veux contrôler le nombre de threads dans le programme en utilisant omp_set_num_threads(), mais il ne fonctionne pas.

#include <iostream>
#include <omp.h>
#include "mpi.h"

using namespace std;

int myrank;
int groupsize;
double sum;
double t1,t2;
int n = 10000000;

int main(int argc, char *argv[])
{
    MPI_Init( &argc, &argv);
    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
    MPI_Comm_size(MPI_COMM_WORLD,&groupsize);

    omp_set_num_threads(4);

    sum = 0;
    #pragma omp for  reduction(+:sum)
    for (int i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;
    cout<<"threads="<<omp_get_num_threads()<<endl;

    MPI_Finalize();
    return 0;
}

les extrants du programme:

sum = 4.5e+007
threads=1

comment contrôler le nombre de threads?

22
demandé sur Smi 2012-06-19 10:09:46

4 réponses

en plus d'appeler omp_get_num_threads() en dehors de la région parallèle dans votre cas, en appelant omp_set_num_threads() ne garantit toujours pas que L'exécution OpenMP utilisera exactement le nombre de threads spécifié. omp_set_num_threads() est utilisée pour remplacer la valeur de la variable d'environnement OMP_NUM_THREADS et ils contrôlent tous les deux le limite supérieure de la taille de l'équipe thread que OpenMP générerait pour toutes les régions parallèles (dans le cas de OMP_NUM_THREADS) ou pour toute conséquence région parallèle (après un appel à omp_set_num_threads()). Il y a ce qu'on appelle des équipes dynamiques qui pourraient encore choisir un plus petit nombre de threads si le système d'exécution le juge plus approprié. Vous pouvez désactiver les équipes dynamiques en appelant omp_set_dynamic(0) ou en réglant la variable d'environnement OMP_DYNAMICfalse.

pour appliquer un nombre donné de threads, vous devez désactiver les équipes dynamiques et spécifier le nombre de threads désiré avec omp_set_num_threads():

omp_set_dynamic(0);     // Explicitly disable dynamic teams
omp_set_num_threads(4); // Use 4 threads for all consecutive parallel regions
#pragma omp parallel ...
{
    ... 4 threads used here ...
}

ou num_threads OpenMP clause:

omp_set_dynamic(0);     // Explicitly disable dynamic teams
// Spawn 4 threads for this parallel region only
#pragma omp parallel ... num_threads(4)
{
    ... 4 threads used here ...
}
75
répondu Hristo Iliev 2012-06-19 07:58:03

omp_get_num_threads() la fonction renvoie le nombre de threads actuellement dans l'équipe qui exécute la région parallèle à partir de laquelle il est appelé. Vous appelez en dehors de la région parallèle, c'est pourquoi il retourne 1.

15
répondu Smi 2012-06-19 06:18:04

Selon manuel GCC pour omp_get_num_threads:

dans une section séquentielle du programme omp_get_num_threads retourne 1

Donc:

cout<<"sum="<<sum<<endl;
cout<<"threads="<<omp_get_num_threads()<<endl;

devrait être changée en quelque chose comme:

#pragma omp parallel
{
    cout<<"sum="<<sum<<endl;
    cout<<"threads="<<omp_get_num_threads()<<endl;
}

le code que j'utilise suit les conseils de Hristo de désactiver les équipes dynamiques, aussi.

4
répondu jww 2015-06-14 00:46:31

je faisais face au même problème . La Solution est donnée ci-dessous

clic droit sur le programme Source > Propriétés > Propriétés de Configuration > C/C++ > Langage > changez maintenant le drapeau de soutien open MP en Yes....

Vous obtiendrez le résultat souhaité.

2
répondu Ali Jafar 2016-01-02 17:08:10