尝试加速涉及许多两级嵌套循环的并行代码
我创建了一个整数数组并按顺序存储了循环的索引,因此两级嵌套循环变成了一个级别的大循环,这应该可以减少开销。
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;
}
令我惊讶的是,代码放慢而不是加速,我不知道为什么?。
答案 0 :(得分:1)
循环并不昂贵。你在循环内做的很贵。你创建了一个新的循环,它运行i * j次,所以你最终执行内码相同的次数。所以你没有保存任何东西,只有一小部分内部循环的开销。
您的新代码现在可以访问每次迭代的内存。记忆很慢。比你已经摆脱的for循环的开销要慢得多。
这就是为什么你的新版本比旧版本慢。