我希望使用OpenMP并行化双线性插值,使输入数组的内存访问最少。在下面的代码中,对于输出数组中i和j的每次迭代,读取和处理根据经度和纬度值的输入数据。
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]应该转到一个线程,以便输入值只从内存中读取一次,以便为每个线程注册。