在解决嵌套循环时令人惊讶的减速

时间:2011-12-03 20:42:52

标签: loops for-loop nested

尝试加速涉及许多两级嵌套循环的并行代码

我创建了一个整数数组并按顺序存储了循环的索引,因此两级嵌套循环变成了一个级别的大循环,这应该可以减少开销。

k = 0;
for (int i=0;i<n;++i)
{
for (int j=0;j<n;++j)
{
index[k][0] = i;
index[k][1] = j;
}
} 

例如:

#pragma omp for 
for (int i=0;i<n;++i)
{
for (int j=0;j<n;++j)
{
a[i][j] = 2.0*i+3.0;
}
}

转向

#pragma omp for 
for (int k=0;k<n;++k)
{
i = index[k][0];
j = index[k][1];
a[i][j] = 2.0*i+3.0;
}

令我惊讶的是,代码放慢而不是加速,我不知道为什么?。

1 个答案:

答案 0 :(得分:1)

循环并不昂贵。你在循环内做的很贵。你创建了一个新的循环,它运行i * j次,所以你最终执行内码相同的次数。所以你没有保存任何东西,只有一小部分内部循环的开销。

您的新代码现在可以访问每次迭代的内存。记忆很慢。比你已经摆脱的for循环的开销要慢得多。

这就是为什么你的新版本比旧版本慢。