OpenMP 在子程序中没有线程 [英] OpenMP no threading in subroutine

查看:22
本文介绍了OpenMP 在子程序中没有线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用 Fortran 编写一个矩阵乘法子程序.我正在使用英特尔 Fortran 编译器.我写了一个简单的静态调度并行do-loop.不幸的是,它只在一个线程上运行.代码如下:

I'm writing a matrix multiplication subroutine in Fortran. I'm using the Intel Fortran compiler. I've written a simple static scheduled parallel do-loop. Unfortunately, it's running on only one thread. Here's the code:

      SUBROUTINE MATMULT(A,B,C,L,M,N)
      REAL*8 A,B,C
      INTEGER NCORES, CHUNK, TID
      DIMENSION A(L,N),B(L,M),C(M,N)
      PARAMETER (NCORES=8)
      CHUNK=(L/(NCORES+1))+1
      TID=0
!$OMP PARALLELDO SHARED(A,B,C,L,M,N,CHUNK) PRIVATE(I,J,K,TID)
!$OMP+DEFAULT(NONE) SCHEDULE(STATIC,CHUNK)
      DO I=1,L
         TID = OMP_GET_THREAD_NUM()
         PRINT *, "THREAD ", TID, " ON I=", I
         DO K=1,N
            DO J=1,M
               A(I,K) = A(I,K) + B(I,J)*C(J,K)
            END DO
         END DO
      END DO
!$OMP END PARALLELDO
      RETURN
      END

注意:

  • 调用例程的主程序中没有并行指令
  • 数组 A,B,C 在主程序中被串行初始化.A 被初始化为零
  • 我在编译期间强制执行 Fortran 固定源代码格式

我已确认以下内容:

  • 另一个示例程序在 8 个线程下运行良好(因此没有硬件问题)
  • 我使用了 -openmp 编译器参数
  • OMP_GET_NUM_PROCS() 和 OMP_GET_MAX_THREADS() 都返回 0
  • 对于 I 的每次迭代,TID 都是 0(不应该是这种情况)

我无法诊断我的错误.对此我将不胜感激.

I am unable to diagnose my mistake. I'd appreciate any inputs on this.

推荐答案

标识符 OMP_GET_THREAD_NUM 没有明确声明.默认的隐式类型规则意味着它将是 real 类型.这与 OpenMP 规范中对该名称的函数的声明不一致.

The identifier OMP_GET_THREAD_NUM is not explicitly declared. The default implicit typing rules mean it will be of type real. That's not consistent with the declaration in the OpenMP spec for the function of that name.

添加 USE OMP_LIB 可以解决这个问题.此外,不使用隐式类型 (IMPLICIT NONE) 可以避免这种情况以及许多类似问题.

Adding USE OMP_LIB would fix that issue. Further, not using implicit typing (IMPLICIT NONE) would avoid this and a multitude of similar problems.

这篇关于OpenMP 在子程序中没有线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆