首先,OpenMP显然只能在群集中的一个主板上运行,在这种情况下,每个主板都有两个2GHz的四核Xeon E5405和运行的Scientific Linux 5.3(2009年发布,基于red hat)。另一方面,我的笔记本电脑有2个运行Windows 7的core2duo T7300 7.两台机器都没有超线程。
主要的问题是我的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, loopy, 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,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之前的版本循环中的崩溃不起作用。这可能是问题吗?