ускорение вычисления тета-функции для генерации фракталов по методу Ньютона

Я пытался сгенерировать метод Ньютона фракталов тета-функции Jacobi -- мои попытки использовать mpmath занимают много времени, поэтому я попытался написать код на C.

Источник, использованный для создания следующего изображения, находится здесь: http://owen.maresh.info/allegra.c и будет компилироваться с помощью gcc allegra.c -o allegra - lm, а затем следует вызывать как ./allegra > jacobi.pnm


(источник: maresh.info )

Итак: * Есть ли способы ускорить оценку -- на создание этого изображения у меня ушло более получаса времени? (Я хотел бы иметь возможность быстро создавать эти изображения с разными именами, чтобы я мог снять фильм) * Я знаю, что делаю ошибку в определении тета-функции, но мне трудно найти причину ошибки. разрывы.

В справочных целях это изображение было получено с помощью стандартного метода Ньютона для ϑ3(z,0,001–0,3019*i).


person graveolensa    schedule 13.04.2012    source источник
comment
Вы не возражаете, если я передам ваш код Apple в качестве примера приложения, которое работает медленнее при компиляции с их новым компилятором clang C, чем с их gcc.   -  person Brian Swift    schedule 14.04.2012
comment
Не проблема. Я собираюсь попробовать это с icc через некоторое время.   -  person graveolensa    schedule 15.04.2012
comment
icc отличная идея. Мне любопытно, сколько улучшений вы видите с ним по сравнению с gcc.   -  person Brian Swift    schedule 15.04.2012
comment
icc » /usr/bin/time ./allegra2 ›› chack.pnm 164.21user 1.35system 2:46.03elapsed 99%CPU (0avgtext+0avgdata 14864max Resident)k 0inputs+4920outputs (0major+985minor)pagefaults 0swaps owen@orrery ~/math / ZEREWT »MD5SUM CHACK.PNM 03B3ED17194D6E77970310BCE55C967D Chack.PNM GCC» / USR / Bin / Time ./allegra >> Geese.pnm 1257.28USER 23.44SYSTEM 21: 32.45ELAPSED 99% CPU (0AVGTEXT + 0AVGDATA 15376MAXRESIDRETS) K 32INPUTS + 4920OUTSUTS (0ААМЕЗЕР +1010minor)pagefaults 0swaps owen@orrery ~/math/thenewt » md5sum geese.pnm 03b3ed17194d6e77970310bce55c967d geese.pnm   -  person graveolensa    schedule 15.04.2012
comment
Вот это да. icc сгенерированный код, который работал в 7 раз быстрее, чем gcc, впечатляет. (Также спасибо за упоминание icc, я не знал, что Intel предоставляет свои инструменты разработки бесплатно для некоммерческого использования в Linux).   -  person Brian Swift    schedule 16.04.2012
comment
дополнение: я закончил визуализацию, которую можно посмотреть на YouTube здесь: youtube.com/watch?v= f0ZGfCmPjWA, и следующим шагом будет попытка использовать библиотеку ядра Intel Math (при условии, что она будет быстрее, чем math.h)   -  person graveolensa    schedule 25.04.2012


Ответы (2)


Сначала попробуйте включить оптимизацию компилятора с помощью -O3 и/или -fast. Быстрый тест на моей системе показал улучшение производительности в 3 раза.

Кроме того, при экспериментировании с изменениями кода для повышения производительности полезно иметь более быструю среду выполнения, возможно, изменив основной цикл на for(a=0;a<10 /* 512*/ ;a++).

Также обратите внимание: GCC поддерживает комплексные числа и см. справочные страницы complex, cpow и cexp. и включите файл /usr/include/complex.h

Я профилировал приложение и увидел, что большую часть времени оно проводит в powc(). К сожалению, когда я изменил powc(), чтобы использовать cpow() из математической библиотеки, он работал медленнее, чем ваша реализация.

Если система, в которой вы работаете, имеет несколько ядер, время настенных часов, вероятно, может быть довольно легко снижено за счет распараллеливания внешнего основного цикла с OpenMP. Однако, когда вы генерируете кадры изображения для анимации, вероятно, будет наиболее эффективно просто генерировать каждый кадр с помощью отдельного процесса (мне нравится xargs -P # -n 1 для этого типа грубого распараллеливания).

person Brian Swift    schedule 13.04.2012
comment
Между прочим, я интуитивно чувствую, что никто на самом деле не использует сложные типы данных в стандарте c99 для чего-либо, и что они просто были добавлены в язык, потому что кто-то в то время подумал, что это будет хорошей идеей. (как двойное отступление: я как бы агитирую за специальные функции ASIC, потому что эти функции (Jacobi) theta повторно реализуются в программном обеспечении миллион раз, и все программные реализации очень медленные) - person graveolensa; 15.04.2012
comment
Я думал, что gcc имел сложную поддержку некоторое время до c99. Однако я не удивлюсь, если большинство активных пользователей complex все еще используют фортран. - person Brian Swift; 16.04.2012

Когда вы упомянули об этом в IRC, я был в странном настроении и потратил некоторое время на его оптимизацию. Теперь он работает как минимум в 4 раза быстрее на моем Mac, не считая флагов оптимизации компилятора, и даже больше на некоторых других платформах.

Я... невежественен, когда дело доходит до высшей математики, но я знаю кое-что об оптимизации. Я считаю, что вычисление здесь такое же, как и в оригинале, за исключением замены системы cexp() на вашу реализацию в expc(), и он дает идентичный результат. Вы сами решаете, достаточно ли он численно стабилен для вас.

Как заметил Брайан Свифт, powc() стоит дорого, и это из-за функций log() и pow().

Вещи, которые были большими победами:

  • вычисления в pjtheta() и pjtheta3() можно комбинировать
  • это вычисление может быть сделано внутренним циклом в newt(), и часть его может быть перемещена из внутреннего или обоих циклов
  • cpow() может быть медленнее для Брайана (и для меня), но cexp() определенно быстрее, чем ваш код, по крайней мере, на моих машинах. попробуй оба варианта
  • -ffast-math в флагах компилятора убирает поддержку соответствия стандартам с некорректными числами и значительно ускоряет работу.

Еще одним большим успехом стало преобразование арифметики в cexp() и cpow() в одинарную точность, но это дало немного другие результаты, которые вас могут волновать или не волновать.

Вы можете больше не узнавать программу, но она находится по адресу:

https://github.com/cgull/allegra.git

Я заметил еще пару вещей и выкинул из этого еще 25%-33% (черт возьми, это итеративная функция, которая сходится!)

Я уверен, что кто-то, кто разбирается в высшей математике лучше меня, мог бы найти там еще 2-4-кратную производительность...

person cgull    schedule 07.07.2012