繁体   English   中英

OpenMP 2中的共享向量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM