1

我在 Virtual box 上运行 Ubuntu 12,我正在使用 GCC 编译这个具有简单 OpenMp pragmas 的简单 C 程序:

#include <stdio.h>
#include <omp.h>
#define MAX 10000000000
void main()
{
    unsigned long long i,j,k,l;
    int threadnumber;
    #pragma omp parallel shared(i,j,k,l)
    {
        threadnumber = omp_get_thread_num();
        if(threadnumber == 0)
        {
            for(i = 0; i < (MAX / 4); i++)
                ;
        }
        else if(threadnumber == 1)
        {
            for(j = (MAX / 4); j < (MAX / 2); j++)
                ;
        }
        else if(threadnumber == 2)
        {
            for(k = (MAX / 2); k < (3 * (MAX / 4));k++)
                ;
        }
        else
        {
            for(l = (3 * (MAX / 4)); l < MAX; l++)
                ;
        }
    }
}

我的处理器是 Intel Core i5 处理器。该程序确实在并行工作(通过添加一些 printf()s 进行验证),我已将环境变量(OMP_NUM_THREADS)设置为 4。问题是代码花费的时间比这个非并行的要多:

#include <stdio.h>
#define MAX 10000000000
void main()
{
    unsigned long long i;
    for(i = 0; i < MAX; i++)
        ;
}

我还尝试clock()在两个版本的循环之前和之后添加调用,并且我在并行版本中获得了更长的时间。我还尝试使用 : time 来测量时间./a.out,并且我得到的(仅在并行版本中)与返回的“实际”时间不同clock()

我已经在 Visual Studio 上编译了这两个代码,结果如下:

  1. 在调试模式下:两个代码的时间几乎相等,并且时间接近 GCC 给出的时间。
  2. 在发布模式下:两种代码都更快,并行代码在时间上显示出很大的改进。问题简而言之:
  3. 我想以与 Visual Studio 编译器的发布版本相同的效率并行运行该程序。2)是否有一个参数或选项我应该传递给 GCC,而不是"-fopenmp"让它构建一个与 Visual Studio 完全一样的发布版本。3) 我想知道这是 Ubuntu 问题还是 GCC 问题或什么?

PS:我尝试在安装了 wubi 的 Ubuntu 上以及作为独立操作系统(在 ext4 文件系统上)和相同平台上的 Ubuntu 上运行相同的程序,我得到了相同的结果。

4

2 回答 2

7

我真的不明白为什么这里关于 SO 的每个新的 OpenMP 相关问题都包含clock()用于(错误地)测量挂钟执行时间的代码,前提是 OpenMP 有一个便携式高分辨率计时器,可以通过调用omp_get_wtime()?

首先,在并行区域内使用共享变量作为循环计数器是一个非常糟糕的想法就是为什么,尽管你有一个 Nehalem 或更高版本的基于微架构的 CPU,这使得这个问题不那么严重。

其次,Visual Studio 在调试和发布配置中应用了不同的优化级别。在调试模式下禁用优化 ( /Od),而在发布模式下启用速度优化 ( /O2)。您说在调试模式下 VS 代码运行速度与 GCC 代码一样快。这可能意味着您运行 GCC 时默认优化级别为无优化。编译-O2或什-O3至与 VS 在发布模式下生成的代码相同。

第三,您在虚拟机中运行 Ubuntu。虚拟机可以访问多少个 CPU?

第四,您为什么要重新实现 OpenMP 并行for工作共享指令?

于 2012-06-29T11:14:14.850 回答
1

小心从这些简单的测量中得出结论。您在这里拥有的空循环应该是大多数现代编译器完全优化的。OMP这种优化在这里可能会受到您的编译指示的阻碍。但这真的与并行与否无关。

于 2012-06-28T19:00:11.893 回答