我有以下功能:
void ikj(float (*a)[N], float (*b)[N], float (*c)[N], int n) {
int i, j, k;
float r;
papi_start();
for (i = 0; i < n; i++) {
for (k = 0; k < n; k++) {
r = a[i][k];
for (j = 0; j < n; j++)
c[i][j] += r * b[k][j];
}
}
papi_stop();
}
我PAPI
用来计算我之间有多少负载和存储,我得到papi_start()
的papi_stop()
结果如下:
负载(使用PAPI_LD_INS
):
32 26781
64 205053
128 1606077
256 12714815
512 101189551
1024 807406950
2048 6450848188
商店(使用PAPI_SR_INS
):
32 8290
64 65698
128 524578
256 4194850
512 33555490
1024 268437701
2048 2147487778
其中第一个值是 N 的大小,第二个值是指令数。
我正在使用 O3 进行编译,我的缓存大小为 L1 = 32KB x 2(指令和数据,8 路)和 L2 = 1024KB(4 路)(2 核共享).. 我的 cpu 是 Intel T3200 和有SSE3..
我知道 O3 优化了代码,因此它将在其他功能中使用预取,并且由于我正在加载连续地址并且我的缓存有 64 字节的行大小,我一次加载 16 个浮点数,但我的计算没有达到这个价值观,所以有人可以向我解释一下吗?
编辑:这是我的汇编文件,很抱歉把它们扔在这里,但我从未使用过汇编,我无法真正理解其中的任何一个:
http://dl.dropboxusercontent.com/u/878621/mmc.s http://dl.dropboxusercontent.com/u/878621/mmc_asm.s
谢谢!