假設我有以下一個在內部使用#pragma omp parallel
的功能。如何將OpenMP線程拆分爲一個循環的子工作流
void do_heavy_work(double * input_array);
我現在想do_heavy_work
許多input_arrays
這樣的:
void do_many_heavy_work(double ** input_arrays, int num_arrays)
{
for (int i = 0; i < num_arrays; ++i)
{
do_heavy_work(input_arrays[i]);
}
}
比方說,我有N
硬件線程。上面的實現會導致調用do_heavy_work
以串行方式發生,每個使用內部的所有N
線程執行任何想要的並行任務。
現在假定當num_arrays > 1
與其在內部平行於do_heavy_work
時實際上在此外部循環上並行效率更高。我現在有以下選擇。
- 把
#pragma omp parallel for
放在外環上並設置OMP_NESTED=1
。但是,通過設置OMP_NUM_THREADS=N
,我將最終產生大量的線程(N*num_arrays
)。 - 同上,但關閉嵌套並行。當
num_arrays < N
時,這會浪費可用核心。
理想我想的OpenMP它的OMP_NUM_THREADS
線程隊分成num_arrays
工作小組,然後,如果給出了一些每個do_heavy_work
可以跟帖超過其分配的工作小組。
實現此目的的最簡單方法是什麼?
(爲了討論的目的,讓我們假設num_arrays
不一定事先知道,而且也是我無法改變的代碼do_heavy_work
本身。該代碼將可以在多臺機器的工作,所以N
應該是自由定的。)
謝謝!我沒有意識到omp_set_num_threads()僅影響當前線程的上下文。 – Saran