c - 有没有办法在保持缓存局部性的同时计算标量积?

标签 c caching numerical

假设我有两个相同长度 nfloat 数组:

float *a, *b;
int n;

我想计算它们的标量积。天真的方法是这样的:

int i;
float result=0;
for (i=0;i<n;i++)
  result += a[i]*b[i];

但是从数据局部性的角度来看,这很糟糕,尤其是当 n 很大或者如果 ab 在内存。在每次迭代中,我们交替从 ab 中获取值。有什么方法可以提高效率吗?

最佳答案

除非你很不幸 a 和 b 都映射到同一个缓存行,否则处理器几乎一直都在获取管道。数据非局部性和步幅在更大、更方形的阵列中可能是大问题,但在这里我认为您无需担心。

如果您交错 a 和 b 值,那么这两个 float 将适合 64 位机器上的单个提取,这可能会有所帮助(尽管内存对齐问题使此体系结构相关。)

关于c - 有没有办法在保持缓存局部性的同时计算标量积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11388979/

相关文章:

java - 软件工程面试内存分配

c++ - Unsigned Long Long - 奇怪的输出

c - 在lua中设置不同的内存分配函数

c - 我们什么时候需要 C 中的缓冲区?

html - 跨不同网站的相同 CSS 文件是否共享/缓存?

php - 如何使用 PHP 和 C 将大图保存在内存中?

ios - 使用 SDWebImage 将视频保存在缓存中

matrix - 常见运算的复数数组格式效率

python - 在多个图形上绘制一条线

Scipy 的数值微分