Loops 在分解嵌套循环时,速度会惊人地减慢
为了加速我的并行代码,它涉及许多两级嵌套循环 我创建了一个整数数组,并按循环的顺序存储循环的索引,因此两级嵌套循环变成了一级大循环,以减少开销Loops 在分解嵌套循环时,速度会惊人地减慢,loops,for-loop,nested,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; } } k=0; 对于(int i=0;i循环并不昂贵。在循环内执行的操作非常昂贵。您创建了一个新的循环,该循环运行i*j次,因此最终执行内部代码的次数相同。因此
k = 0;
for (int i=0;i<n;++i)
{
for (int j=0;j<n;++j)
{
index[k][0] = i;
index[k][1] = j;
}
}
k=0;
对于(int i=0;i循环并不昂贵。在循环内执行的操作非常昂贵。您创建了一个新的循环,该循环运行i*j次,因此最终执行内部代码的次数相同。因此,您只为内部循环的开销节省了一小部分
你的新代码现在每次迭代都会访问内存。内存很慢。比你已经去掉的for循环的开销要慢得多
这就是为什么新版本比旧版本慢。为什么第一段代码从不修改k
?
#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;
}