【问题标题】:how to make this faster?如何使这更快?
【发布时间】: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
    }
  }

有人告诉我,切换列和行可能会有所帮助,因为它可以避免不断访问缓存中更远的内存,但我不知道该怎么做。

此函数用于执行矩阵转置乘以向量。任何建议表示赞赏。

【问题讨论】:

  • 什么是MGETVGET? mat? vec?请提供minimal reproducible example,因为任何人都无法仅根据这篇文章来确定它们的作用、类型是什么、如何访问内存等。速度还取决于 CPU 架构等,所以这很可能是一个过于宽泛的问题
  • 一旦 OP 提供了工作代码,我相信这个问题属于 Code Review
  • 您需要描述您将要测量速度的方式、您当前测量的速度以及需要达到的速度。该信息对于提出有可能实际改进事物的更改是必要的。如果没有提供这些信息,优化问题也太宽泛了。 IE。将其扩展到测试程序的 MRE(正如 Sami 已经提出的)。还提供一些您将用于测量的示例数据。

标签: c matrix optimization


【解决方案1】:

从表面上看,这是我的矩阵乘法的经典向量。任何体面的编译器都会优化代码,只要它可以通过 getter/setter 看到:VGET、MGET、VSET)。

如果您必须使用包装器,最好的方法是在 getter、setter 上使用“内联”(假设它们不是宏)。如果不需要它们,请考虑删除它们,因为它们贡献不大,并使用 v[i] 等。这将释放优化器的能力以使用矢量化等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多