【发布时间】:2012-04-14 18:48:43
【问题描述】:
我正在尝试并行化我正在使用的程序并得到以下问题。 如果多个线程需要在同一个向量但向量的不同元素上读/写,我会损失性能吗?我有一种感觉,这就是我的程序在并行化后几乎没有变得更快的原因。取以下代码:
#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
非常感谢您的帮助!
【问题讨论】:
标签: c++ performance stl openmp