[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-2d-dev
Subject: [OpenJDK 2D-Dev] Integrated: 8263482: Make access to the ICC color profiles data multithread-friendl
From: Sergey Bylokhov <serb () openjdk ! java ! net>
Date: 2021-03-19 2:51:38
Message-ID: 3NHsCVboGu1I1PCtY4_FIX5mV-UFs5gDS7XpkqHVb3c=.ce65ca97-7c6b-4918-91e5-6b6be3dfdfda () github ! com
[Download RAW message or body]
On Fri, 12 Mar 2021 05:10:25 GMT, Sergey Bylokhov <serb@openjdk.org> wrote:
> FYI: probably is better/simpler to review it via webrev.
>
> After migration to the lcms from the kcms the performance of some operations was \
> regressed. One possible workaround was to split the operation into multiple \
> threads. But unfortunately, we have too many bottlenecks which prevent using \
> multithreading. This is the request to remove/minimize such bottlenecks(at least \
> some of them), but it does not affect the single-threaded performance it should be \
> handled separately.
> The main code pattern optimized here is this:
> activate();
> byte[] theHeader = getData(cmmProfile, icSigHead);
> ----> CMSManager.getModule().getTagData(p, tagSignature);
> Notes about the code above:
>
> 1. Before the change "activate()" method checked that the "cmmProfile" field was \
> not null. After that we usually used the "cmmProfile" as the parameter to some \
> other method. This included two volatile reads, and also required to check when we \
> need to call the "activate()" method before usage of the \
> "cmmProfile" field.
> Solution: "activate()" renamed to the "cmmProfile()" which became an accessor for \
> the field, so we will get one volatile read and can easily monitor the usage of the \
> field itself(it is used directly only in this method).
> 2. The synchronized static method "CMSManager.getModule()" reimplemented to have \
> only one volatile read.
> 3. The usage of locking in the "getTagData()" is changed. Instead of the \
> synchronized instance methods, we now use the mix of "ConcurrentHashMap" and \
> StampedLock.
> See some comments inline.
>
> Some numbers(small numbers are better):
>
> 1. Performance of ((ICC_ProfileRGB) \
> ICC_Profile.getInstance(ColorSpace.CS_sRGB)).getMatrix();
> jdk 15.0.2
> Benchmark Mode Cnt Score Error Units
> CMMPerf.ThreadsMAX.testGetMatrix avgt 5 19,624 ± 0,059 us/op
> CMMPerf.testGetMatrix avgt 5 0,154 ± 0,001 us/op
>
> jdk - before the fix
> Benchmark Mode Cnt Score Error Units
> CMMPerf.ThreadsMAX.testGetMatrix avgt 5 12,935 ± 0,042 us/op
> CMMPerf.testGetMatrix avgt 5 0,127 ± 0,007 us/op
>
> jdk - after the fix
> Benchmark Mode Cnt Score Error Units
> CMMPerf.ThreadsMAX.testGetMatrix avgt 5 0,561 ± 0,005 us/op
> CMMPerf.testGetMatrix avgt 5 0,092 ± 0,001 us/op
>
> 2. Part of performance gain in jdk17 is from some other fixes, for example
> Performance of ICC_Profile.getInstance(ColorSpace.CS_sRGB); and \
> ColorSpace.getInstance(ColorSpace.CS_sRGB);
> jdk 15.0.2
> Benchmark Mode Cnt Score Error Units
> CMMPerf.ThreadsMAX.testGetSRGBProfile avgt 5 2,299 ± 0,032 us/op
> CMMPerf.ThreadsMAX.testGetSRGBSpace avgt 5 2,210 ± 0,051 us/op
> CMMPerf.testGetSRGBProfile avgt 5 0,019 ± 0,001 us/op
> CMMPerf.testGetSRGBSpace avgt 5 0,018 ± 0,001 us/op
>
> jdk - same before/ after the fix
> Benchmark Mode Cnt Score Error Units
> CMMPerf.ThreadsMAX.testGetSRGBProfile avgt 5 0,005 ± 0,001 us/op
> CMMPerf.ThreadsMAX.testGetSRGBSpace avgt 5 0,005 ± 0,001 us/op
> CMMPerf.testGetSRGBProfile avgt 5 0,005 ± 0,001 us/op
> CMMPerf.testGetSRGBSpace avgt 5 0,005 ± 0,001 us/op
>
> note "ThreadsMAX" is 32 threads.
This pull request has now been integrated.
Changeset: 1a21f779
Author: Sergey Bylokhov <serb@openjdk.org>
URL: https://git.openjdk.java.net/jdk/commit/1a21f779
Stats: 212 lines in 5 files changed: 52 ins; 83 del; 77 mod
8263482: Make access to the ICC color profiles data multithread-friendly
Reviewed-by: azvegint
-------------
PR: https://git.openjdk.java.net/jdk/pull/2957
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic