We need to store GPU/APU code on selected methods, independently of normal CPU code.
There are currently 5 words used in the Method struct to store code and structures relating to code. Even if we support only one type of GPU this means something like 5 more words.
Let's think about merging all the pointers used to manage code (code, x_adapter, etc.) into a consolidated format that will save memory and allow new degrees of freedom.
(This is similar to the work inJDK-8010862 that consolidated the method counters.)
Note: The OSR side table might be able to go away also if we do this right.
Consider an open api like:
address Method::entry_point(enum EntryPointKind k, int subtype = 0)
(Subtype is usually zero but may be BCI for an OSR nmethod, or what-not.)
The data structure probably needs searching but can be organized so that search length is 1 almost always. Compact the common cases.
EntryPointKinds for _code and for _gpu_code, for example.
(Definition of GPU could be, "whatever we found besides the CPU when the JVM started". If there are up to 2 possibilities, CPU + GPU1 + GPU2, etc.)
Existing pointer words relevant to enum EPK:
{
address _i2i_entry; // All-args-on-stack calling convention
// Adapter blob (i2c/c2i) for this Method*. Set once when method is linked.
AdapterHandlerEntry* _adapter;
// Entry point for calling from compiled code, to compiled code if it exists
// or else the interpreter.
volatile address _from_compiled_entry; // Cache of: _code ? _code->entry_point() : _adapter->c2i_entry()
// The entry point for calling both from and to compiled code is
// "_code->entry_point()". Because of tiered compilation and de-opt, this
// field can come and go. It can transition from NULL to not-null at any
// time (whenever a compile completes). It can transition from not-null to
// NULL only at safepoints (because of a de-opt).
nmethod* volatile _code; // Points to the corresponding piece of native code
volatile address _from_interpreted_entry; // Cache of _code ? _adapter->i2c_entry() : _i2i_entry
}
There are currently 5 words used in the Method struct to store code and structures relating to code. Even if we support only one type of GPU this means something like 5 more words.
Let's think about merging all the pointers used to manage code (code, x_adapter, etc.) into a consolidated format that will save memory and allow new degrees of freedom.
(This is similar to the work in
Note: The OSR side table might be able to go away also if we do this right.
Consider an open api like:
address Method::entry_point(enum EntryPointKind k, int subtype = 0)
(Subtype is usually zero but may be BCI for an OSR nmethod, or what-not.)
The data structure probably needs searching but can be organized so that search length is 1 almost always. Compact the common cases.
EntryPointKinds for _code and for _gpu_code, for example.
(Definition of GPU could be, "whatever we found besides the CPU when the JVM started". If there are up to 2 possibilities, CPU + GPU1 + GPU2, etc.)
Existing pointer words relevant to enum EPK:
{
address _i2i_entry; // All-args-on-stack calling convention
// Adapter blob (i2c/c2i) for this Method*. Set once when method is linked.
AdapterHandlerEntry* _adapter;
// Entry point for calling from compiled code, to compiled code if it exists
// or else the interpreter.
volatile address _from_compiled_entry; // Cache of: _code ? _code->entry_point() : _adapter->c2i_entry()
// The entry point for calling both from and to compiled code is
// "_code->entry_point()". Because of tiered compilation and de-opt, this
// field can come and go. It can transition from NULL to not-null at any
// time (whenever a compile completes). It can transition from not-null to
// NULL only at safepoints (because of a de-opt).
nmethod* volatile _code; // Points to the corresponding piece of native code
volatile address _from_interpreted_entry; // Cache of _code ? _adapter->i2c_entry() : _i2i_entry
}
- duplicates
-
JDK-8038356 JVM should manage multiple versions of compiled methods
-
- Open
-
- relates to
-
JDK-8038356 JVM should manage multiple versions of compiled methods
-
- Open
-
-
JDK-8010862 The Method counter fields used for profiling can be allocated lazily
-
- Resolved
-