OpenMP 2中的共享矢量
Shared vectors in OpenMP 2
在我之前的问题中OpenMP中的共享矢量有人指出,只要不同的线程访问向量的不同元素。如果不同的线程必须读取一个向量的所有(有时是相同的)元素,比如下面的情况,该怎么办?
#include <vector>
int main(){
vector<double> numbers;
vector<double> results(10);
double x;
//write 25 values in vector numbers
for (int i =0; i<25; i++){
numbers.push_back(cos(i));
}
#pragma omp parallel for default(none)
shared(numbers, results)
private(x)
for (int j = 0; j < 10; j++){
for(int k = 0; k < 25; k++){
x += 2 * numbers[j] * numbers[k] + 5 * numbers[j * k / 25];
}
results[j] = x;
}
return 0;
}
这种并行化会很慢吗?因为一次只有一个线程可以读取向量的任何元素,还是事实并非如此?我能解决条款firstprivate(numbers)
的问题吗?
创建一个向量数组,让每个线程都有自己的向量,这有意义吗?
例如:
vector<double> numbersx[**-number of threads-**];
从多个线程中读取同一向量的元素不是问题。代码中没有同步,因此它们将被并发访问。
根据您正在处理的向量的大小,您也不会有任何缓存问题,尽管对于较大的向量,由于缓存访问模式,您可能会遇到一些速度减慢的问题。在这种情况下,数字数据的单独副本将提高性能。
更好的方法:
#include <vector>
int main(){
vector<double> numbers;
vector<double> results(10);
//write 25 values in vector numbers
for (int i =0; i<25; i++){
numbers.push_back(cos(i));
}
#pragma omp parallel for
for (int j = 0; j < 10; j++){
double x = 0; // make x local var
for(int k = 0; k < 25; k++){
x += 2 * numbers[j] * numbers[k] + 5 * numbers[j * k / 25];
}
results[j] = x; // no race here
}
return 0;
}
这将是缓慢的,因为没有太多的工作来共享
相关文章:
- 从python调用openMP共享库时,未定义opnMP函数
- OpenMP 任务看不到共享变量的更改
- 读/写 OpenMP 中的共享向量会减慢程序速度
- 共享或私有 openmp 代码中的结构化类型变量
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- OpenMP:共享同一算法的单线程和多线程实现
- OpenMP 环路阵列访问中的错误共享
- 在C 中使用OpenMP共享子句
- OpenMP并行区域中的std::vector push_back会导致错误共享吗
- Eigen & OpenMP : 由于错误共享和线程开销,没有并行化
- 为什么 openMP 取消构造不取消工作共享区域
- OpenMP中类成员变量的数据共享属性
- OpenMP:为"共享"预先确定"共享"?
- 使用openmp创建共享锁
- 增加OpenMP中用于进度报告的共享循环计数器
- 在与 OpenMP 并行的嵌套 for 循环中写入共享数组(通过指针)如何产生错误的结果
- C++:OpenMP 共享内存保护
- 在 OpenMP 中使用共享数据结构而不是私有数据结构时的性能差异