Skip to content

Enable AVX-512 for block unrollings (both copying and zeroing) - #85389

Merged
EgorBo merged 6 commits into
dotnet:mainfrom
EgorBo:blk-avx-512
Apr 27, 2023
Merged

Enable AVX-512 for block unrollings (both copying and zeroing)#85389
EgorBo merged 6 commits into
dotnet:mainfrom
EgorBo:blk-avx-512

Conversation

@EgorBo

@EgorBoEgorBo commented Apr 26, 2023

Copy link
Copy Markdown
Member

Closes#83798

This PR enables AVX-512 for various unrollings using GT_BLK - it can be stackalloc zeroing, struct copy/initialization, Unsafe.InitBloc/Unsafe.BlockCopy calls, etc.

Examples:

structMyStruct{longa,b,c,d,e,f,g,h;}// CopyingMyStructStructCopy(MyStructs){returns;}// ZeroingvoidStackallocZeroing(){byte*ptr=stackallocbyte[300];Consume(ptr);}

Codegen diff: https://www.diffchecker.com/cxc6UYLf/ (this PR is on the right)

As the result, it increases ranges where we previously used to fallback to memcpy/memset calls.

Benchmark:

[Benchmark]publicvoidTest(){varptr=stackalloclong[42];Consume(ptr);}[MethodImpl(MethodImplOptions.NoInlining)]staticvoidConsume(void*ptr){}
MethodJobToolchainMean
TestJob-FEQJHS\Core_Root\corerun.exe4.229 ns
TestJob-CMMDYR\Core_Root_PR\corerun.exe2.262 ns

Ryzen 7950x, avx512, win-x64

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 26, 2023
@ghostghost assigned EgorBoApr 26, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Closes #83798

This PR enables AVX-512 for various unrollings using GT_BLK - it can be stackalloc zeroing, struct copy/initialization, Unsafe.InitBloc/Unsafe.BlockCopy calls, etc.

Examples:

structMyStruct{longa,b,c,d,e,f,g,h;}// CopyingMyStructStructCopy(MyStructs){returns;}// ZeroingvoidStackallocZeroing(){byte*ptr=stackallocbyte[300];Consume(ptr);}

old codegen:

; Method Tests:StructCopy(Tests+MyStruct):Tests+MyStruct:thisvzeroupper vmovdqu ymm0, ymmword ptr [r8] vmovdqu ymmword ptr [rdx],ymm0 vmovdqu ymm0, ymmword ptr [r8+20H] vmovdqu ymmword ptr [rdx+20H],ymm0movrax,rdxvzeroupperret; Total bytes of code: 30; Method Tests:StackallocZeroing():thispushrbpsubrsp,48learbp,[rsp+20H]movrax,0xD1FFAB1Emov qword ptr [rbp],raxtest dword ptr [rsp],espsubrsp,304learcx,[rsp+20H]mov qword ptr [rbp+08H],rcxxoredx,edxmovr8d,304call CORINFO_HELP_MEMSETmovrcx, qword ptr [rbp+08H]call[Tests:Consume(ulong)]movrcx,0xD1FFAB1Ecmp qword ptr [rbp],rcxje SHORT G_M16409_IG03call CORINFO_HELP_FAIL_FASTnoplearsp,[rbp+10H]poprbpret; Total bytes of code: 94

new codegen:

; Method Tests:StructCopy(Tests+MyStruct):Tests+MyStruct:thisvzerouppervmovdqu32zmm0, zmmword ptr [r8]vmovdqu32 zmmword ptr [rdx],zmm0movrax,rdxvzeroupperret; Total bytes of code: 22; Method Tests:StackallocZeroing():thispushrbpsubrsp,48vzeroupperlearbp,[rsp+20H]movrax,0xD1FFAB1Emov qword ptr [rbp+08H],raxtest dword ptr [rsp],espsubrsp,304learcx,[rsp+20H] vxorps zmm0,zmm0vmovdqu32 zmmword ptr [rcx],zmm0vmovdqu32 zmmword ptr [rcx+40H],zmm0vmovdqu32 zmmword ptr [rcx+80H],zmm0vmovdqu32 zmmword ptr [rcx+C0H],zmm0vmovdqu32 zmmword ptr [rcx+F0H],zmm0call[Tests:Consume(ulong)]movrcx,0xD1FFAB1Ecmp qword ptr [rbp+08H],rcxje SHORT G_M16409_IG03call CORINFO_HELP_FAIL_FASTnoplearsp,[rbp+10H]poprbpret; Total bytes of code: 119
Author:EgorBo
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@EgorBoEgorBo added the avx512 Related to the AVX-512 architecture label Apr 26, 2023
@EgorBo

Copy link
Copy Markdown
MemberAuthor

/azp list

@azure-pipelines

This comment was marked as resolved.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr outerloop, runtime-coreclr jitstress-isas-x86

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@EgorBo

Copy link
Copy Markdown
MemberAuthor

Diffs
Size regressions are expected (call memset/memcpy is smaller)

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@tannergooding@BruceForstall @dotnet/avx512-contrib PTAL, I didn't enable it for non-zeroing init (e.g. Unsafe.InitBlockUnaligned(ref a, value: 42, count: 32)) because I plan to work on that separately, even for XMM/YMM it might be improved

@EgorBo

Copy link
Copy Markdown
MemberAuthor

Failures are mostly #85403

@EgorBo

Copy link
Copy Markdown
MemberAuthor

benchmark:

[Benchmark]publicvoidTest(){varptr=stackalloclong[42];Consume(ptr);}[MethodImpl(MethodImplOptions.NoInlining)]staticvoidConsume(void*ptr){}}
MethodJobToolchainMean
TestJob-FEQJHS\Core_Root\corerun.exe4.229 ns
TestJob-CMMDYR\Core_Root_PR\corerun.exe2.262 ns

@EgorBo
EgorBo merged commit 953d290 into dotnet:mainApr 27, 2023
@EgorBo
EgorBo deleted the blk-avx-512 branch April 27, 2023 23:48
@ghostghost locked as resolved and limited conversation to collaborators May 28, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIavx512Related to the AVX-512 architecture

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Optimize block unrolling operations using AVX-512

2 participants

@EgorBo@BruceForstall