我寫更少了以下原理計算代碼:信號中的OpenMP
#pragma omp parallel
{
#pragma omp for nowait
// Compute elements of some array A[i] in parallel
#pragma omp single
for (i = 0; i < N; ++i) {
// Do some operation with A[i].
// This time it is important that operations are sequential. e.g.:
result = compute_new_result(result, A[i]);
}
}
兩個計算A[i]
和compute_new_result
是相當昂貴的。所以我的想法是並行計算數組元素,並且如果任何線程獲得空閒,它就開始執行順序操作。很有可能啓動的數組元素已經被計算出來了,而其他的將由其他線程提供,並且仍然是第一個循環。
然而,爲了使這個概念的工作,我必須做到兩兩件事:
爲了讓OpenMP的分裂在另一種方式的循環,即兩個線程:線程1計算A[0]
,A[2]
,A[4]
和線程2:A[1]
,A[3]
,A[5]
等提供一些信令系統。我正在考慮一組標誌,表示
A[i]
已經被計算出來。然後compute_new_result
應該等待相應的A[i]
的標誌在繼續之前被釋放。
我會很高興爲任何提示如何實現這兩個目標。我需要該解決方案可以在Linux,Windows和Mac上移植。我正在用C++ 11編寫整個代碼。
編輯:
我已經找到了答案拳頭問題。看起來好像schedule(static,1)
條款已經足夠了#pragma omp for
指令。
不過,我還是想對第二個問題的優雅的解決方案......
做了[我]取決於所有A [J:J <我,或者只是在一些項目?這可能使我們有可能想出其他方法來實現這一目標。 – ChronoTrigger
我會看看進度條款。但是,我不明白這些任務可以如何幫助信號。我需要A的特定元素的信號,而不是計算它們的線程的結束。 –
A [i]依賴於A [i-1]。特別是他們是一些大矩陣,我首先需要計算,然後找到運算結果f(A [3] * f(A [2] * f(A [1] * f(A [0],I )))),其中f是一些已知函數。 –