1

openmpを使ってマルチスレッドプログラミングを学ぼうとしています。

まず、多数の配列アクセス操作を含むネストされたループをテストし、それを並列化しました。以下にコードを添付します。基本的に、内部ループにこのかなり大きな配列 tmp があり、すべてのスレッドがアクセスして変更できるように共有すると、スレッドの数が増えるとコードが実際に遅くなります。すべてのスレッドがまったく同じ値を配列 tmp に書き込むように記述しました。tmp を非公開にすると、スレッド数に比例して高速化されます。いいえ。の操作は、どちらの場合もまったく同じように思えます。tmp を共有すると速度が低下するのはなぜですか? 異なるスレッドが同時に同じアドレスにアクセスしようとするためでしょうか?

int main(){
    int k,m,n,dummy_cntr=5000,nthread=10,id;
    long num=10000000;
    double x[num],tmp[dummy_cntr];
    double tm,fact;
    clock_t st,fn;

    st=clock();
    omp_set_num_threads(nthread);
#pragma omp parallel private(tmp)
    {
        id = omp_get_thread_num();
        printf("Thread no. %d \n",id);
#pragma omp for
        for (k=0; k<num; k++){
            x[k]=k+1;
            for (m=0; m<dummy_cntr; m++){
                tmp[m] = m;
            }
        }
    }
    fn=clock();
    tm=(fn-st)/CLOCKS_PER_SEC;
}

PS:ここで clock() を使用しても実際には正しい時間が得られないことは承知しています。いいえで割る必要があります。この場合、「time ./a.out」で与えられるのと同様の出力を取得するスレッドの数。

4

2 に答える 2