From c71d0b98f5c3de49e6f522f9640e9b659e946662 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 23 May 2007 09:39:35 -0700 Subject: [PATCH] Add understanding_rectangles blog entry --- src/exa/rectangles-512.png | Bin 0 -> 19232 bytes src/exa/rectangles-64.png | Bin 0 -> 22846 bytes src/exa/understanding_rectangles.mdwn | 125 ++++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 src/exa/rectangles-512.png create mode 100644 src/exa/rectangles-64.png create mode 100644 src/exa/understanding_rectangles.mdwn diff --git a/src/exa/rectangles-512.png b/src/exa/rectangles-512.png new file mode 100644 index 0000000000000000000000000000000000000000..a0729fef1f1e83246aff3179ca21e6cc98d1488c GIT binary patch literal 19232 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%0DE@ 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 UYe#T|`1@lL4OLyBLIoE2AAChBLI3~& literal 0 HcmV?d00001 diff --git a/src/exa/understanding_rectangles.mdwn b/src/exa/understanding_rectangles.mdwn new file mode 100644 index 0000000..5973620 --- /dev/null +++ b/src/exa/understanding_rectangles.mdwn @@ -0,0 +1,125 @@ +[[tag cairo exa xorg]] + +# Understanding the cairo rectangles performance test case + +About a month ago (can it have been that long already?) I started an +effort to try to [baseline EXA performance on an r100 +chip](http://article.gmane.org/gmane.comp.freedesktop.xorg/17466). A +particularly alarming result from that initial test was that cairo's +rectangles case was running 14 times slower with EXA than with no X +server acceleration at all. + +Afterwards, Eric and Dave [set me +straight](http://article.gmane.org/gmane.comp.freedesktop.xorg/17502) +and I got DRI working with EXA. This definitely made it faster in +general, but the rectangles test was still 8x slower than NoAccel. A +deeper look was necessary. + +Eric had various theories about how cairo's measurement strategy could +be confounding the results. What cairo's performance suite does is to +perform an XGetImage of a single pixel as a synchronization barrier, +(to allow the suite to wait until the X server provides the result as +a guarantee that all pending rendering has occurred). One theory is +that EXA could be doing something extremely inefficient here, (such as +fetching the entire image instead of just a single pixel). + +To alleviate this possible problem, I cranked the number of rectangles +being rendered between timings from 1000 to 10000. This actually did +help to some extent. After this change EXA is only 2-3x slower than +NoAccel instead of 8x slower. + +Also, we noticed that this slowdown only occurs when drawing to an +ARGB Pixmap as opposed to drawing to an RGB Window, (when drawing to a +window EXA is about 4x faster than NoAccel, whether drawing 1000 or +10000 rectangles). + +So the test with 1000 rectangles was definitely measuring something +undesired, since a 10x increase in the the number of rectangles +resulted in something close to a 2x increase in rendering time. (For +EXA to a Pixmap at least---EXA to a Window, and NoAccel to a Window or +Pixmap all increased by about 10x). I'm still not sure exactly what +the problem was in the case with 1000 rectangles, but the 1x1 +XGetImage is still a possibility. Eric has suggested adding a new +wait-for-rendering-to-complete request to the XFixes extension to +eliminate the need for the 1x1 XGetImage and any problems it might be +causing. + +After seeing the results change so dramatically with the number of +iterations, I began to wonder about batching effects. The original +cairo-based rectangles test case looked about like this: + + for (i = 0; i < NUM_RECTANGLES; i++) { + cairo_rectangle (cr, rect[i].{x,y,width,height}); + cairo_fill (cr); + } + +That is, each rectangle was being filled individually. I experimented +with changing this so that many calls were made to cairo_rectangle for +each call to cairo_fill. The mysterious EXA slowdown I had been +chasing went away, but only because everything became a lot slower. It +turns out there's a bad performance bug in cairo when it converts from +a list of rectangular trapezoids to a pixman_region. Cairo's pixman +doesn't expose a function for "create region from list of rectangles" +so cairo is calling a pixman_region_union function once for every +rectangle. This looks like an unnecessary O(n**2) algorithm to +me. Fortunately that should be a simple thing to fix. + +So next I rewrote the test case by eliminating cairo calls and calling +directly into either XRenderFillRectangles or XFillRectangle. I was +shocked to find that the Render function was much slower than the +non-Render function, (with no change in the X server). A little +protocol tracing[*] revealed that XFillRectangle is batching requests +while XRenderFillRectangles is not. That's a rather nasty trap for an +unwary Xlib coder like myself. I added batching in chunks of 256 +rectangles around XRenderFillRectangles and it started behaving +precisely like XRenderFillRectangles. + +Finally, I eliminated some non-determinism from the rectangles test +case. Originally, it was written to choose randomly-sized rectangles +by independently selecting a width and height from 1 to 50. Instead I +ran separate tests at power-of-2 sizes from 1 to 512. The results of +doing this were quite revealing and are best seen graphically: + +[[rectangles-512.png]] + +And a closer look at the small rectangles: + +[[rectangles-64.png]] + +As can be seen, there's a break-even point at a rectangle size just +below 60x60. Above that, EXA performance scales extremely well, with +the time becoming flat based on the number of rectangles, and +independent of their size. While NoAccel performance scales quite +poorly (and as expected). + +Meanwhile, for the small rectangles, (which my original test case just +happened to be testing exclusively), EXA is 3 to 4 times slower than +NoAccel. Perhaps it would make sense for the X server to take an +alternate approach for these small rectangles? The NoAccel results +show that the X server does have faster code already. Or perhaps EXA +itself could be made faster by having some hardware state caching to +reduce overhead from one rectangle to the next. + +But there are some obvious questions here: What sizes actually matter? +What would a rectangle-size histogram look like for typical desktop +loads? There's definitely room to do some measurement work here so +that we can come up with meaningful benchmarks, (rather than the +fairly arbitrary things I started with), and focus on optimizing the +things that really matter. + +A similar issue holds for the batching issue. I only saw good +performance when I batched many rectangles into each call to +XRenderFillRectangles. But is that even a reasonable thing to expect +applications to be able to do? Do applications actually sequentially +render dozens of rectangles all of the same color? I'm imagining GTK+ +widget themes with bevelled edges where it's actually much more likely +that the behavior would be close to toggling back and forth between +two colors every one or two rectangles. And that kind of behavior will +exhibit wildly different results than what's being benchmarked here. + +Anyway, there's plenty of interesting work to still be done here. + +[*] I used wireshark and manually decoded all Render requests. I'm +looking forward to good protocol tracing tools that decode all +extensions. And yes, I'm aware of current XCB efforts to provide +this---should be very nice! -- 2.43.0