Страницы

Поиск по вопросам

четверг, 21 марта 2019 г.

Распараллеливание обработки комбинаций

Моя программа генерирует 27 512 614 111 (27,5 миллиардов) комбинаций чисел. Кажется, что нереально страшная цифра, но всё не так. Программа в чистом виде делает это за 10 мин на одном ядре. Однако мне нужно производить некоторые вычисления с полученной комбинацией чисел, соответственно программа начинает резко притормаживать:
Используется арифметика с плавающей запятой Добавляются несколько циклов для вычисления использование оператора ЕСЛИ на каждой итерации, вплоть до 27,5 миллиарда так же вставляет палки в колёса (сам убедился, что проверка условия сильно тормозит любую программу при больших вычисления)
Возможно ли распараллелить обработку комбинаций? У меня 8 ядер в процессоре. Как разбить все комбинации по 27,5 / 8 = 3.4 миллиарда комбинаций. Это очень ускорит работу, но я не понимаю как для каждой функции, запускаемой в поток, отделить мои комбинации. Комбинации по 7 элементов, туда входят число от 0 до 30
0 0 0 0 0 0 ... 0 31 0 31 31 31 0
и т.д. Заранее спасибо!


Ответ

Нашёл решение проблемы. Если вы перебираете размещения с повторениями, то возьмите счётчик, который считает от 0 до 2 млрд (__int64 подойдет для этих целей), далее останавливаете цикл, когда дойдет до 2 млрд и смотрите на состав элементов последовательности. Если у вас начальные элементы это все нули, а на 2 млрд, к примеру 9 8 1 2 7 1 8, то запомните этот состав, и далее начните перебор, задав начальной последовательностью не нули, а вышеуказанной, и опять считаете 2 млрд и т.д.! Это очень простое решение в лоб! Спасибо всем кто участвовал

Комментариев нет:

Отправить комментарий