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中的线程的主要内容,如果未能解决你的问题,请参考以下文章

C ++中OpenMP中的有序线程ID

C++:OpenMP 中的私有静态变量

在C++中使用openmp进行多线程编程

在 Openmp (C++) 中销毁线程

如何不等待 OpenMP 中的其他线程?

NodeJS:具有多线程的本机 C++ 模块(openmp)