[foreign-memaccess+abi] RFR: Performance improvement to unchecked segment ofNativeRestricted

Radoslaw Smogura github.com+7535718+rsmogura at openjdk.java.net
Thu Jan 14 23:15:22 UTC 2021


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));
    }
}

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

Commit messages:
 - Naming & comments redaction
 - Revert "Next iteration of tuning"
 - Next iteration of tuning
 - Performance improvement to unchecked segment ofNativeRestricted

Changes: https://git.openjdk.java.net/panama-foreign/pull/437/files
 Webrev: https://webrevs.openjdk.java.net/?repo=panama-foreign&pr=437&range=00
  Stats: 52 lines in 1 file changed: 49 ins; 2 del; 1 mod
  Patch: https://git.openjdk.java.net/panama-foreign/pull/437.diff
  Fetch: git fetch https://git.openjdk.java.net/panama-foreign pull/437/head:pull/437

PR: https://git.openjdk.java.net/panama-foreign/pull/437


More information about the panama-dev mailing list