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
.