高速化なんもわかってない
概要
高速化・マルチスレッド・マルチコアのことをよくわかっていないので、わかったことを随時メモする。目的としては科学技術計算ではなく一般のアプリケーションプログラムなのでそこまで考慮する必要も無い気がするが…。
参考書籍を書くほどしっかりしたものではないが、今のところ見たのは以下の通り
- Optimized C++ ―最適化、高速化のためのプログラミングテクニック
- 図書館で読んだだけなのでうろ覚え
- Geminiの言ってること(一応裏は取ってるつもりだけど。ごめん。)
- キャッシュライン衝突するかどうか試してみた
- 計算科学技術特論A 第1回プログラム高速化の基礎(名古屋大学)
- 計算科学技術特論A 2023 | 理化学研究所 計算科学研究センター(R-CCS)
- 科学技術計算・スーパーコンピュータの話だが、第5回など応用が効きそうなやつもある
キャッシュ
(語弊があるが)CPUごとにキャッシュが存在する。なので、複数のCPUで頻繁に同じ場所に書き込みすると、キャッシュを都度更新する必要がある。よって、遅くなる。
GCの簡単な実装である参照カウント方式はこの制約にベタベタ触れる事になる。複数のスレッドが、同じ場所に、参照カウントの上下をちまちま書きに来るので。キャッシュの衝突?とかそういう呼び方をする?[要出典]
RCUでは参照カウントを持たず、スレッドごとに見ることができるかで判別するから高速っぽい[要出典]。しかし、これだとスレッドをまたいでデータをコールバックで渡したり、中断されるコルーチンと相性が悪い。やっぱ参照カウントかなぁ。
アロケーション
遅い。Optimized C++では親の敵かのようにボロクソ言われていた。全スレッドと競合せずにメモリ領域について対応マップを操作するんだからさもありなん。
C++ではplacement new(配置new)があるので、勝手にメモリ管理ができる。そもそもmalloc()は汎用性が高くなるように設計されているので、メモリの使われ方に癖がある(そしてそれが影響を及ぼす)なら自前で管理したほうが効率が良くなるに決まっている。それはそう。