我正在試驗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測試中,我們可以有一個PBPower8上的硬件事件
在試驗結束時有錯誤捕手:
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不是翻牌的數量,而是完成的助記符的數量。因此,對於M_VSU {i} _1FLOP,PM_VSU {i} _ {j} FLOP應該通過以下因子來正確:x1對於M_VSU {i} _1FLOP,x2對於M_VSU {i} _2FLOP,x4對於M_VSU {i} _4FLOP和x8對於M_VSU {i} _8FLOP。
事實上,原始測試的工作原理是因爲默認情況下我們使用-O0進行編譯,因此生成的ASM只有串行操作,由M_VSU {i} _1FLOP測量,其中1個標量助記符是一個翻牌。我在dgemm和基本矢量添加和FMA上做了一些測試,這證實了我的修正。
IBM-Power guru的任何命題?
最佳,
++牛逼
從我幾乎不記得你是對的,硬件計數器應該計算浮點指令的數量(FLIPs與FLOPs),它們是ADDs,MULs或FMAs,在這種情況下我不會考慮它是一個錯誤,只是直接評估實際GFlops沒有用處。但是當我遇到他們時,我正在研究Power3/4/5。 IBM有可能在更新的處理器中引入了FP操作計數器,所以這實際上是一個錯誤。 – Sigismondo 2015-03-31 13:36:43
謝謝你的快速回答,我真的需要這個失敗的表現模型。我將嘗試將信息轉發給IBM – 2015-03-31 16:53:20