c - 使用 C 在 OpenMP 中执行后合并数据以打印
问题描述
我正在使用 OpenMP 在多个线程中运行一个函数。该函数返回一个MyStruct
变量,如下所示:
typedef struct
{
int elements[8];
uint64_t score;
} MyStruct;
在一个#pragma omp parallel
部分中运行函数后,我得到p
MyStruct
变量,其中p
是线程数(注意这些是每个线程的私有变量)。
此时,我可以打印所有这些MyStruct
变量并直观地寻找具有最大 的变量score
,但我觉得这不够优雅。
如何从所有这些MyStruct
变量中选择得分最高的变量并仅打印该变量?
解决方案
您可以定义用户定义的归约来完成此任务,作为并行区域连接操作的一部分:
#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 或更高版本的编译器。
推荐阅读
- c# - 使用 Aggregate 获取多个大于某个值的整数
- ios - 如何正确配置我的 iOS 应用程序以使用 Firebase 本地模拟器套件?
- c++ - 使用 SFML 对象时 C++ 单元测试失败
- python - x:5,这是什么声明?
- python - KeyError - 字典值/键
- docker - Docker 看不到 $ 符号
- pdf - 在浏览器中查看 PDF 时会改变颜色 - 来自 wordpress 网站
- python - 将 Unix 格式日期(来自 yfinance)的 Pandas 数据框列转换为日期时间格式时出现问题
- ios - 将 UITableView 从 animation:YES 更改为 animation:NO 会导致看似无关的警告消息。如何避免这种情况?
- eloquent - 如何在 Laravel 8 中获取扩展类的第一个对象