萌えハッカーニュースリーダー

2025/08/11 04:59 Going Faster Than Memcpy

出典: https://squadrick.dev/journal/going-faster-than-memcpy
hakase
博士

ロボ子、今日はメモリコピーの最適化について話すのじゃ!

roboko
ロボ子

メモリコピーですか、博士。最適化の余地があるのですね。

hakase
博士

そう!大量のバイナリデータをコピーする時、時間がかかる問題があったらしいのじゃ。そこで、色々な方法を試したみたいだぞ。

roboko
ロボ子

具体的にはどのような方法を試されたのですか?

hakase
博士

`memcpy`を調べて、`__memmove_avx_unaligned_erms`がAVXを使って一度に32バイトをコピーしているのを発見したらしいのじゃ。`memcpy`と`memmove`の違いも重要だぞ。

roboko
ロボ子

`memcpy`はコピー元とコピー先が重ならないことを前提として、`memmove`は重なりを許容するのですね。他にどのような実装方法を試されたのですか?

hakase
博士

`REP MOVSB`でERMSの単純なバージョンを実装したり、アラインメントされたAVX、ストリームAVX、さらにはプリフェッチまで試したみたいじゃ。

roboko
ロボ子

ループのアンローリングやマルチスレッディングも試されたのですね。Shadesmar APIというのも気になります。

hakase
博士

Shadesmar APIは、カスタムメモリコピーロジックを統合するために`Copier`を導入したものらしいのじゃ。`cudaMemcpy`みたいにクロスデバイスで使えるようにしたかったみたいだぞ。

roboko
ロボ子

なるほど。ベンチマークの結果はどうだったのでしょう?

hakase
博士

`std::memcpy`が一番良かったらしいのじゃ!ハードウェアアーキテクチャに最適化されていて、アラインメントも気にしなくていいからだぞ。

roboko
ロボ子

`std::memcpy`が最適とは意外でした。ストリーミングプリフェッチコピーは大きなコピーに最適とのことですが、それ以外は`std::memcpy`で十分なのですね。

hakase
博士

そういうことじゃ!パフォーマンスが重要な場合は、アラインメント要件のある非ジェネリック実装を検討する余地はあるみたいじゃがな。

roboko
ロボ子

勉強になります。ちなみに、アンローリングはどの程度パフォーマンスを向上させるのでしょうか?

hakase
博士

アンローリングは大体5〜10%くらいパフォーマンスを上げてくれるみたいじゃ。でも、`std::memcpy`には敵わないのじゃ。

roboko
ロボ子

結論としては、特別な理由がない限り`std::memcpy`を使うのが無難ということですね。

hakase
博士

その通り!ちなみに、このコードは`dragons.h`に入ってるらしいぞ。まるで、ドラゴンの宝物みたいじゃな!

roboko
ロボ子

確かに、メモリコピーの最適化は奥が深いですね。まるで迷宮のようです。

hakase
博士

そうじゃな。でも、`std::memcpy`という最強の魔法があれば、どんな迷宮も怖くないぞ!

roboko
ロボ子

博士、今日はありがとうございました。とても勉強になりました。

hakase
博士

どういたしまして。最後に一つ、メモリコピーが速すぎて、コピーしたはずのデータがまだ存在しないというジョークはどうじゃ?

roboko
ロボ子

それはまるで、シュレディンガーの猫ですね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search