Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux OpenMP不在一台机器上启动线程,但在另一台运行相同操作系统的机器上正常工作_Linux_Multithreading_Fortran_Openmp - Fatal编程技术网

Linux 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

最近,我成功地将一个用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编译时,它运行良好。但不是在每台电脑上。。。 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中生成