为什么在 Fortran 中某些数组没有正确对齐以进行矢量化?

2024-01-04

我正在尝试通过矢量化 for 循环来改进 Fortran 77 代码。我对矢量化相当陌生,虽然我可以获得矢量化代码,但优化报告告诉我,我的一些数组具有未对齐的访问权限。据我了解,这使得矢量化效率较低。 我已手动向数组添加填充,以便对齐数据,这似乎适用于我的大多数数组,但不适用于所有数组(请参阅示例代码)。

      SUBROUTINE SOURCE
      PARAMETER(NLINES=8)
      PARAMETER(NLM=NLINES-1)
      PARAMETER(NZ=18)
      
      COMMON/TEST/h(-nlines:nlines+15,-nlines:nlines)
     &,hr(-nlines:nlines+15,-nlines:nlines)
      COMMON/PRO/P2(-nlm:nlm+1,-nlm:nlm)

      dimension SNT(-nlm:nlm+1,-nlm:nlm,0:NZ+1)

      DO iy=-nlm,nlm
       DO ix=-nlm,nlm
        H(ix,iy)=SNT(ix,iy,1)
     &  +SNT(ix,iy,0)
     &  +SNT(ix,iy,2)

        HR(ix,iy)=P2(ix,iy)*H(ix,iy)
       enddo
      enddo      
      END

以及优化报告的相关部分:

   LOOP BEGIN at SOURCE.FPP(13,8)
      remark #15389: vectorization support: reference h(ix,iy) has unaligned access   [ SOURCE.FPP(14,9) ]
      remark #15388: vectorization support: reference snt(ix,iy,1) has aligned access   [ SOURCE.FPP(14,9) ]
      remark #15388: vectorization support: reference snt(ix,iy,0) has aligned access   [ SOURCE.FPP(14,9) ]
      remark #15388: vectorization support: reference snt(ix,iy,2) has aligned access   [ SOURCE.FPP(15,9) ]
      remark #15389: vectorization support: reference hr(ix,iy) has unaligned access   [ SOURCE.FPP(18,9) ]
      remark #15388: vectorization support: reference p2(ix,iy) has aligned access   [ SOURCE.FPP(18,9) ]
      remark #15389: vectorization support: reference h(ix,iy) has unaligned access   [ SOURCE.FPP(18,9) ]
      remark #15381: vectorization support: unaligned access used inside loop body
      remark #15305: vectorization support: vector length 4
      remark #15399: vectorization support: unroll factor set to 3
      remark #15300: LOOP WAS VECTORIZED
      remark #15448: unmasked aligned unit stride loads: 4 
      remark #15450: unmasked unaligned unit stride loads: 1 
      remark #15451: unmasked unaligned unit stride stores: 2 
      remark #15475: --- begin vector cost summary ---
      remark #15476: scalar cost: 15 
      remark #15477: vector cost: 4.250 
      remark #15478: estimated potential speedup: 2.340 
      remark #15488: --- end vector cost summary ---
      remark #25456: Number of Array Refs Scalar Replaced In Loop: 3
      remark #25015: Estimate of max trip count of loop=1
   LOOP END

为什么 h(ix,iy) 和 hr(ix,iy) 没有对齐访问权限?如何对齐它们以实现更好的矢量化?

大概还有相关信息:

Intel(R) Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 19.0.0.117 Build 20180804

Compiler options: -qopt-report=5 -c -DLINUX -O3 -w -assume nounderscore -xCORE-AVX2 -o SOURCE.o193

预先感谢您的时间和帮助!


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Fortran 中某些数组没有正确对齐以进行矢量化? 的相关文章

  • 对象数组的数组(二维数组)JNI

    我正在努力创建自定义对象类型 ShareStruct 的二维数组 jobjectArray ret jobjectArray ins jobjectArray outs jclass myClass env gt FindClass env
  • numpy:如何连接数组? (获得多个范围的并集)

    我使用Pythonnumpy 我有一个 numpy 索引数组a gt gt gt a array 5 7 12 18 20 29 gt gt gt type a
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • 如何在 Swift 中使用未知密钥解码 JSON 响应?

    我想将数据拆分为https blockchain info ticker https blockchain info ticker这样每一行都是它自己的String在一个数组中 我正在制作一个获取所选货币价格的应用程序 因此 如果有人想要澳
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • 获取向量幂的有效方法

    我编写了一个代码 在数值上使用勒让德多项式直至某个高 n 阶 例如 case 8 p 6435 x 8 12012 x 6 6930 x 4 1260 x 2 35 128 return case 9 如果向量x太长这会变得很慢 我发现说之
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 如何在 Smarty 中打印 json

    我从 api 获取 json 如何使用 Smarty 打印 json Json格式 first name jinu last name mk loginid email protected cdn cgi l email protectio
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 将按钮文本放在一行上

    我的按钮文本在 safari 中显示在一行上 即使在初次单击后 但是在 google chrome 上 当您第一次到达该按 钮时 我的按钮将显示在一行上 但是当您浏览更多帖子并再次遇到 加载更多 按钮时 文本搞砸了 这只发生在谷歌浏览器上
  • 如何将一个变量的字符串分配给另一变量?

    这是我在这个网站上的第一个问题 如何将一个变量的字符串分配给另一变量 我在这里做错了什么 include
  • 如何释放字符指针数组?

    我使用此方法将列表中的值转换为数组 以便在 execvp 系统调用中使用 char list2argarray struct shellvalue values int count char array char malloc count
  • 删除二维数组C++[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这两种释放二维数组的方法是否相似 int M new int 5 for int i 0 i lt 5 i M i new int 3 fo
  • Numpy vectorize() 正在展平整个数组

    我的输入是一个 numpy 元组数组 values np array 4 5 2 18 4 7 3 8 我的功能如下 def outerFunc values print values def innerFunc values print
  • 合并 2 个数组并合并数字键的结果

    我有 2 个数组 我希望通过每个数字键将其中合并 分组在一起 例如 Array1 2009 gt 131 2008 gt 940 2007 gt 176 2006 gt 1 Array2 2008 gt 9 2007 gt 3 我希望输出是
  • Redim Preserve 给出“下标超出范围”

    我想要Redim Preserve一个数组我不断收到错误 下标超出范围 我知道只有最后一个维度的大小可以更改 这正是我正在做的事情 这里出了什么问题 数组的类型是Variant BmMatrix Sheets BENCH Range a60
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 使用正则表达式搜索 Ruby 数组

    你好 我有一个小的 ruby 函数 它可以分割出一个 Ruby 数组 如下所示 def rearrange arr from to sidx arr index from eidx arr index to arr sidx arr sid

随机推荐