问题描述
|
首先,OpenMP显然仅在集群中的一块主板上运行,在这种情况下,每块主板都有两个2GHz的四核Xeons E5405,并且运行的Scientific Linux 5.3(于2009年发布,基于Red Hat)。另一方面,我的笔记本电脑a具有运行Windows 7的2GHz的core2duo T7300。
主要问题是我的OOP代码通常在两个系统中都以串行方式运行大约2分钟,但是当我在嵌套循环中实现OpenMP时,它将大大减少笔记本电脑中的预期时间(使用2个线程时),并且服务器中的时间增加(例如,使用两个线程大约需要5分钟)。
有两个类,“多维数据集”和“空间”。空间包含多维数据集的三维数组(20x20x20),而我尝试并行化的代码是三向嵌套循环,该循环为每个多维数据集调用多维数据集的成员函数。该成员函数具有三个参数(双精度),并基于每个多维数据集的私有变量进行一些计算。
inline void space::cubes_refresh(const double vsx,const double vsy,const double vsz) {
int loopx,loopy,loopz;
#pragma omp parallel private(loopx,loopz)
{
#pragma omp for schedule(guided,1) nowait
for(loopx=0 ; loopx<cubes_w ; loopx++) {
for(loopy=0 ; loopy<cubes_h ; loopy++) {
for(loopz=0 ; loopz<cubes_d ; loopz++) {
// Refreshing the values in source
if ( (loopx==source_x)&&(loopy==source_y)&&(loopz==source_z) )
cube_array[loopx][loopy][loopz].refresh(0.0,0.0,vsz);
// refresh everything else
else
cube_array[loopx][loopy][loopz].refresh(0.0,0.0);
}
}
} // End of loop
}
正如我之前所说,我不知道问题可能出在哪里,我在笔记本电脑上看到了预期的性能改进,但是服务器中的完全相同的代码会严重恶化。
这些是我在笔记本电脑中使用的标志(尝试使用完全相同的标志,但什么也没做):
g++ -std=c++98 -fopenmp -O3 -Wl,--enable-auto-import -pedantic main.cpp -o parallel_openmp
在服务器中:
g++ -std=c++98 -fopenmp -O3 -W -pedantic main.cpp -o parallel_openmp
我正在运行gcc版本4.5.0,而服务器正在运行4.1.2,我不知道服务器中的OpenMP版本,因为我不知道如何检查它,我认为这是3.0之前的版本循环崩溃无效。这可能是问题吗?
解决方法
gcc直到4.2才支持OpenMP,从gcc 4.4开始支持OpenMP 3.0。您的操作系统供应商可能已将更改反向移植到4.1.2。
, 我能想到的唯一导致问题的原因是,由于某种原因,服务器中所有访问多维数据集成员数组的线程都会导致大量缓存丢失,但是在笔记本电脑中运行的程序中是否也会发生这种情况?