void mul_pol( my_compl *p1, my_compl * p2, my_compl * pr,int m,int n)
{
int i,j,k;
float s;
#pragma omp parallel for private(k,pr) schedule (static)
for ( k =0; k <= m +n ; k ++){
pr[ k ].re=0;
pr[ k ].im=0;
}
#pragma omp parallel for private(i,j,p1,p2,m,n) schedule (static)
for ( i =0; i <= m ; i ++)
for ( j =0; j <= n ; j ++)
{
{
pr[ i + j ].re += p1[ i ].re* p2[ j ].re;
pr[ i + j ].re -= p1[ i ].im* p2[ j ].im;
pr[ i + j ].im += p1[ i ].re* p2[ j ].im;
pr[ i + j ].im += p1[ i ].im* p2[ j ].re;
}
}
// #pragma omp barrier
}
在下面的程序中,我的执行时间很短,但由于竞争条件输出不准确。请有人建议除了还原条款如何改进代码。我也尝试了关键条款。虽然关键的结果很差。
答案 0 :(得分:0)
我猜竞争条件来自第二个循环嵌套,因为i
和j
的不同组合具有相同的总和。解决问题的最佳方法可能是消除数据竞争。关于如何做到这一点有一些变化,但首先考虑的是涉及使第二个嵌套的外部循环遍及pr
的索引,而内部循环遍及{的索引。 {1}}或p1
的{1}}。这样,p2
的每个元素都将被一个线程修改。
因为该修改导致外部循环的不同迭代需要不同的工作量,所以您可以考虑切换到动态线程调度。但是,不要假设您需要动态调度 - 工作量变化的常规方式可能会使静态调度在整个计算过程中保持平衡。
例如,
pr