【问题标题】:Roofline model - how to calculate flop/byte ratio?Roofline 模型 - 如何计算 flop/byte 比率?
【发布时间】:2015-11-14 16:33:50
【问题描述】:

我想创建屋顶线模型,但每字节比率的算法失败率存在问题。你能解释一下如何计算吗?该算法使用 5 点模板进行计算。

这是算法

for(int i=1; i<m-1; ++i) {
   for(int j=1; j<n-1; ++j) {
       outMax[i][j] = max( inMax[i][j], inMax[i][j-1], inMax[i][j+1],
                           inMax[i-1][j], inMax[i+1][j] );
   }
}
swap(inMax, outMax)

for(int i=1; i<m-1; ++i) {
   for(int j=1; j<n-1; ++j) {
      outMin[i][j] = min( inMin[i][j], inMin[i][j-1], inMin[i][j+1],
                          inMin[i-1][j], inMin[i+1][j] );
   }
}
swap(inMax, outMax)

【问题讨论】:

  • 这取决于类型(或者更确切地说,它们的大小),浮点型还是双精度型?
  • 我使用双数据类型

标签: algorithm performance stencils intel-advisor roofline


【解决方案1】:

通常,roofline 是每个循环或每个程序的。所以我可能会考虑第一个循环的 flop/byte 和第二个循环。

对于每个循环:

  1. 您需要估计操作的数量,这(对于屋顶线和翻转/字节算术强度)通常等于所有 ALU(乘法、加法、除法等)操作的数量,在循环的单次迭代中执行。 (就硬件指令而言,您必须考虑不会导致生成 MOV* 或跳转指令的操作)。在您的情况下,您只需要考虑比较次数(因为 min/max 正在处理比较)。您的具体比较次数取决于 min()/max() 函数的实现。

  2. 你必须估计你从/到 inMax(或者在第二种情况下从/到 inMin)读取和写入了多少字节;再次,您每次迭代都执行此操作。在您的情况下,您肯定会读取 5*sizeof(double) == 40 bytes。你至少写了一个双重。如何在 min()/max() 函数中读/写内存取决于它的实现。

  3. 您必须将这两个值相除。在你的情况下,翻转/字节可能会像 0.1,取决于 min()/max() 算法。

同时自动为 C/C++/Fortran 程序中的每个循环和函数生成 Roofline 模型(连同 flop/byte 度量)作为 Intel Advisor 产品启动中的一流功能提供从 2017 版开始,请参阅 https://software.intel.com/en-us/articles/intel-advisor-rooflinehttps://www.codeproject.com/Articles/1169323/Intel-Advisor-

请注意,某些屋顶线变体在定义“字节”值的方式上有所不同。

找出模板的翻转/字节和屋顶线模型是屋顶线专家和开发人员非常热门的话题。因此,通过查看下面的链接,您可能会找到足够的模板屋顶线示例来遵循并在您的特定情况下重新应用,无论是否考虑 DRAM 与 L1:

http://icsc2014.sjtu.edu.cn/wp-content/uploads/2014/05/Tutorial-Leopold1.pdf(尤其是从第 17 页开始)

http://blogs.fau.de/hager/files/2014/05/Roofline_ECM_SPPEXA_PhD_2014.pdf

【讨论】:

  • 这就是我所需要的。感谢您的帮助:)
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多