OpenMP 2中的共享矢量

Shared vectors in OpenMP 2

本文关键字:共享 OpenMP      更新时间:2023-10-16

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

这将是缓慢的,因为没有太多的工作来共享