Общие векторы в OpenMP

Я пытаюсь распараллелить программу, которую использую, и получил следующий вопрос. Получу ли я потерю производительности, если несколько потоков должны читать/записывать один и тот же вектор, но разные элементы вектора? У меня такое чувство, что по этой причине моя программа почти не становится быстрее после ее парализованного выполнения. Возьмем следующий код:

#include  

int main(){

    vector numbers;
    vector results(10);
    double x;

    //write 10 values in vector numbers
    for (int i =0; i<10; i++){
        numbers.push_back(cos(i));  
    } 

#pragma omp parallel for \
    private(x) \
    shared(numbers, results)
        for(int j = 0;  j < 10;  j++){

            x  =  2 * numbers[j]  +  5;  
#pragma omp critical  // do I need this ?
            {
                results[j]  =  x;     
            }
        }

    return 0;

}

Очевидно, что реальная программа выполняет гораздо более затратные операции, но этот пример должен только поясните мой вопрос. Так может ли цикл for выполняться быстро и полностью параллельно, или разные потоки должны ждать друг друга, потому что, например, только один поток за раз может получить доступ к номеру вектора, хотя все они читают разные элементы вектора?

Тот же вопрос с операцией записи: нужна ли критическая прагма или это не проблема, поскольку каждый поток записывает в другой элемент результатов вектора? Я доволен каждой помощью, которую я могу получить, а также было бы неплохо узнать, есть ли лучший способ сделать это (может быть, вообще не использовать векторы, а простые массивы, указатели и т. д.?) Я также читал, что в некоторых случаях векторы не являются потокобезопасными, и рекомендуется использовать указатель: Вектор OpenMP и STL

Большое спасибо за вашу помощь!

6
задан Community 23 May 2017 в 11:59
поделиться