OpenMP и разные векторы STL - PullRequest
0 голосов
/ 28 июня 2018

Это безопасно, как есть? Или нам нужно раскомментировать «критическую» прагму?

std::vector< std::vector<int> > vv(10);
#pragma omp parallel for
for (int i=0; i<10; ++i)
    for (int j=0; j<100; ++j)
        // Should we uncomment the following pragma?
        // #pragma omp critical
        vv[i].push_back(j);

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Краткий ответ

Краткий ответ: не раскомментируйте, это безопасно без критического раздела

Длинный ответ

Нет необходимости в критической секции, так как потоку эха предоставляется уникальное подмножество итераций из цикла for (есть разные стратегии, которые вы можете применять для их распределения). Для вас важно не иметь условий гонки, которые возникают, когда одновременное добавление элементов в один и тот же вектор (push_back не является поточно-ориентированным как таковым).

В вашем случае каждый поток всегда и только имеет доступ к своему набору векторов, так что нет никакой возможности, чтобы два потока записали один и тот же vector.

0 голосов
/ 28 июня 2018

Данный код безопасен как есть, потому что все потоки будут работать с различными элементами vv. std::vector является слабо поточно-ориентированным в том смысле, что вы можете одновременно работать с разными векторами по своему усмотрению.

...