私は以下の一般的な構造のプログラムを持っています。基本的に、私はオブジェクトのベクトルを持っています。各オブジェクトにはメンバーベクトルがあり、そのうちの1つはより多くのベクトルを含む構造体のベクトルです。マルチスレッド化により、オブジェクトは並列に動作し、メンバーベクトル要素のアクセスと修正が多く必要な計算が行われます。 1つのオブジェクトは、一度に1つのスレッドのみが処理し、処理のためにそのスレッドのスタックにコピーされます。C++ `.reserve()`を使用してマルチスレッドキャッシュの無効化と偽の共有から保護するための `std :: vector`sを埋めてください
問題は、プログラムが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;
}
;-)を共有真を除外するまで
ので、偽の共有に焦点を当てていませんか? –
@Alexander私は虚偽の共有、キャッシュの無効化、一般的なメモリなどの概念がかなり不安定であるため、理論的な観点からもアイデアに興味があります。言い換えれば、私は自分の状況を確認しようとしています。 –
指定したコードは有効ではありません。C++。どのくらい正確に16コアまで拡張できませんか?それは単に遅いですか?もしそうなら、どれくらい遅くなりますか?それは具体的には16コアですか、それとも8コア、4コア、または2コアにも適用されますか? –