Форум программистов, компьютерный форум, киберфорум
OpenMP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
3 / 3 / 0
Регистрация: 16.01.2017
Сообщений: 11
1

Не удается распараллелить цикл через OpenMP в Fortran

20.04.2020, 23:02. Показов 1058. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Пытаюсь распараллелить цикл do в Фортране (Inteal Parallel Studio поверх MSVS) на 6 ядер (процессор AMD FX-6300). Для чего обрамил данный цикл директивами
!$OMP DO

мой цикл do

!$OMP END DO

В свойствах проекта поставил Generate Parallel Code (/Qopenmp). Однако наблюдение за запущенной программой в Process Explorer, что существует лишь один Thread ID, т.е. программа не распараллелилась. Что можно сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2020, 23:02
Ответы с готовыми решениями:

Не удается правильно распараллелить программу табулирования функции, используя OpenMP
Необходимо было написать программу для табулирования функции. Расчеты выводит правильные, но время...

Распараллелить цикл со сложной индексацией используя OpenMP
Пусть есть такой цикл, преобразующий массив: #define N 6 #define RADIUS 1 int arr; int...

Распараллелить, используя OpenMP
Имеется программа, для нахождения определенного интеграла. Необходимо ее распараллелить. Я сделал,...

Распараллелить метод Гаусса (OpenMP)
Доброго времени суток, дамы и господа! Столкнулась с проблемой следующего рода - не получается...

7
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
25.04.2020, 01:57 2
Экспериментировал как-то из интереса, но уже забыл что и как. Нужно компилятору сообщить о применении распрараллеливающих инструкций, поставить ключ, это Вы вроде бы сделали. Но по моему там еще дополнительные инструкции должны быть, нужно изучать литературу. Однако самым принципиальным является вопрос возможности распараллеливания, тип решаемой задачи. Если у Вас компилятор intel, то можно посмотреть в сторону собственных средств распараллеливания фортран программ. Хотя такой способ вероятно лучше подходит для новых программ.
0
3 / 3 / 0
Регистрация: 16.01.2017
Сообщений: 11
27.04.2020, 12:33  [ТС] 3
Цитата Сообщение от WH Посмотреть сообщение
Если у Вас компилятор intel, то можно посмотреть в сторону собственных средств распараллеливания фортран программ. Хотя такой способ вероятно лучше подходит для новых программ.
Не очень понял это предложение. Интеловский компилятор. Т.е. у него есть еще какие-то собственные возможности распараллеливания? Это небольшой расчет, написанный сейчас, а не старая программа. Задача распараллеливается абсолютно прозрачно, т.к. снаружи стоит цикл в котором считаются точки на графике - соответственно нужно разделить весь диапазон значений на поддиапазоны и отдать из считаться в разные процессы.

Добавлено через 11 минут
По опциям компилятора буду читать.
0
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
27.04.2020, 13:37 4
Цитата Сообщение от zpal Посмотреть сообщение
Не очень понял это предложение. Интеловский компилятор. Т.е. у него есть еще какие-то собственные возможности распараллеливания?
Не именно у компилятора, а в самом стандарте фортрана. Просто свободный компилятор Gfortran, к примеру, не все поддерживает, насколько успевают разработчики включать новшества из стандартов, настолько и поддерживает. Это можно посмотреть на сайте, что включено, что планируется в предстоящей версии и т.п. А вот разработчики Intel Fortran пошустрее в этом смысле, но так этот компилятор и стоит не мало.

Из того что я знаю это так называемые комассивы coarry и параллельный цикл do concurrent. Сам не пользуюсь, нет надобности (как нет и iFort-а), но если Вам нужно поизучайте, вполне возможно Вам этого будет достаточно. Это кроме OpenMP и MPI, именно собственные средства языка.
0
3 / 3 / 0
Регистрация: 16.01.2017
Сообщений: 11
25.05.2020, 16:23  [ТС] 5
Распараллелить на 6 потоков (тредов) удалось после включения опции компилятора /Qopenmp в разделе Language. Как оказалось, эта опция объявляет макрос _OPENMP. Т.е., оказывается, макросы могут объявляться опциями компилятора, без объявления в исходном тексте программы.
Теперь, когда опция указана в код нужно добавить
#ifdef _OPENMP
include 'omp_lib.h'
#endif
дабы включить заголовочный файл omp.h

Далее нужно объявлять параллельную область
!$omp parallel shared(z)
и внутри нее параллельный цикл
!$omp do private(x,y)&
schedule(static)
тело цикла
!$omp end do
!$omp end parallel
z- разделяемая переменная, x,y - приватные (в каждом процессе свои значения, например счетчик цикла и др.)
Однако есть еще одна хитрость. Если в цикле вызываются функции, то это уже не параллельный фрагмент (parallel construct), а параллельная область (parallel region, терминология из книги Гергеля). Т.е. в эту параллельную область входит уже и код этой функции и код других функций, которые она вызывает. Тут и возникает проблема в том, что через глобальные переменные в такую функцию ничего не передашь (через глоб. константы можно), поэтому приходится увеличивать список аргументов функции.
В параллельную область можно вставить еще конструкцию
!$omp single
nthr=OMP_GET_NUM_THREADS();
print *,'number of threads= ',nthr
!$omp end single
чтобы узнать на сколько потоков распараллелилось. В моем случае на процессоре AMD FX-6300 получилось 6 потоков, а выигрыш по времени составил где-то 3,6 раз. Правда это измерялось на очень небольшой выборке. На выборке побольше выигрыш может оказаться большим. В программе Process Explorer загрузка процессора составляла 16,6% без распараллеливания и 96% при его наличии.
1
155 / 135 / 9
Регистрация: 21.10.2012
Сообщений: 413
25.05.2020, 17:49 6
Цитата Сообщение от zpal Посмотреть сообщение
Распараллелить на 6 потоков (тредов)
Не могли бы код выложить?
Хочется тоже в этом вопросе разобраться.
0
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
25.05.2020, 18:18 7
А собственные средства, о которых говорили выше, не удалось применить?
0
3 / 3 / 0
Регистрация: 16.01.2017
Сообщений: 11
25.05.2020, 20:31  [ТС] 8
chessman2, код постоянно меняю. Посмотрите лучше интеловский пример, откуда я это и взял - http://saddleback.atmos.colost... sample.f90.
WH, как-то указывал вроде опцию optimization/parallelization/yes (не помню точно) и вроде несколько потоков создавалось, но забил на это т.к. руками через OpenMP как-то понятнее. Coarray и т.д. не смотрел.
1
25.05.2020, 20:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2020, 20:31
Помогаю со студенческими работами здесь

Распараллелить метод Зейделя-Гаусса используя OpenMP
Сама программа вот: #include "stdafx.h" #include "iostream" #include "math.h" #include...

Распараллелить несколько разных процедур с помощью OpenMP
Требуется распараллелить несколько разных процедур с помощью OpenMP 3.0 в gcc 4.5. Но проблема в...

Как распараллелить процедуру Fortran OMP
SUBROUTINE rasch(a,n,m1,m2,np,mp,al,mpl,indx,b) INTEGER ::...

Не могу разобраться с OpenMP! Как правильно распараллелить формулу?
Только начинаю изучать ПП. Помогите разобраться как распараллелить формулу. Данные зависимы. Не...

Не удаётся распараллелить программу
Доброго времени суток. Есть программа, её нужно распараллелить, получив выигрыш во времени. Беда...

Распараллелить цикл
Распараллелить цикл: For(i=2;i<N;i++) For(j=2;i<N;j++) A =A +A; #include <iostream>...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru