Funções (OpenMP)
Fornece links para as funções usadas na API OpenMP.
A implementação do Visual C++ do padrão OpenMP inclui as funções e os tipos de dados a seguir.
Para execução do ambiente:
Função | Descrição |
---|---|
omp_set_num_threads | Define o número de threads em regiões paralelas futuras, a menos que seja substituído por uma cláusula num_threads. |
omp_get_num_threads | Retorna o número de threads na região paralela. |
omp_get_max_threads | Retorna um inteiro igual ou maior que o número de threads que estariam disponíveis se uma região paralela sem num_threads fosse definida nesse ponto no código. |
omp_get_thread_num | Retorna o número de threads do thread em execução em sua equipe de threads. |
omp_get_num_procs | Retorna o número de processadores que estão disponíveis quando a função é chamada. |
omp_in_parallel | Retorna não zero se chamado de dentro de uma região paralela. |
omp_set_dynamic | Indica que o número de threads disponíveis em regiões paralelas futuras pode ser ajustado pelo tempo de execução. |
omp_get_dynamic | Retorna um valor que indica se o número de threads disponíveis em regiões paralelas futuras pode ser ajustado pelo tempo de execução. |
omp_set_nested | Habilita o paralelismo aninhado. |
omp_get_nested | Retorna um valor que indica se o paralelismo aninhado está habilitado. |
Para bloqueio:
Função | Descrição |
---|---|
omp_init_lock | Inicializa um bloqueio simples. |
omp_init_nest_lock | Inicializa um bloqueio. |
omp_destroy_lock | Cancela a inicialização de um bloqueio. |
omp_destroy_nest_lock | Não diferencia um bloqueio aninhável. |
omp_set_lock | Bloqueia a execução do thread até que um bloqueio esteja disponível. |
omp_set_nest_lock | Bloqueia a execução do thread até que um bloqueio esteja disponível. |
omp_unset_lock | Libera um bloqueio. |
omp_unset_nest_lock | Libera um bloqueio aninhável. |
omp_test_lock | Tenta definir um bloqueio, mas não bloqueia a execução do thread. |
omp_test_nest_lock | Tenta definir um bloqueio aninhável, mas não bloqueia a execução do thread. |
Tipo de dados | Descrição |
---|---|
omp_lock_t |
Um tipo que conterá o status de um bloqueio, se o bloqueio estiver disponível ou se um thread possuir um bloqueio. |
omp_nest_lock_t |
Um tipo que contém uma das seguintes informações sobre um bloqueio: se o bloqueio está disponível, e a identidade do thread que possui o bloqueio e uma contagem de aninhamento. |
Para rotinas de tempo:
Função | Descrição |
---|---|
omp_get_wtime | Retorna um valor em segundos do tempo decorrido de algum ponto. |
omp_get_wtick | Retorna o número de segundos entre os acionamentos do clock do processador. |
omp_destroy_lock
Cancela a inicialização de um bloqueio.
void omp_destroy_lock(
omp_lock_t *lock
);
Parâmetros
lock
Uma variável de tipo omp_lock_t
que foi inicializada com omp_init_lock.
Comentários
Para obter mais informações, consulte 3.2.2 Funções omp_destroy_lock e omp_destroy_nest_lock.
Exemplo
Consulte omp_init_lock para obter um exemplo de uso de omp_destroy_lock
.
omp_destroy_nest_lock
Não diferencia um bloqueio aninhável.
void omp_destroy_nest_lock(
omp_nest_lock_t *lock
);
Parâmetros
lock
Uma variável de tipo omp_nest_lock_t
que foi inicializada com omp_init_nest_lock.
Comentários
Para obter mais informações, consulte 3.2.2 Funções omp_destroy_lock e omp_destroy_nest_lock.
Exemplo
Consulte omp_init_nest_lock para obter um exemplo de uso de omp_destroy_nest_lock
.
omp_get_dynamic
Retorna um valor que indica se o número de threads disponíveis em regiões paralelas futuras pode ser ajustado pelo tempo de execução.
int omp_get_dynamic();
Valor retornado
Um valor não zero significa que os threads serão ajustados dinamicamente.
Comentários
O ajuste dinâmico de threads é especificado com omp_set_dynamic e OMP_DYNAMIC.
Para obter mais informações, confira 3.1.7 Função omp_set_dynamic.
Exemplo
Consulte omp_set_dynamic para obter um exemplo de uso de omp_get_dynamic
.
omp_get_max_threads
Retorna um inteiro igual ou maior que o número de threads que estariam disponíveis se uma região paralela sem num_threads fosse definida nesse ponto no código.
int omp_get_max_threads( )
Comentários
Para obter mais informações, confira 3.1.3 Função omp_get_max_threads.
Exemplo
// 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
Retorna um valor que indica se o paralelismo aninhado está habilitado.
int omp_get_nested( );
Valor retornado
Um valor não zero significa que o paralelismo aninhado está habilitado.
Comentários
O paralelismo aninhado é especificado com omp_set_nested e OMP_NESTED.
Para obter mais informações, confira 3.1.10 Função omp_get_nested.
Exemplo
Consulte omp_set_nested para obter um exemplo de uso de omp_get_nested
.
omp_get_num_procs
Retorna o número de processadores que estão disponíveis quando a função é chamada.
int omp_get_num_procs();
Comentários
Para obter mais informações, confira 3.1.5 Função omp_get_num_procs.
Exemplo
// 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
Retorna o número de threads na região paralela.
int omp_get_num_threads( );
Comentários
Para obter mais informações, confira 3.1.2 Função omp_get_max_threads.
Exemplo
// 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
Retorna o número de threads do thread em execução em sua equipe de threads.
int omp_get_thread_num( );
Comentários
Para obter mais informações, confira 3.1.4 Função omp_get_thread_num.
Exemplo
Consulte paralelo para obter um exemplo de uso de omp_get_thread_num
.
omp_get_wtick
Retorna o número de segundos entre os acionamentos do clock do processador.
double omp_get_wtick( );
Comentários
Para obter mais informações, confira 3.3.2 Função omp_get_wtick.
Exemplo
Consulte omp_get_wtime para obter um exemplo de uso omp_get_wtick
.
omp_get_wtime
Retorna um valor em segundos do tempo decorrido de algum ponto.
double omp_get_wtime( );
Valor retornado
Retorna um valor em segundos do tempo decorrido de algum ponto arbitrário, mas consistente.
Comentários
Esse ponto permanecerá consistente durante a execução do programa, tornando as comparações futuras possíveis.
Para obter mais informações, confira 3.3.1 Função omp_get_wtime.
Exemplo
// 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
Retorna não zero se chamado de dentro de uma região paralela.
int omp_in_parallel( );
Comentários
Para obter mais informações, confira 3.1.6 Função omp_in_parallel.
Exemplo
// 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
Inicializa um bloqueio simples.
void omp_init_lock(
omp_lock_t *lock
);
Parâmetros
lock
Uma variável do tipo omp_lock_t
.
Comentários
Para obter mais informações, consulte 3.2.1 Funções omp_init_lock e omp_init_nest_lock.
Exemplo
// 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
Inicializa um bloqueio.
void omp_init_nest_lock(
omp_nest_lock_t *lock
);
Parâmetros
lock
Uma variável do tipo omp_nest_lock_t
.
Comentários
A contagem inicial de aninhamento é zero.
Para obter mais informações, consulte 3.2.1 Funções omp_init_lock e omp_init_nest_lock.
Exemplo
// 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 que o número de threads disponíveis em regiões paralelas futuras pode ser ajustado pelo tempo de execução.
void omp_set_dynamic(
int val
);
Parâmetros
val
Um valor que indica se o número de threads disponíveis em regiões paralelas futuras pode ser ajustado pelo tempo de execução. Se não for zero, o runtime poderá ajustar o número de threads, se zero, o runtime não ajustará dinamicamente o número de threads.
Comentários
O número de threads nunca excederá o valor definido por omp_set_num_threads ou por OMP_NUM_THREADS.
Use omp_get_dynamic para exibir a configuração atual de omp_set_dynamic
.
A configuração para omp_set_dynamic
substituirá a configuração da variável de ambiente OMP_DYNAMIC.
Para obter mais informações, confira 3.1.7 Função omp_set_dynamic.
Exemplo
// 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
Bloqueia a execução do thread até que um bloqueio esteja disponível.
void omp_set_lock(
omp_lock_t *lock
);
Parâmetros
lock
Uma variável de tipo omp_lock_t
que foi inicializada com omp_init_lock.
Comentários
Para obter mais informações, consulte 3.2.3 Funções omp_set_lock e omp_set_nest_lock.
Exemplos
Consulte omp_init_lock para obter um exemplo de uso de omp_set_lock
.
omp_set_nest_lock
Bloqueia a execução do thread até que um bloqueio esteja disponível.
void omp_set_nest_lock(
omp_nest_lock_t *lock
);
Parâmetros
lock
Uma variável de tipo omp_nest_lock_t
que foi inicializada com omp_init_nest_lock.
Comentários
Para obter mais informações, consulte 3.2.3 Funções omp_set_lock e omp_set_nest_lock.
Exemplos
Consulte omp_init_nest_lock para obter um exemplo de uso de omp_set_nest_lock
.
omp_set_nested
Habilita o paralelismo aninhado.
void omp_set_nested(
int val
);
Parâmetros
val
Um valor não zero habilita o paralelismo aninhado, enquanto zero desabilita o paralelismo aninhado.
Comentários
O paralelismo aninhado do OMP pode ser ativado com omp_set_nested
ou definindo a variável de ambiente OMP_NESTED.
A configuração para omp_set_nested
substituirá a configuração da variável de ambiente OMP_NESTED
.
Habilitar a variável de ambiente pode interromper um programa operacional de outra forma, pois o número de threads aumenta exponencialmente ao aninhar regiões paralelas. Por exemplo, uma função que se recursa seis vezes com o número de threads OMP definidos como 4 requer 4.096 (4 elevado à potência 6) threads. Exceto com aplicativos associados a E/S, o desempenho de um aplicativo geralmente cairá se houver mais threads do que processadores.
Use omp_get_nested para exibir a configuração atual de omp_set_nested
.
Para obter mais informações, confira 3.1.9 Função omp_set_nested.
Exemplo
// 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
Define o número de threads em regiões paralelas futuras, a menos que seja substituído por uma cláusula num_threads.
void omp_set_num_threads(
int num_threads
);
Parâmetros
num_threads
O número de threads na região paralela.
Comentários
Para obter mais informações, confira 3.1.1 Função omp_set_max_threads.
Exemplo
Consulte omp_get_num_threads para obter um exemplo de uso de omp_set_num_threads
.
omp_test_lock
Tenta definir um bloqueio, mas não bloqueia a execução do thread.
int omp_test_lock(
omp_lock_t *lock
);
Parâmetros
lock
Uma variável de tipo omp_lock_t
que foi inicializada com omp_init_lock.
Comentários
Para obter mais informações, consulte 3.2.5 Funções omp_test_lock e omp_test_nest_lock.
Exemplo
// 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 definir um bloqueio aninhável, mas não bloqueia a execução do thread.
int omp_test_nest_lock(
omp_nest_lock_t *lock
);
Parâmetros
lock
Uma variável de tipo omp_nest_lock_t
que foi inicializada com omp_init_nest_lock.
Comentários
Para obter mais informações, consulte 3.2.5 Funções omp_test_lock e omp_test_nest_lock.
Exemplo
// 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
Libera um bloqueio.
void omp_unset_lock(
omp_lock_t *lock
);
Parâmetros
lock
Uma variável de tipo omp_lock_t
que foi inicializada com omp_init_lock, pertencente ao thread e em execução na função.
Comentários
Para obter mais informações, consulte 3.2.4 Funções omp_unset_lock e omp_unset_nest_lock.
Exemplo
Consulte omp_init_lock para obter um exemplo de uso de omp_unset_lock
.
omp_unset_nest_lock
Libera um bloqueio aninhável.
void omp_unset_nest_lock(
omp_nest_lock_t *lock
);
Parâmetros
lock
Uma variável de tipo omp_nest_lock_t
que foi inicializada com omp_init_nest_lock, pertencente ao thread e em execução na função.
Comentários
Para obter mais informações, consulte 3.2.4 Funções omp_unset_lock e omp_unset_nest_lock.
Exemplo
Consulte omp_init_nest_lock para obter um exemplo de uso de omp_unset_nest_lock
.