当分解嵌套循环时令人惊讶的减速



为了加速我的并行代码,其中涉及许多两级嵌套循环

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

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;
}

令我惊讶的是,代码变慢了,而不是加速,我不知道为什么

循环并不昂贵。你在循环中所做的是昂贵的。你创建了一个新的循环,它运行i*j次,所以你最终执行了相同次数的内部代码。所以你并没有为内循环节省任何开销。

您的新代码现在为每次迭代访问内存。内存很慢。比你去掉的for循环的开销要慢得多。

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

最新更新