Parallel processing 具有多个CPU的Fortran问题

Parallel processing 具有多个CPU的Fortran问题,parallel-processing,fortran,Parallel Processing,Fortran,我正在运行一些用fortan编写的代码。它由几个子程序组成,我使用模块中指定的全局变量在它们之间共享变量 使用多个CPU时会出现此问题。在一个子例程中,代码应通过全局变量的值更新局部变量的值。在一些通过子程序的随机过程中,当我使用多个CPU运行它时,代码不会更新变量。但是,如果我暂停它并使其上升,以强制代码传入更新变量的代码段,它将工作!魔术然后,我实现了一个循环,检查变量是否已更新,并尝试在代码中使用(GOTO)返回以使其更新变量。。。。但对于2次尝试,它有时仍然不更新变量。如果我只使用一个内

我正在运行一些用fortan编写的代码。它由几个子程序组成,我使用模块中指定的全局变量在它们之间共享变量

使用多个CPU时会出现此问题。在一个子例程中,代码应通过全局变量的值更新局部变量的值。在一些通过子程序的随机过程中,当我使用多个CPU运行它时,代码不会更新变量。但是,如果我暂停它并使其上升,以强制代码传入更新变量的代码段,它将工作!魔术然后,我实现了一个循环,检查变量是否已更新,并尝试在代码中使用(GOTO)返回以使其更新变量。。。。但对于2次尝试,它有时仍然不更新变量。如果我只使用一个内核运行代码,那么它就可以正常工作。。。。有什么想法吗

谢谢

一段代码:

Subroutine1() !Where the variable A0 should be updated
                nTries = 0
 777               IF (nItems.NE.0) THEN
                    DO J = 1,nItems
                        IF (nint(mDATA(J,3)).EQ.nint(XCOORD+U1NE0)
 & .AND. nint(mDATA(J,4)).EQ.nint(YCOORD+U2NE0) .AND. 
 2              nint(mDATA(J,5)).EQ.nint(ZCOORD+U3NE0)) THEN
                            A0 = mDATA(J,1)
                            JNODE = mDATA(J,2)
                            EXIT
                        ELSE
                            A0 = A02
                        ENDIF
                    ENDDO

                IF (A0.EQ.ZERO) THEN !If the variable was not updated
                    IF (nTries.LE.2) THEN
                        nTries = nTries + 1
                        GOTO 777
                    ENDIF
                    write(6,*) "ZERO A0", IELEM, JTYPE
                    A0 = MAXT
                ENDIF

我不知道Abaqus是如何与FORTRAN子例程交互的,也不清楚上面的代码出了什么问题,但您遇到的似乎是“竞争条件”的经典示例,您称之为“一个核心先于另一个核心”

一般的评论是,
GOTO
s和全局变量非常危险,因为它们使程序很难推理。一旦开始并行化,这些问题就会变得复杂。如果Abaqus正在进行某种“黑箱”计算,并负责并行化,那么您(作为一个仅对数据进行预处理和后处理的用户)应该与此隔离。然而,从上面看,听起来您正在做一些与Abaqus并行计算交织的事情。在这种情况下,您需要确保所做的一切都是线程安全的。在许多其他事情中,您绝对需要确保您没有写入任何全局变量


另一个评论是,您对
A0
的检查基本上是一个称为“spinlock”的锁。这是一种确保线程安全的方法,但锁本身也有陷阱。如果Abaqus不能让您同步所有线程并保证完成其工作,那么像这样的锁可能是最好的方法。

在“多个CPU”上运行时使用什么?您好!我正在运行一个有限元分析,我正在使用一个名为abaqus的商业程序,它有一个功能,允许用户使用多个cpu核运行模型。我只需要在DOS命令中指定“CPU=number”。我不知道程序是如何处理计算的,但问题是一个核在计算中领先于另一个核,更新变量(即U1NE0、U2NE0、U3NE0)的信息在该核调用时还不可用。。。。。