2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
||||||
1 | ||||||
Многопоточность и вычисления: выбор оптимальной стратегии07.10.2015, 19:03. Показов 3880. Ответов 15
Метки нет (Все метки)
Есть некоторый массив
Если есть какой нибудь похожий пример - с удовольствием почитал бы. зы что использовать буду std::thread или boost::thread пока не решил. Знаю я их одинаково плохо
0
|
07.10.2015, 19:03 | |
Ответы с готовыми решениями:
15
Найти счёт при оптимальной стратегии двух игроков Выбор оптимальной структуры данных Выбор оптимальной последовательности. Конечный алгоритм Нахождение оптимальной стратегии игры |
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
07.10.2015, 20:20 | 2 |
Слабо понял задачу, как это будет происходить...
можно ориентироваться на std::thread::hardware_concurrency
1
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
||||||
07.10.2015, 22:22 [ТС] | 3 | |||||
Похоже это то что надо.
Возможно я несколько сумбурно описал задачу. У меня есть достаточно тяжеловесные вычисления для одной операции. И есть массив достаточно большого размера ~10^4-10^5. К его элементам в случайном порядке прибавляется некоторая величина(либо вообще не прибавляется), рассчитанная при каждой операции. Нужно произвести допустим 10^6-10^7 таких операций. Если считать в несколько потоков, то надо как то синхронизировать доступ к его элементам, иначе как я понял - неопределенное состояние. Оно будет редким, но всё же будет. Вот псевдокод.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
07.10.2015, 23:14 | 4 |
1
|
08.10.2015, 09:54 | 5 | |||||
Я бы сделал примерно так:
1
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
|
08.10.2015, 10:04 | 6 |
Добавлено через 1 минуту PS: не используй rand в нескольких потоках, это блокирующая функция.
1
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
08.10.2015, 10:26 | 7 |
0
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
||||||
08.10.2015, 11:37 | 8 | |||||
Код
$ g++ -Wall -std=c++11 -fopenmp openmp_reduction_array.cpp $ time ./a.out real 0m0.404s user 0m1.556s sys 0m0.004s
1
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
||||||
08.10.2015, 16:53 [ТС] | 9 | |||||
Всем спасибо за ответы. Сейчас стало более менее понятно в какую сторону думать
Для float, кстати, как я понял метод atomic::fetch_add() не объявлен. Работает только с целочисленными типами. Ну здесь наверное можно попробовать int или в случае чего long long. Не совсем понятен этот кусок
0
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
|
08.10.2015, 22:16 | 10 |
Skaarj, упс опечатка естественно должно было быть +=
Добавлено через 6 минут Нужно добавить накопленные данные каждого из потоков к целевому
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
08.10.2015, 22:49 | 11 |
Мысль правильная. только кроме того что по количеству конвейеров надо еще гарантировать их выполнение на разных конвейерах. Опять же какой размер массива и каков размер данных которые используются для счета? Если размер большой то все может просто напросто упираться в трансфер по шине и параллелить просто без толку.
В GPU в GPU c таким методом. Там и конвейеров ого-го сколько и трансфер ого-го, и то что потоки на разных конвейерах тоже гарантированно. Он именно для такого подхода и создавался.
0
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
||||||||||||||||||||||||||||||||||||||||||
09.10.2015, 09:35 | 12 | |||||||||||||||||||||||||||||||||||||||||
И как эта задача ляжет на GPU? Только если решить
и уже распределять их вычисление по index. Рабочий код я представил. Тест на 2-х процессорной машинке:
schedule и nowait Предложенное мной решение как раз и рассматривается для нескольких потоков (~10). При большом количестве потоков надо менять алгоритм вычисления.
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
09.10.2015, 16:16 | 14 |
Вопрос какой трансфер данных по шине тянет за собой сама функция calculate(); Тоже в принципе может на каких то таблицах считаться.
Алгоритм примерно тот же, только у каждого потока массив разреженный. И периодически по исчерпанию памяти производить суммирование разреженных массивов в результирующий массив.
0
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
|
09.10.2015, 23:08 [ТС] | 15 |
Объём массива будет задаваться пользователем, порядок ~10^4. Суть задачи - решение методом Монте Карло задачи переноса электронов в веществе. Пример я тут немного утрировал. Исходные данные будут статическими. Во время жизни частицы по случайному закону будут меняться её положение, направление и энергия и ещё несколько вспомогательных параметров, пока она не поглотится/вылетит за пределы области. Поток будет соответствовать трассировке одной частице. Массив будет накапливать полученную энергию.
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
09.10.2015, 23:14 | 16 |
Ото дейcтвительно в GPU. Задача из того же класса что и трассировка лучей и построение фотонных карт. И она там именно так и решается -по потоку на луч/фотон.
1
|
09.10.2015, 23:14 | |
09.10.2015, 23:14 | |
Помогаю со студенческими работами здесь
16
Выбор оптимальной видеокарты Выбор оптимальной замены Выбор оптимальной БД / СУБД Выбор оптимальной видеокарты Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |