在 GPU 上运行操作系统内核级计算是不是有意义?
Posted
技术标签:
【中文标题】在 GPU 上运行操作系统内核级计算是不是有意义?【英文标题】:Does it make sense to run OS kernel-level computations on a GPU?在 GPU 上运行操作系统内核级计算是否有意义? 【发布时间】:2011-07-11 15:50:44 【问题描述】:我注意到 GPU 可以有数百个内核,因此可以大大加快并行计算的速度。似乎在操作系统内核中,没有使用并行算法进行加速。
人们使用 OpenMP 以用户的速度进行并行计算,但为什么不在内核空间中呢?我猜操作系统内部有很多任务需要并行处理,例如处理多个网络连接和数据包、进行加密操作、管理内存、搜索?...一些防火墙通过匹配模式、面向研究的操作系统来过滤和监控网络流量还可以在运行程序之前对其进行分析,这既费时又可能是可并行的。
那么,为什么操作系统不使用 GPU 来提高其性能和吞吐量?在 GPU 上运行 OS 计算有意义吗?
【问题讨论】:
【参考方案1】:GPU 并行处理应用程序需要您运行完全相同的操作数百次。此外,您可以执行的操作受到限制 - 分支通常不是一种选择,也不是遍历指针链。
大多数内核操作不适合此模型;内核所做的大部分工作是通过指针管理资源,包括锁定。这根本不适合 GPU 模型。至于你引用的其他操作:
密码学:GPU 非常适合尝试破解密码,但这不是内核的工作。它通常运行一次加密操作一次。在这种情况下,CPU 速度要快得多,因为它只需要执行一次。 处理网络流量:数据包到达的时间不同,需要低延迟处理。 GPU 可能能够进行无状态防火墙处理,但您需要批量处理数据包并使其一次处理数百个数据包才能获得好处 - 这会损害延迟和抖动,所以这项工作留给了 CPU。此外,有状态跟踪需要对连接跟踪表的共享锁定访问,这是 GPU 无法做到的。 管理内存:这是一个带有大量锁定的指针繁重的操作,因此即使是 GPU 也不太适合。此外,延迟至关重要,将作业发送到 GPU 意味着大量延迟。 搜索:现代操作系统内核不搜索。这是用户空间的工作 - 而且,这是一项非常繁重的工作。GPU 非常适合数学内核,其中吞吐量是最重要的,而延迟是一个小问题 - 数值模拟之类的东西。一般来说,它们不太适合数据管理,或者延迟很关键的地方——这正是操作系统内核所做的事情。这就是操作系统通常不使用 GPU 加速的原因。
操作系统内核可以并且确实使用了其他类型的硬件加速 - 一些机器具有专门设计用于快速进行一次性加密计算的特殊加密硬件内核。这些可以被内核很好地利用,因为它们更适合内核面临的特定问题。
【讨论】:
谢谢,我同意延迟是 GPU 计算的弱点。 PacketShader 软件声称有数百微秒的延迟,不确定这是否仍然很慢?密码学,我不知道文件服务器是否使用加密的 fs/disk,GPU 可能有助于这种情况。关于指针,CUDA 4.0 似乎有一个统一的内存地址空间,不仅包括多个 GPU 内存,还包括主内存,不是吗?我很好奇为什么人们不将有用的功能放入内核,尤其是安全方面,我认为内核是我们唯一可以信任的东西...... 我们可以信任内核,因为人们尽可能少地投入其中:) 即使服务器使用加密磁盘,将单个扇区发送到 GPU 进行解密比在 CPU 上进行解密要慢。很难批处理足够多的操作以使 GPU 的并行性有用。即使你有统一的地址空间,GPU 也根本不是为多指针寻址阶段而构建的。再一次,内核中的典型操作不适合利用 GPU 的优势,因此它们充分发挥了 GPU 的劣势。【参考方案2】:您认为内核不并行化的印象是错误的。现代内核已经很好地适应了多核/多线程 CPU,并且在这方面以“并行”方式处理几乎所有事情。
就 GPU 而言,它们可以从 CPU 处理的指令非常不同。尤其适用于矢量浮点计算。 Linux 内核基本上从不使用这种操作。例外情况是加密和一些可以很好地适应向量类型操作的突袭代码(可能还有其他,但仍然非常有限)。
因此,一般来说,内核本身实际上并不需要 GPU 提供的那种操作。在需要它们的时候,您会发现现代 CPU 内核包括特定指令集(如 SSE、AES-NI 等)或专用协处理器/卸载引擎(同样用于加密和 raid 计算、网络数据包校验等) ...)。
【讨论】:
我认为现代 CPU 没有足够的内核来支持操作系统的并行处理。操作系统内核可以处理具有不同内核的多个网络队列,但队列的数量受#cores 的限制。这将限制可扩展性和吞吐量。我注意到有一个关于 GPU 网络的项目:PacketShader。它在 GPU 上查找 IP 转发,速度非常快。另一个问题是处理多个请求并不是并行处理的全部。在像 OpenMP 这样的并行计算中,更常见的是对单个请求进行分区并在每个内核上处理小任务。【参考方案3】:现代 GPU 不仅可以用于图形处理;他们也可以运行通用程序。虽然并不适合所有类型的程序,但它们在可以利用其高度并行性的代码上表现出色。大多数所谓的“通用 GPU”(GPGPU)计算的使用已经超出了系统软件的范围。然而,最近关于软件路由器和加密网络连接的工作已经给出了如何将 GPGPU 应用于操作系统领域内更传统的任务的示例。这些用途只是表面上的。可以利用 GPU 的系统级任务的其他示例包括通用密码学、模式匹配、程序分析和基本常用算法的加速。
引用自https://code.google.com/p/kgpu/
【讨论】:
【参考方案4】:是的,我同意马特的观点。当今计算世界的瓶颈是运行在虚拟线程上的操作系统。这在用户空间中创造了需求,用于创建使用 GPU 的应用程序。然而内核仍然按顺序运行操作系统。例如,搜索操作被集成为操作系统特性,它顺序检查文件系统表,或者通过索引然后使用二进制搜索算法进行搜索。这两种操作都很耗时。为什么不将部分文件系统表发送到 GPU 并分叉搜索操作。在处理级别,大多数操作系统操作只是算术和逻辑计算,但这些操作等待 CPU。这里涉及的问题是从 CPU 到 GPU 再到 CPU 发送和接收操作/内存所涉及的延迟。需要进行大量研究来减少这种延迟。 但实际上这里的问题不是硬件延迟(CPU和GPU之间),而是操作系统估计这个延迟。操作系统必须估计延迟并决定是 CPU 处理更好还是 GPU 处理更好。这又取决于硬件平台。这些问题都可以解决和研究。它只需要操作系统公司的巨额研究投入。
【讨论】:
以上是关于在 GPU 上运行操作系统内核级计算是不是有意义?的主要内容,如果未能解决你的问题,请参考以下文章
运行一百万次扫描的 hbase mapreduce 作业是不是有意义?