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