0

在 OpenCL C 内核代码中,默认的内置函数很好,但用户定义的函数呢?与内置的相比,它们是否有任何性能和内存下降?如果是这样,在 __kernel void 中编写上述用户定义函数一次或多次是否更好?

例如:-

gentype clamp ( gentype x,
gentype minval,
gentype maxval)

以上是一个内置函数,对性能没有影响,也不会减少gpu l0/l1缓存内存

通过用户定义的函数,我的意思如下

int Add(int a, int b)
{
   return a + b;
}

这些函数是否对 l0/l1 内存有任何影响,如果是,那么最好不要将这些函数编写为函数,而是在任何地方使用代码?

4

1 回答 1

3

我通常内联所有函数,除非它们很长并且在内核中被多次调用。例如

float __attribute__((always_inline)) sq(const float x) {
    return x*x;
}

用于计算 的平方x。内联函数不会为调用自身的函数带来额外的计算成本。但是,如果您在内核中多次内联一个非常长的函数,程序集就会爆炸并溢出到全局内存中,从而导致性能损失。在这种情况下,与函数本身的执行时间相比,函数调用的开销可以忽略不计。最后,如果您没有明确内联一个非常短的函数,编译器会在大多数情况下自动执行此操作。与 for 函数相同,对于使用 展开的循环也是如此#pragma unroll

关于数学函数,大部分都与硬件直接相关,只有少数例外。例如,计数前导零函数int y = clz(x);尽管被转换为clzPTX 指令,但没有专用硬件,并且比使用 模拟它要慢int y = 31-(int)(as_uint((float)x)>>23);。同样,虽然逆平方根rsqrt(x)是在硬件中执行的,

float __attribute__((always_inline)) fast_rsqrt(const float x) {
    return as_float(0x5F37642F-(as_int(x)>>1));
}

运行速度稍快但不太准确。在大多数情况下,内置数学函数是最好的选择。

于 2021-06-19T17:08:08.300 回答