在OpenCL中,我有一个需要在复杂和真实数据上操作的内核。我可以在该调用正确的代码行中放置条件语句来处理此问题,或者我可以将两个内核来调用,然后将条件语句推出到我的呼叫代码。

这显然对可维护性不利,但是对性能是否重要?

有帮助吗?

解决方案

如果这只是一个条件陈述,就我的经验而言,至少在NVIDIA硬件上,性能差异绝对可以忽略不计。

基本上,只要所有(或大多数)工作项目遵循相同的代码路径,就可以。由于所采用的代码路径取决于您的情况下的内核参数,因此所有工作项目都遵循相同的路径。

其他提示

略微取决于条件位置。首先要可读性的代码,然后在测量它之后的性能并发现这是一个问题

例如。 kernel_for_rgb_image和kernel_for_abgr_image似乎是一种合理的用途,有效传输一些深内部环的不同内核可能是更大的维护头痛。

我认为最好的方法是实际尝试对两个变体进行基准测试。在某些情况下,已编译了多个条件块,即使仅执行其中一个块,也会导致性能较差。原因是GPRS(通用寄存器):编译器分配尽可能多的寄存器,最坏情况所需。

我可以提出这样的解决方案:具有单个内核函数,但具有编译时条件:

__kernel void work()
{
#if VAR
    // one code
#else
    // another code
#endif
}

然后,您需要将内核重新编译 true/false 设置 VAR 改变条件时。显然,对于编译器而言,它与两个内核没有区别,但是如果这些内核的一部分相同,则可以保持更好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top