в моем предыдущем вопросе Общие векторы в OpenMP было указано, что можно разрешить различным потокам читать и писать в общем векторе, если разные потоки обращаются к различным элементам вектора.Что, если разные потоки должны прочитать все (иногда одни и те же) элементы вектора, как в следующем случае?
#include <vector>
int main(){
vector<double> numbers;
vector<double> results(10);
double x;
//write 25 values in vector numbers
for (int i =0; i<25; i++){
numbers.push_back(cos(i));
}
#pragma omp parallel for default(none) \
shared(numbers, results) \
private(x)
for (int j = 0; j < 10; j++){
for(int k = 0; k < 25; k++){
x += 2 * numbers[j] * numbers[k] + 5 * numbers[j * k / 25];
}
results[j] = x;
}
return 0;
}
Будет ли это распараллеливание медленным, потому что только один поток за раз может прочитать любой элемент вектора или это не так?Могу ли я решить проблему с помощью предложения firstprivate(numbers)
?
Имеет ли смысл создавать массив векторов, чтобы каждый поток получал свой собственный вектор?
Например:
vector<double> numbersx[**-number of threads-**];