Моя программа генерирует 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 млрд и т.д.! Это очень простое решение в лоб! Спасибо всем кто участвовал
Комментариев нет:
Отправить комментарий