Вы упоминаете, что каждый шаг зависит от результатов всех предыдущих шагов, что затрудняет распараллеливание такой программы.
Я не знаю, какой алгоритм вы используете, но вы могли бы использовать многопоточность для ускорения. Каждый поток будет обрабатывать один шаг, но должен ждать результатов, которые еще не были рассчитаны (хотя он может работать с уже рассчитанными результатами, если они не меняют значения во времени). По сути, это означает, что вам придется использовать механизм блокировки / ожидания, чтобы ожидать результатов, которые еще не были рассчитаны, но в настоящее время необходимы для выполнения определенного рабочего потока.