lispnik ([info]lispnik) wrote,

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

Решил я вспомнить молодость — нарисовать множество Мандельброта, тем более что с тех пор мощность компьютеров значительно выросла. Самую первую программу для рассчёта множества Мандельброта я написал ещё в 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. Ошибки округления?

Tags: fractal, lisp, mandelbrot, mpi

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    Your IP address will be recorded 

  • 10 comments

[info]_sparrow

February 9 2012, 16:48:54 UTC 3 months ago

Писал такое (https://github.com/kondratovich/mp3-3) в университете примерно год назад на Erlang. Не хотелось MPI ковырять. Не скажу, чтобы быстро было. Добавлял возможность крутить вертеть это хозяйство.

[info]lispnik

February 9 2012, 16:52:22 UTC 3 months ago

А что это?

[info]resetius

February 9 2012, 17:24:00 UTC 3 months ago

У меня Си вариант дает 30 секунд, а sbcl 31 секунду. Ты в сишном варианте оптимизацию включить не забыл?

[info]lispnik

February 9 2012, 17:39:16 UTC 3 months ago

В комментариях я написал, как компилировал. Компилировал с помощью make, в Makefile прописаны ключи, при запуске make команда высветилась правильно.

На каком процессоре запускал?

[info]resetius

February 9 2012, 17:43:45 UTC 3 months ago

Intel Q8400 2.66Ghz
$ sbcl --version
SBCL 1.0.55
$ gcc --version
gcc (GCC) 4.6.2


Не вижу Makefile

[info]lispnik

February 10 2012, 04:44:12 UTC 3 months ago

Makefile я не публиковал... Попробую gcc поновее, а потом интеловский процессор.

[info]lispnik

February 10 2012, 06:07:39 UTC 3 months ago

gcc 4.6.2 у меня нет, на 4.5.3 отставание всё равно есть.

Однако равный результат тоже неплох :)

[info]resetius

February 9 2012, 17:47:21 UTC 3 months ago

Увидел опции компилятора. Надо было их в заголовок вставить :)

[info]nivanych

February 10 2012, 08:43:10 UTC 3 months ago

Даже и так — оочень и оочень неплохо.

[info]resetius

February 10 2012, 21:02:46 UTC 3 months ago

да, неплохо
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…