2012-11-03 13 views
14

Perché non ottengo ID di thread diversi quando utilizzo "#pragma omp parallel num_threads (4)". In questo caso, tutti gli ID thread sono 0. Ma quando commento la riga e utilizzo il numero predefinito di thread, ho ottenuto ID di thread diversi. Nota: - la variabile I ha usato la variabile tid per ottenere l'id del thread.openMP: perché non ottengo ID di thread diversi quando uso "#pragma omp parallelo num_threads (4)"

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, char *argv[]) 
{ 
int nthreads, tid; 
int x = 0; 

#pragma omp parallel num_threads(4) 
#pragma omp parallel private(nthreads, tid) 
    { 
    /* Obtain thread number */ 
tid = omp_get_thread_num(); 
    printf("Hello World from thread = %d\n", tid); 

    // /* Only master thread does this */ 
    if (tid == 0) 
    { 
    nthreads = omp_get_num_threads(); 
    printf("Number of threads = %d\n", nthreads); 
    } 

    } 


} 

uscita del codice di cui sopra: -

Hello World from thread = 0 
Hello World from thread = 0 
Number of threads = 1 
Hello World from thread = 0 
Number of threads = 1 
Hello World from thread = 0 
Number of threads = 1 
Number of threads = 1 

uscita quando ho commentato la linea di cui sopra: -

Hello World from thread = 3 
Hello World from thread = 0 
Number of threads = 4 
Hello World from thread = 1 
Hello World from thread = 2 
+0

Nota: - per la compilazione ho fatto gcc -fopenmp open.c -o ciao –

risposta

14

Si sta creando due regioni parallele nidificate. E 'lo stesso di fare questo:

#pragma omp parallel num_threads(4) 
{ 
    #pragma omp parallel private(nthreads, tid) 
    { 
    /* Obtain thread number */ 
    tid = omp_get_thread_num(); 
    printf("Hello World from thread = %d\n", tid); 

    // /* Only master thread does this */ 
    if (tid == 0) 
    { 
     nthreads = omp_get_num_threads(); 
     printf("Number of threads = %d\n", nthreads); 
    } 
    } 
} 

omp_get_num_threads() restituisce il numero di thread nella regione più interna. Quindi stai eseguendo quattro thread, ognuno dei quali sta eseguendo un thread.

L'area parallela interna sta eseguendo solo un thread, perché non è stato abilitato il parallelismo nidificato. Puoi abilitarlo chiamando lo omp_set_nested(1).

http://docs.oracle.com/cd/E19205-01/819-5270/aewbi/index.html

Se invece di fare due regioni parallele nidificate, si voleva fare una singola regione in parallelo e specificare due proprietà, si può fare questo:

#pragma omp parallel num_threads(4) private(nthreads,tid) 
{ 
    . 
    . 
    . 
} 
+0

Ho provato "#pragma omp_set_nested (1)", ma non funziona. Lo sto scrivendo proprio sopra "#pragma omp parallel num_threads (4)", dove mi sbaglio? –

+1

@jayeshhathila: omp_set_nested() è una funzione regolare –

+0

Ho anche avuto il motivo per tid = 0 Grazie –

Problemi correlati