【发布时间】:2019-11-19 05:40:20
【问题描述】:
我有一段代码需要更快,任何提示或解决方案都会很有用。通过将内存访问重新排序为尽可能连续,希望获得更多的缓存命中。
int elij, veci, prod, curr, next;
for(int j=0; j<mat.cols; j++){
VSET(res,j,0); // initialize res[j] to zero
for(int i=0; i<mat.rows; i++){
elij = MGET(mat,i,j);
veci = VGET(vec,i);
prod = elij * veci;
curr = VGET(res,j);
next = curr + prod;
VSET(res,j, next); // add on the newest product
}
}
有人告诉我,切换列和行可能会有所帮助,因为它可以避免不断访问缓存中更远的内存,但我不知道该怎么做。
此函数用于执行矩阵转置乘以向量。任何建议表示赞赏。
【问题讨论】:
-
什么是
MGET?VGET?mat?vec?请提供minimal reproducible example,因为任何人都无法仅根据这篇文章来确定它们的作用、类型是什么、如何访问内存等。速度还取决于 CPU 架构等,所以这很可能是一个过于宽泛的问题 -
一旦 OP 提供了工作代码,我相信这个问题属于 Code Review。
-
您需要描述您将要测量速度的方式、您当前测量的速度以及需要达到的速度。该信息对于提出有可能实际改进事物的更改是必要的。如果没有提供这些信息,优化问题也太宽泛了。 IE。将其扩展到测试程序的 MRE(正如 Sami 已经提出的)。还提供一些您将用于测量的示例数据。
标签: c matrix optimization