<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="">
<p style="margin: 0px 0px 1.2em !important;">My hunch was correct.
When tweaking the acquire code I go from this:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">Benchmark Mode Cnt Score Error Units
FFMEscapeAnalysisTest.noop_params0 avgt 3 6.243 ± 0.221 ns/op
FFMEscapeAnalysisTest.noop_params1 avgt 3 6.243 ± 0.301 ns/op
FFMEscapeAnalysisTest.noop_params2 avgt 3 6.198 ± 0.056 ns/op
FFMEscapeAnalysisTest.noop_params3 avgt 3 6.533 ± 1.222 ns/op
FFMEscapeAnalysisTest.noop_params4 avgt 3 17.435 ± 1.990 ns/op
FFMEscapeAnalysisTest.noop_params5 avgt 3 21.509 ± 4.035 ns/op
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">To this:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">Benchmark Mode Cnt Score Error Units
FFMEscapeAnalysisTest.noop_params0 avgt 3 6.479 ± 0.052 ns/op
FFMEscapeAnalysisTest.noop_params1 avgt 3 6.230 ± 0.016 ns/op
FFMEscapeAnalysisTest.noop_params2 avgt 3 6.272 ± 0.082 ns/op
FFMEscapeAnalysisTest.noop_params3 avgt 3 6.566 ± 0.294 ns/op
FFMEscapeAnalysisTest.noop_params4 avgt 3 6.200 ± 0.066 ns/op
FFMEscapeAnalysisTest.noop_params5 avgt 3 6.785 ± 0.029 ns/op
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">So, something is
definitively off with that acquire code.</p>
<p style="margin: 0px 0px 1.2em !important;">Thanks for the
report!<br>
Maurizio</p>
<p style="margin: 0px 0px 1.2em !important;">On 23/10/2024 17:21,
Maurizio Cimadamore wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:569daaf6-0a2f-4f97-ab71-d03d394bfe61@oracle.com">Thanks
Ioannis, we'll take a look.
<br>
<br>
One thing that comes to mind is that when you pass an address
to a downcall, the Linker has to keep its arena alive (to
ensure it stays alive for the entire duration of the call).
Now, if the segments you pass are constructed with
MemorySegment::ofAddress, you get back segments associated
with the global scope, so this "acquire" operation is a no-op.
<br>
<br>
But the Linker-generated code contains some non-trivial logic
to try to reduce the number of acquire calls that are
generated - e.g. if you pass 7 arguments all associated with
the same arena, we'll just do a single acquire. I wonder if,
as the number of argument becomes increasingly big, the
generated code for the downcall bindings becomes too complex
and full of control flow, which then results in EA bailing
out.
<br>
<br>
(Needless to say, we can't wait to make MemorySegment
implementation a value class and avoid all these issues :-) )
<br>
<br>
If that is the issue, it might be that case that calling one
acquire per pointer argument, even if redundant, leads to
better optimizations than what we have now. The complex logic
I'm referring to is here:
<br>
<br>
<a class="moz-txt-link-freetext" href="https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/jdk/internal/foreign/abi/BindingSpecializer.java#L497">https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/jdk/internal/foreign/abi/BindingSpecializer.java#L497</a>
<br>
<br>
Maurizio
<br>
<br>
On 23/10/2024 16:51, Ioannis Tsakpinis wrote:
<br>
<blockquote type="cite">Hello,
<br>
<br>
I've been migrating LWJGL to FFM and during testing of some
real-world
<br>
code (Vulkan rendering), I noticed a spike in GC activity
with the FFM
<br>
implementation, compared to the old JNI implementation. I
think I've
<br>
been able to track it down to what looks like an odd failure
of escape
<br>
analysis. Specifically, scalar replacement no longer occurs
when
<br>
calling functions with 4 or more ADDRESS (MemorySegment)
parameters.
<br>
<br>
JMH benchmark (you'll need to build a shared library with
some empty
<br>
functions and run with GC profiling enabled) that
demonstrates the
<br>
issue:
<br>
<br>
<a class="moz-txt-link-freetext" href="https://gist.github.com/Spasi/71d5cfa687a1dbe95b3fce608d31ae6b">https://gist.github.com/Spasi/71d5cfa687a1dbe95b3fce608d31ae6b</a>
<br>
<br>
There are functions with arity from 0 to 5. When invoking a
downcall,
<br>
raw pointer values are wrapped with
MemorySegment.ofAddress() and
<br>
passed to each argument. The exact pointer values do not
matter.
<br>
<br>
Until 3 ADDRESS parameters, or 3 ADDRESS parameters plus
other non-
<br>
ADDRESS parameters, everything is fine and there's no GC
activity.
<br>
With 4 or more ADDRESS parameters, allocations are no longer
<br>
eliminated. The problem also occurs with a single
MemorySegment that
<br>
is passed to all parameters:
<br>
<br>
var p = MemorySegment.ofAddress(42L);
<br>
functionMH.invokeExact(p, p, p, p);
<br>
<br>
Any idea what might be causing this?
<br>
<br>
- Ioannis
<br>
</blockquote>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div title="MDH:PHA+TXkgaHVuY2ggd2FzIGNvcnJlY3QuIFdoZW4gdHdlYWtpbmcgdGhlIGFjcXVpcmUgY29kZSBJ
IGdvIGZyb20gdGhpczo8L3A+PHA+YGBgPGJyPkJlbmNobWFyayZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBNb2RlJm5ic3A7IENudCZuYnNwOyZuYnNwOyBTY29yZSZu
YnNwOyZuYnNwOyBFcnJvciZuYnNwOyBVbml0czxicj5GRk1Fc2NhcGVBbmFseXNpc1Rlc3Qubm9v
cF9wYXJhbXMwJm5ic3A7IGF2Z3QmbmJzcDsmbmJzcDsmbmJzcDsgMyZuYnNwOyZuYnNwOyA2LjI0
MyDCsSAwLjIyMSZuYnNwOyBucy9vcDxicj5GRk1Fc2NhcGVBbmFseXNpc1Rlc3Qubm9vcF9wYXJh
bXMxJm5ic3A7IGF2Z3QmbmJzcDsmbmJzcDsmbmJzcDsgMyZuYnNwOyZuYnNwOyA2LjI0MyDCsSAw
LjMwMSZuYnNwOyBucy9vcDxicj5GRk1Fc2NhcGVBbmFseXNpc1Rlc3Qubm9vcF9wYXJhbXMyJm5i
c3A7IGF2Z3QmbmJzcDsmbmJzcDsmbmJzcDsgMyZuYnNwOyZuYnNwOyA2LjE5OCDCsSAwLjA1NiZu
YnNwOyBucy9vcDxicj5GRk1Fc2NhcGVBbmFseXNpc1Rlc3Qubm9vcF9wYXJhbXMzJm5ic3A7IGF2
Z3QmbmJzcDsmbmJzcDsmbmJzcDsgMyZuYnNwOyZuYnNwOyA2LjUzMyDCsSAxLjIyMiZuYnNwOyBu
cy9vcDxicj5GRk1Fc2NhcGVBbmFseXNpc1Rlc3Qubm9vcF9wYXJhbXM0Jm5ic3A7IGF2Z3QmbmJz
cDsmbmJzcDsmbmJzcDsgMyZuYnNwOyAxNy40MzUgwrEgMS45OTAmbmJzcDsgbnMvb3A8YnI+RkZN
RXNjYXBlQW5hbHlzaXNUZXN0Lm5vb3BfcGFyYW1zNSZuYnNwOyBhdmd0Jm5ic3A7Jm5ic3A7Jm5i
c3A7IDMmbmJzcDsgMjEuNTA5IMKxIDQuMDM1Jm5ic3A7IG5zL29wPGJyPmBgYDwvcD48cD5UbyB0
aGlzOjwvcD48cD5gYGA8YnI+QmVuY2htYXJrJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7IE1vZGUmbmJzcDsgQ250Jm5ic3A7IFNjb3JlJm5ic3A7Jm5ic3A7IEVycm9y
Jm5ic3A7IFVuaXRzPGJyPkZGTUVzY2FwZUFuYWx5c2lzVGVzdC5ub29wX3BhcmFtczAmbmJzcDsg
YXZndCZuYnNwOyZuYnNwOyZuYnNwOyAzJm5ic3A7IDYuNDc5IMKxIDAuMDUyJm5ic3A7IG5zL29w
PGJyPkZGTUVzY2FwZUFuYWx5c2lzVGVzdC5ub29wX3BhcmFtczEmbmJzcDsgYXZndCZuYnNwOyZu
YnNwOyZuYnNwOyAzJm5ic3A7IDYuMjMwIMKxIDAuMDE2Jm5ic3A7IG5zL29wPGJyPkZGTUVzY2Fw
ZUFuYWx5c2lzVGVzdC5ub29wX3BhcmFtczImbmJzcDsgYXZndCZuYnNwOyZuYnNwOyZuYnNwOyAz
Jm5ic3A7IDYuMjcyIMKxIDAuMDgyJm5ic3A7IG5zL29wPGJyPkZGTUVzY2FwZUFuYWx5c2lzVGVz
dC5ub29wX3BhcmFtczMmbmJzcDsgYXZndCZuYnNwOyZuYnNwOyZuYnNwOyAzJm5ic3A7IDYuNTY2
IMKxIDAuMjk0Jm5ic3A7IG5zL29wPGJyPkZGTUVzY2FwZUFuYWx5c2lzVGVzdC5ub29wX3BhcmFt
czQmbmJzcDsgYXZndCZuYnNwOyZuYnNwOyZuYnNwOyAzJm5ic3A7IDYuMjAwIMKxIDAuMDY2Jm5i
c3A7IG5zL29wPGJyPkZGTUVzY2FwZUFuYWx5c2lzVGVzdC5ub29wX3BhcmFtczUmbmJzcDsgYXZn
dCZuYnNwOyZuYnNwOyZuYnNwOyAzJm5ic3A7IDYuNzg1IMKxIDAuMDI5Jm5ic3A7IG5zL29wPGJy
PmBgYDwvcD48cD5Tbywgc29tZXRoaW5nIGlzIGRlZmluaXRpdmVseSBvZmYgd2l0aCB0aGF0IGFj
cXVpcmUgY29kZS48L3A+PHA+VGhhbmtzIGZvciB0aGUgcmVwb3J0ITxicj5NYXVyaXppbzxicj48
L3A+PGRpdiBjbGFzcz0ibW96LWNpdGUtcHJlZml4Ij5PbiAyMy8xMC8yMDI0IDE3OjIxLCBNYXVy
aXppbyBDaW1hZGFtb3JlIHdyb3RlOjxicj48L2Rpdj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBj
aXRlPSJtaWQ6NTY5ZGFhZjYtMGEyZi00Zjk3LWFiNzEtZDAzZDM5NGJmZTYxQG9yYWNsZS5jb20i
PlRoYW5rcyBJb2FubmlzLCB3ZSdsbCB0YWtlIGEgbG9vay4KPGJyPgo8YnI+T25lIHRoaW5nIHRo
YXQgY29tZXMgdG8gbWluZCBpcyB0aGF0IHdoZW4geW91IHBhc3MgYW4gYWRkcmVzcyB0byBhIApk
b3duY2FsbCwgdGhlIExpbmtlciBoYXMgdG8ga2VlcCBpdHMgYXJlbmEgYWxpdmUgKHRvIGVuc3Vy
ZSBpdCBzdGF5cyAKYWxpdmUgZm9yIHRoZSBlbnRpcmUgZHVyYXRpb24gb2YgdGhlIGNhbGwpLiBO
b3csIGlmIHRoZSBzZWdtZW50cyB5b3UgCnBhc3MgYXJlIGNvbnN0cnVjdGVkIHdpdGggTWVtb3J5
U2VnbWVudDo6b2ZBZGRyZXNzLCB5b3UgZ2V0IGJhY2sgCnNlZ21lbnRzIGFzc29jaWF0ZWQgd2l0
aCB0aGUgZ2xvYmFsIHNjb3BlLCBzbyB0aGlzICJhY3F1aXJlIiBvcGVyYXRpb24gCmlzIGEgbm8t
b3AuCjxicj4KPGJyPkJ1dCB0aGUgTGlua2VyLWdlbmVyYXRlZCBjb2RlIGNvbnRhaW5zIHNvbWUg
bm9uLXRyaXZpYWwgbG9naWMgdG8gdHJ5IHRvIApyZWR1Y2UgdGhlIG51bWJlciBvZiBhY3F1aXJl
IGNhbGxzIHRoYXQgYXJlIGdlbmVyYXRlZCAtIGUuZy4gaWYgeW91IHBhc3MgCjcgYXJndW1lbnRz
IGFsbCBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgYXJlbmEsIHdlJ2xsIGp1c3QgZG8gYSBzaW5n
bGUgCmFjcXVpcmUuIEkgd29uZGVyIGlmLCBhcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IGJlY29t
ZXMgaW5jcmVhc2luZ2x5IApiaWcsIHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIGRvd25jYWxs
IGJpbmRpbmdzIGJlY29tZXMgdG9vIGNvbXBsZXggCmFuZCBmdWxsIG9mIGNvbnRyb2wgZmxvdywg
d2hpY2ggdGhlbiByZXN1bHRzIGluIEVBIGJhaWxpbmcgb3V0Lgo8YnI+Cjxicj4oTmVlZGxlc3Mg
dG8gc2F5LCB3ZSBjYW4ndCB3YWl0IHRvIG1ha2UgTWVtb3J5U2VnbWVudCBpbXBsZW1lbnRhdGlv
biBhIAp2YWx1ZSBjbGFzcyBhbmQgYXZvaWQgYWxsIHRoZXNlIGlzc3VlcyA6LSkgKQo8YnI+Cjxi
cj5JZiB0aGF0IGlzIHRoZSBpc3N1ZSwgaXQgbWlnaHQgYmUgdGhhdCBjYXNlIHRoYXQgY2FsbGlu
ZyBvbmUgYWNxdWlyZSBwZXIgCnBvaW50ZXIgYXJndW1lbnQsIGV2ZW4gaWYgcmVkdW5kYW50LCBs
ZWFkcyB0byBiZXR0ZXIgb3B0aW1pemF0aW9ucyB0aGFuIAp3aGF0IHdlIGhhdmUgbm93LiBUaGUg
Y29tcGxleCBsb2dpYyBJJ20gcmVmZXJyaW5nIHRvIGlzIGhlcmU6Cjxicj4KPGJyPmh0dHBzOi8v
Z2l0aHViLmNvbS9vcGVuamRrL2pkay9ibG9iL21hc3Rlci9zcmMvamF2YS5iYXNlL3NoYXJlL2Ns
YXNzZXMvamRrL2ludGVybmFsL2ZvcmVpZ24vYWJpL0JpbmRpbmdTcGVjaWFsaXplci5qYXZhI0w0
OTcKPGJyPgo8YnI+TWF1cml6aW8KPGJyPgo8YnI+T24gMjMvMTAvMjAyNCAxNjo1MSwgSW9hbm5p
cyBUc2FrcGluaXMgd3JvdGU6Cjxicj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIj5IZWxsbywKPGJy
Pgo8YnI+SSd2ZSBiZWVuIG1pZ3JhdGluZyBMV0pHTCB0byBGRk0gYW5kIGR1cmluZyB0ZXN0aW5n
IG9mIHNvbWUgcmVhbC13b3JsZAo8YnI+Y29kZSAoVnVsa2FuIHJlbmRlcmluZyksIEkgbm90aWNl
ZCBhIHNwaWtlIGluIEdDIGFjdGl2aXR5IHdpdGggdGhlIEZGTQo8YnI+aW1wbGVtZW50YXRpb24s
IGNvbXBhcmVkIHRvIHRoZSBvbGQgSk5JIGltcGxlbWVudGF0aW9uLiBJIHRoaW5rIEkndmUKPGJy
PmJlZW4gYWJsZSB0byB0cmFjayBpdCBkb3duIHRvIHdoYXQgbG9va3MgbGlrZSBhbiBvZGQgZmFp
bHVyZSBvZiBlc2NhcGUKPGJyPmFuYWx5c2lzLiBTcGVjaWZpY2FsbHksIHNjYWxhciByZXBsYWNl
bWVudCBubyBsb25nZXIgb2NjdXJzIHdoZW4KPGJyPmNhbGxpbmcgZnVuY3Rpb25zIHdpdGggNCBv
ciBtb3JlIEFERFJFU1MgKE1lbW9yeVNlZ21lbnQpIHBhcmFtZXRlcnMuCjxicj4KPGJyPkpNSCBi
ZW5jaG1hcmsgKHlvdSdsbCBuZWVkIHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBzb21l
IGVtcHR5Cjxicj5mdW5jdGlvbnMgYW5kIHJ1biB3aXRoIEdDIHByb2ZpbGluZyBlbmFibGVkKSB0
aGF0IGRlbW9uc3RyYXRlcyB0aGUKPGJyPmlzc3VlOgo8YnI+Cjxicj5odHRwczovL2dpc3QuZ2l0
aHViLmNvbS9TcGFzaS83MWQ1Y2ZhNjg3YTFkYmU5NWIzZmNlNjA4ZDMxYWU2Ygo8YnI+Cjxicj5U
aGVyZSBhcmUgZnVuY3Rpb25zIHdpdGggYXJpdHkgZnJvbSAwIHRvIDUuIFdoZW4gaW52b2tpbmcg
YSBkb3duY2FsbCwKPGJyPnJhdyBwb2ludGVyIHZhbHVlcyBhcmUgd3JhcHBlZCB3aXRoIE1lbW9y
eVNlZ21lbnQub2ZBZGRyZXNzKCkgYW5kCjxicj5wYXNzZWQgdG8gZWFjaCBhcmd1bWVudC4gVGhl
IGV4YWN0IHBvaW50ZXIgdmFsdWVzIGRvIG5vdCBtYXR0ZXIuCjxicj4KPGJyPlVudGlsIDMgQURE
UkVTUyBwYXJhbWV0ZXJzLCBvciAzIEFERFJFU1MgcGFyYW1ldGVycyBwbHVzIG90aGVyIG5vbi0K
PGJyPkFERFJFU1MgcGFyYW1ldGVycywgZXZlcnl0aGluZyBpcyBmaW5lIGFuZCB0aGVyZSdzIG5v
IEdDIGFjdGl2aXR5Lgo8YnI+V2l0aCA0IG9yIG1vcmUgQUREUkVTUyBwYXJhbWV0ZXJzLCBhbGxv
Y2F0aW9ucyBhcmUgbm8gbG9uZ2VyCjxicj5lbGltaW5hdGVkLiBUaGUgcHJvYmxlbSBhbHNvIG9j
Y3VycyB3aXRoIGEgc2luZ2xlIE1lbW9yeVNlZ21lbnQgdGhhdAo8YnI+aXMgcGFzc2VkIHRvIGFs
bCBwYXJhbWV0ZXJzOgo8YnI+Cjxicj52YXIgcCA9IE1lbW9yeVNlZ21lbnQub2ZBZGRyZXNzKDQy
TCk7Cjxicj5mdW5jdGlvbk1ILmludm9rZUV4YWN0KHAsIHAsIHAsIHApOwo8YnI+Cjxicj5Bbnkg
aWRlYSB3aGF0IG1pZ2h0IGJlIGNhdXNpbmcgdGhpcz8KPGJyPgo8YnI+LSBJb2FubmlzCjxicj48
L2Jsb2NrcXVvdGU+PC9ibG9ja3F1b3RlPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>