2016-07-07 78 views
1

我有一個模板(CUDA,雖然適用於C++)函數(我已經簡化以使點)如下:「毫無意義的比較」警告在模板與某些值

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

我使用「windowsize」代碼設置爲1-16。的Visual Studio 2013中使用nvcc編譯,我得到以下警告:

warning : pointless comparison of unsigned integer with zero 

這顯然是針對情況下windowsize = 16(針對if語句的計算結果爲threadIdx.x < 0,也就是假的),所以警告確實有道理。

我看過類似的問題: How to silence a particular "pointless comparison of unsigned with zero" warning?但這是在使用typedef而不是模板,所以答案不適合的情況。

有沒有更好的方法來構建這個功能,它將提供相同的功能,而不會有警告?我可以創建單獨的函數來處理windowsize大於和小於16的不同,但實際上函數更復雜,我覺得我不必要地重複並且使代碼複雜化,這是使用模板開始的全部要點用。

回答

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>() 
} 

Live example

如果有共同的代碼,那麼您可以出來,並創建一個單獨的功能,無論是正規和專業版會呼叫。

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

雖然這解決了這個問題,它是編譯器已經爲我做的事情的額外代碼行。 – valjean

0

您可能要進行兩次測試,其中首先應在編譯時進行:

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

我有一個包裝函數,它使用std :: enable_if來檢查windowsize <16(無法讓它與__global__ void一起工作),但是轉換爲int可能是一個不錯的解決方案。 – valjean