0 / 0 / 1
Регистрация: 16.07.2015
Сообщений: 28
|
||||||
1 | ||||||
Распараллеливание циклов02.02.2018, 12:35. Показов 5181. Ответов 14
Метки нет (Все метки)
Есть такой цикл
В настоящее время пытаюсь проделать это в OPenMP и компилятор жалуется на переменную цикла. Эта переменная почему-то отказывается приводиться к другим типам. Какие мысли имеются?
0
|
02.02.2018, 12:35 | |
Ответы с готовыми решениями:
14
Распараллеливание циклов Распараллеливание циклов Распараллеливание циклов с использованием OpenMP C++ OpenIM - не работает распараллеливание циклов |
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
02.02.2018, 20:53 | 2 |
это распараллеливать бессмыленно. Если переделаешь std::list на std::vector, чтобы можно было за o(1) перейти на "1/4 длины, 1/2, 3/4" и начиная с этих мест каждым из потоков проверять массив, то смысл будет. А в таком виде параллелить бессмысленно.
И то, когда сделаешь с вектором, как собираешься "глушить" потоки, которые придут вторыми/третьими? А то ж они будут честно проходить свои куски массивов до конца, и их придётся ждать для корректного завершения.
0
|
║XLR8║
|
|
02.02.2018, 21:11 | 3 |
https://www.youtube.com/playli... 5X2utwnoEG прикольный плей лист
0
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
||||||
02.02.2018, 21:22 | 4 | |||||
В принципе можно проверку флага добавить в условие цикла), что-нибудь вроде:
0
|
║XLR8║
|
||||||
03.02.2018, 01:38 | 5 | |||||
Ага, вот смотрю курс по OpenMP там как раз поднималась тема, что доступ к shared memory между потоками должен быть минимизироваться и выполняться синхронно дабы избежать cache invalidation. И если синхронизировать данные часто overhead перекроет приемущесто от использования паралельных вычислений.
Zlobnyj_Prapor, TRam_, если делать цыкл указанный в вопросе на OpenMP эффективно, должно быть что-то такое (на итераторах, к сожалению, не добился работы)
И да, break использовать нельзя... Вообще, если у тебя в цыкле есть зависимости от предыдущей итерации, его нельза разпаралелить.
0
|
gray_fox
|
03.02.2018, 01:58
#6
|
0
|
║XLR8║
|
||||||
03.02.2018, 03:53 | 7 | |||||
Zlobnyj_Prapor, gray_fox оказался прав, жаль лайк не поставить...
0
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|
03.02.2018, 04:41 | 8 |
delete
Добавлено через 22 минуты Т.е. имея массив из '1'-ц поиск (1-й по сути) '1'-цы быстрее с 4-я потоками?! Что-то здесь не так...
0
|
║XLR8║
|
||||||
03.02.2018, 05:28 | 9 | |||||
Ну.. это ведь не "поиск" ведь в цыкл нельзя прервать (break). Я вот думаю, что можно выполнить поиск в виде отдельной функции, которая будет получать ренж в виде итераторов и возвращать найден элемент на определенном отрезке.
Можно даже использовать тотже код, что предоставляет ТС в первом посте. Просто обернуть его в функцию и вызывать на поддиапазонах нужного вектора. В худшем случае надо проходить N, а разпарелеливая, мы худший случай делим на количество потоков, что не O(1), конечно, но всё равно приятно. Вообще, для эффективного алгоритма надо знать больше о решаемой задаче и, вероятно, сделать свою структуру данных. Добавлено через 17 минут gray_fox,
0
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
||||||
03.02.2018, 05:39 | 10 | |||||
Изначально задача именно "поиск"; по сути, "в терминах STL":
0
|
03.02.2018, 11:33 | 11 | |||||
Как верно подмечено необходимость делить список между потоками O(n) отъедает время, и тут вопрос в том где лежат искомые данные. Если искомое в последнем узле списка расклад такой (потоки - время):
4 - 1100; 3 - 1330; 2 - 1800; 1 - 3140, а если в первом узле списка то: 4 - 199; 3 - 265; 2 - 201; 1 - 2.
1
|
0 / 0 / 1
Регистрация: 16.07.2015
Сообщений: 28
|
|
03.02.2018, 18:37 [ТС] | 12 |
Всем спасибо за помощь. Собственно список _paramsFFT содержал не просто тип int а структуры. И итератор был в цикле просто проходил по всем структурам списка paramsFFT и проверял структуры списка paramsFFT на соответствие ключевым параметрам. Вышел я из положения следующим образом: сначала по коду посчитал, сколько максимум структур может оказаться в списке paramsFFT и переделал переменную цикла в int. А чтобы избавиться от break добавил вместо него изменение переменной цикла таким образом чтобы условие цикла стало неверно. Вот что получилось:
iter = _paramsFFT.begin(); for(int i = 0; i< 16; i++) { if ((*iter).isign != fft_ward) { ++iter; continue; } if ((*iter).length != mas.size()) { ++iter; continue; } isGo = true; i = 16; } В принципе можно и убрать, i = 16; ведь 8 потоков быстрее чем один выполнят подобный цикл, но я оставил так.
0
|
║XLR8║
|
|
03.02.2018, 21:39 | 13 |
Херня (:
Если у тебя "i" в стеке потока, остальные потоки продолжат лопатить свои куски массива. igorrr37 показал портируемый пример с ручным управлением потоками и с использованием ::std::list. Я как раз хотел разобрать как оно всё работает, так как с потоками в STL я еще не сталкивался, но очень похоже на pthread. Добавлено через 6 минут igorrr37, хотел спросить: как сильно использование ::std::atomic на каждой итерации бьет по производительности? Ведь чем больше потоков, тем больше они должны ожидать пока атомик станет доступным. Объясните, пожалуйста.
0
|
04.02.2018, 02:35 | 14 |
outoftime, если искомая величина находится в последнем узле списка и использовать атомик то результаты:
4 - 1110; 1 - 3140; 8 - 1130 а если атомик заменить на простой bool то: 4 - 960, 1 - 2530; 8 - 950
0
|
║XLR8║
|
|
04.02.2018, 04:06 | 15 |
igorrr37, на сколько я понял с доки по atomic он использует локи, что значит, остальные потоки будут ждать. И если мы говорим о паралельных вычислениях, то лочить выполнение на каждой итерации цыкла неприемлимо (я не говорю о случае когда искомый элемент первый). Еще, в отличии от OpenMP я не нашел информации о том какая стратегия применяеся в STL когда потоку нужно ждать освобождения лока.
0
|
04.02.2018, 04:06 | |
04.02.2018, 04:06 | |
Помогаю со студенческими работами здесь
15
Распараллеливание циклов с ипользованием OpenMP распараллеливание Распараллеливание Распараллеливание программы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
|
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
|
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее:
На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
|
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript
В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
|
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
|
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален
В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
|
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
|
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели
В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
|
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества
Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
|
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов.
. . .
|
С чего начать программировать микроконтроллеры
raxper 06.01.2025
Введение в мир микроконтроллеров
Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
|
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
|