首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写多个内核或单个内核

编写多个内核或单个内核
EN

Stack Overflow用户
提问于 2012-03-01 02:46:41
回答 3查看 5K关注 0票数 6

假设我有两个大函数。是在单独的内核中编写它们并按顺序调用它们更好,还是只编写一个内核更好?(我不想读回数据,并在主机和设备之间强制形成表单)。如果我想多次调用内核,速度会怎么样呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-01 18:16:11

需要考虑的一件事是寄存器压力对硬件利用率和性能的影响。

一般来说,较大的内核具有较大的寄存器占用空间。典型的OpenCL设备(即GPU)的寄存器文件大小非常有限,而较大的内核可能导致较低的并发性(较少的并发翘曲/波前),较少的延迟隐藏机会,以及较差的整体性能。另一方面,内核启动开销在大多数平台上都很低,因此如果您的算法在执行的“阶段”之间没有大量的状态需要保存,那么使用多个内核的代价可能会相当低。

使用多个内核还有另一个好处--您可以免费获得所有工作单元之间的隐式同步。通常,这可以消除对原子内存操作和同步原语的需求,这些操作和同步原语会对代码性能产生负面影响。

最终的指南应该是测量的性能。对于这类事情,没有通用的经验法则。基准测试是唯一确定的方法。

票数 12
EN

Stack Overflow用户

发布于 2012-03-01 16:54:27

一般来说,这是一个(可能)稍微好一点的性能与代码的可靠性的问题。复制缓冲区是没有问题的,只要您将它们保持在相同的上下文中。例如,您可以将一个内核的一个输出缓冲区设置为下一个内核的输入缓冲区,这将不涉及任何复制。

票数 3
EN

Stack Overflow用户

发布于 2012-03-01 23:24:41

在OpenCL中编写代码的正确方法是将代码分成多个并行任务,每个任务都是一个内核。这就是说,每个"for loop“都应该是一个内核。有时,一个单一的CPU代码函数可能会导致OCL中的4个内核实现。

如果您需要在内核执行之间存储数据,只需使用OpenCL缓冲区,并且不要复制到主机(这解决了设备<->主机瓶颈)。

如果这两个函数处理不同的数据,您可以编写单个内核,但这取决于正在运行的操作的复杂性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9504828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档