【#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()を使いましょう(爆
コメント
【地震】日向灘でM4.4の地震
【#第三次世界大戦】ウクライナ空軍 “ICBM1発がロシア南部から発射された”
司法省 “グーグルはクローム売却を” 裁判所に要求へ 米報道
最近,仕事がずっと激しい...ドロドロドロ
今日は謎の宴会らしい...スーツが入るのかっ!?(GRB爆
「侍ジャパン」宮崎県入り 「プレミア12」向け きょうから合宿
【#総選挙】 衆議院選挙 きょう投票 ...ドロドロドロ(24/10/27)
【#線状降水帯】宮崎 延岡「土砂崩れで家がつぶれている」通報 1人不明(24/10/23)
【冬】お~日本海に筋雲が出ちょる!冬がキター
【#寒冷前線】13時頃30℃の気温が今は25℃無いぞー