1

パーティクルインタラクションシミュレーターをpthreadに実装していますが、pthreadコードでセグメンテーション違反が発生し続けています。障害は次のループで発生します。これは、各スレッドが私のthread_routineの各タイムステップの最後に実行します。

    for (int i = first; i < last; i++)
    {
            get_id(particles[i], box_id);
            pthread_mutex_lock(&locks[box_id.x + box_no * box_id.y]);
            //cout << box_id.x << "," << box_id.y << "," << thread_id << "l" << endl;
            box[box_id.x][box_id.y].push_back(&particles[i]);
            //cout << box_id.x << box_id.y << endl;
            pthread_mutex_unlock(&locks[box_id.x + box_no * box_id.y]);
    }

奇妙なことに、一方(どちらかは関係ありません)または両方のcoutのコメントを外すと、プログラムは期待どおりに実行され、エラーは発生しません(ただし、これは明らかにパフォーマンスを低下させ、エレガントなソリューションではありません)、正しい出力を提供します。

boxは、グローバルに宣言されたvector <vector <vector <particle_t * >>>ボックスであり、私の(正方形の)ドメインをボックスに分解したものを表します。

ループが開始すると、box [i] [j] .size()はすべてのi、jに対してゼロに設定され、ループはパーティクルをボックス構造に戻すことになっています(get_id関数は正しい結果を返します。確認しました)

配列pthread_mutex_tlocksはグローバルとして宣言されています

pthread_mutex_t * locks

サイズはスレッド0によって設定され、ロックは他のスレッドが作成される前にスレッド0によって初期化されます。

locks = (pthread_mutex_t *) malloc( box_no*box_no * sizeof( pthread_mutex_t ) );

for (int i = 0; i < box_no*box_no; i++)
{
    pthread_mutex_init(&locks[i],NULL);
}

何がこれを引き起こす可能性があるかについて何か考えがありますか?プロセッサの数が1に設定されている場合もコードが実行され、実行するプロセッサの数が多いほど、セグメンテーション違反が早く発生するようです(2つのプロセッサでシミュレーション全体を1回実行しましたが、これは例外)

ありがとう

4

2 に答える 2

1

これは知識に基づいた推測にすぎませんが、すべてのボックスに1つのロックを使用すると解消される問題に基づいています。つまり、テンプレートpush_backを介してメモリを割り当てる必要があります。スレッドセーフであることが保証されているとは思いませんし、パーティション化されることも保証されていないと思いstd::allocatorます。(基礎となるのスレッドセーフですが、通常はブロックスライスのトリックを実行してコストを償却します。)allocatorvectoroperator new allocatoroperator new

reserve各ボックスにいくつの粒子が巻き込まれるかについての控えめな見積もりを使用して、すべてのベクトルに事前にスペースを事前に割り当てるために使用するのは実用的ですか?それが私が最初に試みることです。

もう1つ試してみるのは、すべてのボックスに1つのロックを使用することです。これは機能することがわかっていますが、ロック/ロック解除操作をforループの外に移動して、各スレッドがすべてのアイテムを一度に隠してもらうようにします。これは、実際には、実行しようとしていることよりも高速である可能性があります。つまり、ロックのスラッシングが少なくなります。

于 2011-03-01T22:30:21.503 に答える
0

boxおよびbox[i]ベクトルは正しく初期化されていますか?あなたはベクトルの最も内側のセットが設定されていると言うだけです。それ以外の場合は、またはコンポーネントが間違っていて、いずれかのアレイの最後から実行されているbox_idように見えます。xy

外観のどの部分がクラッシュしていますか?

于 2011-03-01T20:55:18.743 に答える