考虑模板参数改变if语句条件

stu*_*hlo 1 c++ templates cuda

我有一个带模板参数的全局内核函数:

template<int ARG> __global__ void kernel(array[]) {
    int threadID = blockDim.x*blockIdx.x + threadIdx.x;
    if(...) {...}
}
Run Code Online (Sandbox Code Playgroud)

函数的行为和特殊的if语句条件在考虑模板参数时略有不同,但是主体保持不变.让我们说:
ARG == 0if语句如下:if(expr1){body}
ARG == 1if语句如下:if(expr2){body}
ARG == 2if语句如下:if(expr1 && expr2){body}

我的问题是提供这种方法的最佳方式(在可读性和性能方面)是什么?

编辑: 表达式expr1和函数expr2调用__device__ boolean,例如fnc1(array[threadID])fnc2(array[threadID]).

Pet*_*ker 6

直截了当的做法是蛮力:

if ((ARG != 1 || expr1) && (ARG != 0 || expr2)) ...
Run Code Online (Sandbox Code Playgroud)

由于ARG在编译时是已知的,因此编译器将在此处生成良好的代码.