我有一个模板化(CUDA,虽然适用于C ++)函数(我已经简化了这一点),如下所示:
template<unsigned windowsize>
__global__ void someFunc()
{
if (threadIdx.x < (32 - windowsize * 2))
{
// ... something exciting
}
}
我使用&#34; windowsize&#34;设置为1-16。在Visual Studio 2013中使用nvcc进行编译,我收到以下警告:
warning : pointless comparison of unsigned integer with zero
这显然适用于windowsize = 16的情况(if语句的计算结果为threadIdx.x&lt; 0,即为false),因此警告确实有意义。
我看过类似的问题: How to silence a particular "pointless comparison of unsigned with zero" warning?但是在使用typedef而不是模板的情况下,这些答案并不合适。
是否有更好的方法来构建此功能,在没有警告的情况下提供相同的功能?我可以创建单独的函数来处理windowsize大于或小于16的不同,但实际上函数更复杂,我觉得我不必要地复制和复杂代码,这是使用模板的全部要点开头。
答案 0 :(得分:2)
显而易见的方法是将比较分解为一个单独的函数:
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
}
}
答案 1 :(得分:1)
您可以尝试使用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>()
}
如果有通用代码,您可以将其分解并创建一个单独的函数,常规版本和专用版本都将调用。
答案 2 :(得分:0)
您可能希望执行两个测试,其中第一个应在编译时执行:
template<unsigned windowsize>
__global__ void someFunc()
{
if (windowsize < 16)
{
if ((int)threadIdx.x < (int)(32 - windowsize * 2))
{
// ... something exciting
}
}
}