【发布时间】:2016-11-06 11:57:18
【问题描述】:
我正在尝试通过阻塞循环来提高缓存性能来加速矩阵乘法算法,但非阻塞版本无论矩阵大小、块大小如何都保持显着更快(我尝试了很多介于 2 和200、2 等的势能)和优化级别。
非阻塞版本:
for(size_t i = 0; i < n; ++i)
{
for(size_t k = 0; k < n; ++k)
{
int r = a[i][k];
for(size_t j = 0; j < n; ++j)
{
c[i][j] += r * b[k][j];
}
}
}
屏蔽版本:
for(size_t kk = 0; kk < n; kk += BLOCK)
{
for(size_t jj = 0; jj < n; jj += BLOCK)
{
for(size_t i = 0; i < n; ++i)
{
for(size_t k = kk; k < kk + BLOCK; ++k)
{
int r = a[i][k];
for(size_t j = jj; j < jj + BLOCK; ++j)
{
c[i][j] += r * b[k][j];
}
}
}
}
}
我还有一个 bijk 版本和一个 6-loops bikj 版本,但它们的性能都优于非阻塞版本,我不明白为什么会发生这种情况。我遇到的每篇论文和教程似乎都表明被阻止的版本应该更快。如果这很重要,我会在 Core i5 上运行它。
【问题讨论】:
-
什么编译器?有哪些优化设置?还有太多变数。
标签: c caching matrix-multiplication cpu-architecture