c - 提高 OpenMP 程序的性能

标签 c linux openmp

假设一个 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.97s。也就是说,没有任何加速。

我应该在这个程序中改进什么以提高速度吗?谢谢。

最佳答案

我运行了您的确切代码,使用 1 个线程我得到 390 毫秒,使用 2 个线程我得到 190 毫秒。您的问题不在代码中。它必须是基本的东西。这些是我能想到的:

  • 不与 OpenMP 链接(使用 g++ filename -fopenmp);
  • 在单核机器上运行;
  • 在双核上运行,其他东西占据另一个核;
  • 在控制计算的这个循环之外计时。

关于c - 提高 OpenMP 程序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12270517/

相关文章:

linux - 从多个文件复制数据并添加到不同的文件

php - linux下编辑PHP ini文件问题

Pthreads、MPI 和 OpenMP 中的 C++

c - fork 多个进程并让父进程等待所有进程(在 C 中)

c - C 中的日期时间比较

c - Big Endian 与 Little Endian 填充问题

具有功能的linux cron脚本不运行

c++ - openMP - 并发访问变量和原子

c - 在 OpenMP 并行代码中,并行运行 memset 会有什么好处吗?

C代码检查命令行是否被重定向到/dev/null