是否有可能在二维数组的一个空间列中有一个常数?
本文关键字:空间 一个 有一个 常数 有可能 二维数组 是否 | 更新日期: 2023-09-27 18:16:52
我正在努力改善并行。在我的主要代码部分。这个循环包含主要的计算,每个输出需要执行超过100万次(我需要8000万次输出)。因此,即使是很小的改进也会对执行时间产生重大影响。我知道中频条件会降低并行计算的速度。而且,我知道特殊位置的一些主变量(U[I,j]和V[I,j])总是为零。因此,如果我可以为这些数组的特殊列指定常数零(不想在计算中改变),我可以从代码中消除if条件。
Before calculation:
| 1 1 1 0 1|
| 1 1 1 0 1|
| 1 1 1 0 1|
| 1 1 1 0 1|
After calculation:
| 3 1 8 0 5|
| 1 4 4 0 1|
| 7 3 1 0 8|
| 1 1 5 0 7|
我想有一个列,它的值总是保持零。
我如何为二维数组的空间列分配常数数(零)?
作为示例,前面提到的部分看起来像:double[,] U= new double[nx,ny];
double[,] V= new double[nx,ny];
Parallel.For(0,nx,i =>
{
For (j=0; j<ny ; j++)
{
if (i!=a && i!=b &&i!=c &&i!=d &&)
{
U[i,j]= ...; // A big chunk of calculations
V[i,j]=... ;// A big chunk of calculations
}
}
}
有趣的是,当我运行代码时,我发现它几乎使用了所有内核的20%。这是因为我的弱并行循环还是我应该手动分配循环使用的核心数量?
这难道不能有所改善吗?
Parallel.For(0,nx,i =>
{
if (i!=a && i!=b &&i!=c &&i!=d &&)
{
For (j=0; j<ny ; j++)
{
U[i,j]= ...; // A big chunk of calculations
V[i,j]=... ;// A big chunk of calculations
}
}
}
仅当i
不满足条件时计算内环。否则,你就只能等待了。
在单独的内核中计算边界,因为只有它们有"if"子句。然后计算没有任何if条件的内部。预期加速2倍。
//interior (dont include borders)
Parallel.For(1,nx-1,i =>
{
For (j=1; j<ny-1 ; j++)
{
U[i,j]= ...; // A big chunk of calculations
V[i,j]=... ;// A big chunk of calculations
}
}
//exterior 1
Parallel.For(xx,xx1,i =>
{
//another calculation
}
//exterior 2
Parallel.For(xx1,yy,i =>
{
//another calculation
}
//exterior 3
Parallel.For(yy,yy1,i =>
{
//another calculation
}
//exterior 4
Parallel.For(yy1,xx,i =>
{
//another calculation
}
使用c++ dll的内部循环有10倍的加速(SIMD),甚至opencl的gpgpu -> 30倍的加速