我应该创建多个OpenCL内核来避免条件语句吗?

时间:2010-11-05 19:26:01

标签: performance cuda opencl nvidia conditional-statements

在OpenCL中,我有一个需要对复杂和真实数据进行操作的内核。我可以在调用正确的代码行来处理这个条件语句,或者我可以调用两个内核并将条件语句推送到我的调用代码。

这显然不利于可维护性,但它对性能有意义吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

例如。 kernel_for_RGB_image和kernel_for_ABGR_image似乎是一个合理的用法,不同的内核有效地展开一些深层内循环可能是一个更大的维护难题。

答案 2 :(得分:0)

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

我可以建议这样一个解决方案:拥有单个内核函数,但编译时条件:

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

然后,您需要在更改条件时将true / false设置为VAR来重新编译内核。显然,对于编译器而言,它与两个内核没有区别,但是如果代码的一部分对于那些内核是相同的,那么维护可能会更好。