模板中具有特定值的"Pointless comparison"警告

"Pointless comparison" warning in template with certain values

本文关键字:Pointless comparison 警告      更新时间:2023-10-16

我有一个模板化(CUDA,虽然适用于C++)函数(我简化了它以说明这一点),如下所示:

template<unsigned windowsize>
__global__ void someFunc()
{
    if (threadIdx.x < (32 - windowsize * 2))
    {
       // ... something exciting
    }
}

我正在使用"窗口大小"设置为1-16的代码。在Visual Studio 2013中使用nvcc进行编译时,我收到以下警告:

warning : pointless comparison of unsigned integer with zero

这显然适用于 windowsize=16 的情况(对于 if 语句的计算结果为 threadIdx.x <0,即 错误),所以警告确实有意义。

我看过类似的问题:如何使特定的"无符号与零的毫无意义的比较"警告静音?但这是在使用 typedef 而不是模板的情况下,因此答案不合适。

有没有更好的方法来构造这个函数,它将在没有警告的情况下提供相同的功能?我可以创建单独的函数,以不同的方式处理大于和小于 16 的窗口大小,但实际上该函数更复杂,我会觉得我不必要地重复和复杂化代码,这就是使用模板的全部意义开始。

显而易见的方法是将比较因素分解到一个单独的函数中:

template <unsigned WindowSize>
bool doSomethingExciting() { return threadIdx.x < (32u - WindowSize * 2u); }
template <>
bool doSomethingExciting<16>() { return false; }
template<unsigned windowsize>
__global__ void someFunc()
{
    if (doSomethingExciting<windowsize>())
    {
       // ... something exciting
    }
}

您可以尝试将模板函数专用于 16:

template<unsigned windowsize>
__global__ void someFunc()
{
    //...
    std::cout << "called for windowsize " << windowsize << 'n';
}
template<>
__global__ void someFunc<16>()
{
    //...
    std::cout << "specialized for windowsize 16" << 'n';
}
void foo()
{
    someFunc<4>();
    someFunc<16>()
}

现场示例

如果有通用代码,您可以将其分解并创建一个单独的函数,常规版本和专用版本都将调用该函数。

您可能需要执行两个测试,其中第一个测试应在编译时执行:

template<unsigned windowsize>
__global__ void someFunc()
{
    if (windowsize < 16)
    {
       if ((int)threadIdx.x < (int)(32 - windowsize * 2))
       {
          // ... something exciting
       }
    }
}