gpt4 book ai didi

c++ - 在一个循环中证明内存访问

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:56 25 4
gpt4 key购买 nike

我有以下功能:

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 个 float ,但我的计算没有达不到这个值,所以任何人都可以向我解释一下吗?

编辑:这是我的汇编文件,很抱歉把它们扔在这里,但我从来没有使用过汇编,我真的无法理解其中的任何内容:

http://dl.dropboxusercontent.com/u/878621/mmc.s http://dl.dropboxusercontent.com/u/878621/mmc_asm.s

谢谢!

最佳答案

查看商店,您获得的数量非常接近 N**3/4。显然,我们希望它是 O(N**3)。

这表明 4 个浮点写入被合并到 PAPI_SR_INS 正在测量的任何一个中。或者,您正在计算 16 字节写入的次数。

同样,负载的数量大致为 3/4 N**3。主导项应该是最内层循环内 b 和 c 的负载,即每次迭代 2 次读取。老实说,我不太明白这一点。

如果您不确切知道要测量的内容,并且不将其与生成的代码相关联,则很难预测测量结果。

编辑:这些数字似乎与执行的加载和存储指令相关,但与 L1、L2 等交易或未命中的数量无关——因此不太可能与实际性能相关。花的时间不是更值得担心吗?考虑到现代 CPU 架构的复杂性,我相信测量胜过预测。

关于c++ - 在一个循环中证明内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com