c++ openmp中的线程
Posted
技术标签:
【中文标题】c++ openmp中的线程【英文标题】:c++ threading in openmp 【发布时间】:2018-03-15 10:33:11 【问题描述】:您好,我在使用这个程序时遇到了困难,我应该依次遍历整个数据向量,并使用 openmp 并行地对其中的每个向量求和(并将总和存储在 solution[i] )。但是程序由于某种原因卡住了。我得到的输入向量并不多,但非常大(每个 2.5m 个整数)。知道我在做什么错吗? 下面是代码,ps:忽略未使用的minVectorSize参数:
void sumsOfVectors_omp_per_vector(const vector<vector<int8_t>> &data, vector<long> &solution, unsigned long minVectorSize)
unsigned long vectorNum = data.size();
for (int i = 0; i < vectorNum; i++)
#pragma omp parallel
unsigned long sum = 0;
int thread = omp_get_thread_num();
int threadnum = omp_get_num_threads();
int begin = thread * data[i].size() / threadnum;
int end = ((thread + 1) * data[i].size() / threadnum) - 1;
for (int j = begin; j <= end; j++)
sum += data[i][j];
#pragma omp critical
solution[i] += sum;
【问题讨论】:
When is the reduction needed?的可能重复 请停止发布我们的作业:cw.fel.cvut.cz/wiki/courses/b4b36pdv/tutorials/hw_02a 【参考方案1】:void sumsOfVectors_omp_per_vector(const vector<vector<int8_t>> &data, vector<long> &solution, unsigned long minVectorSize)
unsigned long vectorNum = data.size();
for (int i = 0; i < vectorNum; i++)
unsigned long sum = 0;
int begin = 0;
int end = data[i].size();
#omp parallel for reduction(+:sum)
for (int j = begin; j < end; j++)
sum += data[i][j];
solution[i] += sum;
这样的东西应该更优雅,效果更好,你能编译和评论它是否适合你
【讨论】:
作为一般规则,让 omp 为您分配工作负载更聪明,正如@Nicolas Cami 指出的那样并行化最外层循环。除非你有一些依赖可以防止这种情况发生 感谢您的回答,这实际上适用于我提到的输入,但我有一个后续问题,当我输入包含向量长度非常不同的数据时,它会运行 2 分钟但没有给出合理的输出,这是为什么呢?我知道对于这样的输入,这种方法不是最好的,但无论如何它应该给出正确的答案,对吧? 你的意思是“我”?但是如果 len(solution) != len(data) 这将是一个问题。如果 i 超出任一向量的范围,将导致未定义的行为。你能检查一下逻辑吗? 我的意思是:...当我输入 which...,ps: len(solution)==solution(data) 我可以保证 我只能在这里猜测。但我认为当 j >> i 时,你会看到很好的缩放。但是如果 i >> j 开销与工作量的关系将使这不可行。但是这里没有合理的输出就意味着错误的输出?以上是关于c++ openmp中的线程的主要内容,如果未能解决你的问题,请参考以下文章