0

特定の方法で並列にしたい次のコードがあります。私は間違いを犯しているため、すべてのスレッドが思ったようにループを実行しているわけではありません。誰かがその間違いを特定するのを手伝ってくれたら素晴らしいでしょう。

ヒストグラムを計算するコードです。

#pragma omp parallel default(shared) private(iIndex2, iIndex1, fDist) shared(iSize, dense) reduction(+:iCount)
{

chunk = (unsigned int)(iSize / omp_get_num_threads());
threadID = omp_get_thread_num();
svtout << "Number of threads available " << omp_get_num_threads() << endl;
svtout << "The threadID is " << threadID << endl;

//want each of the thread to execute the loop
    for (iIndex1=0; iIndex1 < chunk; iIndex1++)
    {
        for (iIndex2=iIndex1+1; iIndex2 < chunk; iIndex2++)
        {   
            iCount++;

            fDist = (*this)[iIndex1 + threadID*chunk].distance( (*this)[iIndex2 + threadID*chunk] );
            idx = (int)(fDist/fWidth);

            if ((int)fDist % (int)fWidth >= 0)
            {
               #pragma omp atomic
               dense[idx] += 1;
            }  
}
}

iCount 変数は反復回数を追跡します。シリアル バージョンとパラレル バージョンの間に顕著な違いがあることに気付きました。すべてのスレッドが実行されているとは限らないため、並列プログラムから取得したヒストグラム値は、実際の読み取り値よりもはるかに小さくなっています (密な配列にヒストグラム値が格納されています)。

ありがとう、
サヤン

4

1 に答える 1

2

複数のスレッドを持つiSizeではなく、チャンクをループしています。ループ境界を iSize に置き換えてみてください。

于 2010-06-29T15:51:41.573 に答える