我正在虚拟机上运行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上编译了两个代码,结果如下:
"-fopenmp"让它构建一个与visual studio完全相同的版本.3)我想知道它是Ubuntu的问题还是GCC的问题或者什么?PS:我尝试在安装了wubi的Ubuntu上运行相同的程序,并在Ubuntu作为独立的操作系统(在ext4文件系统上)和同一平台上运行相同的程序,我得到了相同的结果.
我真的不明白为什么每个与SOMP相关的新问题包含clock()用于(错误地)测量挂钟执行时间的代码,前提是OpenMP有一个便携式高分辨率计时器,通过调用可用omp_get_wtime()?
首先,在并行区域内使用共享变量作为循环计数器是一个可怕的可怕想法.这就是为什么,虽然你有一个Nehalem或后来的基于微体系结构的CPU,这使得这不是一个问题.
其次,Visual Studio在调试和发布配置中应用不同的优化级别.在调试模式下,禁用优化(/Od),在释放模式下,启用速度优化(/O2).你说在调试模式下VS代码运行速度与GCC代码一样快.这可能意味着您运行GCC的默认优化级别为无优化.编译-O2或甚-O3至使用以获得与VS在发布模式下生成的代码相同的代码.
第三,您在虚拟机中运行Ubuntu.虚拟机可以访问多少个CPU?
第四,为什么要重新实现OpenMP并行for工作共享指令?
| 归档时间: |
|
| 查看次数: |
1565 次 |
| 最近记录: |