68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 560
|
|
1 | |
Многопоточное матрично-векторное произведение24.10.2014, 09:15. Показов 4696. Ответов 14
Метки нет Все метки)
(
Доброго времени суток.
Хочу написать многопоточный вариант матрично-векторного произведения. Единственное, что приходит на ум, - в методе класса при вызове создавать потоки (CreateThread) и в конце ждать окончания выполнения всех потоков (WaitForMultipleObjects), т.е., как всегда и поступал. Но вот есть подозрения, что быстродействия не получится - в каждом произведении заново создавать/удалять потоки, наверно, затратно? Как поступить? Добавлено через 10 часов 8 минут upd
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
24.10.2014, 09:15 | |
Ответы с готовыми решениями:
14
Найти скалярное и векторное произведение векторов Векторное произведение векторов, в чем ошибка? Как одновременно декларировать векторное и скалярное произведение векторов?
|
![]() ![]() |
|
24.10.2014, 09:32 | 2 |
Пулы потоков.
Мы в разделе С++. Здесь мы говорим о реализации многопоточности в стандартной библиотеке. Если принципиально использование реализации многопоточности от Windows то вы переедете в соответствующий раздел.
1
|
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 560
|
|
24.10.2014, 19:55 [ТС] | 3 |
0
|
![]() 1672 / 1044 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
24.10.2014, 22:06 | 4 |
Да, более чем.
Использовать Thread pool (пул потоков). Нужное число потоков запускается заранее и выполняет поставленные в очередь задания, а когда их нет - ждёт. Если требуется, могу на следующей неделе поделиться своей простенькой реализацией Thread pool, которая основана на многопоточности из стандартной библиотеки (а значит, нужна поддержка со стороны компилятора, как C++11 так и собственно <thread>) и на очень полезных свойствах примитива Event из Windows API. Разумеется, можно воспользоваться чем-то более серьёзным и сильным - в Boost::Asio есть свой thread pool, возможно и ещё где-то. Или можно написать свой.
1
|
![]() 1672 / 1044 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
24.10.2014, 22:24 | 6 |
Если у человека возникают мысли о многопоточности, то наверняка для этого есть какие-то основания. То ли матрицы большие, то ли их много, то ли вообще всё вместе. И в том, и в другом случае задачу можно поделить на подходящие для пула потоков куски, будь то строки больших матриц или целиковое перемножение маленькой матрицы на вектор.
0
|
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 560
|
|
24.10.2014, 23:01 [ТС] | 8 |
Нужно для решения СЛАУ в итерационном методе GMRES (гидродинамика). Пока еще далеко до завершения, так что матрицы небольшие, но, в принципе, размер не ограничен.
спасибо, очень бы пригодилось. На выходных буду разбираться с пулами потоков, но дополнительная информация всегда полезна.
0
|
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 560
|
||||||
13.11.2014, 16:39 [ТС] | 9 | |||||
Как сделать, чтобы можно было сделать несколько вызовов функций с разными параметрами, с последующим ожиданием исполнения? Т.е. как передать данные в функцию submit. В примере выводится 1 2 2 2, а надо 1,1,2,2. Могу, конечно, приписать критические секции и статические переменные, но не хотел бы.
0
|
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 560
|
||||||
13.11.2014, 19:50 [ТС] | 11 | |||||
Kuzia domovenok, не правильно выразился: да можно поставить WaitForThreadpoolWorkCallbacks, но задача в том, чтобы несколько потоков выполнялись одновременно, а в этом случае просто будет очередь- смысл многопоточности теряется.
Добавлено через 1 час 14 минут Вот так прокатывает, но неужели нет стандартного варианта?
0
|
13.11.2014, 20:06 | 12 |
что ты хочешь, объясни. Ты передаёшь в потоки указатель на один и тот же аргумент p1, а потом удивляешься, что они с ним не могут одновременно работать?
Ну так передавай указатель на разные аргументы, что сказать...
0
|
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 560
|
|
13.11.2014, 21:07 [ТС] | 13 |
Kuzia domovenok, при обычном создании потоков передаю в функцию createthread исходные данные- одновременно работают n потоков. Здесь же почему-то в функцию SubmitThreadpoolWork нельзя передать данные, они есть только в callback функции, фигурирующей в вызове CreateThreadpoolWork.
Т.е. делать вызов CreateThreadpoolWork несколько раз? А как в этом случае реализовать ожидание как в WaitForThreadpoolWorkCallbacks, чтобы при этом задачи выполнялись параллельно, а не последовательно? Добавлено через 5 минут В первом примере я ожидал, что в строке 31 будет прежнее значение, а в 33 уже новое. Ожидания не оправдались по понятным причинам, поэтому сделал как во втором посте, но хочу понять нельзя ли в более приличном виде написать.
0
|
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 560
|
|
07.12.2014, 13:32 [ТС] | 14 |
На всякий случай подниму тему.
Задача состоит не в том, чтобы создать несколько вообще разных потоков и запустить их параллельно, а создать несколько потоков с по сути одной функцией MyWorkCallback - для умножения матрицы на вектор (при каждом последующем вызове функции она должна работать со следующим диапазоном строк матрицы). Единственное, что пришло в голову, передавать в MyWorkCallback указатель на массив, чтобы при каждом вызове в критической секции увеличивалось значение статической переменной и так функция узнавала с каким участком матрицы работать. Честно говоря, не нравится, что надо создавать отдельно массив с индексами в глобальной области. Как по-другому сделать?
0
|
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 560
|
||||||||||||||||
01.01.2015, 14:25 [ТС] | 15 | |||||||||||||||
В продолжение темы, многопоточное умножение матрицы на вектор. Как думаете - нормально или проще можно сделать? (p.s. работает, но если скажете как лучше сделать, то буду рад
![]() Все в *h. файле:
Опаньки, поторопился, лучше бы в теме Многопоточное матрично-векторное произведение написал. Перенесите, пожалуйста, если не трудно.
0
|
01.01.2015, 14:25 | |
Помогаю со студенческими работами здесь
15
Векторное произведение Векторное произведение Векторное произведение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |