我尝试过这样做,但我不知道它是否正确,为了计算执行时间,有时它在代码中给出了0。
我首先创建了一个结构来存储要插值的点的所有坐标,我有一个要插值的点的表,所以我使用pragma parallel for执行for部分来插值所有的点。变量R1、R2和P是双变量,并在线程之间共享。
#pragma omp parallel for
for(i=0;i<N ; i++)
{
R1 = BilinearInterpolation(Table[i].x1, Table[i].Q11,Table[i].x2, Table[i].Q21,Table[i].x);
R2 = BilinearInterpolation(Table[i].x1, Table[i].Q12, Table[i].x2, Table[i].Q22,Table[i].x);
P = BilinearInterpolation(Table[i].y1, R1, Table[i].y2, R2, Table[i].y);
TableInter[i] = P;
}发布于 2021-01-06 13:03:58
#pragma omp parallel for
for(i=0;i<N ; i++)
{
R1 = BilinearInterpolation(Table[i].x1, Table[i].Q11,Table[i].x2, Table[i].Q21,Table[i].x);
R2 = BilinearInterpolation(Table[i].x1, Table[i].Q12, Table[i].x2, Table[i].Q22,Table[i].x);
P = BilinearInterpolation(Table[i].y1, R1, Table[i].y2, R2, Table[i].y);
TableInter[i] = P;
}代码的问题是R1、R2和P是由多个线程共享和更新的,因此您有一个争用条件。例如,一个线程可能正在更改P,而另一个线程则将P添加到TableInter[i]中。尽管如此,通过将这些变量声明为私有变量(即在并行区域中声明这些变量),或者使用OpenMP的private子句(#pragma omp parallel for private(R1, R2, P),您可以轻松地解决这个争用条件。
#pragma omp parallel for private(R1, R2)
for(i=0;i<N ; i++)
{
R1 = BilinearInterpolation(Table[i].x1, Table[i].Q11,Table[i].x2, Table[i].Q21,Table[i].x);
R2 = BilinearInterpolation(Table[i].x1, Table[i].Q12, Table[i].x2, Table[i].Q22,Table[i].x);
TableInter[i] = BilinearInterpolation(Table[i].y1, R1, Table[i].y2, R2, Table[i].y);
}只要BilinearInterpolation方法不修改线程之间的共享状态,这段代码就没有种族条件。
计算执行时间--有时它在代码中给我0,
要计算可以使用OpenMP函数wtime的时间,如下所示:
double start = omp_get_wtime();
// the code that you want to measure.
double end = omp_get_wtime();
printf("%f\n",end-start);https://stackoverflow.com/questions/65595876
复制相似问题