首页 > 解决方案 > 在 GPU 上使用 OpenMP+Fortran 减少数组。我得到一个不受支持的动态分配编译时错误

问题描述

我的 Fortran 代码如下所示

      b=0.
      !$OMP TARGET DATA MAP(to:a) MAP(tofrom:b) ! a and b are arrays of size n
  
      !$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO COLLAPSE(3) &
      !$OMP PRIVATE(x,y,z,term) & 
      !$OMP REDUCTION(+:b) 
      do x = ...
         do y = ...
            do z = ...
               term = a*a
               b(z) = b(z) + term
            end do
         end do
      end do
      !$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO
      !$OMP END TARGET DATA 

我需要将每个线程对 b 的每个元素的贡献加起来。当我尝试编译此代码时,出现以下错误。

error: <unknown>:0:0: in function subroutine_$ck_L46_1 void (i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32): unsupported dynamic alloca

当我没有减少子句时,代码编译得很好。我不明白为什么它看起来像是试图在这里动态分配任何东西,因为我有一个 MAP(tofrom:b)。此代码的一个版本只有 $OMP PARALLEL DO 可以工作。所以我使用 TARGET 指令的方式有问题。

任何指针表示赞赏!

标签: fortrangpuopenmp

解决方案


推荐阅读