Roofline模型 - 如何计算翻牌/字节比?

时间:2015-08-20 21:01:03

标签: algorithm performance intel-mic stencils

我想创建屋顶线模型,我遇到算法翻转每字节比率的问题。你能解释一下如何计算吗?该算法使用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)

1 个答案:

答案 0 :(得分:3)

通常,roofline是per-loop或per-program。所以我可能会考虑第一个循环的翻转/字节,另外,第二个循环。

对于每个循环:

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

  2. 你必须估计你从/向inMax读取和写入的字节数(或者在第二种情况下从/到inMin);再次,你每次迭代都这样做。在你的情况下,你绝对阅读5 * sizeof(double)== 40 bytes 。你写至少一个双。你如何在min()/ max()函数内部读/写内存取决于它的实现。

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

  4. 与此同时,C / C ++ / Fortran程序中每个循环和函数的自动 Roofline模型生成(以及翻牌/字节指标)可作为Intel Advisor产品startig中的一流功能提供从2017版开始,请参阅https://software.intel.com/en-us/articles/intel-advisor-rooflinehttps://www.codeproject.com/Articles/1169323/Intel-Advisor- Intel Advisor Roofline: each circle corresponds to some loop/function; flop/byte ration is on horizontal axis

    请记住,一些屋顶线的变化在定义&#34;字节&#34;值。

    在模板专家和开发人员之间找出模板的翻牌/字节和车顶线模型是非常受欢迎的主题。因此,通过查看下面的链接,您可以找到足够的模板屋顶线示例,并在您的特定情况下重新应用,或者说,让我们说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