Існує безліч технічних проблем, які роблять точну відтворюваність обчислювальних результатів вкрай важко досягти.
На програмному рівні зміни коду або будь-якої бібліотеки, що використовується кодом, очевидно можуть спричинити отримання різних результатів. Ви здивуєтеся кількості бібліотек підтримки, які можуть зв'язатись із типовим науковим кодом.
На нижчому рівні перекомпіляція будь-якого коду або будь-якої з бібліотек, використовуваних кодом, з новим компілятором або з увімкненою різною оптимізацією компілятора, також може спричинити проблеми. Однією з причин є те, що різні операції з кодом можуть виконуватися в іншому порядку, коли код перекомпілюється. Оскільки додавання з плаваючою комою не є асоціативним (a + b) + c <> a + (b + c), це може дати різні результати.
Гаразд, що робити, якщо ми збережемо все програмне середовище (ОС, бібліотеки та скомпільований код) шляхом (наприклад) запису його на завантажувальний CD-Rom, який запустить код. Тепер ми можемо бути впевнені, що ми отримаємо однакові результати, якщо запустити цей код на іншому комп’ютері?
Дивно, але деякі коди фактично змінюють порядок обчислень на основі аспектів конкретної моделі процесора, на якій вони працюють. Наприклад, оптимізовані бібліотеки лінійної алгебри зазвичай розбивають матричні множення для роботи над блоками, які впишуться в кеш. Коли Intel випускає новий мікропроцесор з більшим кешем, код може динамічно регулювати розмір блоку, що призводить до арифметики, яка виконується в іншому порядку і дає різні результати. Інші коди динамічно регулюють порядок обчислень, виходячи з обсягу наявної пам’яті - якщо ви запускаєте код на комп’ютері з більшою кількістю пам’яті, що могло б спричинити арифметику в іншому порядку і таким чином давати різні результати.
Речі стають напрочуд складнішими при введенні багатопотокового коду, оскільки точна історія виконання різних потоків часто не є детермінованою, і це може знову спричинити виконання арифметичних операцій в іншому порядку від одного запуску до іншого.
На практиці найбільше, на що ви можете сподіватися, - це результати, подібні від однієї машини до другої, аж до точності допуску використовуваних алгоритмів. Наприклад, якщо у мене є проблема з кореневим знаходженням і використовую бісекцію, щоб отримати корінь в межах + -1,0e-10, то я повинен бути щасливим, якщо різні машини дають відповіді, які згодні в межах цієї допуску.