lispnik (lispnik) wrote,
lispnik
lispnik

Categories:

Тряхнём стариной Мандельбротом

Решил я вспомнить молодость — нарисовать множество Мандельброта, тем более что с тех пор мощность компьютеров значительно выросла. Самую первую программу для рассчёта множества Мандельброта я написал ещё в 11 классе, используя Borland C++ (для Windows 3.11, стоявшей в компьютерном классе).

Чтобы было веселей, я решил написать параллельную программу на C с использованием MPI. Нужно же использовать многоядерные процессоры...

Одновременно я сделал версию, которая использует тип complex, она оказалось в два раза медленнее варианта с использованием double. После микрооптимизаций стала отставать лишь где-то на четверть, а то и меньше (замеров не сохранилось, к сожалению).

Первая версия использовала примитивную раскраску, основанную на скорости убегания. Картинка 5120x10240 40960x20480 считалась в 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. Ошибки округления?

Upd 13 декабря 2016: в комментариях указывают, что для справедливого результата надо сраавнивать с -O3 -ffast-math. На С c -O3 считается на текущем железе за 16.7 секунд, с -O3 -ffast-math за 10 секунд, на SBCL — 14 секунд. Однако разнятся теперь 87 пикселей, а не 13, как раньше.

Tags: fractal, lisp, mandelbrot, mpi
Subscribe

  • ANSI Common Lisp в электронном виде

    ANSI Common Lisp на русском языке в электронном виде со свободной ценой на файл! Upd: EPUB глючный, PDF нормальный.

  • Новый CipherSaber

    В связи с неожиданно всплывшим интересом к моей реализации CipherSaber я решил пересмотреть её код. В частности, изменил одну неправильную…

  • Натан Фройд. Протокол инициализации CLOS

    Соскучились уже по посту с тегом «lisp»? :) Этот текст — перевод статьи Натана Фройда, которую он любезно разрешил перевести для…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 16 comments

  • ANSI Common Lisp в электронном виде

    ANSI Common Lisp на русском языке в электронном виде со свободной ценой на файл! Upd: EPUB глючный, PDF нормальный.

  • Новый CipherSaber

    В связи с неожиданно всплывшим интересом к моей реализации CipherSaber я решил пересмотреть её код. В частности, изменил одну неправильную…

  • Натан Фройд. Протокол инициализации CLOS

    Соскучились уже по посту с тегом «lisp»? :) Этот текст — перевод статьи Натана Фройда, которую он любезно разрешил перевести для…