我正在尝试使用英特尔Fortran运行OpenMP Fortran代码。
在我的代码开头,我分配了7个非常大的矩阵:
! Allocate
REAL, ALLOCATABLE :: m1(:,:,:,:,:,:,:,:,:)
REAL, ALLOCATABLE :: m2(:,:,:,:,:,:,:,:,:)
REAL, ALLOCATABLE :: m3(:,:,:,:,:,:,:,:,:)
REAL, ALLOCATABLE :: m4(:,:,:,:,:,:,:,:,:)
REAL, ALLOCATABLE :: m5(:,:,:,:,:,:,:,:,:)
REAL, ALLOCATABLE :: m6(:,:,:,:,:,:,:,:,:)
REAL, ALLOCATABLE :: m7(:,:,:,:,:,:,:,:,:)
ALLOCATE(m1(2,161,20,2,2,21,30,2,2))
ALLOCATE(m2(2,161,20,2,2,21,30,2,2))
ALLOCATE(m3(2,161,20,2,2,21,30,2,2))
ALLOCATE(m4(2,161,20,2,2,21,30,2,2))
ALLOCATE(m5(2,161,20,2,2,21,30,2,2))
ALLOCATE(m6(1,161,20,2,2,21,30,2,2))
ALLOCATE(m7(1,161,20,2,2,21,30,2,2))
然后我运行一个带有大型并行循环的代码。
!$omp parallel do default(private) shared(m1, m2, m3, m4, m5, m7, someothervariables)
某些矩阵m1
到m7
确实在子例程中使用,这可能会导致创建临时数组。
在任何情况下,如果串行完成,代码运行正常。但是如果使用openMP运行它会崩溃并出现以下错误,无论我使用的核心数是多少:
我使用的机器有128GB
个ram。不确定这是否是限制因素。如果我将每个矩阵的最后一个索引减少到1,则代码在24个核心中运行良好。鉴于我正在增加2使用的内存大小,它应该运行12个内核,至少没有?
也许我正在做一些大错误,或者只是一些需要更改的Fortran选项...