【#VCPP】VC x64コンパイルでのmemcpyは,AVX命令を使ってるべ
関連記事
- ぎんゆぅ~さんの更新頻度が落ちているときは仕事炎上中(爆 【2025年01月09日(木)】
- 仕事が納まった,のか?一応,拘束解除命令が出たモルモルモル 【2024年12月27日(金)】
- さすがに激務すぎ,ワロタ! 【2024年12月25日(水)】
- 今週もひたすらモノ書き #JAVA 祭りがまだまだ続く そろそろC#を書かせろー 【2024年12月04日(水)】
- 【#Assembler】結局x64のアセンブラでゴニョゴニョと書き始めたオイラはバカかっ!(爆 【2024年05月13日(月)】
memcpyの高速化を思案
でっかいデータサイズのメモリ移動な実装が多いしのぉ 画像とか動画とか
AVX(YMMレジスタ)を使えば速くなりそう,ってなって
ぐぐったら,これを見つけた
FastMemcpy @ github
AVXを利用して高速memcpyを実現するモジュールだそうな
ビルドしてベンチマークを実行してみた
VC標準版,高速版とも速度が全く変わらない(汗
なして?
memcpy()の実装を覗いてみることにした
memcpy.asm がその実装
(場所は C:¥Program Files (x86)¥Microsoft Visual Studio¥2019¥
Community¥VC¥Tools¥MSVC¥14.29.30133¥crt¥src¥x64 [VS2019 Community時])
; the implementation follows this approach: ; 1. for blocks less than 16 bytes in size use loads and stores through general registers ; 2. for blocks 16-32 bytes in size use two (possibly overlapping) loads and stores through SSE registers ; 3. for blocks 33-8K bytes in size use AVX (if available) or SSE loads and stores ; 4. for blocks 8K+1-256K bytes in size use enhanced strings (if available), ; if not continue using AVX or SSE loads and stores ; 5. for blocks greater than 256K size use non-temporal AVX stores (if available), or enhanced strings (if available), ; or SSE loads and stores.なんて書いてある
VC x64でコンパイルしたら,標準でAVXを使っているじゃないですかかかっ!(なんとっ!爆
1.16バイト以下は通常のループ
2.16~32バイトはSSE命令を使用
3.33バイト以上は,AVXかSSEか拡張文字列コピー命令(rep movsb 命令)
にて動くそうな
項目3に関しちゃ,64bit時はSSEを標準使用できるんで(x64命令セットの仕様)
AVX or SSEの2択じゃな
しかも,AVXの使用の可否は
VC++のコンパイラオプション「/arch:AVX」を引っ掛けてるんじゃなく
CPUと直接通信して確定している
__FAVOR_ENFSTRG equ 1 __ISA_AVAILABLE_AVX equ 3 ;<-- AVXかどうかのスイッチ define KB equ 1024 public memmove LEAF_ENTRY_ARG3 memcpy, _TEXT, dst:ptr byte, src:ptr byte, count:dword OPTION PROLOGUE:NONE, EPILOGUE:NONE memmove = memcpy extrn __favor:byte extrn __ImageBase:byte extrn __isa_available:dword ;このextern変数にCPUから戻されるAVX or SSE の使用指示スイッチ情報が格納 .... ; ソース下の方でAVXが使えるかどうかチェックして処理の振り分け CopyUp: cmp __isa_available, __ISA_AVAILABLE_AVX ; check if the HW supports wider AVX copies jb NoAVX ; if not, use the SSE based implementation
う~む,↑のgithubモジュール引っ張り出すまでもなく
VC標準のmemcpy()が十分頑張ってるべ
無駄な抵抗はやめて,VC標準memcpy()を使いましょう(爆
コメント
【#大相撲】 横綱 照ノ富士 引退の意向を固める
【#日向灘地震】割れ残り部が依然健在じゃし.怖いわなぁ
【#大地震】宮崎に大地震キタ━(゚∀゚)━!!(25/1/13)
【#大雪】宮崎市に降雪予報キター(25/1/11)
【#2025】あけおめ~ 2025年が始まったらしい...ドロドロドロ
2024年が終わりますなぁ 1年ありがとうございました
ついに宮崎市も氷点下気温キター(24/12/23)