在“Using OpenMP”一书中,是 C 中错误内存访问的一个例子,我认为这是我尝试并行化高斯算法的主要问题。
该示例如下所示:
k= 0 ;
for( int j=0; j<n ; j++)
for(int i = 0; i<n; i++)
a[i][j] = a[i][j] - a[i][k]*a[k][j] ;
所以,我确实理解为什么这会导致内存访问错误。在 C 中,二维数组按行存储,并且在每 i 步中,都会将新行从内存复制到缓存。
我正在尝试为此找到解决方案,但我没有得到很好的加速。我的尝试的影响很小。
有人可以给我一个提示我能做什么吗?
最简单的方法是交换 for 循环,但我想按列进行。
第二次尝试:
for( int j=0; j<n-1 ; j+=2)
for(int i = 0; i<n; i++)
{
a[i][j] = a[i][j] - a[i][k]*a[k][j] ;
a[i][j+1] = a[i][j+1] - a[i][k]*a[k][j+1] ;
}
根本没有任何区别。
第三次尝试:
for( int j=0; j<n ; j++)
{
d= a[k][j] ;
for(int i = 0; i<n; i++)
{
e = a[i][k] ;
a[i][j] = a[i][j] - e*d ;
}
}
多谢
问候 Stepp