今までは、実行する前にクエリ数を並列数で割って各コアに割り当てられるクエリ数を決めていたが、P2P タイプでは実行してみるまで所要時間が分からないので、それでいいと思っていた。
しかしながら、偏りがあると1コアだけ実行しているという状態にもなってしまうので、改善する事にした。とりあえず排他制御のコストが気になったので、まずは簡単にグローバル変数を用意し、各スレッド関数内で排他制御してインクリメントするといった方法で実装してみた。クエリ内での並列はしていないので、排他処理を行ってもそれ以上にうまく割り振られている部分の効果が出ている。
さらに今回は、numactl による結果からする予測値のようなものも算出してみたので、それとの比較もできるようにしてみた。
L2 を共有していなければ、予測値通りに動く。L2 を共有していると速度低下してしまうので、やはりキャッシュ汚染が問題になっているようにも思える。
しかしながら、偏りがあると1コアだけ実行しているという状態にもなってしまうので、改善する事にした。とりあえず排他制御のコストが気になったので、まずは簡単にグローバル変数を用意し、各スレッド関数内で排他制御してインクリメントするといった方法で実装してみた。クエリ内での並列はしていないので、排他処理を行ってもそれ以上にうまく割り振られている部分の効果が出ている。
さらに今回は、numactl による結果からする予測値のようなものも算出してみたので、それとの比較もできるようにしてみた。
L2 を共有していなければ、予測値通りに動く。L2 を共有していると速度低下してしまうので、やはりキャッシュ汚染が問題になっているようにも思える。