0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|||||||||||
1 | |||||||||||
Распараллеливание с помощью OpenMP05.05.2012, 13:11. Показов 17736. Ответов 41
Метки нет (Все метки)
Здравствуйте, уважаемые участники форума!
Имеется цикл вида:
Буду благодарен за помощь. P.S. Также буду благодарен за любые другие, более профессиональные реализации данной задачи с использованием технологии OpenMP. Добавлено через 3 часа 58 минут В догонку еще вопрос.
0
|
05.05.2012, 13:11 | |
Ответы с готовыми решениями:
41
Как выполнить распараллеливание с помощью OpenMP Распараллеливание циклов с использованием OpenMP C++ Работа с OpenMP. Распараллеливание цикла for Распараллеливание цикла For с использованием OpenMP |
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
05.05.2012, 13:19 | 2 |
Чем и как компилируется? У меня такие результаты:
Код
$ g++ omptest.cpp -o omptest -O3 -fopenmp $ ./omptest Posl Part 1, thread Part 1, thread 0 01 Parallel Part 1, thread 0 1 Parallel 0 Parallel Part 1, thread 1 1 Parallel Part 2, thread Part 2, thread 10 00 0.00510692 Parallel
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
||||||
05.05.2012, 14:37 [ТС] | 3 | |||||
grizlik78, Microsoft Visual Studio 2008. Ctrl+F5
Добавлено через 5 минут У меня результаты совершенно другие, везде последовательно пишет. Плюс к примеру в программе
0
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
05.05.2012, 14:40 | 4 |
В свойствах проекта Configuration Properties → C/C++ → Language
OpenMP включён? У меня GCC и Linux. Но в MSVC тоже должно работать.
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
05.05.2012, 14:46 [ТС] | 5 |
Включил. Спасибо большое!
Подскажите пожалуйста общую концепцию как на Ваш взгляд лучше реализовать мою изначальную задачу. Спасибо.
0
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 17:32 [ТС] | 6 |
Опять же, простой такой вопрос. Вот у меня есть цикл
for (i=0; i<N; i++) { do something; } который выполняется к примеру за 7 секунд. делаем omp_set_num_threads(2); //делаем чтобы выполнялось двумя нитями #pragma omp parallel { for (i=0; i<N; i++) { do something; } } по идее программа должна параллельно выполнить два одинаковых кода, то есть сделать в два раза больше действий за тоже самое время. А она у меня делает за в два раза большее время, т.е. за 14 секунд. А к примеру если я в функции omp_set_num_threads() объявлю не 2, а 3 нити, то на делает не за 14 секунд, а за 10. Вот я видимо чего-то капитально не понимаю, разъясните пожалуйста.
0
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
06.05.2012, 17:35 | 7 |
Очень многое зависит от того, что же там за "do something;"
Добавлено через 1 минуту Кстати, в прагме не забыто слово for ещё?
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 17:39 [ТС] | 8 |
do something в моей задаче, а именно в той, на которой я хочу научиться - это вычисление факториала числа 100.
Но в той задаче, которую мне надо будет сдать преподавателю, на каждой итерации цикла будет выполняться тестовый запуск генетического алгоритма. Вот. По идее, у меня 4 процессора, мне надо чтобы четыре (ну или две) итерации цикла выполнялись одновременно, чтобы максимально сэкономить время. Добавлено через 1 минуту слово for в pragma не писал, да. оно нужно? Добавлено через 10 секунд слово for в pragma не писал, да. оно нужно?
0
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
06.05.2012, 17:41 | 9 |
Нет, раз обе нити должны сделать все N по итераций цикла каждая, то не нужно. Просто показалось
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 17:42 [ТС] | 10 |
Так что я такого не понимаю, что у меня ничего не работает?
0
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
06.05.2012, 17:45 | 11 |
Я OpenMP сам только начал осваивать, так что всех граблей назвать не смогу. Ну давай для начала хоть с факториалами попробуем ускорить. Хотя ждать, что 2 ядра выполнят в 2 раза больше работы не стоит, но хотя бы 1,5 раза в большинстве случаев получается легко.
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 17:53 [ТС] | 12 |
хорошо. мой код пока такой
double start, end; start = omp_get_wtime(); int i, k, g = 1; omp_set_num_threads(2); #pragma omp parallel { for (i = 0; i<100000; i++) { for (k = 1; k<1000; k++) { g = g*k; } } } end = omp_get_wtime(); cout<<end-start<<endl; По нашему замыслу эта прога должна работать ну максимум в 1,5 раза больше, чем просто for (i = 0; i<100000; i++) { for (k = 1; k<1000; k++) { g = g*k; } } Но вот не работает.
0
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
||||||
06.05.2012, 18:31 | 13 | |||||
Здесь все нити работают с одной и той же переменной g, изменяя её. Поэтому процессору надо постоянно синхронизировать значение этой переменной между ядрами. Промежуточные результаты стоить делать принадлежащими только одной нити, указав, например, private(g) в прагме. Переменные цикла по умолчанию приватные.
Но вообще пример не очень хороший, так как оптимизатор может его сильно изменить в зависимости от режима компиляции. Предлагаю несколько модифицировать и сравнить быстродействие и результат на таком коде:
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 18:34 [ТС] | 14 |
А как включить оптимизацию?
0
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
06.05.2012, 18:35 | 15 |
Ну, если проект компилируется в режиме Release, то она, как правило, включена по умолчанию. В Debug по умолчанию выключена.
0
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 18:39 [ТС] | 16 |
Скомпилировал вот без оптимизации, результат ужасный - если раньше выполнялось за 4 секунды, то сейчас за 25.
0
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
06.05.2012, 18:42 | 17 |
Ну, увеличение времени понятно, деление по модулю операция не быстрая. А результат в сравнении параллельно и нет как? У меня время практически одинаково. параллельный процентов 5 проигрывает всего.
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 19:00 [ТС] | 18 |
Я же написал выше, что когда запускал без параллельного, то было 4 секунды. А с параллельным стало 25.
Добавлено через 2 минуты Если закомментить деление по модулю, то будет 8 секунд.
0
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
06.05.2012, 19:01 | 19 |
А нельзя ли всё-таки с оптимизацией попробовать?
0
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 19:02 [ТС] | 20 |
Как проверить включена она или нет, и если нет, как включить?
0
|
06.05.2012, 19:02 | |
06.05.2012, 19:02 | |
Помогаю со студенческими работами здесь
20
Распараллеливание циклов с ипользованием OpenMP Распараллеливание вычисления интеграла используя редукции (OpenMP) Для распараллеливание процессов лучше пользоваться OpenMP или Win32? OpenMP. Время выполнения программы больше чем без OpenMP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |