2012-04-20 19 views
1

私は進化コードを書いています。それぞれの世代で100個の生物が存在し、それぞれの体力計算は簡単に並列化できる手順です。さて、私は独立した100個のスレッドをまとめて作成するのではなく、同時に実行するスレッドの数をハードウェアの並行性の関数として決定したいと考えています。'm'個のジョブを実行するn個のboost :: threadインスタンス

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

誰も私にboost :: thread_groupを使って簡単で効率的なやり方を教えてもらえますか?私はあまりにも多くの新しい概念(コールバックなど)とちょっと混乱しています。だから、単純なC++スニペットをいただければ幸いです:)

TIA に関して、 ニキル

答えて

0

私は1つのアイデアは、ラッパー関数を記述することであろうものを適合関数が戻る、あまりありませんが、確認していませんこれを「m」回(この場合は100/8、または12回)と呼びます。その後、 "n"回ループするループを作成し、毎回thread_group :: add_threadを呼び出します。これは、ラッパー関数を呼び出す新しいスレッドを生成します。

基本的な考え方は、このようなものになるだろう:

/* ??? */ 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関数呼び出し構文の権利は十分にその近くを持っているかどうかわからないです。うまくいけば、これは役に立ちます。

関連する問題