首页 > 解决方案 > 使用 C 在 OpenMP 中执行后合并数据以打印

问题描述

我正在使用 OpenMP 在多个线程中运行一个函数。该函数返回一个MyStruct变量,如下所示:

typedef struct 
{
     int elements[8];
     uint64_t score;

} MyStruct;

在一个#pragma omp parallel部分中运行函数后,我得到p MyStruct变量,其中p是线程数(注意这些是每个线程的私有变量)。

此时,我可以打印所有这些MyStruct变量并直观地寻找具有最大 的变量score,但我觉得这不够优雅。

如何从所有这些MyStruct变量中选择得分最高的变量并仅打印该变量?

标签: copenmp

解决方案


您可以定义用户定义的归约来完成此任务,作为并行区域连接操作的一部分:

#pragma omp declare reduction \
    (mymax:MyStruct:(omp_in.score > omp_out.score) ? omp_in : omp_out) \
    initializer(omp_priv = {.score = INT_MIN})

void example() {
    MyStruct s;

#pragma omp parallel reduction(mymax:s)
    {
        fill_struct_with_value(&s);
    }
}

我是从头顶写的,所以它可能会编译也可能不会编译,但大致的想法就在那里。

请注意,上述代码需要支持 OpenMP 4.0 或更高版本的编译器。


推荐阅读