Главная страница
Навигация по странице:

  • 3.5.5 Директива flush Синхронизация типа flush

  • 3.6 Примеры программ с использованием технологии OpenMP

  • БИБЛИОГРАФИЧЕСКИЙ СПИСОК

  • Основы параллельного программирования с использованием технологий MPI и OpenMP

  • Учебное пособие саранск издательство свмо 2013 2 удк 004. 42 Ббк з97 Авторский знак о753


    Скачать 6.58 Mb.
    НазваниеУчебное пособие саранск издательство свмо 2013 2 удк 004. 42 Ббк з97 Авторский знак о753
    Дата03.04.2022
    Размер6.58 Mb.
    Формат файлаpdf
    Имя файлаParProg_MPI_OpenMP.pdf
    ТипУчебное пособие
    #439244
    страница8 из 8
    1   2   3   4   5   6   7   8
    omp_destroy_lock() и
    omp_destroy_nest_lock() используются для переведения простого или множественного замка в неинициализированное состояние.
    Для захватывания замка используются функции omp_set_lock() и
    omp_set_nest_lock().
    Вызвавшая эту функцию нить дожидается освобождения замка, а затем захватывает его. Замок при этом переводится в заблокированное состояние. Если множественный замок уже захвачен данной нитью, то нить не блокируется, а коэффициент захваченности увеличивается на единицу.
    Для освобождения замка используются функции omp_unset_lock() и
    omp_unset_nest_lock(). Вызов этой функции освобождает простой замок, если он был захвачен вызвавшей нитью. Для множественного замка уменьшает на единицу коэффициент захваченности. Если коэффициент станет равен нулю, замок освобождается. Если после освобождения замка есть нити, заблокированные на операции, захватывающей данный замок, замок будет сразу же захвачен одной из ожидающих нитей.
    Для неблокирующей попытки захвата замка используются функции
    omp_test_lock() и omp_test_nest_lock(). Данная функция пробует захватить указанный замок. Если это удалось, то для простого замка функция

    73 возвращает 1, а для множественного замка – новый коэффициент захваченности. Если замок захватить не удалось, в обоих случаях возвращается 0.
    Использование замков является наиболее гибким механизмом синхронизации, поскольку с помощью замков можно реализовать все остальные варианты синхронизации [6].
    3.5.5 Директива flush
    Синхронизация типа flush используется для обновления значений локальных переменных, перечисленных в качестве аргументов этой команды, в оперативной памяти. После выполнения этой директивы все переменные, перечисленные в этой директиве, имеют одно и то же значение для всех параллельных потоков.
    #pragma omp flush [(список)]
    Выполнение данной директивы предполагает, что значения всех переменных (или переменных из списка, если он задан), временно хранящиеся в регистрах и кэш-памяти текущей нити, будут занесены в основную память; все изменения переменных, сделанные нитью во время работы, станут видимы остальным нитям; если какая-то информация хранится в буферах вывода, то буферы будут сброшены и т.п. При этом операция производится только с данными вызвавшей нити, данные, изменявшиеся другими нитями, не затрагиваются. Поскольку выполнение данной директивы в полном объёме может повлечь значительных накладных расходов, а в данный момент нужна гарантия согласованного представления не всех, а лишь отдельных переменных, то эти переменные можно явно перечислить в директиве списком. До полного завершения операции никакие действия с перечисленными в ней переменными не могут начаться.
    Неявно flush без параметров присутствует в директиве barrier, на входе и выходе областей действия директив parallel, critical, ordered, на выходе областей распределения работ, если не используется опция nowait, в вызовах функций omp_set_lock(), omp_unset_lock(), omp_test_lock(),
    omp_set_nest_lock(), omp_unset_nest_lock(), omp_test_nest_lock(), если при этом замок устанавливается или снимается, а также перед порождением и после завершения любой задачи (task). Кроме того, flush вызывается для переменной, участвующей в операции, ассоциированной с директивой
    atomic. Заметим, что flush не применяется на входе области

    74 распределения работ, а также на входе и выходе области действия директивы master [12,14].
    3.6 Примеры программ с использованием технологии OpenMP
    Первая программа реализует операцию перемножения двух квадратных матриц.
    В последовательной области происходит инициализация массивов и замер времени. Затем порождается параллельная область, исходные и результирующий массивы являются общими переменными, а параметры циклов частными. После выхода из параллельной секции снова происходит замер времени, вывод результата и общего времени выполнения программы на экран [3,5].
    Программа. Параллельное перемножение двух квадратных матриц
    #include
    #include
    #define N 1000
    int main()
    {
    double A[N][N], B[N][N] ,C[N][N];
    int i ,j, k;
    double start, end;
    for (i=0; i<; ,i++)
    for (j=0; j
    {
    A[i][j]=i+j;
    B[i][j]=i*j;
    }
    start=omp_get_wtime();
    #pragma omp parallel for shared(A,B,C) private(i, j, k)
    for (i=0; i<; ,i++){
    for (j=0; j
    C[i][j]=0;
    for (k=0; k
    C[i][j]+=A[i][k]*B[k][j];
    }
    }
    end=omp_get_wtime();
    for (i=0; i<; ,i++)
    for (j=0; j
    printf (“C[%d][%d]=%lf\n” , i, j, C[i][j]);

    75
    printf (“Time %lf\n” , end-start);
    return 0;
    }
    В следующем примере вычисляется определенный интеграл от функции sin(x) методом трапеций. В параллельной области вычисляется значение функции для каждого интервала разбиения и разграничивается доступ к операции сложения директивой atomic [9].
    Программа. Параллельное вычисление интеграла методом трапеций
    #include
    #include
    #include
    double a,b,h;
    double f(int j)
    {
    return sin(a+j*h);
    }
    int main()
    {
    double sum,result;
    int i,N;
    sum=0;
    result=0;
    printf("Vvedite a,b,N\n");
    scanf("%lf %lf %d", a ,b ,N);
    h=(b-a)/N;
    #pragma omp parallel for private (i) shared (N)
    for (i=1;i
    {
    #pragma omp atomic
    sum+=f(i);
    }
    result=h*((f(0)+f(N))/2+sum);
    printf("Znachenie %0.5lf",result);
    system("PAUSE");
    return 0;
    }

    76
    БИБЛИОГРАФИЧЕСКИЙ СПИСОК
    1.
    Антонов А.С. Введение в параллельные вычисления: Методическое пособие. – М.: Изд-во Физфака МГУ, 2002. – 70 с.
    2.
    Антонов А.С. Параллельное программирование с использованием технологии MPI: Учебное пособие. – М.: Изд-во МГУ, 2004. – 71 с.
    3.
    Антонов А.С. Параллельное программирование с использованием технологии OpenMP: Учебное пособие. – М.: Изд-во МГУ, 2009. – 79 с.
    4.
    Букатов А.А., Дацюк В.Н., Жегуло А.И.. Программирование многопроцессорных вычислительных систем.

    Ростов-на-Дону:
    Издательство ООО «ЦВВР», 2003. – 208 с.
    5.
    Бурова И.Г., Демьянович Ю.К. Алгоритмы параллельных вычислений и программирование: Курс лекций. – СПб.: Изд-во С-Пб. ун-та, 2007. –
    206 с.
    6.
    Васильева М.В., Захаров П.Е., Сирдитов И.К., Попов П.А.,
    Еремеева М.С. Параллельное программирование на основе библиотек:
    Учебное пособие (
    http://edu.chpc.ru/parallel/main.html
    )
    7.
    Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб.:
    БХВ-Петербург, 2002. – 608 с.
    8.
    Гергель В.П. Теория и практика параллельных вычислений: Учебный курс (
    http://www.intuit.ru/studies/courses/1156/190/info
    )
    9.
    Гергель В.П., Стронгин, Р.Г. Основы параллельных вычислений для многопроцессорных вычислительных систем: Учебное пособие – Нижний
    Новгород: Изд-во ННГУ им. Н.И. Лобачевского, 2003. – 184 с.
    10.
    Гришагин В.А., Свистунов А.Н. Параллельное программирование на основе MPI: Учебное пособие – Нижний Новгород: Изд-во ННГУ им. Н.И. Лобачевского, 2005. – 93 с.
    11.
    Левин М.П. Параллельное программирование с использованием
    OpenMP: Курс лекций (
    http://www.intuit.ru/studies/courses/1112/232/info
    )
    12.
    Технологии параллельного программирования (
    http://parallel.ru/tech
    )
    13.
    Что такое OpenMP? (
    http://parallel.ru/tech/tech_dev/openmp.html
    )
    14.
    OpenMP Architecture Review Board (
    http://openmp.org/wp/
    )

    77
    ДЛЯ ЗАМЕТОК

    78
    Учебное пособие
    Жалнин Руслан Викторович
    Панюшкина Елена Николаевна
    Пескова Елизавета Евгеньевна
    Шаманаев Павел Анатольевич
    Основы параллельного программирования с использованием
    технологий MPI и OpenMP
    Ответственные за выпуск:
    Панюшкина Е.Н., Пескова Е.Е.
    Сдано в набор
    Подписано к печати
    Формат 60x84 1/16
    Тираж 100 экз.
    Издательство Средневолжского математического общества
    Напечатано в лаборатории НИИ Математики при Мордовском государственном университете имени Н.П. Огарёва
    430000, г. Саранск, ул. Большевистская, 68
    1   2   3   4   5   6   7   8


    написать администратору сайта