我有一个数字bessel过滤器的实现,这是我的程序的性能瓶颈。我想用OpenMP并行化主循环。当循环迭代不独立时使用OpenMP并行化循环
该函数获取输入数组paddedsignal
和滤波器系数数组dcof
和ccof
,并生成一个临时数组temp
,该数组被过滤。这个过程的主循环是这样的:
for (i=order; i<end; i++)
{
temp[i] = ccof[0]*paddedsignal[i];
for (p=1; p<=order; p++)
{
temp[i] += ccof[p]*paddedsignal[i-p] - dcof[p]*temp[i-p];
}
}
尤其注意,temp[i]
价值取决于temp[i-p]
以前的值。这混淆了一个简单的#pragma omp for
指令,因为靠近数组各部分之间的边界的temp[i]
值将由不同线程处理,其竞争条件问题。基本上,如果线程1的索引在0-99之间,线程2的线程需要100-199,那么100的值将会是错误的,因为它将在它所依赖的值99之前计算。
有没有办法挽救这种情况?由于过滤值依赖于相邻值这一事实使得它本身就是一个串行计算,所以我很遗憾我能做些什么来平行化。有没有办法解决?
这是一个序列计算。让速度更快的唯一方法是获得更快的CPU。另一种可能是使用更适合并行执行的不同类型的过滤器。或者,如果要过滤的数据可以以某种方式进行批处理,则可以通过不同的线程筛选不同的批次。 – bazza
我认为批处理过滤将是要走的路 – KBriggs
内循环可能像[前缀总和问题](http://stackoverflow.com/a/35840595/2542702)? –