是否有研究比较 OpenCL 与 OpenMP 的性能?具体来说,我对使用 OpenCL 启动线程的开销成本感兴趣,例如,如果将域分解为大量单独的工作项(每个工作项由一个线程执行一项小工作),而 OpenMP 中的重量级线程则为该域被分解为子域,子域的数量等于核心的数量。
看来 OpenCL 编程模型更针对大规模并行芯片(例如 GPU),而不是具有更少但更强大内核的 CPU。
OpenCL 能否有效替代 OpenMP?
我见过的基准测试表明,在相同硬件上运行的 OpenCL 和 OpenMP 通常在性能上相当,或者 OpenMP 的性能稍好一些。然而,我还没有看到任何我认为具有决定性的基准,因为它们大多缺乏对其方法的详细解释。然而,有一些有用的事情需要考虑:
OpenCL 在运行时编译内核时总会有一些额外的开销。任何基准测试要么需要单独列出这个时间,要么使用预编译的本机内核,要么运行足够长的时间以使内核编译无关紧要。
OpenCL 的实现会有所不同。像 NVidia 这样的 GPU 供应商没有动力确保他们基于 CPU 的 OpenCL 实现尽可能快。没有一个 OpenCL 实现可能像良好的 OpenMP 实现一样成熟。
OpenCL 规范基本上没有提及基于 CPU 的实现如何在底层使用线程,因此任何关于线程是相对轻量级还是重量级的讨论都必然是特定于实现的。
当您在 CPU 上运行 OpenCL 代码时,您的工作项不必很小且数量众多。您可以按照与 OpenMP 相同的方式来分解问题。
即使 OpenCL 的开销更大,也可能有其他原因更喜欢它。
显然,如果您的代码可以充分利用 GPU,您将需要 OpenCL 实现。 CPU 上的 OpenCL 性能可能足够好,以至于不值得为没有强大 GPU 的用户维护 OpenMP 后备代码路径。
良好的基于 CPU 的 OpenCL 实现意味着您将自动受益于 CPU 和 OpenCL 实现支持的任何指令集扩展。使用 OpenMP,您必须做额外的工作以确保您的可执行文件包含 SSEx 和 AVX 代码路径。
OpenCL 向量原语可以帮助您表达一些显式并行性,而不会因使用 SSE 内在函数而牺牲可移植性和可读性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)