c - 如何在没有任何非标准库的情况下在 C 中进行多处理

标签 c parallel-processing multiprocessing opencl

<分区>

假设您想用 C 语言从头开始编写您自己的 Opencl 版本。您将如何着手去做? OpenCL 如何“在幕后”完成并行编程?它只是 pthreads 吗?

最佳答案

OpenCL涵盖很多功能,包括运行时 API 库、基于 C 的编程语言、该语言的库环境,以及可能支持多种实现的加载程序库。如果您想查看如何实现它的开源示例,Pocl , Clover , BeignetROCm存在。至少 Pocl 的 CPU 目标确实使用 pthreads,但 OpenCL 旨在支持将任务卸载到 GPU 等协处理器,以及使用 vector 操作,因此一个线程不一定运行一个工作项。

标题并未提及 OpenCL,但确实要求使用“标准”库。标准的伟大之处在于有很多可供选择的;例如,C 标准不提供多线程,也不保证多任务处理。多处理通常指的是在多个进程中运行(在例如 CPython 中,由于全局解释器锁,这是获得并发执行 Python 代码的唯一方法)。这可以通过 Unix 标准函数 fork 来完成。 .多线程可以使用 POSIX threads 完成(POSIX.1c 标准扩展)或 OpenMP .最新版本的 OpenMP 还支持加速器卸载,这正是 OpenCL 的设计目标。由于 OpenMP 和 OpenCL 提供受限和抽象的环境,原则上它们可以在许多其他环境(例如 CUDA)之上实现。

实现并行执行本身需要硬件知识和访问权限,并且通常是操作系统的领域; POSIX 线程通常是这方面的抽象层,例如使用clone在 Linux 上。

OpenMP 通常是将 C 程序转换为并行执行的最简单方法,因为许多编译器都支持它;您使用 pragmas 注释分支点并使用例如编译-GCC 的 fopenmp。如果在没有 OpenMP 的情况下编译,此类程序仍将像以前一样工作。

关于c - 如何在没有任何非标准库的情况下在 C 中进行多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57633170/

相关文章:

python - 并行处理单独模块中的函数

python - 多处理 : NULL result without error in PyObject_Call

c - 在 C 中释放二维数组

c++ - 使用 SSE 或 SSE3 在 ushort 数组中添加 uchar 值

C: freeRTOS 没有按预期工作

r - 如何并行化 while 循环?

syntax - 如何在 Fortran 中对数组使用归约?

python - Manager.Namespace() 内的多处理队列

c - 在头文件中为结构成员使用宏 #define 时无法编译 C 代码

c - 无法在屏幕上打印文件内容