使用OpenMP有效并行化双线性插值

时间:2015-04-10 01:53:41

标签: c openmp

我希望使用OpenMP并行化双线性插值,使输入数组的内存访问最少。在下面的代码中,对于输出数组中i和j的每次迭代,读取和处理根据经度和纬度值的输入数据。

  • input [20] [20] - 包含数据值的输入数组,例如2d中的{1,2,3,..,400}
  • lon [100] [100] - 水平轴中输出阵列中每个插值点的纵向位置不一定等距。例如。 {2.34,2.65,2.74 ...}
  • lat [100] [100] - 垂直轴上输出数组中每个插值点的纬度位置不一定等距。 {5.76,5.92,6.26 ...}
  • output [100] [100] - 包含插值的数组

void interpolate(float(* lon)[100],float(* lat)[100],float(* input)[20],float(* output)[100]) {

int i,j,floori,floorj;
float fractionj,fractioni;
for(j = 0; j < 100; j++)
{

    for(i = 0; i < 100; i++)
    {
        floori = lon[i][j];
        fractioni = lon[i][j] - floori;
        floorj = lat[i][j];
        fractionj = lat[i][j] - floorj;
        output[i][j] = (1.0-fractioni)*(1.0-fractionj)*input[floori][floorj] + fractioni*(1.0-fractionj)*input[floori+1][floorj] + (1.0-fractioni)*fractionj*input[floori][floorj+1] + fractioni * fractionj *input[floori+1][floorj+1];
    }
}

}

我需要以这样的方式划分工作:对于在输入[floori] [floorj]的块内使用lon和lat值指定的所有插值点,输入[floori + 1] [floorj],输入[floori] [floorj + 1],输入[floori + 1] [floorj + 1]应该转到一个线程,以便输入值只从内存中读取一次,以便为每个线程注册。

0 个答案:

没有答案