|
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 59
|
||||||
Параллельный алгоритм Гаусса средствами std::thread03.03.2020, 11:13. Показов 3780. Ответов 7
Здравствуйте! Пытаюсь написать параллельный алгоритм решения СЛАУ методом Гаусса с помощью std::thread, но не могу настроить синхронизацию потоков.
Вот мой код, там комментарии прописаны, надеюсь суть будет ясна:
1) В начале итерации один из потоков формирует текущую (или ведущую) строку, которая потом используется им же и всеми остальными для обработки нижестоящих строк. Остальные потоки ждут пока будет готова текущая строка, для этой цели я использую condition_variable cv. 2) В конце итерации мне нужно дождаться, чтобы все потоки обработали свои строки, я использую в качестве счётчика atomic_int i_counter. Пока эта переменная меньше числа потоков, все потоки останавливатся с помощью второй condition_variable cv2. Последний поток, который доводит i_counter до общего числа потоков, сбрасывает эту переменную в ноль и все потоки дружно несутся на следующую итерацию. Так я себе это представлял. А по факту один из потоков не просыпается после того, как i_counter сброшен в ноль, на скриншоте с примером это поток №0. Что я делаю не так подскажите пожалуйста?
0
|
||||||
| 03.03.2020, 11:13 | |
|
Ответы с готовыми решениями:
7
Pimpl + std::thread + linux sockets? Чтение переменной несколькими std::thread |
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 03.03.2020, 11:22 | ||
|
Какая-то мутная у тебя реализация. Там не нужно такое количество мьютексов и conditional variables Добавлено через 1 минуту Чтобы обработать матрицу по строкам, достаточно одной atomic-переменной
0
|
||
|
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 59
|
|||
| 03.03.2020, 11:30 [ТС] | |||
|
Далее, первый используется чтобы все потоки подождали пока один из них сформирует ведущую строку, а второй - чтобы дождаться завершения всех потоков. Нужен был какой-то типа "барьер", вот такой вот велосипед сочинился Добавлено через 2 минуты на скриншоте видно, что нулевой поток зашёл сюда
Добавлено через 1 минуту а потом опять же 3-й закончил очередную итерацию и сделал i_counter ++, а нулевой не успел проснуться... Вот как быть?
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 03.03.2020, 11:33 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 59
|
||
| 03.03.2020, 11:34 [ТС] | ||
|
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 03.03.2020, 11:59 | |||||||
Сообщение было отмечено Hirurg2605 как решение
РешениеДобавлено через 2 минуты Ведущую строку формируй не в потоках, а прямо в main Добавлено через 30 секунд Там же устанавливай счётчик и жди, кгда он обнулится Добавлено через 18 минут
1
|
|||||||
|
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 59
|
|
| 03.03.2020, 14:04 [ТС] | |
|
oleg-m1973, спасибо огромное, ваша подсказка очень помогла! Я переделал свой алгоритм по вашему шаблону и всё заработало! Правда свой вариант с ещё одним condition_variable тоже пробовал, скорость сопоставимая, но мой вариант на 8 потоках умирает, а ваш гораздо более работоспособен
![]() Добавлено через 24 минуты Хотя нет, мой вариант тоже работает, просто я его неправильно проинициализировал. Но код такой страшный, что я его не буду выкладывать
0
|
|
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,521
|
|||
| 30.04.2021, 21:48 | |||
вопросы (в конце) ещё страшнее
0
|
|||
| 30.04.2021, 21:48 | |
|
Помогаю со студенческими работами здесь
8
Ошибка "неопределенная ссылка" при работе с std::thread Можно ли использовать std::thread в С++ Builder? Embarcadero Berlin. Отсутствуют библиотеки многопоточности (thread,mutex) в std под платформу win 32bit Параллельный алгоритм, решенный методом Гаусса-Зейделя Как распараллелить алгоритм Гаусса через библиотеку thread? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|