OpenMP 不会在一台机器上启动线程,但在另一台运行相同操作系统的机器中工作正常



最近,我成功地将一个用Fortran编写的程序(有点大)与一些用C编写的库(最值得注意的是UMFPACK)相提并论。我们使用英特尔的 C 编译器和英特尔的 Fortran 编译器(icc 和 ifort)14.0 编译了这些内容。我们运行 Ubuntu 12.04.3。

我使所有例程都是线程安全的,并使用以下代码使用 OpenMP 执行平行化:

!$omp parallel do default(shared) private(gs,ibk,ij) schedule(dynamic)
do  ibk=1,numcell
call CellGaussPoints(ibk,numcell,nquado,numq,numgauss, &
    xc,noCell,gauss,gs)
    do  ij=1,numgauss
        gs_3D(ibk,1,ij)=gs(1,ij)
        gs_3D(ibk,2,ij)=gs(2,ij)
        gs_3D(ibk,3,ij)=gs(3,ij)
        gs_3D(ibk,4,ij)=gs(4,ij)
        call SearchMaterial(tree3,my_array0,node,gs_3D(ibk,1,ij),gs_3D(ibk,2,ij),numnode,mat_2D(ibk,ij),nf,numd,elements)
    end do
end do
!$omp end parallel do

当使用 -openmp 编译时,它运行良好。但并非在每台 PC 中...gs_3D是一个三维数组,用于存储搜索材料的结果。

我有一个Core i5-2400,并使用运行Linux(Windows Host)的VMWare虚拟机和我的本机Linux安装进行了测试。两者都工作正常。但是在另一台同样运行 Ubuntu 12.04.3 的 PC(Core i7-3860X)上,安装了相同的编译器和库,它将仅使用一个线程运行。编译选项都是一样的。我什至尝试在另一个上运行我在PC中编译的二进制文件。

不仅如此,使用OpenBLAS的OpenMP实现在我的本机Linux安装上运行良好,但在我的虚拟机和i7-3860X上则不行)。

经过一番研究,一无所获,我决定寻求帮助。

(OMP_NUM_THREADS在所有这些情况下都设置正确)

ulimit -a 返回以下内容

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63687
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 63687
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

我通常在运行程序之前执行 ulimit -s 无限,否则我会得到分段错误。

OMP_THREAD_LIMIT没有在机器上设置,我的代码不起作用。

编辑:至于BLAS问题,我发现在没有处理器关联的情况下编译它会使它使用所有内核。另一方面,我的程序仍然无法在i7上运行

尝试将

环境可变OMP_DYNAMIC设置为 FALSE 。当它TRUE时,如果运行时环境认为CPU太忙,线程数将由运行时环境调整。

相关内容

最新更新