2017-07-21 13 views
0

私は現在、チェスエンジンのためにLazy SMPを実装しようとしています。これは、さまざまなコアで検索アルゴリズムを実行し(可能な限り同期が外れている)、共有ハッシュテーブルの利点をうまく利用しています。それはまだ1つのコアで実行されます。以下のコード(関連性のない部分は削除しました)。C++ asyncは1つのコアでのみ動作しますか?

反復深化ループ:

for(distance; distance <= depth && IDTimeS < endTime;) { 

    positionCount = 0; 
    clock_t currentTime = clock(); 

    if(currentTime >= endTime) { 
     distance - 1; 
     break; 
    }  

    //multi threading testing 
    int val = multi(distance, alpha, beta, false, currentTime, timeLimmit, currentDepth +1, true, z0, z1, z2); 

    //increment distance to travel (same as depth at max depth) 
    distance++; 
} 

マルチスレッド機能:

int Ai_Logic::multi(
    int distance, 
    int alpha, 
    int beta, 
    bool isWhite, 
    long currentTime, 
    long timeLimmit, 
    int currentDepth, 
    bool allowNull, 
    ZobristH *z0, 
    ZobristH *z1, 
    ZobristH *z2 
) 
{ 
    auto f1 = std::async(std::launch::async, &Ai_Logic::alphaBeta, this, distance, alpha, beta, isWhite, currentTime, timeLimmit, currentDepth, allowNull, BB0, z0); 
    auto f2 = std::async(std::launch::async, &Ai_Logic::alphaBeta, this, distance-1, alpha, beta, isWhite, currentTime, timeLimmit, currentDepth, allowNull, BB1, z1); 
    auto f3 = std::async(std::launch::async, &Ai_Logic::alphaBeta, this, distance+1, alpha, beta, isWhite, currentTime, timeLimmit, currentDepth, allowNull, BB2, z2); 

    auto val = f1.get(); 
    auto val2 = f2.get(); 
    auto val3 = f3.get(); 

    return val; 
} 

は、それはまだ一つだけコアを使用していますなぜ私は欠けている明白な理由はありますか?

+1

どのようにそのスレッドを1つしか使用していないのですか? – vu1p3n0x

+0

プロセッサの使用率は?私が全く誤解しない限り。それをコア間で分割する別の方法はありますか? –

+1

プロセッサの使用状況を見ていると、スレッドが完了すると、スレッドの作成が正しく行われません。 – vu1p3n0x

答えて

0

私が抱えていた問題を少なくとも取り組んでいる作品を見つけました。スレッドが反復深化ループの前に作成され、私がマルチコアの使用を確実にした後に参加する限り、

std::thread t0(&Ai_Logic::alphaBeta, this, depth+1, alpha, beta, false, 0, timeLimmit, currentDepth, true, BB0, z0); 
std::thread t1(&Ai_Logic::alphaBeta, this, depth-1, alpha, beta, false, 0, timeLimmit, currentDepth, true, BB1, z1); 

for(distance; distance <= depth && IDTimeS < endTime;) { 

positionCount = 0; 
clock_t currentTime = clock(); 

if(currentTime >= endTime) { 
    distance - 1; 
    break; 
}  

//normal alpha beta call 
int val = alphaBeta(distance, alpha, beta, false, currentTime, timeLimmit, currentDepth +1, true, newBoard, mZobrist); 


//increment distance to travel (same as depth at max depth) 
distance++; 
} 

t0.join(); 
t1.join(); 
関連する問題