我试图平行我正在使用的程序并得到以下问题.
如果多个线程需要在同一个向量上读取/写入但向量的不同元素,我会失去性能吗?我感觉这就是我的程序在平行化时几乎没有得到更快的原因.请使用以下代码:
如果多个线程需要在同一个向量上读取/写入但向量的不同元素,我会失去性能吗?我感觉这就是我的程序在平行化时几乎没有得到更快的原因.请使用以下代码:
#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
非常感谢你的帮助!