模板中具有特定值的"Pointless comparison"警告
"Pointless comparison" warning in template with certain values
我有一个模板化(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
}
}
}
相关文章:
- 在comparison中处理int和std::vector::size_type
- 使用代码调整删除"comparison is always false"警告
- 编译 C++ 代码时"Error: comparison between pointer and integer"
- Comparison Boost.Odeint vs Scipy.integrate.odeint?
- 收到错误:"ISO C++ forbids comparison between pointer and integer [-fpermissive]"如何解决?
- 我的逻辑让我失望了(C++,nslookup,char comparison)
- sizeof vs std::is_same comparison
- 修复警告"comparison is always false due to limited range of data type [-Wtype-limits]"
- 模板中具有特定值的"Pointless comparison"警告
- Flip bool: performance comparison of x=!x versus x^=1