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; } 显然,实际程序执行的操作要昂贵得多,但这个例子应该如此 与写操作相同的问题:我是否需要关键编译指示或者没有问题,因为每个线程写入向量结果的不同元素? 非常感谢你的帮助! 解决方法
我想大多数线程中的向量问题都是如果它必须调整大小,然后它将向量的全部内容复制到内存中的新位置(一个更大的已分配块),如果你并行访问它然后你只是试图读取一个已被删除的对象.
如果你没有调整数组的大小,那么我从来没有遇到过对向量的并发读写的任何麻烦(显然,只要我没有写两次相同的元素) 至于缺乏性能提升,openmp临界区将使程序速度降低到可能与仅使用1个线程相同(取决于在关键部分之外实际完成的程度) 您可以删除关键部分声明(考虑上述条件). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |