OpenMP 2中的共享向量

时间:2012-04-01 19:04:43

标签: c++ performance stl openmp

在我之前的问题中 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-**];

2 个答案:

答案 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;

}
由于没有太多的工作要分享

,它会很慢