Power8 上的硬件事件

hardware event on Power8

我正在 Power8 上试验 PAPI 和硬件计数器。我认为非常是 PM_FLOP 计算的问题(由 PAPI_flop 使用)。 PM_FLOP 是以下计数器的总和:PM_VSU{i}_{j}FLOP 其中 i 是 (1,2)(每个核心 2 个 VSU)",j 是 (1,2,4 ,8). 如果我们分析PAPI测试的矩阵-hl.c测试(矩阵乘法),这2个数字仍然匹配,我们可以得到一个pb.

测试结束时出现错误捕捉器:

 if ( event[0] == PAPI_FP_INS ) {
            /*     Compare measured FLOPS to expected value */
            tmp =
                    2 * ( long long ) ( NROWS1 ) * ( long long ) ( NCOLS2 ) *
                    ( long long ) ( NCOLS1 );
    printf("%llu \n",tmp);
            if ( abs( ( int ) values[0] - ( int ) tmp ) > ( float ) tmp * 0.05 ) {
                    /*     Maybe we are counting FMAs? */
                    tmp = tmp / 2;
                    if ( abs( ( int ) values[0] - ( int ) tmp ) >
                             ( float ) tmp * 0.05 ) {
                            printf( "\n" TAB1, "Expected operation count: ", 2 * tmp );
                            printf( TAB1, "Or possibly (using FMA):  ", tmp );
                            printf( TAB1, "Instead I got:            ", values[0] );
                            test_fail( __FILE__, __LINE__,
                                               "Unexpected FLOP count (check vector operations)",
                                               1 );
                    }
            }
  }

但是没有错误如果我删除第一个分支并使用 -O3 为 float 和 double 编译测试我得到

Expected operation count:      11812500
Or possibly (using FMA):        5906250
Instead I got:                  3003761
matrix-hl.c - DOUBLE                             FAILED

Expected operation count:      11812500
Or possibly (using FMA):        5906250
Instead I got:                  1552507
matrix-hl.c - FLOAT                              FAILED

目前我认为PM_FLOP的计算是错误的。对我来说每一次 PM_VSU{i}_{j}FLOP 不是翻牌的次数而是完成的助记词的次数。因此 PM_VSU{i}_{j}FLOP 应该是正确的因子:x1 代表 M_VSU{i}_1FLOP,x2 代表 M_VSU{i}_2FLOP,x4 代表 M_VSU{i}_4FLOP 和 x8 for M_VSU{i}_8FLOP.

事实上,原始测试是有效的,因为默认情况下我们使用 -O0 进行编译,因此生成的 ASM 只有串行操作,由 M_VSU{i}_1FLOP 测量,其中 1 个标量助记符是一个 flop。我对 dgemm 和基本向量加法以及 FMA 做了一些测试,这证实了我的更正。

IBM-Power 专家有什么建议吗?

最佳,

++t

是的,我认为你是对的。

查看文档(来自ophelp):

PM_VSU1_8FLOP: (counter: 0, 1, 2, 3)
    eight flops operation (DP vector versions of fdiv,fsqrt and SP vector versions of 
    fmadd,fnmadd,fmsub,fnmsub) (min count: 10000)

不是很清楚,但暗示此事件的计数为 1 意味着执行了 8 个 FLOP。