使用GCC时,OpenMP没有实际的并行性

1 c ubuntu gcc openmp

我正在虚拟机上运行Ubuntu 12,我正在使用GCC编译这个简单的C程序,该程序具有简单的OpenMp编译指示:

#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++)
                ;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的处理器是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++)
        ;
}
Run Code Online (Sandbox Code Playgroud)

我也尝试clock()在两个版本的循环之前和之后添加调用,并且我在并行版本中获得更高的时间.我还尝试使用时间来衡量时间:./a.out我得到(仅在并行版本中)与返回的时间不同的"真实"时间clock()!

我在visual studio上编译了两个代码,结果如下:

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

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

Hri*_*iev 7

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

首先,在并行区域内使用共享变量作为循环计数器是一个可怕的可怕想法.就是为什么,虽然你有一个Nehalem或后来的基于微体系结构的CPU,这使得这不是一个问题.

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

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

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