0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 59
|
||||||
1 | ||||||
Параллельный алгоритм Гаусса средствами std::thread03.03.2020, 11:13. Показов 2778. Ответов 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 Ошибка "неопределенная ссылка" при работе с std::thread |
6577 / 4562 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
03.03.2020, 11:22 | 2 |
Подозреваю, он стоит вот здесь - cv.wait(lk, [&]{ return i_row == i; });
Какая-то мутная у тебя реализация. Там не нужно такое количество мьютексов и conditional variables Добавлено через 1 минуту Чтобы обработать матрицу по строкам, достаточно одной atomic-переменной
0
|
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 59
|
|
03.03.2020, 11:30 [ТС] | 3 |
Один мьютекс чисто отладочный, для вывода в консоль используется, он не считается)
Далее, первый используется чтобы все потоки подождали пока один из них сформирует ведущую строку, а второй - чтобы дождаться завершения всех потоков. Нужен был какой-то типа "барьер", вот такой вот велосипед сочинился Добавлено через 2 минуты на скриншоте видно, что нулевой поток зашёл сюда Добавлено через 1 минуту а потом опять же 3-й закончил очередную итерацию и сделал i_counter ++, а нулевой не успел проснуться... Вот как быть? ![]()
0
|
6577 / 4562 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
03.03.2020, 11:33 | 4 |
0
|
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 59
|
|
03.03.2020, 11:34 [ТС] | 5 |
да как всегда, сутки голову ломал, а как на форум написал так и ответ очевиден. но решения пока не вижу, кроме как завести ещё один condition_variable
0
|
6577 / 4562 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||
03.03.2020, 11:59 | 6 | |||||
![]() Решение
Рекомендую убрать один (или даже оба) и разбить алгоритм на части.
Добавлено через 2 минуты Ведущую строку формируй не в потоках, а прямо в main Добавлено через 30 секунд Там же устанавливай счётчик и жди, кгда он обнулится Добавлено через 18 минут
1
|
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 59
|
|
03.03.2020, 14:04 [ТС] | 7 |
oleg-m1973, спасибо огромное, ваша подсказка очень помогла! Я переделал свой алгоритм по вашему шаблону и всё заработало! Правда свой вариант с ещё одним condition_variable тоже пробовал, скорость сопоставимая, но мой вариант на 8 потоках умирает, а ваш гораздо более работоспособен
![]() Добавлено через 24 минуты Хотя нет, мой вариант тоже работает, просто я его неправильно проинициализировал. Но код такой страшный, что я его не буду выкладывать ![]()
0
|
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
|
|
30.04.2021, 21:48 | 8 |
![]()
0
|
30.04.2021, 21:48 | |
Помогаю со студенческими работами здесь
8
Можно ли использовать std::thread в С++ Builder? Embarcadero Berlin. Отсутствуют библиотеки многопоточности (thread,mutex) в std под платформу win 32bit Параллельный алгоритм, решенный методом Гаусса-Зейделя Как распараллелить алгоритм Гаусса через библиотеку thread? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |