我正在尝试使用我正在使用的程序并得到以下问题。 如果多个线程需要在同一个矢量上读取/写入,但是矢量的不同元素会损失性能吗?我感觉这就是我的程序在对其进行平滑处理时几乎没有得到更快的原因。看看下面的代码:OpenMP中的共享向量
#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循环可以快速完成并行,或者不同的线程必须等待对方,因为一次只有一个线程可以访问向量编号,尽管它们都读取了向量的不同元素?
与写操作相同的问题:我需要的关键编译或因为每个线程写入矢量结果的不同元素是没有问题? 我很高兴能得到每一个帮助,也很高兴知道是否有更好的方法来做到这一点(也许根本不使用向量,但简单的数组和指针等?) 我也读向量aren “T在某些情况下是线程安全的,建议使用指针:OpenMP and STL vector
非常感谢您的帮助!
他不调整向量的。 – eudoxos 2012-03-31 09:22:39
@eudoxos我意识到,从代码片段,我只是想确保有人提到,特别是因为他提出了一个事实,即STL矢量某些条件下不会 – SirGuy 2012-03-31 12:43:23
+1线程安全:它不会真的拿出在这里,但你必须记住特定向量的操作,如追加,调整大小等不是线程安全的,并可能会中断。但只要每个元素只由一个线程写入,只需操作矢量的元素就没有问题。 – 2012-03-31 15:35:14