Я пытаюсь распараллелить программу, которую использую, и получил следующий вопрос. Получу ли я потерю производительности, если несколько потоков должны читать/записывать один и тот же вектор, но разные элементы вектора? У меня такое чувство, что по этой причине моя программа почти не становится быстрее после ее парализованного выполнения. Возьмем следующий код:
#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
Большое спасибо за вашу помощь!