[英]Shared vectors in OpenMP 2
在我之前的问题中,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-**];
从多个线程读取相同向量的元素不是问题。 您的代码中没有同步,因此将同时访问它们。
使用您正在使用的向量大小,您也不会遇到任何缓存问题,但对于较大的向量,由于缓存访问模式,您可能会遇到一些缓慢的问题。 在这种情况下,数字数据的单独副本将提高性能。
更好的方法:
#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;
}
由于没有太多工作要分享,因此它会很慢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.