【问题标题】:how to reduce data movement to improve performance如何减少数据移动以提高性能
【发布时间】:2019-10-01 18:46:46
【问题描述】:

我尝试使用 openACC 提高 Fortran 代码的性能,但是编译器显示设备和主机之间有很多传输

我尝试使用数据区域来减少内存移动

这是代码的一部分, 完整的子程序用于使用 LU 求解方程

!EXCHANGING AND ELIMINATING COLUMNS

!$acc data copy(a(:,k:n))create(a(:,k:n))   
!$acc kernels

                                DO J = K + 1, N
                                        TQ = A(M, J)
                                        A(M, J) = A(K, J)
                                        A(K, J) = TQ

                                        IF (DABS(TQ) .GT. 0) THEN
                                        DO I = K + 1,N
                                                A(I,J)=A(I,J)+A(I,K)*TQ
                                        ENDDO
                                        END IF
                                ENDDO
!$acc end kernels
!$acc end data

我希望减少计算时间,代码在没有数据区域的情况下运行但非常慢,当使用数据区域时,由于不可能的因式分解,程序停止

【问题讨论】:

    标签: fortran gfortran openacc


    【解决方案1】:

    OpenACC 计算区域,即“内核”或“并行”,包括一个隐式数据区域。当与结构化数据区域不在同一范围内且计算区域上没有任何数据子句时,编译器将为您隐式复制数据。添加数据区域将覆盖此隐式数据,并让您更好地控制何时传输数据。

    您在数据区域中看到的错误很可能是由于在“复制”和“创建”子句中都添加了“a”。由于变量只能出现一次,因此将使用最右边的子句(即 create),因此您的数据不会被复制到设备或从设备复制。要修复,请删除 create 子句。 (请注意,copy 会进行创建和复制)

    但是,由于您的数据区域直接位于计算区域周围,因此您的性能将保持不变。为了解决这个问题,我建议将数据区域移动到代码中更早的位置,例如直接在分配或初始化“a”之后。然后在“kernels”指令中添加“present(a)”子句来强制数据存在于设备上。

    为确保主机和设备之间的数据同步,请在计算区域前后使用“更新”指令。下一步是开始向外移动“更新”指令,同时将更多计算卸载到设备上。理想情况下,您将卸载所有在“A”数组上工作的代码,以便在程序启动时将数据复制到设备一次,并在需要打印结果时将数据复制回主机。

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多