将棋AIの学習のためにGPUを増やしたところ、まったく速度が上がらないどころか低下するという事象が起きて、ここ数日原因を調べていました。
メモリスワップが起きていたことが原因で、わかってしまえば単純な話でしたが、Windowsのタスクマネージャーの仕様の理解が不足していたため、数日悩むことになりました。
物理メモリを食いつぶしていたので、Windows 10のタスクマネージャーの詳細タブでプロセスのメモリ使用量を見ると、プロセスを起動してから、メモリ(プライベートワーキングセット)の数字が徐々に上がっていたため、メモリリークを起こしているのではないかと疑いました。
プライベートワーキングセットとは
実は、タスクマネージャー表示されるメモリ(プライベートワーキングセット)は、プロセスに割りあてられたページの物理メモリのサイズを示しており、C++のnewで確保したメモリは、仮想メモリが割り当てられるだけで、実際にアクセスするまではOSに物理メモリが割り当てられないということが今回調べてわかりました。
詳しい人によっては、常識レベルの話で、自分も仮想メモリの動作は知識としては知っていたはずですが、タスクマネージャーの数値の意味を理解していませんでした。
なお、仮想メモリのサイズを見るにはタスクマネージャーで、列の選択で「コミット サイズ」を表示する必要があります。
ということで、徐々に上がる=メモリリークと勘違いしたため、コードを変えたりして原因を探してもリークしている箇所が見つからず数日時間を浪費しましたorz。
しかし、おかげでタスクマネージャーと仮想メモリについて理解が深まったので良いとします。