在我之前的问题中 Shared vectors in 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-**];
答案 0 :(得分:2)
从多个线程读取相同向量的元素不是问题。您的代码中没有同步,因此可以同时访问它们。
使用您正在使用的向量大小,您也不会遇到任何缓存问题,但是对于较大的向量,由于缓存访问模式,您可能会遇到一些缓慢的问题。在这种情况下,数字数据的单独副本将提高性能。
答案 1 :(得分:1)
更好的方法:
#include <vector>
int main(){
vector<double> numbers;
vector<double> results(10);
//write 25 values in vector numbers
for (int i =0; i<25; i++){
numbers.push_back(cos(i));
}
#pragma omp parallel for
for (int j = 0; j < 10; j++){
double x = 0; // make x local var
for(int k = 0; k < 25; k++){
x += 2 * numbers[j] * numbers[k] + 5 * numbers[j * k / 25];
}
results[j] = x; // no race here
}
return 0;
}
由于没有太多的工作要分享,它会很慢