3

私はこのC++コードを持っています。

ループは行列を通過し、各行の最小要素を見つけて、対応する行の各要素からそれを減算します。変数 myr はすべての min 要素の合計です

並列化しようとしています:

int min = 0;
int myr = 0;  
int temp[SIZE][SIZE];
int size = 0;
...//some initialization

omp_set_num_threads(1);
start_time = omp_get_wtime();
    #ifdef _OPENMP
    #pragma omp parallel for firstprivate(min, size) reduction(+:myr) 
    #endif
    for(int i = 0; i < size; i++){
        min = INFINITY;
        for(int j = 0; j < size; j++){
                if (temp[i][j] < min)                
                    min = temp[i][j];                        
        }
        myr+=min;
        for(int j = 0; j < size; j++) 
                temp[i][j]-=min;
    }
end_time = omp_get_wtime();

コードのこの部分を設定するとomp_set_num_threads(2);、動作が遅くなります。

私のprocには2つのコアがあります

2 スレッドでコードの動作が遅くなるのはなぜですか?

4

2 に答える 2

3

エイリアシングか何かが起こっているに違いありません。OpenMP の処理を​​単純化します。

int const size0 = size;
#ifdef _OPENMP
#pragma omp parallel for reduction(+:myr) 
#endif
for(int i = 0; i < size0; i++){
    int min = INFINITY;
    int * tmp = temp[i];
    for(int j = 0; j < size0; j++){
            if (tmp[j] < min)                
                min = tmp[j];                        
    }
    for(int j = 0; j < size0; j++) 
            tmp[j]-=min;
    myr+=min;
}

つまり、ほとんどの変数をローカルにし、const可能であれば.

于 2012-09-10T13:36:53.850 に答える
0

並列部分は次のように再解釈できます (@jens-gustedt のスニペットを使用しましたが、私の経験では大きな違いはありませんでした)。

#pragma omp parallel private(myr_private) shared(myr)
{
    myr_private = 0;
    #pragma omp for 
    for(int i = 0; i < size; i++){
        int min = INFINITY;
        int * tmp = temp[i];
        for(int j = 0; j < size; j++){
            if (tmp[j] < min)                
                min = tmp[j];                        
        }
        for(int j = 0; j < size; j++) 
            tmp[j]-=min;
        myr_private+=min;
    }
    #pragma omp critical
    {
        myr+=myr_private;
    }
}

(この解釈は、http: //www.openmp.org/mp-documents/OpenMP3.1.pdf の例 A.36.2c から直接引用したものです)。スレッドの数が n>1 の場合、#pragma omp parallel追加のスレッドを作成するときと、すべてのスレッドが待機するクリティカル セクションでオーバーヘッドが発生します。

さまざまなマトリックス サイズを試してみましたが、限定的なテストでは、サイズが 1000 を超えると 2 つのスレッドが大幅に高速になり、サイズが 500 を下回ると遅れが生じ始めます。

于 2012-09-11T18:54:21.440 に答える