gpt4 book ai didi

multithreading - 制作基本 OpenMP 类库的最简单方法

转载 作者:行者123 更新时间:2023-12-03 08:02:19 25 4
gpt4 key购买 nike

我想制作一个具有 OpenMP 一些非常基本功能的基本库。例如,只是为了能够编写如下代码。我想知道如何使用 LLVM 和 pthreads 来完成此任务。我想有两个步骤:

  1. 预处理以确定并行任务(并行与并行-for)
  2. 将适当的代码块转换为 pthread 所需的 void* 函数
  3. 自动创建、运行和加入线程

示例代码:

#Our_Own parallel
{
printf("hello");
}

#Our_Own parallel for
for (int i =0; i < 1000; i++)
{
printf(i);
}

最佳答案

在 C++ 中无需使用编译指示来实现并行循环(或任务)。您可以在 Threading Building Blocks 的实现中看到这一点(待定),或 Kokkos ,两者都提供并行性而不使用编译指示。因此,无需进行任何编译器修改即可执行此操作!

这里的关键观察是,C++ 提供了 lambda,它允许您将一段代码抽象为匿名函数,并从上下文绑定(bind)适当的变量,以便稍后可以在其他线程中调用它。

即使您确实想要映射到编译指示,例如提供您自己的“改进”版本的 OpenMP,您也可以通过使用 _Pragma 来实现,而无需使用 C 宏以外的任何内容。指令,可以放置在宏中,如下所示:-

#include <stdio.h>
#include <omp.h>

#define STRINGIFY1(...) #__VA_ARGS__
#define STRINGIFY(...) STRINGIFY1(__VA_ARGS__)

#define MY_PARALLEL _Pragma("omp parallel")

#define my_threadID() omp_get_thread_num()

int main (int, char **)
{
MY_PARALLEL
{
printf ("Hello from thread %d\n", my_threadID());
}
return 0;
}

但是,我们对您真正想要实现的目标以及在什么背景下一无所知:

  • 既然 OpenMP 实现几乎都位于 pthread 之上,为什么需要不同的东西?
  • 这适用于哪种语言? (C、C++、其他?)
  • 避免使用现有实现(例如 TBB、RAJA、Kokkos、C++ Parallel Algorithms)的原因是什么?

请记住,“最好的代码是我不必编写的代码”。

(P.s.如果您想了解正在执行的任务类型,请查看 Little OpenMP runtime,它实现了部分(不是全部)CPU OpenMP 要求,以及 the associated book。)

关于multithreading - 制作基本 OpenMP 类库的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73597089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com