0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|||||||||||
1 | |||||||||||
Распараллеливание с помощью OpenMP05.05.2012, 13:11. Показов 17427. Ответов 41
Метки нет (Все метки)
Здравствуйте, уважаемые участники форума!
Имеется цикл вида:
Буду благодарен за помощь. P.S. Также буду благодарен за любые другие, более профессиональные реализации данной задачи с использованием технологии OpenMP. Добавлено через 3 часа 58 минут В догонку еще вопрос.
0
|
05.05.2012, 13:11 | |
Ответы с готовыми решениями:
41
Как выполнить распараллеливание с помощью OpenMP Распараллеливание циклов с использованием OpenMP C++ Работа с OpenMP. Распараллеливание цикла for Распараллеливание цикла For с использованием OpenMP |
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
06.05.2012, 19:05 | 21 |
0
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 19:07 [ТС] | 22 |
Realese.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
06.05.2012, 19:11 | 23 |
Зачем же было говорить "без оптимизации"?
А какие результаты выводятся в том и в другом случае? r[...] = ? На всякий случай можно ещё так попробовать написать: private(g,k,i) хотя ничего не должно измениться по идее.
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 19:14 [ТС] | 24 |
r[0] = 0
r[1] = 0
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
06.05.2012, 19:22 | 25 | |||||
Чёрт, эти нули не показательны, там переполнение возможно. Давай изменим циклы, чтобы не было переполнений. Например так:
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 19:29 [ТС] | 26 |
Тут такая деталька. Запустил на компе с 4 процами - отработала за 3,52 с.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
06.05.2012, 19:33 | 27 |
С 4мя ядрами? А до этого сколько было ядер? У меня 2 ядра.
И всё-таки, результат тоже важен. У меня в результате вычислений в последнем варианте получается 1217. Вроде везде такое должно получаться.
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
06.05.2012, 19:38 [ТС] | 28 |
Что мы сейчас имеем. На 2 ядрах, у меня, старый вариант работает за 6,5 секунд. Два параллельных работают за 8,8; на 4 ядрах работает за 3,52.
Вот r[] везде нули у меня.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
06.05.2012, 20:24 | 29 |
Вот это в первую очередь непонятно. С кодом из #25 должно получаться 1217. Если, конечно, g = 1 в параллельной секции не потерялось и деление по модулю не убиралось.
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
07.05.2012, 03:27 [ТС] | 30 |
Щас еще раз проверю. Но ускорение нормальное?
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
08.05.2012, 15:10 | 31 |
В этой задаче практически нет использования памяти и нет необходимости синхронизации нитей, поэтому время не должно существенно изменяться пока количество нитей не превышает количество физических ядер (логические, вроде гипертрейдинга, не считаются).
8,8 секунд против 6,5 я считаю серьёзным замедлением. Четырёх ядерный, видимо, совсем другой процессор? В однопоточном варианте-то на нём сколько?
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
08.05.2012, 16:10 [ТС] | 32 |
Итак, еще раз.
2-ядерный процессор: 1-поточный вариант: около 8,8 секунд Наш вариант: около 5 секунд 4-ядерный процессор: 1-поточный вариант: около 6,5 секунд Наш вариант: около 3,3 секунд
0
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
||||||
10.05.2012, 19:56 [ТС] | 33 | |||||
Доброго времени суток, снова вопрос.
Есть код:
0 0 1 1 2 2 3 3 0 0 Вот. А у меня он выдает полную околесицу. Откомпилируйте пожалуйста. Каковы Ваши результаты? В чем может быть проблема?
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
10.05.2012, 20:50 | 34 | |||||
Разное выдаёт. Например
01 30 1 2 2 3 0 0 Но это правильный результат: четыре нуля и по 2 остальных, в десяти строчках. Просто, во-первых, неизвестно в каком порядке будут выполняться нити, а во-вторых, когда 2 нити одновременно выводят что-то на экран, то тут тоже неизвестно сколько символов какая нить успеет вывести перед другой. Поэтому всё перемешивается. Убедиться в этом можно если вынести вывод за параллельную секцию, например так:
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
11.05.2012, 04:09 [ТС] | 35 |
И опять я возвращаюсь к вопросу помочь мне реализовать мою изначальную задачу. Может быть, я не описал ее достаточно конкретно, поэтому напишу еще раз.
Имеется цикл следующего вида: for (i = 0; i<100; i++) { fout<<i+1<<endl; //печать номера итерации в файл first_population(A,n,k); // инициализация начальной популяции (для генетического алгоритма); функция не зависит от того, на какой итерации она выполняется best_num=best_population_individ(A,B,m,n,k,func);// вычисление индекса лучшего индивида (для ГА); функция не зависит от того, на какой итерации она выполняется сохранение лучшего индивида в массив; функция не зависит от того, на какой итерации цикла она выполняется функции работы с поколениями; ВАЖНО: в этой части объявляются две переменные, сохраняющие надежность и скорость алгоритма; изменяются они так; speed = speed + {какое-то число, получающееся в результате работы функций ГА} rel = rel + {какое-то число, получающееся в результате работы функций ГА} fout<<speed<<rel<<endl; } Т.е. пока не выполнились предыдущие итерации, следующие выполнятся не могут из-за: 1. В файл должна выводится аккуратная информация о запусках программы (т.е. типа ИТЕРАЦИЯ 1: поколения такие-то, время такое-то, надежность такая-то, скорость такая-то). 2. Переменные speed и rel высчитываются по результатам работы прошлых итераций. Собственно, вопросы: 1. Целесообразно ли это вообще распараллеливать (по идее надо, поскольку функции, занимающие основное время, это функции работы с ГА, а там не зависит в какой итерации она делаются). 2. К примеру, с помощью #pragma omp for schedule (static, 25) я могу разбить цикл на 25 итераций в каждом куске на 4 ядра. Надо, чтобы программа сначала выполнила так: сначала все нити напечатали номер своей последовательно; потом 4 первых итерации могут параллельно выполнять функции с ГА; затем опять сначала первая ветвь для своей итерации считает переменные speed, rel; и затем каждая из 3 других параллельных нитей считает эти значения по результатам работы предшествующей нити; и все повторяется. Вот. Благодарю за помощь.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
11.05.2012, 20:17 | 36 |
Мне кажется, что с помощью omp for желаемого поведения не удастся. Наверное можно создать секцию omp parallel, в которой организовать уже обычные циклы (у одного 0, 4, 8, ..., у второго 1, 5, 9, ..., и так далее), а в нужном месте вставить барьер и секцию мастер, которая будет выполняться в один поток и объединять результаты четырёх потоков, выводить в правильном порядке и так далее.
Но я бы сначала попытался распараллелить не итерации целиком (так как это не очень естественно), а отдельные фунции. Ведь там обычно однотипная работа с множеством независимых индивидов или их пар. Правда в приведённом алгоритме я не слишком-то узнал привычный мне ГА
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
||||||
16.05.2012, 03:56 [ТС] | 37 | |||||
Вроде распараллелил, теперь неизвестная ошибка.
где у меня вообще может быть выход из блока OpenMP!?
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
16.05.2012, 04:05 | 38 |
Такой код трудно читать. Используй, пожалуйста, специальные тэги для оформления кода (кнопка C++ на панели инструментов в форме ответа). Может успеешь ещё это отформатировать...
Добавлено через 5 минут Но вообще, я смотрю там несколько раз встречается return 0; и в конце ещё return 1; Это всё внутри parallel блока? Да, ретурны не разрешаются. Выход из блока может произойти только одним способом: когда он закончится естественным образом, то есть закрывающей скобкой.
1
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
16.05.2012, 14:55 [ТС] | 39 |
Собственно вот какой вопрос. Имеется натуральное число n (число процессоров). Имеются функции (Гриванка, Розендрока, Растригина и т.д.). Нужно их протестировать. Существует ли алгоритм или метод (возможно, вероятностный), позволяющий определить, сколько тестовых запусков нужно провести, чтобы правильно ли работают алгоритмы. Ну в том смысле, что вот если есть алгоритм. Есть данные о том, как он должен работать правильно. Образно, к примеру, результатом работы должен быть целочисленный массив, все элементы которого больше 50. Очевидно, что проверка на 5 запусках ничего не даст, потому что все 5 раз может выпасть к примеру 60. Но и на 100000 запусков проверять бессмысленна, если будет доказано, что проверка на 50 запусках дает ответ о корректности работы.
Вот есть ли такая схема или метод для ГА. Добавлено через 33 секунды Собственно вот какой вопрос. Имеется натуральное число n (число процессоров). Имеются функции (Гриванка, Розендрока, Растригина и т.д.). Нужно их протестировать. Существует ли алгоритм или метод (возможно, вероятностный), позволяющий определить, сколько тестовых запусков нужно провести, чтобы правильно ли работают алгоритмы. Ну в том смысле, что вот если есть алгоритм. Есть данные о том, как он должен работать правильно. Образно, к примеру, результатом работы должен быть целочисленный массив, все элементы которого больше 50. Очевидно, что проверка на 5 запусках ничего не даст, потому что все 5 раз может выпасть к примеру 60. Но и на 100000 запусков проверять бессмысленна, если будет доказано, что проверка на 50 запусках дает ответ о корректности работы. Вот есть ли такая схема или метод для ГА. Добавлено через 9 минут И еще. В моей программе очень важна возможность при невыполнении некоторых условий (их много) не начинать работу, но они в распараллелином куске кода. Как без return остановить выполнение программы?
0
|
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
|
|
17.05.2012, 19:10 [ТС] | 40 |
И еще раз задаю тот же вопрос. Как выйти из блока OpenMP без return?
0
|
17.05.2012, 19:10 | |
17.05.2012, 19:10 | |
Помогаю со студенческими работами здесь
40
Распараллеливание циклов с ипользованием OpenMP Распараллеливание вычисления интеграла используя редукции (OpenMP) Для распараллеливание процессов лучше пользоваться OpenMP или Win32? OpenMP. Время выполнения программы больше чем без OpenMP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |