2011-04-27 2 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

Были каждый из этих отдельных линий настолько медленно, что они должны быть распараллеливание? Подумайте об этом с точки зрения «pthread»; вы хотите запустить каждую строку как функцию в отдельном потоке? Для этого есть огромные накладные расходы. – chrisaycock

+1

Я согласен с chrisaycock. Накладные расходы будут чрезвычайно высокими для небольшого количества работы, которую вы выполняете. Если вы действительно хотите попробовать, ознакомьтесь с директивой разделов OpenMP. – ejd

+0

Гораздо больше гипотетического вопроса. – Mikhail

ответ

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

Смежные вопросы