Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 nell'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 del thread in esecuzione all'interno del suo gruppo 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 | Disinizializza un lucchetto annidabile. |
| omp_set_lock | Sospende l'esecuzione del thread fino a quando non è disponibile un meccanismo di blocco. |
| omp_set_nest_lock | Sospende l'esecuzione del thread fino a quando non è disponibile un meccanismo di 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 lock: se il lock è disponibile, l'identità del thread proprietario del lock e un conteggio di annidamento. |
Per le routine di temporizzazione
| 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 cicli di 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 ulteriori informazioni, vedere le funzioni 3.2.2 omp_destroy_lock e omp_destroy_nest_lock.
Esempio
Si veda omp_init_lock per un esempio di utilizzo omp_destroy_lock.
omp_destroy_nest_lock
Disinizializza un lucchetto 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 ulteriori informazioni, consultare le funzioni 3.2.2 omp_destroy_lock e omp_destroy_nest_lock.
Esempio
Vedere omp_init_nest_lock per un esempio di omp_destroy_nest_lockuso.
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 la funzione 3.1.7 omp_set_dynamic.
Esempio
Vedere omp_set_dynamic per un esempio di utilizzo di omp_get_dynamic.
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 ulteriori informazioni, vedere la funzione 3.1.3 omp_get_max_threads.
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 funzione omp_get_nested.
Esempio
Vedere omp_set_nested per un esempio di utilizzo di omp_get_nested.
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 funzione 3.1.5 omp_get_num_procs.
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 funzione omp_get_num_threads.
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 del thread in esecuzione all'interno del suo gruppo di thread.
int omp_get_thread_num( );
Osservazioni:
Per altre informazioni, vedere funzione omp_get_thread_num 3.1.4.
Esempio
Vedere parallel per un esempio di omp_get_thread_numuso.
omp_get_wtick
Restituisce il numero di secondi tra i cicli di clock del processore.
double omp_get_wtick( );
Osservazioni:
Per ulteriori informazioni, vedere la funzione 3.3.2 omp_get_wtick.
Esempio
Vedere omp_get_wtime per un esempio di utilizzo di omp_get_wtick.
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 la funzione 3.3.1 omp_get_wtime.
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 ulteriori informazioni, vedere funzione omp_in_parallel 3.1.6.
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 avrà la precedenza sull'impostazione della variabile di ambiente OMP_DYNAMIC.
Per altre informazioni, vedere la funzione 3.1.7 omp_set_dynamic.
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 è disponibile un lock.
void omp_set_lock(
omp_lock_t *lock
);
Parametri
lock
Variabile di tipo omp_lock_t inizializzata con omp_init_lock.
Osservazioni:
Per ulteriori informazioni, vedere 3.2.3 funzioni omp_set_lock e omp_set_nest_lock.
Esempi
Si veda omp_init_lock per un esempio di utilizzo omp_set_lock.
omp_set_nest_lock
Sospende l'esecuzione del thread fino a quando non è disponibile un meccanismo di 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 ulteriori informazioni, vedere 3.2.3 funzioni omp_set_lock e omp_set_nest_lock.
Esempi
Vedere omp_init_nest_lock per un esempio di omp_set_nest_lockuso.
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 ulteriori informazioni, vedere 3.1.9 funzione omp_set_nested.
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 ulteriori informazioni, vedere la funzione 3.1.1 omp_set_num_threads.
Esempio
Vedere omp_get_num_threads per un esempio di utilizzo di omp_set_num_threads.
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
Si veda omp_init_lock per un esempio di utilizzo omp_unset_lock.
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 omp_unset_nest_lockuso.