1

私は進化コードを書いています。各世代には (たとえば) 100 の生物があり、それぞれの適応度計算は簡単に並列化できる手順です。ここで、完全に 100 の独立したスレッドを作成したくはありません。この数 (同時に実行されるスレッドの数) をハードウェアの同時実行性の関数として決定したいと考えています (ここでは、その数を 8 と仮定します)。

私が想像している基準は、関数 (フィットネス関数) を 100 の生物に対して実行し、同時に 8 つのスレッドを実行する必要があるということです。

boost::thread_group を使用して、シンプルで効率的な方法を誰か教えてもらえますか? あまりにも多くの新しい概念 (コールバックなど) に少し混乱しています。したがって、単純な C++ スニペットは大歓迎です :)

TIA よろしく、ニキル

4

1 に答える 1

0

フィットネス関数が何を返すかはわかりませんが、それを "m" 回 (この場合は 100/8、つまり 12 回) 呼び出すラッパー関数を作成することをお勧めします。次に、ラッパー関数を呼び出す新しいスレッドを生成する thread_group::add_thread を呼び出すたびに、「n」回ループするループを作成します。

基本的な考え方は次のようになります。

/* ??? */ fitness_calculation(organism& o){
    //...
}

// wrapper function
void calc(std::vector<organism>& v, int idx, int loops){
    for(int i = 0; i < loops; i++)
        fitness_calculation(v[idx + i]);    

}

int main(){
    int num_organisms = 100;
    std::vector<organism> v(num_organisms); // some array with the organisms

    int threads = 8;
    boost::thread_group g;
    int organisms_per_thread = num_organisms / threads;

    int i = 0, idx = 0;
    for (  ; i < threads; ++i, idx += organisms_per_thread )
        g.add_thread(calc, v, idx, organisms_per_thread);

    // finish up remainder in this thread
    calc(v, idx, num_organisms % threads);
    g.join_all();
}

thread_group 関数呼び出し構文が正しいかどうかはわかりませんが、十分に近いです。うまくいけば、これが役に立ちます。

于 2012-04-20T03:21:55.970 に答える