c++ - map 和 openMP 并行调度

标签 c++ multithreading loops openmp multimap

我正在尝试并行化一段代码,但存在一些问题,共享映射中插入的关键部分在我的执行中造成了瓶颈。有没有办法并行化插入?

第二个问题是关于如何使用 openMP 在 map 上迭代预定义的次数。这是代码,我在 Clion 上使用 g++-5。

else if (PERF_ROWS <= MAX_ROWS && function_switch == false)
{
    int array_dist_perf[PERF_ROWS];
    int array_dist[MAX_ROWS];

    multimap<float, int> temp_map;

    #pragma omp parallel for schedule(dynamic) private(array_dist_perf) shared(temp_map)
    for (int i = 0; i < MAX_COLUMNS; i++)
    {
        if (i % PERF_CLMN == 1) continue;

        for (int j = 0; j < PERF_ROWS; j++) //truncation perforation
        {
            array_dist_perf[j] = abs(input[j] - input_matrix[j][i]);
        }

        float av = mean(PERF_ROWS, array_dist_perf);

        float temp_score = score_func(av);

        #pragma omp critical(map_update)
        temp_map.insert({temp_score, i});
    }

    map<float,int>::reverse_iterator rit;

    int iter = 0;

    #pragma omp parallel for schedule(dynamic) private(array_dist) shared(iter)
    for (rit=temp_map.rbegin(); rit!=temp_map.rend(); rit++)
    {
        int s = rit->second;

        for (int k = 0; k < MAX_ROWS; k++)
        {
            array_dist[k] = abs(input[k] - input_matrix[k][s]);
        }

        float av_real = mean(MAX_ROWS, array_dist);

        float score_real = score_func(av_real);

        rank_function(score_real, s);

        #pragma omp atomic
        iter++;

        if (iter == THRESHOLD_NUM)

            break;
    }
}

最佳答案

在 Open MP 4(应该由 g++5 支持)中,可以定义您自己的缩减。 我不想做一些不必要的重复,所以请看这个答案:C++ OpenMP Parallel For Loop - Alternatives to std::vector

如果我理解你的问题是正确的,你可以使用 order 和 schedule(static, chuncksize),其中 chunksize 是线程获得的迭代次数。

关于c++ - map 和 openMP 并行调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36622300/

相关文章:

c++ - 在不同函数内的类中使用静态映射 :

c++ - 获取 "error LNK2019: unresolved external symbol"

c++ - 编译时散列 C++0x

java - 同步速度非常慢

Java线程-我想按顺序生成数字,例如: 1, 2,3,4...等等(只有2个线程)

c++ - 从 C++ 中的文件加载的数组中获取输出

c++ - 实体组件系统 - 渲染方法

multithreading - pthread_cond_signal 不会立即解锁 pthread_cond_wait 线程

用于 ffmpeg 转换的 bash 脚本不循环

c++ - 带指针的基于范围的循环