Решил я вспомнить молодость — нарисовать множество Мандельброта, тем более что с тех пор мощность компьютеров значительно выросла. Самую первую программу для рассчёта множества Мандельброта я написал ещё в 11 классе, используя Borland C++ (для Windows 3.11, стоявшей в компьютерном классе).
Чтобы было веселей, я решил написать параллельную программу на C с использованием MPI. Нужно же использовать многоядерные процессоры...
Одновременно я сделал версию, которая использует
тип complex, она оказалось в два раза медленнее
варианта с использованием double. После микрооптимизаций стала
отставать лишь где-то на четверть, а то и меньше (замеров не
сохранилось, к сожалению).
Первая версия использовала примитивную раскраску, основанную на скорости убегания. Картинка 512x10240 считалась в 8 потоков 6 часов на 8-ядерном Intel® Core™ i7 920 (2.67GHz).
Потом я решил
сделать улучшенную
раскраску, и стал использовать вариант с complex.
Новый
вариант (34Мб, не пытайтесь открывать в браузере!) считался в тех условиях 10 часов.
И тут я решил сделать вариант на Common Lisp... И сделал вариант на C без MPI. И оказывается, вариант на Common Lisp (SBCL 1.0.55) работает на четверть быстрее, чем вариант на C (gcc 4.4.5)! Запускал на AMD Phenom™ 9650 Quad-Core (2.3MHz), картинка 1024x512. (Исходники).
> (time (calculate)) Evaluation took: 33.333 seconds of real time 33.317935 seconds of total run time (32.625041 user, 0.692894 system) 99.96% CPU 76,832,689,149 processor cycles 1 page fault 393,232 bytes consed $ time ./mmb real 0m43.621s user 0m42.694s sys 0m0.896s
Однако справедливости ради нужно упомянуть, что оба варианта дают немного разные картинки — в 13 пикселях на картинке 1024x512 разница значений равна 1. Ошибки округления?
February 9 2012, 16:48:54 UTC 3 months ago
February 9 2012, 16:52:22 UTC 3 months ago
February 9 2012, 17:24:00 UTC 3 months ago
February 9 2012, 17:39:16 UTC 3 months ago
На каком процессоре запускал?
February 9 2012, 17:43:45 UTC 3 months ago
$ sbcl --version
SBCL 1.0.55
$ gcc --version
gcc (GCC) 4.6.2
Не вижу Makefile
February 10 2012, 04:44:12 UTC 3 months ago
February 10 2012, 06:07:39 UTC 3 months ago
Однако равный результат тоже неплох :)
February 9 2012, 17:47:21 UTC 3 months ago
February 10 2012, 08:43:10 UTC 3 months ago
February 10 2012, 21:02:46 UTC 3 months ago