【#VCPP】VC x64コンパイルでのmemcpyは,AVX命令を使ってるべ
関連記事
- 【#CPP】出先でC++にてライブラリの緊急実装!脳死したーキョムリすぎるー 【2024年01月15日(月)】
- 【C#】謎な改造アプリ,SIMD命令を導入して高速化しようか,思案中 【2023年11月14日(火)】
- 生成AI「仕事で利用」2割 正確性などに懸念(23/5/7) 【2023年05月07日(日)】
- 死体キタ━(゚∀゚)━!!病み上がりなのにC++1000行実装などを 【2022年10月24日(月)】
- VC++のXMLパーサをC#で書き直しているが,XMLな実装作業の苦行なことモルモルモル 【2022年05月10日(火)】
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()を使いましょう(爆
コメント
こどもの日,らしい.城主生誕記念の軍事パレード決行なのかっ!?
今朝,寒いよっ!暑くなったり寒くなったりで自律神経が辛い
グリコ「プッチンプリンやカフェオーレ」目標の5月中旬に出荷再開できず 停止期間を延長決定
【#インボイス】消費税の納付,督促状,らしい...ドロドロドロ 所得税の口座引落登録のみじゃNGっぽい
北海道 根室 軽トラックにヒグマが衝突 乗っていた2人けがなし
火野正平さん、腰痛で撮影中断 NHKBS「にっぽん縦断 こころ旅」 ネットに案ずる声
ゴールデンウィークがスタート 見事な土砂降りワロタ