假设你想用C语言从头开始编写自己的Opencl版本。你会怎么做?OpenCL 如何"在幕后"完成并行编程?只是线程吗?
OpenCL 涵盖了许多功能,包括运行时 API 库、基于 C 的编程语言、该语言的库环境,以及可能用于支持多个实现的加载器库。如果你想看看一个开源的例子,它是如何实现的,Pocl,Clover,Beignet和ROCm存在。至少Pocl的CPU目标确实使用pthreads,但OpenCL旨在支持将任务卸载到GPU等协处理器,以及使用矢量操作,因此一个线程不一定运行一个工作项。
标题不是指 OpenCL,但确实请求使用"标准"库。标准的伟大之处在于有很多可供选择;例如,C 标准不提供多线程,也不保证多任务处理。多处理通常是指在多个进程中运行(例如CPython,由于全局解释器锁,这是同时执行Python代码的唯一方法)。这可以通过Unix标准函数分支来完成。多线程可以使用POSIX线程(POSIX.1c标准扩展)或OpenMP来完成。最新版本的 OpenMP 还支持加速器卸载,这正是 OpenCL 的设计目的。由于OpenMP和OpenCL提供了受限和抽象的环境,因此原则上可以在许多其他环境(例如CUDA)之上实现它们。
实现并行执行本身需要硬件知识和访问,并且通常是操作系统的域;POSIX线程通常是这方面的抽象层,例如在Linux上使用克隆。
OpenMP 通常是将 C 程序转换为并行执行的最简单方法,因为它受到许多编译器的支持;您可以使用编译指示注释分支点并使用例如 -fopenmp for GCC 进行编译。如果在没有 OpenMP 的情况下编译,此类程序仍将像以前一样工作。
首先:OpenCL != 并行处理。这是它的优势之一,但它
还有很多。专注于您问题的一部分:
假设你想用 C 语言从头开始编写自己的 Opencl 版本。
首先:熟悉驱动程序开发。我们的 GPU CL 运行时与驱动程序密切相关。如果您想从头开始,则需要非常熟悉 PCIe 协议并挖掘一些关于切换引脚的记忆。这是可行的,但它体现了"非平凡"。
CPU级别的多线程是一个完全不同的问题,已经记录在阴阳中。使用您不必自己编写的操作系统的好处是,这已经为您处理好了。
只是线程吗?
您认为这些是如何实施的?它们的功能是规范的一部分,但它们的实现完全依赖于平台,您可以称之为"非标准"。线程的底层实现取决于操作系统(如果有,这不是给定的)、编译器和大量其他因素。
这是一个很好的问题。