On Mon, 1 Dec 2025 11:59:38 GMT, Stuart Monteith <[email protected]> wrote:

> MemorySegments allocated from shared Arena from
> java.lang.foreign.Arena.ofShared() have their lifecycle controlled by 
> jdk.internal.foreign.SharedSession. This class ensures that the 
> MemorySegments can't be freed until after a thread has called Arena.close(). 
> This is implemented using a counter that is atomically incremented when used, 
> and decremented when not used, on every invocation of a downcall. While 
> shared Arenas allow any thread to use it and to close it, this tracking has a 
> cost when multiple threads are contended on it. This patch changes the 
> implementation to use multiple counters to reduce contention. 
> sun.nio.ch.IOUtil, java.nio.Buffer and 
> sun.nio.ch.SimpleAsynchronousFileChannelImpl are modified as they have 
> threads releasing the scope different from the ones that allocated them, so a 
> ticket that tracks the counter has to be passed over.
> 
> The microbenchmark org.openjdk.bench.java.lang.foreign. 
> CallOverheadConstant.panama_identity_memory_address_shared_3 was used to 
> generate the following results. The scalability was checked on a number of 
> platforms with the JMH parameter "-t" specifying the number of threads. 
> Measurements are in ns/op .
> 
> The hardware are the Neoverse-N1, N2, V1 and V2, Intel Xeon 8375c and the AMD 
> Epyc 9654.
> 
> | Threads |   N1   |      N2   |         V1  |       V2   |    Xeon   |    
> Epyc |
> |---------|-------|-------|-------|-------|-------|-------|
> |    1  |    30.88   |   32.15  |    33.54  |    32.82  |    27.46  |     
> 8.45 |
> |   2    | 142.56    | 134.48  |   132.01 |    131.50 |    116.68   |   46.53 
> |
> |  4    |  310.18   |  282.75  |   287.59  |   271.82  |   251.88   |   86.11 
> |
> |  8    |  702.02   |  710.29  |   736.72  |   670.63  |   533.46   |  194.60 
> |
> |   16  |  1,436.17 |  1,684.80 |  1,833.69 |  1,782.78 |  1,100.15 |    
> 827.28 |
> |  24  | 2,185.55 |  2,508.86 |  2,732.22 |  2,815.26 |  1,646.09 |  1,530.28 
>  |
> |   32  | 2,942.48 |  3,432.84 |  3,643.64 |  3,782.23 |  2,236.81 |  
> 2,278.52 |
> |   48  | 4,466.56 |  5,174.72 |  5,401.95 |  5,621.41 |  4,926.30  | 
> 3,026.58 |
> 
> After:
> 
> | Threads |   N1   |      N2   |         V1  |       V2   |    Xeon   |    
> Epyc |
> |---------|-------|-------|-------|-------|-------|-------|
> |    1  |    32.41  |    32.11  |    34.43  |  31.32  |    27.94  |     9.82 |
> |    2  |    32.64  |    33.72  |    35.11  |  31.30  |    28.02  |     9.81 |
> |    4  |    32.71  |    36.84  |    34.67  |  31.35  |   28.12   |   10.49 |
> |    8  |    58.22  |    31.60  |    36.87  |  31.72  |    47.09  |...

I'll start a discussion soon on panama-dev. At the very least, this PR provides 
a point of discussion.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/28575#issuecomment-3613061007

Reply via email to