<分区>
假设您想用 C 语言从头开始编写您自己的 Opencl 版本。您将如何着手去做? OpenCL 如何“在幕后”完成并行编程?它只是 pthreads 吗?
<分区>
假设您想用 C 语言从头开始编写您自己的 Opencl 版本。您将如何着手去做? OpenCL 如何“在幕后”完成并行编程?它只是 pthreads 吗?
最佳答案
OpenCL涵盖很多功能,包括运行时 API 库、基于 C 的编程语言、该语言的库环境,以及可能支持多种实现的加载程序库。如果您想查看如何实现它的开源示例,Pocl , Clover , Beignet和 ROCm存在。至少 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/