Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace memmove with Unsafe.CopyBlock in hydration code #98929

Merged
merged 1 commit into from
Feb 26, 2024

Conversation

filipnavara
Copy link
Member

The calling convention for memmove needs to be __cdecl on x86, so avoid hitting the issue.

@ghost
Copy link

ghost commented Feb 26, 2024

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

The calling convention for memmove needs to be __cdecl on x86, so avoid hitting the issue.

Author: filipnavara
Assignees: -
Labels:

area-NativeAOT-coreclr

Milestone: -

[MethodImplAttribute(MethodImplOptions.InternalCall)]
[RuntimeImport("*", "memmove")]
static extern unsafe void* memmove(byte* dmem, byte* smem, nuint size);
Unsafe.CopyBlock(pDest, pCurrent, (uint)payload);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@EgorBo would this use the managed impl of the block copying after your #98623?

Wonder whether we should just replace the whole block from line 266 onwards with that.

When I originally wrote this code in #77884 (comment) I had concerns about this running extremely early at startup. If the managed impl works here, it would probably generate equivalent code with the added benefit of being even better for --instruction-set native.

Copy link
Member

@EgorBo EgorBo Feb 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@EgorBo would this use the managed impl of the block copying after your #98623?

Correct, it will be a direct call to https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/SpanHelpers.ByteMemOps.cs#L253 (accelerated with avx512 if presented)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, this is the thing called through RuntimeExports...

If we get a non-inlineable call then what this PR is doing is enough. We can't get rid of the small size special cases, the outer loop is very hot.

Copy link
Member

@EgorBo EgorBo Feb 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If needed, we can consider exposing native memset/memmove/memset APIs in NativeMemory.cs API

Copy link
Member

@MichalStrehovsky MichalStrehovsky left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM with a note that we're now calling into "arbitrary BCL code" at very early startup so we might need to revisit if people ever make the BCL code not low level enough (we e.g. can't touch any MethodTable at this point because it's the thing getting dehydrated).

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CopyBlock(void* destination, void* source, uint byteCount)
{
throw new PlatformNotSupportedException();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will need to be implemented if we ever want hydration work with minimal runtime

@jkotas jkotas merged commit 99a3d9c into dotnet:main Feb 26, 2024
110 checks passed
@filipnavara filipnavara deleted the unsafe-copyblock branch February 26, 2024 15:44
@github-actions github-actions bot locked and limited conversation to collaborators Mar 28, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants