2012-04-13 3 views
4

Я пытаюсь создать Newton's method фракталы Jacobi theta functions - мои попытки с mpmath занимают много времени, поэтому я попытался кодирования его в С.ускорение оценки тета-функции для метода Ньютона фрактал поколения

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

http://owen.maresh.info/jacobi.png

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

Для справочных целей, это изображение было получено, делая метод стандартного Ньютона на & thetas (г, 0.001-0.3019 * я)

+1

ты не возражаешь, если я передать свой код на яблоко в качестве примера приложение, которое работает медленнее при компиляции с их новым компилятором 'clang' C, чем с их gcc. –

+0

Не проблема. Я собираюсь попробовать это с icc немного. –

+0

'icc' - отличная идея. Мне интересно, какое улучшение вы видите с ним над gcc. –

ответ

3

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

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

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

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

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

+0

Кстати, мне кажется, что никто не использует сложные типы данных в стандарте c99 для чего-либо, и что он просто добавлен на язык, потому что кто-то подумал, что это будет хорошая идея на время. (как двойное в сторону: я как бы волнуюсь для специальных функций ASIC, потому что эти функции (Jacobi) theta получают повторное выполнение агазиллиона раз в программном обеспечении, а все программные реализации - sloooow) –

+0

Я думал, что 'gcc' имел сложную поддержку на некоторое время раньше c99. Однако я не удивлюсь, если большинство сверхпрочных пользователей 'complex' все еще используют fortran. –

3

Когда вы упомянули об этом на IRC я ​​был в странном настроении и провел некоторое время, оптимизируя его. В настоящее время он по крайней мере на 4 раза быстрее на моем Mac, не считая флагов оптимизации компилятора, тем более на некоторых других платформах.

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

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

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

  • вычисление в pjtheta() и pjtheta3() могут быть объединены
  • , что вычисление может быть сделано внутреннюю петлю в тритона(), и некоторые из них могут быть перемещены из внутреннего или обе петли
  • КПОО() может быть медленнее для Брайана (и меня), но cexp() определенно быстрее, чем ваш код, по крайней мере o n мои машины. попробовать их оба пути
  • -ffast-математика в тростнике компилятор удаляет поддержку соблюдения стандартов с плохо вели себя числами и ускоряет вещи много

Еще одна большая победа была преобразующий арифметику в ¯cexp() и КПОО () до одной точности, но это дало несколько разные результаты, о которых вы можете или не можете заботиться.

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^