gpt4 book ai didi

c++ - OpenMP 中的共享 vector

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:48 26 4
gpt4 key购买 nike

我正在尝试并行化我正在使用的程序并遇到以下问题。如果多个线程需要在同一个 vector 但 vector 的不同元素上读/写,我会失去性能吗?我觉得这就是我的程序在并行化后几乎没有变得更快的原因。采取以下代码:

#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 循环是否可以快速且完全并行地完成,或者不同的线程是否必须相互等待,因为一次只有一个线程可以访问 vector 编号,例如,尽管它们都在读取 vector 的不同元素?

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

非常感谢您的帮助!

最佳答案

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

如果您没有调整数组的大小,那么我从来没有遇到过对 vector 进行并发读写的任何问题(很明显,只要我没有写两次相同的元素)

至于缺乏性能提升,openmp 临界区会使您的程序减慢到可能与仅使用 1 个线程相同(取决于在该临界区外实际完成了多少)

您可以删除关键部分语句(考虑到上述条件)。

关于c++ - OpenMP 中的共享 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com