0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
||||||
1 | ||||||
Parallel.For: Зачастую t1 не равно t2 и соответственно не равны Sum1 и Sum202.12.2013, 07:07. Показов 727. Ответов 13
Метки нет (Все метки)
Небольшой вопрос по использованию Parallel.for.
Задача проста...
0
|
02.12.2013, 07:07 | |
Ответы с готовыми решениями:
13
Построить новый массив с элементами, значения которых соответственно равны Построить новый массив с элементами, значения которых соответственно равны a1, an+1, a2, an+2,…, an, a2n Построить вектор, элементы которого соответственно равны произведениям элементов строк Построение вектора, элементы которого соответственно равны произведениям элементов строк матрицы |
02.12.2013, 10:14 | 2 |
У вас гонка за Sum2.
Чтобы избежать этого, вам нужно атомарно увеличивать Sum2. Например, это можно сделать заменив обычное сложение на Interlocked.Add
1
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
|
02.12.2013, 14:23 [ТС] | 3 |
Понял проблему, в общих чертах. Но предложенное решение ( Interlocked.Add ) не работает с типом double. Есть какое то решение? В гугле нагуглить не смог.
0
|
02.12.2013, 14:50 | 4 | |||||
Ох, вы правы. Тогда можно воспользоваться Interlocked.CompareExchange:
0
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
||||||
02.12.2013, 17:15 [ТС] | 5 | |||||
К сожалению ваш вариант совсем не решил проблему. Либо я просто чего то не понял. Немного поэкспериментировав я получил более стабильный вариант, но в нем так же случаются отклонения.
0
|
02.12.2013, 19:18 | 6 |
Странно, у меня ваш вариант стабильно дает один и тот же результат.
Как вы проверяете отклонения? Возможно проблема в том, что вы не учитываете особенности операций с плавающей запятой. Строго говоря для типа double в общем НЕ выполняется (a+b)+c = a+(b+c). Порядок операндов при сложении имеет значение.
0
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
||||||
02.12.2013, 20:25 [ТС] | 7 | |||||
Действительно странно. У меня есть TextBox при нажатии на который у меня вызывается функция:
0
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
|
02.12.2013, 23:18 [ТС] | 9 |
Различия в данном случае достаточно не значительны: Последние три значащие цифры далеко после запятой.
Sum1 = 45.587510489502144 (double) Sum2 = 45.587510489502208 (double) Проблемка в том, что в дальнейшем, распараллеливание я буду применять для вычисления "Инвариантных моментом Лежандра", а вот там эти три циферки могут изрядно попортить мне точность, чего я собственно хотел бы избежать. Неужели нет возможности параллельных вычислений без потерь? Для меня это, честно говоря, новость.
0
|
03.12.2013, 09:28 | 10 |
параллельность тут ни при чём. Скорее всего Sum1 тоже не самый точный результат.
Чтобы увеличить точность при работе с дробными значенями, обычно рекомендуют использовать тип decimal, вместо double.
1
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
|
03.12.2013, 12:42 [ТС] | 11 |
Да согласен. Я не совсем верно выразился. Нужна стабильность Что бы одни и тебе вычисления давали один результат. Почему при использовании параллелизма возникают различные значения? Из-за того что (a+b)+c ! = a+(b+c) ? возможно ли этого избежать? Если я например буду использовать массив в который буду передавать соответствующие значения параллельных потоков, а затем сложу их в прямом порядке? это даст мне выигрыш во времени, без потери "относительной точности"?
0
|
03.12.2013, 13:08 | 12 |
Скорее всего, да.
Да, ваш вариант приемлем. Даст ли он прирост - это надо проверять. Еще, как я говорил - можно использовать более точные типы данных.
1
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
||||||
03.12.2013, 15:55 [ТС] | 13 | |||||
Итог:
Sum2 187.93178248451187 double t1 100020001 int t2 84945418 int Time1 12892 long Time2 4711 long Как видно при 10 000 итераций прирост скорости хороший. Значение немного отличается, но при этом оно стабильно. Насчет decimal еще думаю. Немного смущает тот факт что t1 и t2 имеют различное значение. Или тут тоже имеет место быть гонка и они не отображают реального количества итераций (конкретно t2)?
0
|
03.12.2013, 17:23 | 14 |
Да, конечно. Тоже гонка.
Добавлено через 28 минут PS. Вот на википедии нашел про проблему с порядком операция над числами с плавающей запятой - http://en.wikipedia.org/wiki/F... y_problems
1
|
03.12.2013, 17:23 | |
03.12.2013, 17:23 | |
Помогаю со студенческими работами здесь
14
Вывести max и min, которые равны соответственно наибольшему и наименьшему членам последовательности Построение вектора b1, b2, bm, элементы которого соответственно равны наименьшим элементам строк матрицы Написать программу построения нового массива с элементами, значения которых соответственно равны Построить вектор, элементы которого соответственно равны сумме элементов каждой строки матрицы Написать программы построения вектора, элементы которого соответственно равны суммам элементов строк Написать программу построения вектора b, элементы которого соответственно равны наименьшим элементам строк Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |