C++ Maps与openMP并行调度

C++ Maps与openMP并行调度,c++,multithreading,loops,openmp,multimap,C++,Multithreading,Loops,Openmp,Multimap,我正在尝试并行化一段代码,但存在一些问题,在共享映射中插入的关键部分在我的执行中造成了瓶颈。有一种并行插入的方法吗 第二个问题涉及如何在地图上使用openMP进行预定义次数的迭代。这是代码,我在Clion上使用g++-5 else if (PERF_ROWS <= MAX_ROWS && function_switch == false) { int array_dist_perf[PERF_ROWS]; int array_dist[MAX_ROWS];

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

第二个问题涉及如何在地图上使用openMP进行预定义次数的迭代。这是代码,我在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;
    }
}
else if(性能行秒;
对于(int k=0;k
在OpenMP4中(应该由g++5支持),可以定义自己的缩减。 我不想做一些不必要的重复,所以请看以下答案:


如果我正确理解您的问题,您可以使用订单和时间表(静态、chuncksize)其中chunksize是线程得到的迭代次数。

问题是我必须使用有序映射,而不是向量。OpenMP似乎无法并行调度有序多重映射中的插入,除非我将此操作标记为关键操作。我也可以对映射使用相同的缩减?无论如何,谢谢你的回答。好的理解这个概念,但我实际上不知道如何声明映射中插入的减少。对于第二部分,我不是指每个线程的迭代次数,我只是指映射上的总迭代次数,以避免中断。我现在没有尝试,因为我现在使用的是MVSC,但为什么它不是pos可以在示例中使用映射更改std::vector吗?我不知道如何完成这个#pragma omp declare reduction(merge:std::multimap:…)然后是你想要减少的操作,在你的例子中是insert。你想在哪里插入一些东西?在你的输出中。所以写omp_out.insert(omp_in.begin(),omp_in.end())为什么你要使用
调度(动态)
?你的迭代工作负载对我来说似乎没有太大的变化。另外:你正在执行“提前退出”(代码中断)。您应该使用OpenMP4的
取消
取消点
机制-否则,代码的行为未定义。我正在使用计划(动态)对于让我跳过一些迭代的继续部分。我使用break是因为我不知道如何在地图上迭代任意次数,而不是从开始到结束。但是你是对的@KlaasvanGend在地图循环中可以避免使用dynamic…但是你说的取消/取消点是什么意思?对不起,这是我的第一天openmp。@CIV89参见e.g..tomp中有一个特定的
cancel
子句将触发提前退出。要使其他线程跟随退出,请定义取消点,请参阅。