Редагувати

Поділитися через


OpenMP Functions

Provides links to functions used in the OpenMP API.

The Visual C++ implementation of the OpenMP standard includes the following functions and data types.

For environment execution:

Function Description
omp_set_num_threads Sets the number of threads in upcoming parallel regions, unless overridden by a num_threads clause.
omp_get_num_threads Returns the number of threads in the parallel region.
omp_get_max_threads Returns an integer that is equal to or greater than the number of threads that would be available if a parallel region without num_threads were defined at that point in the code.
omp_get_thread_num Returns the thread number of the thread executing within its thread team.
omp_get_num_procs Returns the number of processors that are available when the function is called.
omp_in_parallel Returns nonzero if called from within a parallel region.
omp_set_dynamic Indicates that the number of threads available in upcoming parallel regions can be adjusted by the run time.
omp_get_dynamic Returns a value that indicates if the number of threads available in upcoming parallel regions can be adjusted by the run time.
omp_set_nested Enables nested parallelism.
omp_get_nested Returns a value that indicates if nested parallelism is enabled.

For lock:

Function Description
omp_init_lock Initializes a simple lock.
omp_init_nest_lock Initializes a lock.
omp_destroy_lock Uninitializes a lock.
omp_destroy_nest_lock Uninitializes a nestable lock.
omp_set_lock Blocks thread execution until a lock is available.
omp_set_nest_lock Blocks thread execution until a lock is available.
omp_unset_lock Releases a lock.
omp_unset_nest_lock Releases a nestable lock.
omp_test_lock Attempts to set a lock but doesn't block thread execution.
omp_test_nest_lock Attempts to set a nestable lock but doesn't block thread execution.
Data type Description
omp_lock_t A type that holds the status of a lock, whether the lock is available or if a thread owns a lock.
omp_nest_lock_t A type that holds one of the following pieces of information about a lock: whether the lock is available, and the identity of the thread that owns the lock and a nesting count.

For timing routines:

Function Description
omp_get_wtime Returns a value in seconds of the time elapsed from some point.
omp_get_wtick Returns the number of seconds between processor clock ticks.

omp_destroy_lock

Uninitializes a lock.

void omp_destroy_lock(
   omp_lock_t *lock
);

Parameters

lock
A variable of type omp_lock_t that was initialized with omp_init_lock.

Remarks

For more information, see 3.2.2 omp_destroy_lock and omp_destroy_nest_lock functions.

Example

See omp_init_lock for an example of using omp_destroy_lock.

omp_destroy_nest_lock

Uninitializes a nestable lock.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Parameters

lock
A variable of type omp_nest_lock_t that was initialized with omp_init_nest_lock.

Remarks

For more information, see 3.2.2 omp_destroy_lock and omp_destroy_nest_lock functions.

Example

See omp_init_nest_lock for an example of using omp_destroy_nest_lock.

omp_get_dynamic

Returns a value that indicates if the number of threads available in upcoming parallel regions can be adjusted by the run time.

int omp_get_dynamic();

Return value

A nonzero value means threads will be dynamically adjusted.

Remarks

Dynamic adjustment of threads is specified with omp_set_dynamic and OMP_DYNAMIC.

For more information, see 3.1.7 omp_set_dynamic function.

Example

See omp_set_dynamic for an example of using omp_get_dynamic.

omp_get_max_threads

Returns an integer that is equal to or greater than the number of threads that would be available if a parallel region without num_threads were defined at that point in the code.

int omp_get_max_threads( )

Remarks

For more information, see 3.1.3 omp_get_max_threads function.

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

Returns a value that indicates if nested parallelism is enabled.

int omp_get_nested( );

Return value

A nonzero value means nested parallelism is enabled.

Remarks

Nested parallelism is specified with omp_set_nested and OMP_NESTED.

For more information, see 3.1.10 omp_get_nested function.

Example

See omp_set_nested for an example of using omp_get_nested.

omp_get_num_procs

Returns the number of processors that are available when the function is called.

int omp_get_num_procs();

Remarks

For more information, see 3.1.5 omp_get_num_procs function.

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

Returns the number of threads in the parallel region.

int omp_get_num_threads( );

Remarks

For more information, see 3.1.2 omp_get_num_threads function.

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

Returns the thread number of the thread executing within its thread team.

int omp_get_thread_num( );

Remarks

For more information, see 3.1.4 omp_get_thread_num function.

Example

See parallel for an example of using omp_get_thread_num.

omp_get_wtick

Returns the number of seconds between processor clock ticks.

double omp_get_wtick( );

Remarks

For more information, see 3.3.2 omp_get_wtick function.

Example

See omp_get_wtime for an example of using omp_get_wtick.

omp_get_wtime

Returns a value in seconds of the time elapsed from some point.

double omp_get_wtime( );

Return value

Returns a value in seconds of the time elapsed from some arbitrary, but consistent point.

Remarks

That point will remain consistent during program execution, making upcoming comparisons possible.

For more information, see 3.3.1 omp_get_wtime function.

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

Returns nonzero if called from within a parallel region.

int omp_in_parallel( );

Remarks

For more information, see 3.1.6 omp_in_parallel function.

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

Initializes a simple lock.

void omp_init_lock(
   omp_lock_t *lock
);

Parameters

lock
A variable of type omp_lock_t.

Remarks

For more information, see 3.2.1 omp_init_lock and omp_init_nest_lock functions.

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

Initializes a lock.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

Parameters

lock
A variable of type omp_nest_lock_t.

Remarks

The initial nesting count is zero.

For more information, see 3.2.1 omp_init_lock and omp_init_nest_lock functions.

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

Indicates that the number of threads available in upcoming parallel regions can be adjusted by the run time.

void omp_set_dynamic(
   int val
);

Parameters

val
A value that indicates if the number of threads available in upcoming parallel regions can be adjusted by the runtime. If nonzero, the runtime can adjust the number of threads, if zero, the runtime won't dynamically adjust the number of threads.

Remarks

The number of threads will never exceed the value set by omp_set_num_threads or by OMP_NUM_THREADS.

Use omp_get_dynamic to display the current setting of omp_set_dynamic.

The setting for omp_set_dynamic will override the setting of the OMP_DYNAMIC environment variable.

For more information, see 3.1.7 omp_set_dynamic function.

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

Blocks thread execution until a lock is available.

void omp_set_lock(
   omp_lock_t *lock
);

Parameters

lock
A variable of type omp_lock_t that was initialized with omp_init_lock.

Remarks

For more information, see 3.2.3 omp_set_lock and omp_set_nest_lock functions.

Examples

See omp_init_lock for an example of using omp_set_lock.

omp_set_nest_lock

Blocks thread execution until a lock is available.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

Parameters

lock
A variable of type omp_nest_lock_t that was initialized with omp_init_nest_lock.

Remarks

For more information, see 3.2.3 omp_set_lock and omp_set_nest_lock functions.

Examples

See omp_init_nest_lock for an example of using omp_set_nest_lock.

omp_set_nested

Enables nested parallelism.

void omp_set_nested(
   int val
);

Parameters

val
A nonzero value enables nested parallelism, while zero disables nested parallelism.

Remarks

OMP nested parallelism can be turned on with omp_set_nested, or by setting the OMP_NESTED environment variable.

The setting for omp_set_nested will override the setting of the OMP_NESTED environment variable.

Enabling the environment variable can break an otherwise operational program, because the number of threads increases exponentially when nesting parallel regions. For example, a function that recurses six times with the number of OMP threads set to 4 requires 4,096 (4 to the power of 6) threads. Except with I/O-bound applications, the performance of an application generally degrades if there are more threads than processors.

Use omp_get_nested to display the current setting of omp_set_nested.

For more information, see 3.1.9 omp_set_nested function.

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

Sets the number of threads in upcoming parallel regions, unless overridden by a num_threads clause.

void omp_set_num_threads(
   int num_threads
);

Parameters

num_threads
The number of threads in the parallel region.

Remarks

For more information, see 3.1.1 omp_set_num_threads function.

Example

See omp_get_num_threads for an example of using omp_set_num_threads.

omp_test_lock

Attempts to set a lock but doesn't block thread execution.

int omp_test_lock(
   omp_lock_t *lock
);

Parameters

lock
A variable of type omp_lock_t that was initialized with omp_init_lock.

Remarks

For more information, see 3.2.5 omp_test_lock and omp_test_nest_lock functions.

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

Attempts to set a nestable lock but doesn't block thread execution.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Parameters

lock
A variable of type omp_nest_lock_t that was initialized with omp_init_nest_lock.

Remarks

For more information, see 3.2.5 omp_test_lock and omp_test_nest_lock functions.

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

Releases a lock.

void omp_unset_lock(
   omp_lock_t *lock
);

Parameters

lock
A variable of type omp_lock_t that was initialized with omp_init_lock, owned by the thread and executing in the function.

Remarks

For more information, see 3.2.4 omp_unset_lock and omp_unset_nest_lock functions.

Example

See omp_init_lock for an example of using omp_unset_lock.

omp_unset_nest_lock

Releases a nestable lock.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Parameters

lock
A variable of type omp_nest_lock_t that was initialized with omp_init_nest_lock, owned by the thread and executing in the function.

Remarks

For more information, see 3.2.4 omp_unset_lock and omp_unset_nest_lock functions.

Example

See omp_init_nest_lock for an example of using omp_unset_nest_lock.