加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – OpenMP中的共享向量

发布时间:2020-12-16 05:58:02 所属栏目:百科 来源:网络整理
导读:我试图平行我正在使用的程序并得到以下问题. 如果多个线程需要在同一个向量上读取/写入但向量的不同元素,我会失去性能吗?我感觉这就是我的程序在平行化时几乎没有得到更快的原因.请使用以下代码: #include vector int main(){ vectordouble numbers; vecto
我试图平行我正在使用的程序并得到以下问题.
如果多个线程需要在同一个向量上读取/写入但向量的不同元素,我会失去性能吗?我感觉这就是我的程序在平行化时几乎没有得到更快的原因.请使用以下代码:
#include <vector> 

int main(){

    vector<double> numbers;
    vector<double> results(10);
    double x;

    //write 10 values in vector numbers
    for (int i =0; i<10; i++){
        numbers.push_back(cos(i));  
    } 

#pragma omp parallel for 
    private(x) 
    shared(numbers,results)
        for(int j = 0;  j < 10;  j++){

            x  =  2 * numbers[j]  +  5;  
#pragma omp critical  // do I need this ?
            {
                results[j]  =  x;     
            }
        }

    return 0;

}

显然,实际程序执行的操作要昂贵得多,但这个例子应该如此
只解释我的问题.那么for循环可以快速完全并行完成,还是不同的线程必须等待彼此,因为一次只有一个线程可以访问矢量号,尽管它们都是读取矢量的不同元素?

与写操作相同的问题:我是否需要关键编译指示或者没有问题,因为每个线程写入向量结果的不同元素?
我很满意我能得到的每一个帮助,也很高兴知道是否有更好的方法来做到这一点(可能根本不使用向量,但简单的数组和指针等?)
我也读过在某些情况下矢量不是线程安全的,建议使用指针:OpenMP and STL vector

非常感谢你的帮助!

解决方法

我想大多数线程中的向量问题都是如果它必须调整大小,然后它将向量的全部内容复制到内存中的新位置(一个更大的已分配块),如果你并行访问它然后你只是试图读取一个已被删除的对象.

如果你没有调整数组的大小,那么我从来没有遇到过对向量的并发读写的任何麻烦(显然,只要我没有写两次相同的元素)

至于缺乏性能提升,openmp临界区将使程序速度降低到可能与仅使用1个线程相同(取决于在关键部分之外实际完成的程度)

您可以删除关键部分声明(考虑上述条件).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读