1

最近,我成功地将一个用 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 是一个 3 维数组,用于存储 SearchMaterial 的结果。

我有一个 Core i5-2400,并使用运行 Linux(Windows 主机)的 VMWare 虚拟机和我的本机 Linux 安装进行了测试。两者都工作得很好。但是在另一台 PC(Core i7-3860X)上,也运行 Ubuntu 12.04.3,安装了相同的编译器和库,它只能使用一个线程运行。编译选项都是一样的。我什至尝试在另一台计算机上运行我在我的 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 unlimited ,否则会出现分段错误。

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

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

4

1 回答 1

0

尝试将环境变量设置OMP_DYNAMICFALSE. 为 时TRUE,如果认为 CPU 太忙,运行环境会调整线程数。

于 2013-10-26T04:53:02.377 回答