Linux OpenMP不在一台机器上启动线程,但在另一台运行相同操作系统的机器上正常工作
最近,我成功地将一个用Fortran编写的程序(有点大)与一些用C编写的库(最著名的是UMFPACK)并行化。我们用英特尔的C编译器和英特尔的Fortran编译器(icc和ifort)14.0编译了这些。我们运行Ubuntu 12.04.3 我使所有例程都是线程安全的,并使用下面的代码使用OpenMP执行并行化:Linux OpenMP不在一台机器上启动线程,但在另一台运行相同操作系统的机器上正常工作,linux,multithreading,fortran,openmp,Linux,Multithreading,Fortran,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 ca
!$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编译时,它运行良好。但不是在每台电脑上。。。
gs_3D是一个三维数组,用于存储SearchMaterial的结果
我有一个核心i5-2400,并使用运行Linux(Windows主机)的VMWare虚拟机和我的本机Linux安装进行了测试。两者都很好。但在另一台同样运行Ubuntu12.04.3的PC(CoreI7-3860X)上,安装了相同的编译器和库,它只能使用一个线程运行。编译选项都是相同的。我甚至试着在另一台电脑上运行我在电脑中编译的二进制文件
不仅如此,使用OpenBLAS的OpenMP实现在我的本机Linux安装上运行良好,但在我的虚拟机和i7-3860X上运行不好)
经过一些没有结果的研究,我决定寻求帮助
(在所有这些情况下都正确设置了OMP_NUM_线程)
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_线程限制我的代码不工作
编辑:至于BLAS问题,我发现在没有处理器关联的情况下编译它会使用所有内核。另一方面,我的程序在i7上仍然不起作用请尝试将环境变量ble
OMP\u DYNAMIC
设置为FALSE
。当它为TRUE
时,如果运行时环境认为CPU太忙,则线程数将由运行时环境进行调整。ulimit-a在两个(正常工作和不正常工作)系统上都显示了什么?检查是否有其他OpenMP变量,例如在工作不正常的机器上设置的OMP\u线程限制
。@hristoilev我将编辑我的问题以包含请求的信息。我通常会事先执行ulimit-s unlimited
,否则我会出现分段错误。您也应该将此提交给超级用户堆栈交换站点,因为这可能是操作系统问题。你可能会在那里得到帮助,但你不会在这里(即使有很多交叉)。我会尽快尝试这个。谢谢。线程现在正在生成,即使OMP_DYNAMIC设置为TRUE。但当我将我的程序与PARDISO链接时,其他OpenMP循环不会在其他PC中生成线程,但它们会在我的PC中生成