|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
||||||
Parallel.For: Зачастую t1 не равно t2 и соответственно не равны Sum1 и Sum202.12.2013, 07:07. Показов 847. Ответов 13
Метки нет (Все метки)
Небольшой вопрос по использованию Parallel.for.
Задача проста...
0
|
||||||
| 02.12.2013, 07:07 | |
|
Ответы с готовыми решениями:
13
Построить новый массив с элементами, значения которых соответственно равны
Построить вектор, элементы которого соответственно равны произведениям элементов строк |
|
|
|
| 02.12.2013, 10:14 | |
|
У вас гонка за Sum2.
Чтобы избежать этого, вам нужно атомарно увеличивать Sum2. Например, это можно сделать заменив обычное сложение на Interlocked.Add
1
|
|
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
|
| 02.12.2013, 14:23 [ТС] | |
|
Понял проблему, в общих чертах. Но предложенное решение ( Interlocked.Add ) не работает с типом double. Есть какое то решение? В гугле нагуглить не смог.
0
|
|
|
|
||||||
| 02.12.2013, 14:50 | ||||||
|
Ох, вы правы. Тогда можно воспользоваться Interlocked.CompareExchange:
0
|
||||||
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
||||||
| 02.12.2013, 17:15 [ТС] | ||||||
|
К сожалению ваш вариант совсем не решил проблему. Либо я просто чего то не понял. Немного поэкспериментировав я получил более стабильный вариант, но в нем так же случаются отклонения.
0
|
||||||
|
|
||
| 02.12.2013, 19:18 | ||
|
Как вы проверяете отклонения? Возможно проблема в том, что вы не учитываете особенности операций с плавающей запятой. Строго говоря для типа double в общем НЕ выполняется (a+b)+c = a+(b+c). Порядок операндов при сложении имеет значение.
0
|
||
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
||||||
| 02.12.2013, 20:25 [ТС] | ||||||
|
Действительно странно. У меня есть TextBox при нажатии на который у меня вызывается функция:
0
|
||||||
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
|
| 02.12.2013, 23:18 [ТС] | |
|
Различия в данном случае достаточно не значительны: Последние три значащие цифры далеко после запятой.
Sum1 = 45.587510489502144 (double) Sum2 = 45.587510489502208 (double) Проблемка в том, что в дальнейшем, распараллеливание я буду применять для вычисления "Инвариантных моментом Лежандра", а вот там эти три циферки могут изрядно попортить мне точность, чего я собственно хотел бы избежать. Неужели нет возможности параллельных вычислений без потерь? Для меня это, честно говоря, новость.
0
|
|
|
|
||
| 03.12.2013, 09:28 | ||
|
Чтобы увеличить точность при работе с дробными значенями, обычно рекомендуют использовать тип decimal, вместо double.
1
|
||
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
|
| 03.12.2013, 12:42 [ТС] | |
|
Да согласен. Я не совсем верно выразился. Нужна стабильность
Что бы одни и тебе вычисления давали один результат. Почему при использовании параллелизма возникают различные значения? Из-за того что (a+b)+c ! = a+(b+c) ? возможно ли этого избежать? Если я например буду использовать массив в который буду передавать соответствующие значения параллельных потоков, а затем сложу их в прямом порядке? это даст мне выигрыш во времени, без потери "относительной точности"?
0
|
|
|
|
|||
| 03.12.2013, 13:08 | |||
|
Еще, как я говорил - можно использовать более точные типы данных.
1
|
|||
|
0 / 0 / 1
Регистрация: 04.05.2012
Сообщений: 23
|
||||||
| 03.12.2013, 15:55 [ТС] | ||||||
|
Итог:
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 | ||
|
Добавлено через 28 минут PS. Вот на википедии нашел про проблему с порядком операция над числами с плавающей запятой - http://en.wikipedia.org/wiki/F... y_problems
1
|
||
| 03.12.2013, 17:23 | |
|
Помогаю со студенческими работами здесь
14
Вывести max и min, которые равны соответственно наибольшему и наименьшему членам последовательности Построение вектора b1, b2, bm, элементы которого соответственно равны наименьшим элементам строк матрицы
Построить вектор, элементы которого соответственно равны сумме элементов каждой строки матрицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|