Funciones de OpenMP

Proporciona vínculos a funciones usadas en la API de OpenMP.

La implementación de Visual C++ del estándar OpenMP incluye los siguientes tipos de funciones y datos.

Para la ejecución del entorno:

Función Descripción
omp_set_num_threads Establece el número de subprocesos en próximas regiones paralelas, a menos que sea inválido por una cláusula num_threads.
omp_get_num_threads Devuelve el número de subprocesos de la región paralela.
omp_get_max_threads Devuelve un entero que es igual o mayor que el número de subprocesos que estarían disponibles si una región paralela sin num_threads se definió en ese punto del código.
omp_get_thread_num Devuelve el número de subproceso del subproceso que se ejecuta dentro de su equipo de subprocesos.
omp_get_num_procs Devuelve el número de procesadores disponibles cuando se llama a la función.
omp_in_parallel Devuelve un valor distinto de cero si se llama desde dentro de una región paralela.
omp_set_dynamic Indica que el número de subprocesos disponibles en próximas regiones paralelas se puede ajustar en tiempo de ejecución.
omp_get_dynamic Devuelve un valor que indica si el número de subprocesos disponibles en próximas regiones paralelas se puede ajustar en tiempo de ejecución.
omp_set_nested Habilita el paralelismo anidado.
omp_get_nested Devuelve un valor que indica si el paralelismo anidado está habilitado.

Para bloqueo:

Función Descripción
omp_init_lock Inicializa un bloqueo simple.
omp_init_nest_lock Inicializa un bloqueo.
omp_destroy_lock Anula la inicialización de un bloqueo.
omp_destroy_nest_lock Anula la inicialización de un bloqueo anidado.
omp_set_lock Bloquea la ejecución del subproceso hasta que haya un bloqueo disponible.
omp_set_nest_lock Bloquea la ejecución del subproceso hasta que haya un bloqueo disponible.
omp_unset_lock Libera un bloqueo.
omp_unset_nest_lock Libera un bloqueo anidado.
omp_test_lock Intenta establecer un bloqueo, pero no bloquea la ejecución de subprocesos.
omp_test_nest_lock Intenta establecer un bloqueo anidado, pero no bloquea la ejecución de subprocesos.
Tipo de datos Descripción
omp_lock_t Tipo que contiene el estado de un bloqueo, tanto si el bloqueo está disponible como si un subproceso posee un bloqueo.
omp_nest_lock_t Tipo que contiene una de las siguientes partes de información sobre un bloqueo: si el bloqueo está disponible y la identidad del subproceso que posee el bloqueo y un recuento de anidamiento.

Para rutinas temporales:

Función Descripción
omp_get_wtime Devuelve un valor en segundos del tiempo transcurrido desde algún momento.
omp_get_wtick Devuelve el número de segundos entre los tics del reloj del procesador.

omp_destroy_lock

Anula la inicialización de un bloqueo.

void omp_destroy_lock(
   omp_lock_t *lock
);

Parámetros

lock
Variable de tipo omp_lock_t que se inicializó con omp_init_lock.

Comentarios

Para obtener más información, vea funciones 3.2.2 omp_destroy_lock y omp_destroy_nest_lock.

Ejemplo

Vea omp_init_lock para obtener un ejemplo de uso de omp_destroy_lock.

omp_destroy_nest_lock

Anula la inicialización de un bloqueo anidado.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Parámetros

lock
Variable de tipo omp_nest_lock_t que se inicializó con omp_init_nest_lock.

Comentarios

Para obtener más información, vea funciones 3.2.2 omp_destroy_lock y omp_destroy_nest_lock.

Ejemplo

Vea omp_init_nest_lock para obtener un ejemplo de uso de omp_destroy_nest_lock.

omp_get_dynamic

Devuelve un valor que indica si el número de subprocesos disponibles en próximas regiones paralelas se puede ajustar en tiempo de ejecución.

int omp_get_dynamic();

Valor devuelto

Un valor distinto de cero significa que los subprocesos se ajustarán dinámicamente.

Comentarios

El ajuste dinámico de subprocesos se especifica con omp_set_dynamic y OMP_DYNAMIC.

Para obtener más información, vea 3.1.7 función omp_set_dynamic.

Ejemplo

Consulte omp_set_dynamic para obtener un ejemplo de uso de omp_get_dynamic.

omp_get_max_threads

Devuelve un entero que es igual o mayor que el número de subprocesos que estarían disponibles si una región paralela sin num_threads se definió en ese punto del código.

int omp_get_max_threads( )

Comentarios

Para obtener más información, vea 3.1.3 función omp_get_max_threads.

Ejemplo

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

Devuelve un valor que indica si el paralelismo anidado está habilitado.

int omp_get_nested( );

Valor devuelto

Un valor distinto de cero significa que el paralelismo anidado está habilitado.

Comentarios

El paralelismo anidado se especifica con omp_set_nested y OMP_NESTED.

Para obtener más información, vea 3.1.10 función omp_get_nested.

Ejemplo

Consulte omp_set_nested para obtener un ejemplo de uso de omp_get_nested.

omp_get_num_procs

Devuelve el número de procesadores disponibles cuando se llama a la función.

int omp_get_num_procs();

Comentarios

Para obtener más información, vea 3.1.5 función omp_get_num_procs.

Ejemplo

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

Devuelve el número de subprocesos de la región paralela.

int omp_get_num_threads( );

Comentarios

Para obtener más información, vea 3.1.2 función omp_get_num_threads.

Ejemplo

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

Devuelve el número de subproceso del subproceso que se ejecuta dentro de su equipo de subprocesos.

int omp_get_thread_num( );

Comentarios

Para obtener más información, vea 3.1.4 función omp_get_thread_num.

Ejemplo

Consulte parallel para ver un ejemplo de uso de omp_get_thread_num.

omp_get_wtick

Devuelve el número de segundos entre los tics del reloj del procesador.

double omp_get_wtick( );

Comentarios

Para obtener más información, vea 3.3.2 función omp_get_wtick.

Ejemplo

Vea omp_get_wtime para obtener un ejemplo de uso de omp_get_wtick.

omp_get_wtime

Devuelve un valor en segundos del tiempo transcurrido desde algún momento.

double omp_get_wtime( );

Valor devuelto

Devuelve un valor en segundos del tiempo transcurrido desde algún punto arbitrario, pero coherente.

Comentarios

Ese punto seguirá siendo coherente durante la ejecución del programa, lo que hará posibles las próximas comparaciones.

Para obtener más información, vea 3.3.1 función omp_get_wtime.

Ejemplo

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

Devuelve un valor distinto de cero si se llama desde dentro de una región paralela.

int omp_in_parallel( );

Comentarios

Para obtener más información, vea 3.1.6 función omp_in_parallel.

Ejemplo

// 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 un bloqueo simple.

void omp_init_lock(
   omp_lock_t *lock
);

Parámetros

lock
Una variable de tipo omp_lock_t.

Comentarios

Para obtener más información, vea 3.2.1 omp_init_lock y funciones de omp_init_nest_lock.

Ejemplo

// 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 un bloqueo.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

Parámetros

lock
Una variable de tipo omp_nest_lock_t.

Comentarios

El recuento de anidamiento inicial es cero.

Para obtener más información, vea 3.2.1 omp_init_lock y funciones de omp_init_nest_lock.

Ejemplo

// 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 el número de subprocesos disponibles en próximas regiones paralelas se puede ajustar en tiempo de ejecución.

void omp_set_dynamic(
   int val
);

Parámetros

val
Un valor que indica si el número de subprocesos disponibles en próximas regiones paralelas se puede ajustar en tiempo de ejecución. Si no es cero, el tiempo de ejecución puede ajustar el número de subprocesos, si es cero, el tiempo de ejecución no ajustará dinámicamente el número de subprocesos.

Comentarios

El número de subprocesos nunca superará el valor establecido por omp_set_num_threads o por OMP_NUM_THREADS.

Use omp_get_dynamic para mostrar la configuración actual de omp_set_dynamic.

El valor de omp_set_dynamic invalidará la configuración de la variable de entorno OMP_DYNAMIC.

Para obtener más información, vea 3.1.7 función omp_set_dynamic.

Ejemplo

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

Bloquea la ejecución del subproceso hasta que haya un bloqueo disponible.

void omp_set_lock(
   omp_lock_t *lock
);

Parámetros

lock
Variable de tipo omp_lock_t que se inicializó con omp_init_lock.

Comentarios

Para obtener más información, vea 3.2.3 omp_set_lock y funciones de omp_set_nest_lock.

Ejemplos

Vea omp_init_lock para obtener un ejemplo de uso de omp_set_lock.

omp_set_nest_lock

Bloquea la ejecución del subproceso hasta que haya un bloqueo disponible.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

Parámetros

lock
Variable de tipo omp_nest_lock_t que se inicializó con omp_init_nest_lock.

Comentarios

Para obtener más información, vea 3.2.3 omp_set_lock y funciones de omp_set_nest_lock.

Ejemplos

Vea omp_init_nest_lock para obtener un ejemplo de uso de omp_set_nest_lock.

omp_set_nested

Habilita el paralelismo anidado.

void omp_set_nested(
   int val
);

Parámetros

val
Un valor distinto de cero permite el paralelismo anidado, mientras que cero deshabilita el paralelismo anidado.

Comentarios

El paralelismo anidado de OMP se puede activar con omp_set_nested o estableciendo la variable de entorno OMP_NESTED.

El valor de omp_set_nested invalidará la configuración de la variable de entorno OMP_NESTED.

La habilitación de la variable de entorno puede interrumpir un programa operativo en caso contrario, ya que el número de subprocesos aumenta exponencialmente al anidar regiones paralelas. Por ejemplo, una función que se repite seis veces con el número de subprocesos OMP establecidos en 4 requiere 4 096 (4 a la potencia de 6). Excepto con las aplicaciones enlazadas a E/S, el rendimiento de una aplicación generalmente se degrada si hay más subprocesos que procesadores.

Use omp_get_nested para mostrar la configuración actual de omp_set_nested.

Para obtener más información, vea 3.1.9 función omp_set_nested.

Ejemplo

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

Establece el número de subprocesos en próximas regiones paralelas, a menos que sea inválido por una cláusula num_threads.

void omp_set_num_threads(
   int num_threads
);

Parámetros

num_threads
El número de subprocesos de la región paralela.

Comentarios

Para obtener más información, vea 3.1.1 función omp_set_num_threads.

Ejemplo

Vea omp_get_num_threads para obtener un ejemplo de uso de omp_set_num_threads.

omp_test_lock

Intenta establecer un bloqueo, pero no bloquea la ejecución de subprocesos.

int omp_test_lock(
   omp_lock_t *lock
);

Parámetros

lock
Variable de tipo omp_lock_t que se inicializó con omp_init_lock.

Comentarios

Para obtener más información, vea 3.2.5 funciones omp_test_lock y omp_tet_nest_lock.

Ejemplo

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

Intenta establecer un bloqueo anidado, pero no bloquea la ejecución de subprocesos.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Parámetros

lock
Variable de tipo omp_nest_lock_t que se inicializó con omp_init_nest_lock.

Comentarios

Para obtener más información, vea 3.2.5 funciones omp_test_lock y omp_tet_nest_lock.

Ejemplo

// 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 un bloqueo.

void omp_unset_lock(
   omp_lock_t *lock
);

Parámetros

lock
Variable de tipo omp_lock_t que se inicializó con omp_init_lock, propiedad del subproceso y que se ejecuta en la función.

Comentarios

Para obtener más información, vea 3.2.4 omp_unset_lock y funciones de omp_unset_nest_lock.

Ejemplo

Vea omp_init_lock para obtener un ejemplo de uso de omp_unset_lock.

omp_unset_nest_lock

Libera un bloqueo anidado.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Parámetros

lock
Variable de tipo omp_nest_lock_t que se inicializó con omp_init_nest_lock, propiedad del subproceso y que se ejecuta en la función.

Comentarios

Para obtener más información, vea 3.2.4 omp_unset_lock y funciones de omp_unset_nest_lock.

Ejemplo

Vea omp_init_nest_lock para obtener un ejemplo de uso de omp_unset_nest_lock.