Санкт-Петербургский государственный университет
Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 955 / 173 | Длительность: 05:14:00
Лекция 8:

Программирование с использованием OpenMP

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

Подпрограммы

  • void omp_set_num_threads(int threads);
    
    subroutine omp_set_num_threads(threads)
    integer threads

    Задает количество потоков (threads) при выполнении параллельных секций программы

  • int omp_get_num_threads(void);
    
    integer function omp_get_num_threads()
    

    Возвращает количество потоков, используемых для выполнения параллельной секции.

  • void omp_set_nested(int nested);
    
    subroutine omp_set_nested(nested)
    integer nested
    

    Разрешает или запрещает вложенный параллелизм. По умолчанию запрещен.

  • int omp_get_nested(void);
    
    logical function omp_get_nested()

    Определяет, разрешен ли вложенный параллелизм.

  • void omp_init_lock(omp_lock_t *lock);
    
    subroutine omp_init_lock(lock)
    integer(kind = omp_lock_kind) :: lock

    Инициализирует блокировку, связанную с идентификатором lock, для использования в последующих вызовах.

  • void omp_set_lock(omp_lock_t *lock);
    
    subroutine omp_set_lock(lock)
    integer(kind = omp_lock_kind) :: lock

    Переводит потоки из состояния выполнения в состояние ожидания до тех пор, пока блокировка, связанная с идентификатором lock, не окажется доступной. Поток становится владельцем доступной блокировки.

  • void omp_unset_lock(omp_lock_t *lock);
    
    subroutine omp_unset_lock(lock)
    integer(kind = omp_lock_kind) :: lock

    После выполнения вызова поток перестает быть владельцем блокировки, связанной с идентификатором lock. Если поток не был владельцем блокировки, результат вызова не определен.

Таймеры

  • double omp_get_wtime(void);
    
    double precision function omp_get_wtime()

    Время в секундах, прошедшее с произвольного момента в прошлом. Точка отсчета остается неизменной в течение всего времени выполнения программы

  • double omp_get_wtick(void);
    
    double precision function omp_get_wtick()

    Время в секундах, прошедшее между последовательными "тиками". Это время является мерой точности таймера.

Переменные окружения

Переменные окружения задаются следующим образом:

export ПЕРЕМЕННАЯ=значение (UNIX)

set ПЕРЕМЕННАЯ=значение (Microsoft Windows)
  •  OMP_NUM_THREADS

    Задает количество нитей при выполнении параллельных секций программы.

  • OMP_SCHEDULE

    Задает способ распределения итераций циклов между нитями. Возможные значения:

    static;
    dynamic;
    guided.
    

    Количество итераций (необязательный параметр) указывается после одного из этих ключевых слов, отделяясь от него запятой, например:

    export OMP_SCHEDULE="static, 10"

Примеры

  1. program omp_example
    integer i, k, N
    real*4 sum, h, x
    print *, "Please, type in N:"
    read *, N
    h = 1.0 / N
    sum = 0.0
    !$OMP PARALLEL DO SCHEDULE(STATIC) REDUCTION(+:sum)
    do i = 1, N
    x = i * h
    sum = sum + 1.e0 * h / (1.e0 + x**2)
    enddo
    print *, 4.0 * sum
    end
  2. #include "omp.h"
    #include <stdio.h >
    double f(double x) {
    return 4.0 / (1 + x * x); }
    main () {
    const long N = 100000;
    long i;
    double h, sum, x;
    sum = 0;
    h = 1.0 / N;
    #pragma omp parallel shared(h) {
    #pragma omp for private(x) reduction(+:sum)
    for (i = 0; i < N; i++) {
    x = h * (i + 0.5);
    sum = sum + f(x); } }
    printf("PI = %f\n", sum / N); }

Поддержка

OpenMP поддерживается компиляторами Intel®, GCC и другими.

Компиляция OpenMP-программ выполняется с ключом -openmp или –fopenmp.

< Лекция 7 || Лекция 8: 123 || Лекция 9 >