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_lock
di .
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_lock
di .
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_dynamic
di .
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_nested
di .
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_num
di .
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_wtick
di .
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_lock
di .
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_lock
di .
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_nested
o 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_threads
di .
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_lock
di .
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_lock
di .