OpenMP Упорядоченное Распараллеливание - PullRequest
3 голосов
/ 08 августа 2011

Я пытаюсь распараллелить следующую функцию (псевдокод):

vector<int32> out;
for (int32 i = 0; i < 10; ++i)
{
    int32 result = multiplyStuffByTwo(i);

    // Push to results
    out.push_back(result);
}

Когда я теперь распараллеливаю цикл for и определяю часть push_back как критический путь, я сталкиваюсь с проблемой, что (конечно) порядок результатов в out не всегда правильный. Как я могу заставить потоки выполняться выполнять код в правильном порядке в последней строке цикла for? Спасибо!

Ответы [ 2 ]

8 голосов
/ 08 августа 2011

Вы можете установить размер вектора выхода, вызвав out.resize (), а затем установить значение по индексу, а не по push_back ()

Псевдокод:

vector<int32> out; out.resize(10);
for (int32 i = 0; i < 10; ++i)
{
   int32 result = multiplyStuffByTwo(i);

   // set the result
   out[i] = result;
}

Но я бы рекомендовал использовать «классические» массивы.Они намного быстрее и ими не сложнее управлять

1 голос
/ 08 августа 2011
vector<int32> out;

#pragma omp parallel for ordered 
for (int32 i = 0; i < 10; ++i)
{
    int32 result = multiplyStuffByTwo(i); // this will be run in parallel

    #pragma omp ordered
    // Push to results
    out.push_back(result); // this will be run sequential
}

Это может быть полезно:

http://openmp.org/mp-documents/omp-hands-on-SC08.pdf

...