いくつかの計算を実行し、結果をマージするプログラムを作成しました。
マルチスレッドを使用して並列計算を行いました。
マージ結果のフェーズでは、各スレッドはグローバル配列をロックし、個々の部分をそれに追加し、繰り返しをなくすために追加の作業が行われます。
テストしたところ、スレッドの数が増えるとマージのコストが増加することがわかりました。速度は予想外です:
2 スレッド: 40,116,084(us)
6 スレッド:511,791,532(us
) これを変更するにはどうすればよいですか?
--------------------------スラッシュライン ---------------------- -------------------------------
実際、コードは非常に単純で、疑似コードがあります:
typedef my_object{
いいえ。
int カウント;
二重値;
//何か他のもの
} my_object_t;
static my_object_t** global_result_array; //約10,000
static pthread_mutex_t global_lock;
void* thread_function(void* arg){
my_object_t** local_result;
int local_result_number;
int i;
my_object_t* ptr;
for(;;){
if( exit_condition ){ return NULL;}
if( merge_condition){
//ログの開始時点
pthread_mutex_lock( &global_lock);
for( i = local_result_number-1; i>=0 ;i++){
ptr = local_result[ i] ;
if( NULL == global_result_array[ ptr->no] ){
global_result_array[ ptr->no] = ptr; //ステップ 4
}else{
global_result_array[ ptr->no] -> カウント += ptr->カウント; // ステップ 5
global_result_array[ ptr->no] -> 値 += ptr->value; // ステップ 6
}
}
pthread_mutex_unlock( &global_lock); // ログに記録する終了時点
}else{
// 何らかの計算を行い、部分的かつスレッド ローカルな結果、つまり local_result と local_result_number を生成します
}
}
}
以上のように、2スレッドと6スレッドの違いはstep5とstep6で、step5とstep6の実行順序は数億回程度あったと数えています。他は同じです。
したがって、私の見解では、2 つのスレッドまたは 6 つのスレッドを使用しているにもかかわらず、マージ操作は非常に軽く、両方ともロックして排他的にマージする必要があります。
もう一つ驚いたのは、6 スレッドを使用すると、ステップ 4 のコストが急上昇したことです。トータルコストが爆上がりしたのはブーツのせいでした!
ところで: テスト サーバーには 2 つの CPU があり、各 CPU には 4 つのコアがあります。