0

今、バリアを実装します。しかし、うまくいきませんでした。

バリア時間計算コードを実行すると、pthread_barrier_wait は 180000 us を消費し、バリアは 390000 us を消費します

理由がわからず、もっと速いバリアを作りたい

これが私のバリアコードです

 82 pthread_mutex_t     mutexwait1;
 83 int wait_count = NUM_THREADS;
 84 int barrier1234(void) {                                                     
 85 
 86     int status, cancel, tmp;
 87     status = pthread_mutex_lock(&mutexwait1);
 88     wait_count = wait_count - 1;
 89     if(wait_count == 0){ 
 90         pthread_cond_broadcast(&cond1);
 91         wait_count = NUM_THREADS ;  
 92     }   
 93     else
 94         status = pthread_cond_wait(&cond1, &mutexwait1);
 95 
 96     pthread_mutex_unlock(&mutexwait1);
 97     return status;
 98 
 99 }

いくつかの barrier_wait 関数を見つけましたが、機能しませんでした。( glibc からダウンロード) => バリアをコンパイルするとエラーメッセージ (構造体変数が一致していない) が発生 => このエラーはバージョンによって引き起こされるのだろうか

ubuntu 10.04を使用しています私のバリアが遅い理由を教えてください。そして、どうすればデフォルトの pthread_barrier_wait を実装できますか (私のプラットフォームで)

4

1 に答える 1

2

glibc のバリアは、ミューテックスや条件ではなく、下位レベルのプリミティブを使用して実装されています。

ミューテックスベースの実装には、ミューテックスを解放するためだけにミューテックスを再取得するために起動するすべてのスレッドが必要であるという明らかな問題があります。これは、バリアとは何かという精神に反するものです。つまり、それ自体が第一級のプリミティブです。(もちろん、これはミューテックスと条件のみを提供するプラットフォームへのバリアを必要とするコードの迅速で汚れた移植を行うための良い方法です。)

ちなみに、私は約 12 年前に glibc に存在する最初の POSIX バリア関数を作成しました。ウィンク!

于 2012-04-11T01:31:10.773 に答える