以下に示す一般的な構造のプログラムがあります。基本的に、私はオブジェクトのベクトルを持っています。各オブジェクトにはメンバー ベクトルがあり、そのうちの 1 つは、より多くのベクトルを含む構造体のベクトルです。マルチスレッド化により、オブジェクトは並行して操作され、メンバー ベクター要素へのアクセスと変更を多く含む計算が実行されます。1 つのオブジェクトは、一度に 1 つのスレッドによってのみアクセスされ、処理のためにそのスレッドのスタックにコピーされます。
問題は、プログラムが 16 コアまでスケールアップできないことです。この問題は、誤った共有および/またはキャッシュの無効化である可能性があると思われ、アドバイスを受けています。これが本当なら、原因は互いに近すぎるメモリを割り当てるベクトルにあると思われます.両方の問題は(簡単に言えば)異なるプロセッサによって同時にアクセスされる近接メモリアドレスによって引き起こされると私は理解しているからです. この推論は理にかなっていますか、これが起こる可能性はありますか? もしそうなら、.reserve() を使用してメンバー ベクトルをパディングして余分な容量を追加し、ベクトル配列間に空のメモリの大きなスペースを残すことで、この問題を解決できるようです。それで、これはすべて意味がありますか?私は完全にここで昼食をとっていますか?
struct str{
vector <float> a; vector <int> b; vector <bool> c; };
class objects{
vector <str> a; vector <int> b; vector <float> c;
//more vectors, etc ...
void DoWork(); //heavy use of vectors
};
main(){
vector <object> objs;
vector <object> p_objs = &objs;
//...make `thread_list` and `attr`
for(int q=0; q<NUM_THREADS; q++)
pthread_create(&thread_list[q], &attr, Consumer, p_objs );
//...
}
void* Consumer(void* argument){
vector <object>* p_objs = (vector <object>*) argument ;
while(1){
index = queued++; //imagine queued is thread-safe global
object obj = (*p_objs)[index]
obj.DoWork();
(*p_objs)[index] = obj;
}