2011-04-27 31 views
1

如果並行執行多行代碼,如果它們不相互依賴,最好的方法是什麼? (我使用OpenMP)並行化一系列獨立的代碼行

僞代碼:

database->connect() 
openfile("stuff.txt") 
ping("stackoverflow.com") 
x = 2; 
y = a + b; 

我能想出的唯一辦法是:

#pragma omp parallel for 
for(i = 0; i < 5; i++) 
switch (i) { 
case 0: database->connect(); break; 
... 

我還沒有嘗試過,但我還記得你不應該break,而使用OpenMP

+3

分別這些單個線的如此緩慢,他們需要並行?從「線程」的角度思考這個問題;你是否想要在每個線上作爲一個函數啓動每一行?這樣做有很大的開銷。 – chrisaycock 2011-04-27 15:43:06

+1

我同意chrisaycock。對於你正在做的少量工作來說,開銷會非常高。如果您真的想嘗試一下,請查看OpenMP部分指令。 – ejd 2011-04-27 16:51:07

+0

更多的假設性問題。 – Mikhail 2011-04-27 18:35:20

回答

0

所以我假設你列爲獨立任務的個人事物只是例子。如果他們真的像y=a+b那樣,那麼就像@chrisaycock和@ejd所說的那樣,它們對於這種並行性來說太小了(例如,基於線程的,而不是ILP或某種東西),以便實際利用由於開銷導致的併發性。但是,如果他們是更大的操作,做基於任務的並行OpenMP中的方法是用task指令:例如,

#include <stdio.h> 
#include <omp.h> 
#include <unistd.h> 

void work(int *v) { 
    *v = omp_get_thread_num(); 
    sleep(1); 
} 

int main(int argc, char **argv) 
{ 
    int a, b, c; 
    #pragma omp parallel 
    { 
     #pragma omp single 
     { 
      #pragma omp task shared(a) default(none) 
      work(&a); 

      #pragma omp task shared(b) default(none) 
      work(&b); 

      #pragma omp task shared(c) default(none) 
      work(&c); 
     } 
    } 
    printf("a,b,c = %d,%d,%d\n", a, b, c); 

    return 0; 
} 
+3

我建議部分,因爲我不知道你使用的是什麼編譯器。如果您的編譯器支持OpenMP V3.0,那麼您也可以嘗試任務 - 儘管它們在大多數實現中比部分開銷更多。 – ejd 2011-04-27 17:58:07