используя прагму параллельно для построения - PullRequest
3 голосов
/ 22 декабря 2011

В моем коде 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;
     }

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

1 Ответ

1 голос
/ 22 декабря 2011

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

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

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

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

...