【#VCPP】VC x64コンパイルでのmemcpyは,AVX命令を使ってるべ
関連記事
- 【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日(火)】
- 【#TensorFlow】TFLiteなCーAPIを実装中 頭痛してきた(汗 【2022年02月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()を使いましょう(爆
コメント
食欲が無いでがす
【#地震】北マリアナ諸島M7.1 (23/11/24)
【#地球寒冷化】宮崎~清武 11月なのに雪が舞ってる これは人類滅亡!(23/11/18)
NTT広報室が楽天・三木谷氏の発言に「ナンセンス」と反論 その理由は?
ダンロップフェニックスゴルフ 前回王者の比嘉選手 宮崎県入り(23/11/15)
走行中の軽自動車からタイヤ外れ女の子に当たる 意識不明 札幌
今朝は4℃台の気温 寒い寒い!高千穂五ヶ瀬は氷点下じゃげ(23/11/14)
今朝は寒いの 最低気温7℃じゃったげ(23/11/13)
【#緊急地震速報】地震がキター 宮崎揺れてるー 大隅半島が震源 M5.3(23/11/11)