是否有可能在二维数组的一个空间列中有一个常数?

本文关键字:空间 一个 有一个 常数 有可能 二维数组 是否 | 更新日期: 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倍的加速