最近,我在使用C语言编写的一些库(最值得注意的是UMFPACK)中编写了一个用Fortran编写的程序(有点大)的成功。我们使用英特尔的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是一个三维数组,用于存储SearchMaterial的结果。
我有一台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 unlimited,因为否则会出现分段错误。
我的代码无法在机器上设置OMP_THREAD_LIMIT。
编辑:对于BLAS问题,我发现在没有处理器亲和性的情况下编译它会使它使用所有内核。另一方面,我的程序仍无法在i7上运行答案 0 :(得分:0)
尝试将环境变量OMP_DYNAMIC
设置为FALSE
。当它为TRUE
时,如果认为CPU太忙,则运行时环境将调整线程数。