【#VCPP】VC x64コンパイルでのmemcpyは,AVX命令を使ってるべ
関連記事
- 【#Assembler】結局x64のアセンブラでゴニョゴニョと書き始めたオイラはバカかっ!(爆 【2024年05月13日(月)】
- 【#VCPP #VisualStudio】VS2022のVC 64ビットコンパイルでインラインアセンブラが使えなくなってるぞー 【2024年05月10日(金)】
- 【#CPP】出先でC++にてライブラリの緊急実装!脳死したーキョムリすぎるー 【2024年01月15日(月)】
- 【C#】謎な改造アプリ,SIMD命令を導入して高速化しようか,思案中 【2023年11月14日(火)】
- 生成AI「仕事で利用」2割 正確性などに懸念(23/5/7) 【2023年05月07日(日)】
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()を使いましょう(爆
コメント
急激に寒くなってキター 晩秋がやってきた!
【#諸塚村】連休初日のBBQの模様なぞをアップしてみる
冷房なしで日中過ごすの,いつ以来よっ!?優しい涼しさが心地よい
【#異星人 発見!】異星人から謎の暗号メールを受け取った!解読不能ヤバス【シレペヒキク】
タッパーウェアが破産申請を計画、事業てこ入れ策つまずく-関係者
電子レンジが不調になったヤバス
【#地震】霧島山で有感地震 生駒高原のあたりか?(24/9/6)
奄美大島のマングース 環境省が根絶宣言