[foreign-memaccess+abi] RFR: Performance improvement to unchecked segment ofNativeRestricted [v2]
Maurizio Cimadamore
mcimadamore at openjdk.java.net
Fri Jan 15 11:28:15 UTC 2021
On Thu, 14 Jan 2021 23:24:23 GMT, Radoslaw Smogura <github.com+7535718+rsmogura at openjdk.org> wrote:
>> This changes removes (by making no-ops) range and temporal checks for `ofNativeRestricted` segment. As this segment is global, above checks are not needed.
>>
>> Generated native code is smaller, and execution outperforms Java native arrays (depending on CPU)
>> Changed
>> Benchmark Mode Cnt Score Error Units
>> AccessBenchmark.foreignAddress thrpt 5 128946129.691 ± 317433.113 ops/s
>> AccessBenchmark.foreignAddressRaw thrpt 5 136883439.221 ± 749390.255 ops/s
>> AccessBenchmark.target thrpt 5 125325586.957 ± 32129.931 ops/s
>> Base
>> Benchmark Mode Cnt Score Error Units
>> AccessBenchmark.foreignAddress thrpt 5 125257424.876 ± 230508.169 ops/s
>> AccessBenchmark.foreignAddressRaw thrpt 5 128818591.434 ± 241806.765 ops/s
>> AccessBenchmark.target thrpt 5 125083379.819 ± 184070.467 ops/s
>> ---
>> This PR is replacement for https://github.com/openjdk/panama-foreign/pull/431 (OCA)
>> and was partially discussed (before changes) in https://mail.openjdk.java.net/pipermail/panama-dev/2021-January/011747.htm
>>
>> ---
>> Benchmark
>> @State(Scope.Thread)
>> public class AccessBenchmark {
>> static final MemorySegment ms = MemorySegment.ofNativeRestricted();
>> static final VarHandle intHandle = MemoryHandles.varHandle(int.class, ByteOrder.nativeOrder());
>>
>> int[] intData = new int[12];
>> volatile int intDataOffset = 0;
>>
>> volatile MemoryAddress address;
>> volatile long addressRaw;
>>
>> @Setup
>> public void setup() {
>> var ms = MemorySegment.allocateNative(256);
>> address = ms.address();
>> addressRaw = address.toRawLongValue();
>> }
>>
>> @Benchmark
>> public void target(Blackhole bh) {
>> int[] local = intData;
>> int localOffset = intDataOffset;
>> bh.consume(local[localOffset]);
>> bh.consume(local[localOffset + 1]);
>> }
>>
>> @Benchmark
>> public void foreignAddress(Blackhole bh) {
>> var a = address;
>> bh.consume((int) intHandle.get(ms, a.addOffset(0).toRawLongValue()));
>> bh.consume((int) intHandle.get(ms, a.addOffset(4).toRawLongValue()));
>> }
>>
>> @Benchmark
>> public void foreignAddressRaw(Blackhole bh) {
>> var a = addressRaw;
>> bh.consume((int) intHandle.get(ms, a));
>> bh.consume((int) intHandle.get(ms, a + 4));
>> }
>> }
>
> Radoslaw Smogura has refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR.
Looks good! Thanks for investigating the issues with lack of static on Unsafe.
Could we please add the benchmark under test/micro/org/openjdk/bench/jdk/incubator/foreign ? We try to add benchmark for each case we find as we go along, to make sure we don't regress. This seems like another interesting case.
-------------
PR: https://git.openjdk.java.net/panama-foreign/pull/437
More information about the panama-dev
mailing list