Group Abstract Group Abstract

Message Boards Message Boards

Suggestions for speeding up this plot?

Posted 9 years ago

Consider the code:

HairyStarfish[a_, plotpts_, thickness_, imagesize_] := ParametricPlot[{
                               Sum[(2/3)^k Sin[(3/2)^k t], {k, 0, a}],
                               Sum[(-(2/3))^k Cos[(3/2)^k t], {k, 0, a}]
                               }, {t, 0, 2^(a + 1) Pi}, MaxRecursion -> 5, Axes -> False, 
                PlotPoints -> plotpts, PlotStyle -> {Thickness[thickness], Black}, 
                PlotRange -> {{-2.5, 2.5}, {-2.5, 2.5}},  ImageSize -> {imagesize, Automatic}]
                HairyStarfish[11, 15000, 0.00004, 500]

enter image description here

I want to generate this plot at a = 25 for a large art print (interesting features emerge as a gets large). Computation time increases exponentially with each increment of the value a, since PlotPoints must be doubled to keep accuracy. I've been doing it piecewise so far, breaking {t, 0, 2^(a+1) Pi} up into segments, and then combining the plots later with ImageMultiply. I'm wondering if there's an efficient way to render several segments at once with parallelization and/or GPU. Or if anyone has general comments on a smarter way to render this plot.

So far, I've tried:

  • ParallelEvaluate, generating multiple plots at once on parallel kernels. But it is not any faster.
  • Pairing different values of MaxRecursion and PlotPoints. No significant speed increase.
  • Generating only half of the plot, then combing with it's mirror (since it is symmetric). But this only cuts time by a factor of 2.

Does ParametricPlot use the graphics card as wisely as possible? My graphics card is a 980ti with 6gb of vram and 704 cores, so I figure it should be able to speed up the rendering somewhat if I utilize it properly. I just got CUDALink installed... I've been reading about it, but I'm still pretty lost on how i could apply it here, if at all.

I've also considered purchasing a cluster computing package through gridMathematica, since the computation times are so high and it is parallelizable. But I want to make sure I'm attacking the problem as intelligently as possible before I go that route.

POSTED BY: Bryan Lettner
7 Replies

You should consider the following: what takes longer - rendering the figure or computing the points? If computing the points is a significant time waste then consider separating it from plotting function and use Compile with options potential CompilationTarget -> "C" and Parallelization -> True. If this is for a poster, perhaps you do not want to render in front end and then export. Use Export right away and better to a vector format such as SVG or PDF. Not sure if all this is useful, just a train of thoughts.

POSTED BY: Vitaliy Kaurov
POSTED BY: Marco Thiel

You may try ListPlot with ParallelTable, after you have estimated a reasonable increment for t that does not make you lose too much detail.

POSTED BY: Gianluca Gorni

Using compilation and machine real numbers may be tricky here. You are going to calculate Sin and Cos of numbers that are of the order of 10^12. Can you trust the results?

POSTED BY: Gianluca Gorni
Posted 9 years ago
POSTED BY: Bryan Lettner
Posted 9 years ago

No Errors. The code just displayed as text instead of code for some reason. Fixed.

POSTED BY: Bryan Lettner
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard