[OpenJDK Rasterizer] Marlin #4

Jim Graham james.graham at oracle.com
Mon Oct 12 21:21:08 UTC 2015


Hi Laurent,

These are great results!  And they are much easier to read with the 
tables (which seem to get lost in my reply, oops!).

If it is just the dashing results I can believe that as Ductus does a 
pretty good job of minimizing the number of segments in its stroked 
output paths.  The losses are pretty small in that case so we are 
getting pretty close to being able to deprecate Ductus at some point 
which would be awesome (still a bit of reliability testing "in the wild" 
before we can actually switch full time, though)...

			...jim

On 10/12/15 12:44 PM, Laurent Bourgès wrote:
> Hi Jim,
>
> Here is below the webrev I prepared last saturday night.
>
> However, I made progress since as I inlined few methods and now use
> Unsafe for rowAAChunk storage (to save few percents avoiding bound checks).
> *So please, just have a look to see the new hybrid approach but do not
> make a full review !
> *
> I will try sending another patch 4.2 asap...
>
>
> Webrev 4.1:
> http://cr.openjdk.java.net/~lbourges/marlin/marlin-s4.1/
>
> 1. I simplified the previous patch to have only 2 variants (raw or RLE
> with blockFlags) but as an hybrid approach as each pixel row can use
> either encoding=raw or encoding=rle depending on its complexity
> (heuristics).
>
> 2. I fixed fore-mentioned bugs related to crossing array resizing
> (ptrEnd) but also added a simple overflow check to the edge array:
> indices (pointer like in edgeBuckets and edge.next) are only integer so
> it only works if edges array is smaller than 2Gb.
>
> It works very well on both jdk8 and openjdk9:
>
> Marlin 0.7.1 OpenJDK9(with Sergey gcc hack):
> Test 	Threads 	Ops 	Med 	Pct95 	Avg 	StdDev 	Min 	Max 	TotalOps
> CircleTests.ser 	1 	162 	64.827 	65.118 	64.855 	0.123 	64.597 	65.474 	162
> *EllipseTests-fill-false.ser * 	*1* 	*36* 	*289.896* 	*290.251*
> *289.941* 	*0.157* 	*289.759* 	*290.487* 	*36*
> *EllipseTests-fill-true.ser * 	*1* 	*25* 	*442.567* 	*442.784*
> *442.601* 	*0.197* 	*442.373* 	*443.356* 	*25*
> dc_boulder_2013-13-30-06-13-17.ser 	1 	116 	90.328 	90.849 	90.371
> 0.278 	89.904 	91.448 	116
> dc_boulder_2013-13-30-06-13-20.ser 	1 	222 	46.882 	47.23 	46.897
> 0.197 	46.377 	47.689 	222
> dc_shp_alllayers_2013-00-30-07-00-43.ser 	1 	268 	39.101 	39.307
> 39.116 	0.121 	38.913 	40.088 	268
> dc_shp_alllayers_2013-00-30-07-00-47.ser 	1 	25 	772.936 	774.375
> 773.059 	0.736 	771.858 	774.596 	25
> dc_spearfish_2013-11-30-06-11-15.ser 	1 	823 	12.676 	12.807 	12.705
> 0.076 	12.653 	13.285 	823
> dc_spearfish_2013-11-30-06-11-19.ser 	1 	1640 	6.401 	6.467 	6.41
> 0.036 	6.385 	6.74 	1640
> dc_topp:states_2013-11-30-06-11-06.ser 	1 	853 	12.299 	12.382 	12.314
> 0.033 	12.278 	12.453 	853
> dc_topp:states_2013-11-30-06-11-07.ser 	1 	1402 	7.502 	7.57 	7.507
> 0.038 	7.445 	7.755 	1402
> test_z_625k.ser 	1 	68 	152.561 	153.037 	152.582 	0.261 	152.179
> 153.549 	68
>
>
> Ductus JDK8:
> Test 	Threads 	Ops 	Med 	Pct95 	Avg 	StdDev 	Min 	Max 	TotalOps
> CircleTests.ser 	1 	148 	69.971 	71.418 	70.068 	0.719 	68.369 	72.031 	148
> *EllipseTests-fill-false.ser * 	*1* 	*35* 	*297.56* 	*299.328*
> *297.48* 	*1.093* 	*295.417* 	*299.59* 	*35*
> *EllipseTests-fill-true.ser * 	*1* 	*25* 	*453.612* 	*456.29*
> *453.589* 	*1.813* 	*448.936* 	*456.817* 	*25*
> dc_boulder_2013-13-30-06-13-17.ser 	1 	93 	112.865 	113.419 	112.88
> 0.277 	112.377 	113.459 	93
> dc_boulder_2013-13-30-06-13-20.ser 	1 	183 	56.944 	57.521 	56.987
> 0.26 	56.528 	58.187 	183
> dc_shp_alllayers_2013-00-30-07-00-43.ser 	1 	220 	47.955 	48.555
> 47.975 	0.346 	47.223 	49.203 	220
> dc_shp_alllayers_2013-00-30-07-00-47.ser 	1 	25 	1056.025 	1058.306
> 1056.215 	1.079 	1054.813 	1058.515 	25
> dc_spearfish_2013-11-30-06-11-15.ser 	1 	628 	16.798 	17.095 	16.837
> 0.125 	16.633 	17.343 	628
> dc_spearfish_2013-11-30-06-11-19.ser 	1 	1354 	7.605 	7.896 	7.663
> 0.104 	7.553 	8.217 	1354
> dc_topp:states_2013-11-30-06-11-06.ser 	1 	616 	16.988 	17.097 	16.98
> 0.086 	16.737 	17.513 	616
> dc_topp:states_2013-11-30-06-11-07.ser 	1 	931 	11.319 	11.397 	11.304
> 0.066 	11.052 	11.479 	931
> test_z_625k.ser 	1 	50 	208.874 	209.563 	208.85 	0.439 	206.91 	209.9 	50
>
>
> I tested the new patch with J2DBench (having my warmup patch) using my
> default profile (size=1 to 1000, stokes=1,5, dash=off/on) in
> single-threaded tests:
> - pisces vs marlin:
> http://cr.openjdk.java.net/~lbourges/marlin/j2dBench_reports/html_pisces_marlin_071/Testcase_Summary_Report.html
> - ductus vs marlin:
> http://cr.openjdk.java.net/~lbourges/marlin/j2dBench_reports/html_ductus_marlin_071/Testcase_Summary_Report.html
>
> Marlin is always largely faster than pisces and a bit faster than
> ductus, except for some tests with dash1_5 as you can see in the
> complete report:
> http://cr.openjdk.java.net/~lbourges/marlin/j2dBench_reports/html_ductus_marlin_071/J2DBench_Complete_Report.html
>
> Finally it is very promising and worth the effort I made during last weeks.
>
>     One thing that occurred to me is that the 2 strategies - RLE vs
>     uncompressed - might be easier to follow and manage if they were
>     broken out into separate classes:
>
>     MarlinCache
>     +--- MarlinRLECache
>     +--- MarlinUncompressedCache
>
>
> It was a good idea but I finally adopted an hybrid approach (sharing the
> same data storage): the same shape can use both strategies (mixed, not
> exclusive anymore).
>
> Cheers,
> Laurent


More information about the graphics-rasterizer-dev mailing list