0

假设一个 SIZE=128Mb 的数组arr,其值从 0 到 128Mb-1。现在假设以下代码:

#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 个线程得到 390 毫秒,使用 2 个线程得到 190 毫秒。您的问题不在代码中。它必须是基本的东西。这些是我能想到的:

  • 不与 OpenMP 链接(带g++ filename -fopenmp);
  • 在单核机器上运行;
  • 在双核上运行,其他东西占用另一个核心;
  • 计时比这个循环更多的东西,它在计算中占主导地位。
于 2012-09-06T07:09:01.800 回答