2011-12-21 2 views
3

В моем коде VS2010 C я успешно использую директиву ргадта здесь:использование прагмы параллельно для конструкции

void doSomething(void) 
{ 
    n = doSomethingElse(); 
    j = doOnceMore(); 
    k = n + j; 
} 

    #pragma omp parallel for 
    for (i = 0; i < 5; ++i) 
    { 
     doSomething(); 
    } 

Но я не могу заставить его работать, если я перееду работу «DoSomething()» инлайн:

#pragma omp parallel for 
    for (int i = 0; i < 5; ++i) 
    { 
     n = doSomethingElse(); 
     j = doOnceMore(); 
     k = n + j; 
    } 

Я всегда предполагал, что директива pragma возьмет материал внутри скобок и назначит ему уникальную нить. Неужели я ошибаюсь в этом, или есть какой-то другой синтаксис omp, который я должен использовать?

ответ

1

n, j, k по умолчанию нить разделена, поэтому она не работает. Каждый поток записывает на n, j, k в одно и то же время, в настоящее время.

Это зависит от того, что вы хотите, независимо от того, должны ли они быть частным или общим. Если они являются локальными для одного прохода цикла, вы можете объявить их как поток private, и он должен работать нормально (счетчик циклов, здесь i, по умолчанию является личным).

#pragma omp parallel for private(n,j,k) 
for (int i = 0; i < 5; ++i) 
{ 
    n = doSomethingElse(); 
    j = doOnceMore(); 
    k = n + j; 
} 

Поскольку openmp не может догадаться, какие целевые переменные имеют, ваша задача - сказать прагме, как обращаться с ними. Вы найдете дополнительную информацию о Клаузе и Переменных here. Существует также очень хорошее talk на openmp webpage о структурах данных и построении надлежащих параллельных областей.

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