2012-05-13 21 views
0

我有如下一個C程序:如何使用openmp在c中執行一些for循環的任務並行化?

int a[10]; 
int b; 

for(int i = 0; i < 10; i++) 

    function1(a[i]); 
function1(b); 

現在我想並行功能功能1,所有這些11層()的調用。我如何使用openmp來做到這一點?

我已經試過

#pragma omp parallel sections 
{ 
#pragma omp section 
#pragmal omp parallel for 
for(int i = 0; i < 10; i++) 
    function1(a[i]); 
#pragma omp section 
function1(b); 
} 

但上面的代碼似乎並沒有工作。 編輯:請閱讀function1(b)作爲一些不同的功能,即功能2(b)。

+0

你至少可以告訴我們你嘗試過什麼,它是如何失敗:) – ScarletAmaranth

+0

@ScarletAmaranth,謝謝,我已經加了我的問題的努力。 – quartz

+0

「似乎不起作用」是什麼意思?發生了什麼/沒有發生?你如何編寫代碼? – Mat

回答

1

一種不依賴於OpemMP的簡單方法是將b添加到a陣列。
這樣,你有一個單一的循環並行。
只需製作a 11個整數,並將b的值放在最後一個。

在一個更一般的情況下(假設a的成員不是整數,而是更大的東西),您可能需要更改function1以獲取指針。然後建立另一個陣列,11個指針。設置10指向a的單元格,最後到b

在一個更普遍的情況下,b所要求的函數是不同的(可能具有完全不同的參數)。在這種情況下,你仍然可以使用一個循環:

for (i=0; i<11; i++) { 
    if (i<10) { 
     function1(a[i]); 
    } else { 
     function2(b); 
    } 
} 
+0

謝謝,我沒有完全提到我的環境,這是我的不好。其實第二個功能是一些不同的功能(比如說function2)。在這種情況下,我不能使用上述建議。 – quartz

+0

你還可以,它只是越來越醜。我會更新。 – ugoren

+0

簡直輝煌!非常感謝..它的工作! – quartz

1

最簡單的方法是使用parallel for編譯:

#pragma omp parallel for 
for(int i = 0; i < 10; i++) 
    function1(a[i]); 

請記住,你必須把此時,相應的開關,你的編譯器,以使OMP支持。例如,在GCC中,該開關是-fopenmp

+1

謝謝,但我也想並行化函數調用function1(b) – quartz

+0

@quartz:你不能「並行」一個單一的調用。您需要將該功能拆分爲可並行化的塊。 – Mat

+0

最後一次調用'function1'真的值得並行嗎?在那種情況下,爲什麼不將並行機制移動到該函數內? – Win32