MappedMemorySegment & in-memory filesystems
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Jun 22 13:32:24 UTC 2020
On 22/06/2020 14:16, Ty Young wrote:
>
> On 6/22/20 7:44 AM, Maurizio Cimadamore wrote:
>>
>> On 22/06/2020 13:09, Ty Young wrote:
>>> Hi,
>>>
>>>
>>> With libraries such as NVML, the current "allocation scopes" API
>>> does not properly model the relationship between a GPU and the
>>> MemoryAddresses/MemorySegments that belong to it. Noticing this
>>> issue, I've created a solution based on MappedMemorySegments which
>>> allow for dynamic memory allocation by reusing the same persistent
>>> on-disk file and simply creating new, larger MappedMemorySegment on it.
>>
>> What is the problem you are trying to solve? In what way the
>> NativeScope API is not good for your use case?
>
>
> Current(unless it's changed, doesn't look like it has) *unbounded*
> allocation scopes are not always of one memory chunk but rather
> multiple chunks thrown into a list. I'd like the ability for memory to
> be of one continuous chunk, partly for persistence and for
> consistency. This, along with the fact that files have names, allows
> me to cleanly associate memory with a specific GPU. Here is how I have
> it setup currently(although, not everything is in-use):
So, this is, at its core, a way to support reallocation (e.g. "realloc") ?
If that's the main use case, have you tried using a native method handle
for the "realloc" call plus the unsafe segment factory
MemorySegment::ofNativeUnchecked?
In other words, I think you should really go down the mapped segment
path if you care about persistence - if that's not your primary use
case, I think that's probably not the right tool for the job?
Maurizio
>
>
> https://imgur.com/a/xVR8vCV
>
>
> Every GPU gets its own file(AKA, a "scope") named the same as its UUID.
>
>
>>
>> I'm surprised you ended up with a mapped segment - are you interested
>> in persisting the memory contents to disk?
>
>
> Currently no, but I've been thinking of doing this. Some GPU data
> never changes, like UUID, so there is a benefit to doing it for sure.
>
>
>>
>> I guess that, before discussing the specifics, I'd be interested in
>> learning more about what exactly you are trying to achieve.
>>
>> Thanks
>> Maurizio
>>
>>>
>>>
>>> This works really well and is pretty flexible: you can choose to
>>> allocate memory in chunks or as-needed(with performance costs, of
>>> course). It has, however, an issue in that the file needs to be
>>> stored somewhere. on-disk, like I'm doing now, is an option but it
>>> of course has disk I/O issues.
>>>
>>>
>>> The good news is that Java supports custom filesystems. The bad news
>>> is that there is no standardized way to create one within the JDK
>>> currently, without going with third-party libraries.
>>>
>>>
>>> So my main question here is, would this be something Panama could do?
>>>
>>>
>>> A few other questions:
>>>
>>>
>>> - can anything be to help with MemoryAddress alignment(e.g. a static
>>> utility method)? I have to do this with my code but I feel like
>>> there has to be a more standardized way of fixing a MemoryAddress's
>>> alignment. Even if it's only specific to a MappedMemorySegment, it'd
>>> be nice to have.
>>>
>>>
>>> - what is the relationship of a MappedMemorySegment and its
>>> underlying file? It seems like all memory contents are periodically
>>> written to the file as part of a write-cache or something but I've
>>> noticed deleting the file on-disk doesn't affect my application in
>>> the slightest while running. Is this supposed to happen?
>>>
>>>
>>> - could a new method be added to MappedMemorySegment to get an
>>> expanded view of a file? Something like:
>>>
>>>
>>> public MappedMemorySegment expand(long bytes)
>>>
>>>
>>> ? This is already possible to do with the factory methods but having
>>> a simple "expand" method would be shorter and easier to read.
>>>
More information about the panama-dev
mailing list