[РЕШЕНО] СИ++ Проблема в распараллеливании вычислений

имеется проект
запускной файл
там выполняется функция genFlop(), которая описана тут
в ней выполняется моя попытка распараллелить вычисления.
если оставить всего один поток, то все выполняется отлично, все значения вычисляются. Однако, если запустить хатя бы два потока, то начинается недосчет значений. Точность важна.
Предположительно несколько потоков имеют доступ к одной сущности из-за чего для другого параллельного потока она корруптится и получается неправильное значение.
не могу понять, что за сущность так влияет подобным образом.
в самой функции подсчетов я поставил мьютексы на накопители, которыми и осуществляется подсчет.

Есть ли у кого какие мнения почему подсчеты не верны при параллелизме и всегда разные?

нашлося верное решение
оказывается мьютекс надо было делать глобальным для всех процессов, я же сделал его локальным и он по факту не работал как я ожидал от него.
но больше мне понравилось решение с применением атомарных типов.

код переписал, перезалил.
safocl, попробую ответить с точки зрения дилетанта.
С большой долей вероятности вряд ли на нашем форуме тусуются спецы по параллельному программированию, они тусуются в другом месте - туда, думаю, и следует обратится.
А во вторых, с точки зрения чайника (имею ввиду себя), сначала, думаю, было бы неплохо определится с подходом к организации параллельных вычислений - какой механизм ты хочешь применить - количество потоков равно количеству процессоров или на один процессор несколько потоков? В каждом случае есть свои нюансы.
Самый простой случай, на мой взгляд - один поток на один процессор. Далее, так как скорее всего у тебя SMP и процессоры сидят на одной шине, то вырисовывается система с общей/разделяемой памятью (то есть процессор может напрямую обращаться к памяти другого процессора), а в таких случаях используется, как правило, OpenMP. В твоих исходниках использование директивы OpenMP не видно, какой механизм ты используешь тоже не понятно.
Так что советую начать с азов, а вот по непонятным моментам обращаться лучше на специализированные форумы.
Ошибки не исчезают с опытом - они просто умнеют
vasek
в таких случаях используется, как правило, OpenMP. В твоих исходниках использование директивы OpenMP не видно
пробовал я его, но он по каким то причинам отказывался нормально работать -- крашился. думаю из-за предыдущей моей проблемы... надо будет попробовать снова. но думаю в моем случае он может не понять как распараллелить.

vasek
вычислений - какой механизм ты хочешь применить - количество потоков равно количеству процессоров или на один процессор несколько потоков? В каждом случае есть свои нюансы.
vasek
какой механизм ты используешь тоже не понятно.
использую пока статично под свой проц, у меня i3 2100 2 ядра, 4 потока. сча распараллеливаю на 4 потока. думаю для моего проца енто как раз актуально с гипертредингом.

дополнительно ищу подсказок на лоре.
нашлося верное решение
оказывается мьютекс надо было делать глобальным для всех процессов, я же сделал его локальным и он по факту не работал как я ожидал от него.
но больше мне понравилось решение с применением атомарных типов.

код переписал, перезалил.
safocl
дополнительно ищу подсказок на лоре.
Мда, опускают вас там не по детски... Кажись, и впрямь С - не ваше...
Aivar
опускают вас там
в смсле?

Aivar
Кажись, и впрямь С - не ваше…
ну я ж начал его снова изучать спустя десяток лет, учусь на примере создания своего покерного калькулятора эквити
 
Зарегистрироваться или войдите чтобы оставить сообщение.