Примесь или случайность в профиле Haskell - PullRequest
0 голосов
/ 12 июля 2020

Я реализую RayTracingInOneWeekend и оптимизировал его с 33m до 23s для размера изображения 384x216 сцены и параметров, как указано в статье . Однако, когда я его профилирую, entries (5-й столбец слева на скриншоте ниже) изменяется почти при каждом запуске. Как такое возможно? В моей программе все остается таким же , включая даже генераторы случайных чисел, поскольку генераторы создаются как (вы можете увидеть это на github ):

g = mkStdGen (i * width + j)

Если width и height остаются такими же, тогда все g (по одному для каждого пикселя) также должны оставаться такими же. Однако, как вы можете видеть, два снимка экрана имеют разные значения в столбце entries.

enter image description here

enter image description here

What could be the reason behind this impurity? Or the profiler is not just able to gather all the information and the numbers are not exact (means, in reality the frequency of function calls are different from the numbers shown above; the docs однако ничего подобного не говорит).

Моя программа строится с cabal v2-build -O2 --enable-profiling --enable-executable-profiling, и я не передаю -prof -fprof-auto в ghc-options (думаю, cabal позаботится об этом). Я также использовал -threaded и parallel библиотеки .

Я использую GH C 8.6.5 и Cabal 3.2.

1 Ответ

1 голос
/ 12 июля 2020

Похоже, что профилировщик в многоядерном режиме не работает последовательно - не уверен, что это считается ошибкой . Я запускал программу несколько раз, не передавая -N в RTS, и теперь каждый раз вижу одно и то же entries count:

введите описание изображения здесь

Не уверен, что доказывает , что в моей программе нет примесей . Я все еще ищу лучший и более правдоподобный ответ (если он вообще есть).

...