0

arr0 ~ 128Mb-1 の値を持つ SIZE=128Mbの配列があるとします。ここで、次のコードを想定します。

#pragma omp parallel num_threads(NUM_THREADS)
{
  int me = omp_get_thread_num();
  odds_local[me] = 0;
  int count = 0;

#pragma omp for 
  for (int i = 0; i < SIZE; i++)
      if (arr[i]%2 != 0)
    count++;

  odds_local[me] = count;
}

最後に、 の値を反復処理してodds_local[me]最終結果を取得するループです。このため、Linux で時間を計測してユーザー時間を報告すると、1 スレッドと 2 スレッドの両方で 0.97 秒が得られます。つまり、スピードアップはまったくありません。

スピードアップを改善するために、このプログラムで改善すべき点はありますか? ありがとう。

4

1 に答える 1

1

私はあなたの正確なコードを実行し、1 つのスレッドで 390ms を取得し、2 つのスレッドで 190ms を取得しました。あなたの問題はコードにありません。それは基本的なものでなければなりません。これらは私が考えることができるものです:

  • OpenMP とリンクしていない (with g++ filename -fopenmp);
  • シングルコアマシンで実行。
  • デュアルコアで実行され、他のコアが他の何かで占有されています。
  • 計算を支配しているこのループ以外の何かをタイミングします。
于 2012-09-06T07:09:01.800 に答える