Condividi tramite


Funzioni OpenMP

Fornisce collegamenti alle funzioni usate nell'API OpenMP.

L'implementazione di Visual C++ dello standard OpenMP include le funzioni e i tipi di dati seguenti.

Per l'esecuzione dell'ambiente:

Funzione Descrizione
omp_set_num_threads Imposta il numero di thread nelle aree parallele future, a meno che non venga sottoposto a override da una clausola num_threads .
omp_get_num_threads Restituisce il numero di thread nell'area parallela.
omp_get_max_threads Restituisce un numero intero uguale o maggiore del numero di thread che sarebbero disponibili se un'area parallela senza num_threads fosse definita in quel punto del codice.
omp_get_thread_num Restituisce il numero di thread del thread in esecuzione all'interno del team di thread.
omp_get_num_procs Restituisce il numero di processori disponibili quando viene chiamata la funzione.
omp_in_parallel Restituisce un valore diverso da zero se viene chiamato dall'interno di un'area parallela.
omp_set_dynamic Indica che il numero di thread disponibili nelle aree parallele future può essere regolato in base al tempo di esecuzione.
omp_get_dynamic Restituisce un valore che indica se il numero di thread disponibili nelle aree parallele future può essere modificato in base al tempo di esecuzione.
omp_set_nested Abilita il parallelismo annidato.
omp_get_nested Restituisce un valore che indica se è abilitato il parallelismo annidato.

Per il blocco:

Funzione Descrizione
omp_init_lock Inizializza un blocco semplice.
omp_init_nest_lock Inizializza un blocco.
omp_destroy_lock Annulla l'inizializzazione di un blocco.
omp_destroy_nest_lock Annulla l'inizializzazione di un blocco annidabile.
omp_set_lock Blocca l'esecuzione del thread fino a quando non è disponibile un blocco.
omp_set_nest_lock Blocca l'esecuzione del thread fino a quando non è disponibile un blocco.
omp_unset_lock Rilascia un blocco.
omp_unset_nest_lock Rilascia un blocco annidabile.
omp_test_lock Tenta di impostare un blocco ma non blocca l'esecuzione del thread.
omp_test_nest_lock Tenta di impostare un blocco annidabile ma non blocca l'esecuzione del thread.
Tipo di dati Descrizione
omp_lock_t Tipo che contiene lo stato di un blocco, indipendentemente dal fatto che il blocco sia disponibile o se un thread è proprietario di un blocco.
omp_nest_lock_t Tipo che contiene una delle informazioni seguenti su un blocco: se il blocco è disponibile e l'identità del thread proprietario del blocco e di un conteggio di annidamento.

Per le routine di intervallo:

Funzione Descrizione
omp_get_wtime Restituisce un valore in secondi del tempo trascorso da un certo punto.
omp_get_wtick Restituisce il numero di secondi tra i tick del clock del processore.

omp_destroy_lock

Annulla l'inizializzazione di un blocco.

void omp_destroy_lock(
   omp_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_lock_t inizializzata con omp_init_lock.

Osservazioni:

Per altre informazioni, vedere 3.2.2 omp_destroy_lock e omp_destroy_nest_lock funzioni.

Esempio

Vedere omp_init_lock per un esempio di uso omp_destroy_lockdi .

omp_destroy_nest_lock

Annulla l'inizializzazione di un blocco annidabile.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_nest_lock_t inizializzata con omp_init_nest_lock.

Osservazioni:

Per altre informazioni, vedere 3.2.2 omp_destroy_lock e omp_destroy_nest_lock funzioni.

Esempio

Vedere omp_init_nest_lock per un esempio di uso omp_destroy_nest_lockdi .

omp_get_dynamic

Restituisce un valore che indica se il numero di thread disponibili nelle aree parallele future può essere modificato in base al tempo di esecuzione.

int omp_get_dynamic();

Valore restituito

Un valore diverso da zero indica che i thread verranno regolati in modo dinamico.

Osservazioni:

La regolazione dinamica dei thread viene specificata con omp_set_dynamic e OMP_DYNAMIC.

Per altre informazioni, vedere 3.1.7 omp_set_dynamic funzione.

Esempio

Vedere omp_set_dynamic per un esempio di uso omp_get_dynamicdi .

omp_get_max_threads

Restituisce un numero intero uguale o maggiore del numero di thread che sarebbero disponibili se un'area parallela senza num_threads fosse definita in quel punto del codice.

int omp_get_max_threads( )

Osservazioni:

Per altre informazioni, vedere 3.1.3 omp_get_max_threads funzione.

Esempio

// omp_get_max_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_num_threads(8);
    printf_s("%d\n", omp_get_max_threads( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_max_threads( ));
        }

    printf_s("%d\n", omp_get_max_threads( ));

    #pragma omp parallel num_threads(3)
        #pragma omp master
        {
            printf_s("%d\n", omp_get_max_threads( ));
        }

    printf_s("%d\n", omp_get_max_threads( ));
}
8
8
8
8
8

omp_get_nested

Restituisce un valore che indica se è abilitato il parallelismo annidato.

int omp_get_nested( );

Valore restituito

Un valore diverso da zero indica che il parallelismo annidato è abilitato.

Osservazioni:

Il parallelismo annidato viene specificato con omp_set_nested e OMP_NESTED.

Per altre informazioni, vedere 3.1.10 omp_get_nested funzione.

Esempio

Vedere omp_set_nested per un esempio di uso omp_get_nesteddi .

omp_get_num_procs

Restituisce il numero di processori disponibili quando viene chiamata la funzione.

int omp_get_num_procs();

Osservazioni:

Per altre informazioni, vedere 3.1.5 omp_get_num_procs funzione.

Esempio

// omp_get_num_procs.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    printf_s("%d\n", omp_get_num_procs( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_procs( ));
        }
}
// Expect the following output when the example is run on a two-processor machine:
2
2

omp_get_num_threads

Restituisce il numero di thread nell'area parallela.

int omp_get_num_threads( );

Osservazioni:

Per altre informazioni, vedere 3.1.2 omp_get_num_threads funzione.

Esempio

// omp_get_num_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main()
{
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_num_threads( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_threads( ));
        }

    printf_s("%d\n", omp_get_num_threads( ));

    #pragma omp parallel num_threads(3)
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_threads( ));
        }

    printf_s("%d\n", omp_get_num_threads( ));
}
1
4
1
3
1

omp_get_thread_num

Restituisce il numero di thread del thread in esecuzione all'interno del team di thread.

int omp_get_thread_num( );

Osservazioni:

Per altre informazioni, vedere 3.1.4 omp_get_thread_num funzione.

Esempio

Vedere parallel per un esempio di uso omp_get_thread_numdi .

omp_get_wtick

Restituisce il numero di secondi tra i tick del clock del processore.

double omp_get_wtick( );

Osservazioni:

Per altre informazioni, vedere 3.3.2 omp_get_wtick funzione.

Esempio

Vedere omp_get_wtime per un esempio di uso omp_get_wtickdi .

omp_get_wtime

Restituisce un valore in secondi del tempo trascorso da un certo punto.

double omp_get_wtime( );

Valore restituito

Restituisce un valore in secondi del tempo trascorso da un punto arbitrario, ma coerente.

Osservazioni:

Questo punto rimarrà coerente durante l'esecuzione del programma, rendendo possibili confronti futuri.

Per altre informazioni, vedere 3.3.1 omp_get_wtime funzione.

Esempio

// omp_get_wtime.cpp
// compile with: /openmp
#include "omp.h"
#include <stdio.h>
#include <windows.h>

int main() {
    double start = omp_get_wtime( );
    Sleep(1000);
    double end = omp_get_wtime( );
    double wtick = omp_get_wtick( );

    printf_s("start = %.16g\nend = %.16g\ndiff = %.16g\n",
             start, end, end - start);

    printf_s("wtick = %.16g\n1/wtick = %.16g\n",
             wtick, 1.0 / wtick);
}
start = 594255.3671159324
end = 594256.3664474116
diff = 0.9993314791936427
wtick = 2.793651148400146e-007
1/wtick = 3579545

omp_in_parallel

Restituisce un valore diverso da zero se viene chiamato dall'interno di un'area parallela.

int omp_in_parallel( );

Osservazioni:

Per altre informazioni, vedere 3.1.6 omp_in_parallel funzione.

Esempio

// omp_in_parallel.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_num_threads(4);
    printf_s("%d\n", omp_in_parallel( ));

    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_in_parallel( ));
        }
}
0
1

omp_init_lock

Inizializza un blocco semplice.

void omp_init_lock(
   omp_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_lock_t.

Osservazioni:

Per altre informazioni, vedere Funzioni di omp_init_lock e omp_init_nest_lock 3.2.1.

Esempio

// omp_init_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_lock_t my_lock;

int main() {
   omp_init_lock(&my_lock);

   #pragma omp parallel num_threads(4)
   {
      int tid = omp_get_thread_num( );
      int i, j;

      for (i = 0; i < 5; ++i) {
         omp_set_lock(&my_lock);
         printf_s("Thread %d - starting locked region\n", tid);
         printf_s("Thread %d - ending locked region\n", tid);
         omp_unset_lock(&my_lock);
      }
   }

   omp_destroy_lock(&my_lock);
}
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region

omp_init_nest_lock

Inizializza un blocco.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_nest_lock_t.

Osservazioni:

Il conteggio di annidamento iniziale è zero.

Per altre informazioni, vedere Funzioni di omp_init_lock e omp_init_nest_lock 3.2.1.

Esempio

// omp_init_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_nest_lock_t my_lock;

void Test() {
   int tid = omp_get_thread_num( );
   omp_set_nest_lock(&my_lock);
   printf_s("Thread %d - starting nested locked region\n", tid);
   printf_s("Thread %d - ending nested locked region\n", tid);
   omp_unset_nest_lock(&my_lock);
}

int main() {
   omp_init_nest_lock(&my_lock);

   #pragma omp parallel num_threads(4)
   {
      int i, j;

      for (i = 0; i < 5; ++i) {
         omp_set_nest_lock(&my_lock);
            if (i % 3)
               Test();
            omp_unset_nest_lock(&my_lock);
        }
    }

    omp_destroy_nest_lock(&my_lock);
}
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region

omp_set_dynamic

Indica che il numero di thread disponibili nelle aree parallele future può essere regolato in base al tempo di esecuzione.

void omp_set_dynamic(
   int val
);

Parametri

val
Valore che indica se il numero di thread disponibili nelle aree parallele future può essere regolato dal runtime. Se diverso da zero, il runtime può modificare il numero di thread, se zero, il runtime non regola in modo dinamico il numero di thread.

Osservazioni:

Il numero di thread non supererà mai il valore impostato da omp_set_num_threads o da OMP_NUM_THREADS.

Usare omp_get_dynamic per visualizzare l'impostazione corrente di omp_set_dynamic.

L'impostazione per omp_set_dynamic eseguirà l'override dell'impostazione della variabile di ambiente OMP_DYNAMIC .

Per altre informazioni, vedere 3.1.7 omp_set_dynamic funzione.

Esempio

// omp_set_dynamic.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main()
{
    omp_set_dynamic(9);
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_dynamic( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_dynamic( ));
        }
}
1
1

omp_set_lock

Blocca l'esecuzione del thread fino a quando non è disponibile un blocco.

void omp_set_lock(
   omp_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_lock_t inizializzata con omp_init_lock.

Osservazioni:

Per altre informazioni, vedere 3.2.3 omp_set_lock e funzioni di omp_set_nest_lock.

Esempi

Vedere omp_init_lock per un esempio di uso omp_set_lockdi .

omp_set_nest_lock

Blocca l'esecuzione del thread fino a quando non è disponibile un blocco.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_nest_lock_t inizializzata con omp_init_nest_lock.

Osservazioni:

Per altre informazioni, vedere 3.2.3 omp_set_lock e funzioni di omp_set_nest_lock.

Esempi

Vedere omp_init_nest_lock per un esempio di uso omp_set_nest_lockdi .

omp_set_nested

Abilita il parallelismo annidato.

void omp_set_nested(
   int val
);

Parametri

val
Un valore diverso da zero abilita il parallelismo annidato, mentre zero disabilita il parallelismo annidato.

Osservazioni:

Il parallelismo annidato OMP può essere attivato con omp_set_nestedo impostando la variabile di ambiente OMP_NESTED .

L'impostazione per omp_set_nested eseguirà l'override dell'impostazione della OMP_NESTED variabile di ambiente.

L'abilitazione della variabile di ambiente può interrompere un programma operativo diverso, perché il numero di thread aumenta in modo esponenziale durante l'annidamento di aree parallele. Ad esempio, una funzione che si ripete sei volte con il numero di thread OMP impostati su 4 richiede 4.096 (4 alla potenza di 6 thread). Ad eccezione delle applicazioni associate a I/O, le prestazioni di un'applicazione in genere peggiorano se sono presenti più thread rispetto ai processori.

Usare omp_get_nested per visualizzare l'impostazione corrente di omp_set_nested.

Per altre informazioni, vedere 3.1.9 omp_set_nested funzione.

Esempio

// omp_set_nested.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_nested(1);
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_nested( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_nested( ));
        }
}
1
1

omp_set_num_threads

Imposta il numero di thread nelle aree parallele future, a meno che non venga sottoposto a override da una clausola num_threads .

void omp_set_num_threads(
   int num_threads
);

Parametri

num_threads
Numero di thread nell'area parallela.

Osservazioni:

Per altre informazioni, vedere 3.1.1 omp_set_num_threads funzione.

Esempio

Vedere omp_get_num_threads per un esempio di uso omp_set_num_threadsdi .

omp_test_lock

Tenta di impostare un blocco ma non blocca l'esecuzione del thread.

int omp_test_lock(
   omp_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_lock_t inizializzata con omp_init_lock.

Osservazioni:

Per altre informazioni, vedere Funzioni di omp_test_lock e omp_test_nest_lock 3.2.5.

Esempio

// omp_test_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_lock_t simple_lock;

int main() {
    omp_init_lock(&simple_lock);

    #pragma omp parallel num_threads(4)
    {
        int tid = omp_get_thread_num();

        while (!omp_test_lock(&simple_lock))
            printf_s("Thread %d - failed to acquire simple_lock\n",
                     tid);

        printf_s("Thread %d - acquired simple_lock\n", tid);

        printf_s("Thread %d - released simple_lock\n", tid);
        omp_unset_lock(&simple_lock);
    }

    omp_destroy_lock(&simple_lock);
}
Thread 1 - acquired simple_lock
Thread 1 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - acquired simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - acquired simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - released simple_lock
Thread 3 - failed to acquire simple_lock
Thread 3 - acquired simple_lock
Thread 3 - released simple_lock

omp_test_nest_lock

Tenta di impostare un blocco annidabile ma non blocca l'esecuzione del thread.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_nest_lock_t inizializzata con omp_init_nest_lock.

Osservazioni:

Per altre informazioni, vedere Funzioni di omp_test_lock e omp_test_nest_lock 3.2.5.

Esempio

// omp_test_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_nest_lock_t nestable_lock;

int main() {
   omp_init_nest_lock(&nestable_lock);

   #pragma omp parallel num_threads(4)
   {
      int tid = omp_get_thread_num();
      while (!omp_test_nest_lock(&nestable_lock))
         printf_s("Thread %d - failed to acquire nestable_lock\n",
                tid);

      printf_s("Thread %d - acquired nestable_lock\n", tid);

      if (omp_test_nest_lock(&nestable_lock)) {
         printf_s("Thread %d - acquired nestable_lock again\n",
                tid);
         printf_s("Thread %d - released nestable_lock\n",
                tid);
         omp_unset_nest_lock(&nestable_lock);
      }

      printf_s("Thread %d - released nestable_lock\n", tid);
      omp_unset_nest_lock(&nestable_lock);
   }

   omp_destroy_nest_lock(&nestable_lock);
}
Thread 1 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock again
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - acquired nestable_lock
Thread 2 - acquired nestable_lock again
Thread 2 - released nestable_lock
Thread 2 - released nestable_lock

omp_unset_lock

Rilascia un blocco.

void omp_unset_lock(
   omp_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_lock_t inizializzata con omp_init_lock, di proprietà del thread ed eseguita nella funzione.

Osservazioni:

Per altre informazioni, vedere Funzioni di omp_unset_lock e omp_unset_nest_lock 3.2.4.

Esempio

Vedere omp_init_lock per un esempio di uso omp_unset_lockdi .

omp_unset_nest_lock

Rilascia un blocco annidabile.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Parametri

lock
Variabile di tipo omp_nest_lock_t inizializzata con omp_init_nest_lock, di proprietà del thread ed eseguita nella funzione.

Osservazioni:

Per altre informazioni, vedere Funzioni di omp_unset_lock e omp_unset_nest_lock 3.2.4.

Esempio

Vedere omp_init_nest_lock per un esempio di uso omp_unset_nest_lockdi .