Partilhar via


Funções OpenMP

Fornece ligações para funções usadas na API OpenMP.

A implementação Visual C++ do standard OpenMP inclui as seguintes funções e tipos de dados.

Para a execução no ambiente:

Função Description
omp_set_num_threads Define o número de threads nas regiões paralelas seguintes, a menos que seja sobreposto por uma cláusula num_threads .
omp_get_num_threads Devolve o número de threads na região paralela.
omp_get_max_threads Devolve um inteiro igual ou superior ao número de threads que estariam disponíveis se uma região paralela sem num_threads fosse definida nesse ponto do código.
omp_get_thread_num Devolve o número da thread em execução dentro do seu grupo de threads.
omp_get_num_procs Devolve o número de processadores disponíveis quando a função é chamada.
omp_in_parallel Retorna diferente de zero se chamado a partir 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 Devolve 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 Permite paralelismo aninhado.
omp_get_nested Devolve um valor que indica se o paralelismo aninhado está ativado.

Para bloqueio:

Função Description
omp_init_lock Inicializa uma fechadura simples.
omp_init_nest_lock Inicializa um bloqueio.
omp_destroy_lock Desinicializa um bloqueio.
omp_destroy_nest_lock Desinicializa 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 Abre uma fechadura.
omp_unset_nest_lock Liberta uma fechadura nestable.
omp_test_lock Tenta definir um bloqueio mas não bloqueia a execução da thread.
omp_test_nest_lock Tenta definir um bloqueio nestable mas não bloqueia a execução da thread.
Tipo de dados Description
omp_lock_t Um tipo que detém o estado de um bloqueio, quer o bloqueio esteja disponível ou se um thread possui 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, a identidade do thread que detém o bloqueio e uma contagem de aninhamento.

Para rotinas de temporização:

Função Description
omp_get_wtime Devolve um valor em segundos do tempo decorrido a partir de um determinado ponto.
omp_get_wtick Devolve o número de segundos entre os tique-taques do relógio do processador.

omp_destroy_lock (função de destruição de bloqueio em OpenMP)

Desinicializa um bloqueio.

void omp_destroy_lock(
   omp_lock_t *lock
);

Parâmetros

bloqueio
Uma variável do tipo omp_lock_t que foi inicializada com omp_init_lock.

Observações

Para mais informações, veja 3.2.2 funções omp_destroy_lock e omp_destroy_nest_lock.

Example

Veja omp_init_lock para um exemplo de utilização de omp_destroy_lock.

omp_destroy_nest_lock

Desinicializa um bloqueio aninhável.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Parâmetros

bloqueio
Uma variável do tipo omp_nest_lock_t que foi inicializada com omp_init_nest_lock.

Observações

Para mais informações, veja 3.2.2 funções omp_destroy_lock e omp_destroy_nest_lock.

Example

Veja omp_init_nest_lock para um exemplo de utilização de omp_destroy_nest_lock.

omp_get_dynamic

Devolve 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 de retorno

Um valor diferente de zero significa que os threads serão ajustados dinamicamente.

Observações

O ajuste dinâmico das roscas é especificado com omp_set_dynamic e OMP_DYNAMIC.

Para mais informações, veja a função de omp_set_dynamic 3.1.7.

Example

Veja omp_set_dynamic para um exemplo de utilização de omp_get_dynamic.

omp_get_max_threads

Devolve um inteiro igual ou superior ao número de threads que estariam disponíveis se uma região paralela sem num_threads fosse definida nesse ponto do código.

int omp_get_max_threads( )

Observações

Para mais informações, consulte função omp_get_max_threads 3.1.3.

Example

// 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

Devolve um valor que indica se o paralelismo aninhado está ativado.

int omp_get_nested( );

Valor de retorno

Um valor não nulo significa que o paralelismo aninhado está ativado.

Observações

O paralelismo aninhado é especificado com omp_set_nested e OMP_NESTED.

Para mais informações, veja função omp_get_nested 3.1.10.

Example

Veja omp_set_nested para um exemplo de utilização de omp_get_nested.

omp_get_num_procs

Devolve o número de processadores disponíveis quando a função é chamada.

int omp_get_num_procs();

Observações

Para mais informações, consulte a função de omp_get_num_procs 3.1.5.

Example

// 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

Devolve o número de threads na região paralela.

int omp_get_num_threads( );

Observações

Para mais informações, consulte a função de omp_get_num_threads 3.1.2.

Example

// 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

Devolve o número da thread em execução dentro do seu grupo de threads.

int omp_get_thread_num( );

Observações

Para mais informações, veja a função de omp_get_thread_num 3.1.4.

Example

Ver paralelo para um exemplo de utilização de omp_get_thread_num.

omp_get_wtick

Devolve o número de segundos entre os tique-taques do relógio do processador.

double omp_get_wtick( );

Observações

Para mais informações, consulte função omp_get_wtick 3.3.2.

Example

Veja omp_get_wtime para um exemplo de utilização de omp_get_wtick.

omp_get_wtime

Devolve um valor em segundos do tempo decorrido a partir de um determinado ponto.

double omp_get_wtime( );

Valor de retorno

Devolve um valor em segundos do tempo decorrido a partir de um ponto arbitrário, mas consistente.

Observações

Esse ponto manter-se-á consistente durante a execução do programa, tornando possíveis comparações futuras.

Para mais informações, consulte a função de omp_get_wtime 3.3.1.

Example

// 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 diferente de zero se chamado a partir de uma região paralela.

int omp_in_parallel( );

Observações

Para mais informações, consulte 3.1.6 função omp_in_parallel.

Example

// 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 uma fechadura simples.

void omp_init_lock(
   omp_lock_t *lock
);

Parâmetros

bloqueio
Uma variável do tipo omp_lock_t.

Observações

Para mais informações, veja funções omp_init_lock e omp_init_nest_lock de 3.2.1.

Example

// 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

bloqueio
Uma variável do tipo omp_nest_lock_t.

Observações

A contagem inicial de aninhamento é zero.

Para mais informações, veja funções omp_init_lock e omp_init_nest_lock de 3.2.1.

Example

// 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 for diferente de zero, o tempo de execução pode ajustar o número de threads; se for zero, o runtime não ajustará dinamicamente o número de threads.

Observações

O número de threads nunca ultrapassará o valor definido por omp_set_num_threads ou por OMP_NUM_THREADS.

Use omp_get_dynamic para mostrar a definição atual de omp_set_dynamic.

A configuração de omp_set_dynamic irá sobrepor a configuração da variável de ambiente OMP_DYNAMIC.

Para mais informações, veja a função de omp_set_dynamic 3.1.7.

Example

// 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 da linha de execução até que uma trava esteja disponível.

void omp_set_lock(
   omp_lock_t *lock
);

Parâmetros

bloqueio
Uma variável do tipo omp_lock_t que foi inicializada com omp_init_lock.

Observações

Para mais informações, consulte 3.2.3 funções omp_set_lock e omp_set_nest_lock.

Exemplos

Veja omp_init_lock para um exemplo de utilização 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

bloqueio
Uma variável do tipo omp_nest_lock_t que foi inicializada com omp_init_nest_lock.

Observações

Para mais informações, consulte 3.2.3 as funções omp_set_lock e omp_set_nest_lock.

Exemplos

Veja omp_init_nest_lock para um exemplo de utilização de omp_set_nest_lock.

omp_set_nested

Permite paralelismo aninhado.

void omp_set_nested(
   int val
);

Parâmetros

val
Um valor não nulo permite paralelismo aninhado, enquanto zero desativa o paralelismo aninhado.

Observações

O paralelismo aninhado OMP pode ser ativado com omp_set_nested, ou definindo a variável de ambiente OMP_NESTED .

A definição para omp_set_nested sobrepõe-se à definição da OMP_NESTED variável de ambiente.

Ativar a variável de ambiente pode comprometer um programa que de outra forma estaria operacional, porque o número de threads aumenta exponencialmente quando se aninha regiões paralelas. Por exemplo, uma função que recursa seis vezes com o número de threads OMP definido para 4 requer 4.096 threads (4 elevado à potência de 6). Exceto nas aplicações ligadas a I/O, o desempenho de uma aplicação geralmente degrada-se se houver mais threads do que processadores.

Use omp_get_nested para mostrar a definição atual de omp_set_nested.

Para mais informações, consulte função omp_set_nested 3.1.9.

Example

// 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 nas regiões paralelas seguintes, a menos que seja sobreposto por uma cláusula num_threads .

void omp_set_num_threads(
   int num_threads
);

Parâmetros

num_threads
O número de fios na região paralela.

Observações

Para mais informações, consulte a função omp_set_num_threads 3.1.1.

Example

Veja omp_get_num_threads para um exemplo de utilização de omp_set_num_threads.

omp_test_lock

Tenta definir um bloqueio mas não bloqueia a execução da thread.

int omp_test_lock(
   omp_lock_t *lock
);

Parâmetros

bloqueio
Uma variável do tipo omp_lock_t que foi inicializada com omp_init_lock.

Observações

Para mais informações, consulte 3.2.5 funções omp_test_lock e omp_test_nest_lock.

Example

// 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 nestable mas não bloqueia a execução da thread.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Parâmetros

bloqueio
Uma variável do tipo omp_nest_lock_t que foi inicializada com omp_init_nest_lock.

Observações

Para mais informações, consulte 3.2.5 funções omp_test_lock e omp_test_nest_lock.

Example

// 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

Abre uma fechadura.

void omp_unset_lock(
   omp_lock_t *lock
);

Parâmetros

bloqueio
Uma variável do tipo omp_lock_t que era inicializada com omp_init_lock, pertencente ao thread e executada na função.

Observações

Para mais informações, veja 3.2.4 funções omp_unset_lock e omp_unset_nest_lock.

Example

Veja omp_init_lock para um exemplo de utilização de omp_unset_lock.

omp_unset_nest_lock

Liberta uma fechadura nestable.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Parâmetros

bloqueio
Uma variável do tipo omp_nest_lock_t que era inicializada com omp_init_nest_lock, pertencente à thread e executada na função.

Observações

Para mais informações, consulte 3.2.4 funções omp_unset_lock e omp_unset_nest_lock.

Example

Veja omp_init_nest_lock para um exemplo de utilização de omp_unset_nest_lock.