最近,我成功地将一个用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太忙,线程数将由运行时环境调整。