[foreign-memaccess+abi] RFR: Generalize PointerInvoke to benchmark by-ref segment return

Maurizio Cimadamore mcimadamore at openjdk.org
Fri Feb 10 18:28:38 UTC 2023


On Fri, 10 Feb 2023 18:21:47 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

> I've generalized an existing benchmark to test by-reference segment return in downcalls.
> Ideally, we should see scalarization of the returned segment, and no GC activity.

Results I got:


Benchmark                                                              Mode  Cnt     Score     Error   Units
PointerInvoke.long_to_long                                             avgt   30    10.016 ±   0.038   ns/op
PointerInvoke.long_to_long:·gc.alloc.rate                              avgt   30     0.001 ±   0.001  MB/sec
PointerInvoke.long_to_long:·gc.alloc.rate.norm                         avgt   30    ≈ 10⁻⁵              B/op
PointerInvoke.long_to_long:·gc.count                                   avgt   30       ≈ 0            counts
PointerInvoke.long_to_ptr                                              avgt   30    14.581 ±   0.185   ns/op
PointerInvoke.long_to_ptr:·gc.alloc.rate                               avgt   30  2354.079 ±  29.942  MB/sec
PointerInvoke.long_to_ptr:·gc.alloc.rate.norm                          avgt   30    72.005 ±   0.001    B/op
PointerInvoke.long_to_ptr:·gc.churn.G1_Eden_Space                      avgt   30  2345.490 ± 102.742  MB/sec
PointerInvoke.long_to_ptr:·gc.churn.G1_Eden_Space.norm                 avgt   30    71.766 ±   3.260    B/op
PointerInvoke.long_to_ptr:·gc.churn.G1_Survivor_Space                  avgt   30     0.018 ±   0.007  MB/sec
PointerInvoke.long_to_ptr:·gc.churn.G1_Survivor_Space.norm             avgt   30     0.001 ±   0.001    B/op
PointerInvoke.long_to_ptr:·gc.count                                    avgt   30   210.000            counts
PointerInvoke.long_to_ptr:·gc.time                                     avgt   30   124.000                ms
PointerInvoke.ptr_to_long                                              avgt   30    10.712 ±   0.088   ns/op
PointerInvoke.ptr_to_long:·gc.alloc.rate                               avgt   30     0.001 ±   0.001  MB/sec
PointerInvoke.ptr_to_long:·gc.alloc.rate.norm                          avgt   30    ≈ 10⁻⁵              B/op
PointerInvoke.ptr_to_long:·gc.count                                    avgt   30       ≈ 0            counts
PointerInvoke.ptr_to_long_new_segment                                  avgt   30    11.386 ±   0.124   ns/op
PointerInvoke.ptr_to_long_new_segment:·gc.alloc.rate                   avgt   30     0.001 ±   0.001  MB/sec
PointerInvoke.ptr_to_long_new_segment:·gc.alloc.rate.norm              avgt   30    ≈ 10⁻⁵              B/op
PointerInvoke.ptr_to_long_new_segment:·gc.count                        avgt   30       ≈ 0            counts
PointerInvoke.ptr_to_ptr                                               avgt   30    15.769 ±   0.186   ns/op
PointerInvoke.ptr_to_ptr:·gc.alloc.rate                                avgt   30  2176.427 ±  25.562  MB/sec
PointerInvoke.ptr_to_ptr:·gc.alloc.rate.norm                           avgt   30    72.005 ±   0.001    B/op
PointerInvoke.ptr_to_ptr:·gc.churn.G1_Eden_Space                       avgt   30  2186.727 ± 109.313  MB/sec
PointerInvoke.ptr_to_ptr:·gc.churn.G1_Eden_Space.norm                  avgt   30    72.331 ±   3.393    B/op
PointerInvoke.ptr_to_ptr:·gc.churn.G1_Survivor_Space                   avgt   30     0.013 ±   0.007  MB/sec
PointerInvoke.ptr_to_ptr:·gc.churn.G1_Survivor_Space.norm              avgt   30    ≈ 10⁻³              B/op
PointerInvoke.ptr_to_ptr:·gc.count                                     avgt   30   187.000            counts
PointerInvoke.ptr_to_ptr:·gc.time                                      avgt   30   109.000                ms
PointerInvoke.ptr_to_ptr_new_segment                                   avgt   30    15.848 ±   0.239   ns/op
PointerInvoke.ptr_to_ptr_new_segment:·gc.alloc.rate                    avgt   30  2165.823 ±  32.328  MB/sec
PointerInvoke.ptr_to_ptr_new_segment:·gc.alloc.rate.norm               avgt   30    72.005 ±   0.001    B/op
PointerInvoke.ptr_to_ptr_new_segment:·gc.churn.G1_Eden_Space           avgt   30  2175.643 ±  93.914  MB/sec
PointerInvoke.ptr_to_ptr_new_segment:·gc.churn.G1_Eden_Space.norm      avgt   30    72.321 ±   2.808    B/op
PointerInvoke.ptr_to_ptr_new_segment:·gc.churn.G1_Survivor_Space       avgt   30     0.019 ±   0.009  MB/sec
PointerInvoke.ptr_to_ptr_new_segment:·gc.churn.G1_Survivor_Space.norm  avgt   30     0.001 ±   0.001    B/op
PointerInvoke.ptr_to_ptr_new_segment:·gc.count                         avgt   30   198.000            counts
PointerInvoke.ptr_to_ptr_new_segment:·gc.time                          avgt   30   116.000                ms


Passing segments as arguments works fine, but returning segments generate allocation. This seems to be unrelated to latest API changes - (even when I tweaked the FFM impl to always use global scope, the allocation seems to be still there).

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

PR: https://git.openjdk.org/panama-foreign/pull/788


More information about the panama-dev mailing list