我有一個數字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)? –