openmp

时间:2018-03-15 10:33:12

标签: c++ multithreading openmp

你好我正忙着这个程序,我应该顺序通过整个数据向量并使用openmp并行地总结那里的每个向量(并将总和存储在解决方案中[i] )。但程序因某种原因而陷入困境。我给出的输入向量并不多,但非常大(如每个2.5m整数)。知道我做错了什么吗? 这是代码,ps:igone未使用的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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分: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;
}
}

这样的东西应该更优雅,效果更好,你能编译和评论,如果它适合你或不是