我在 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 上编译了这两个代码,结果如下:
- 在调试模式下:两个代码的时间几乎相等,并且时间接近 GCC 给出的时间。
- 在发布模式下:两种代码都更快,并行代码在时间上显示出很大的改进。问题简而言之:
- 我想以与 Visual Studio 编译器的发布版本相同的效率并行运行该程序。2)是否有一个参数或选项我应该传递给 GCC,而不是
"-fopenmp"
让它构建一个与 Visual Studio 完全一样的发布版本。3) 我想知道这是 Ubuntu 问题还是 GCC 问题或什么?
PS:我尝试在安装了 wubi 的 Ubuntu 上以及作为独立操作系统(在 ext4 文件系统上)和相同平台上的 Ubuntu 上运行相同的程序,我得到了相同的结果。