2016-07-07 4 views
1

У меня есть шаблонный (CUDA, хотя относятся к C++) функции (которую я упростил, чтобы сделать точку) следующим образом:«Бессмысленно сравнение» предупреждение в шаблоне с определенными значениями

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

Я использую код с «windowsize» установлен с 1-16. Компиляция с NVCC в Visual Studio 2013, я получаю следующее предупреждение:

warning : pointless comparison of unsigned integer with zero 

Это, очевидно, для случая, когда windowsize = 16 (для которого, если оператор имеет значение 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

 Смежные вопросы

  • Нет связанных вопросов^_^