2015-06-23 2 views
3

Не могли бы вы рассказать мне, есть ли способ использовать массивы constexpr в коде устройства? Согласно «Руководству по программированию Cuda C 7.0», у меня нет проблем с константными скалярами, но массивы, похоже, не компилируются. Ниже некоторые примеры:constexpr array в коде устройства CUDA

template<unsigned D, unsigned Q> 
class LatticeArrangement 
{ 
} ; 



template<> 
class LatticeArrangement<3,19> 
{ 
    public: 
     static constexpr double c[19] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 } ; 

     static constexpr double d = 19.0 ; 


     __host__ __device__ 
     static constexpr double getC(unsigned index) 
     { 
      // FIXME: error: identifier "LatticeArrangement<(unsigned int)3u, (unsigned int)19u> ::c" is undefined in device code 
      return c[ index ] ; 

      //return d * index ; // OK, this one works 
     } ; 
} ; 



constexpr double LatticeArrangement<3,19>::c[] ; 



template< class LatticeArrangement > 
class FluidModelIncompressible 
{ 
    public: 
     __host__ __device__ 
     static double computeSomething(double v, unsigned idx) 
     { 
      return LatticeArrangement::getC(idx) * v ; 
     } 
} ; 



// Does nothing useful, we want only to compile this 
template< class FluidModel > 
__global__ void 
kernel1 (double * data) 
{ 
    data[ threadIdx.x ] = FluidModel::computeSomething(threadIdx.y, threadIdx.z) ; 
} 



int main(int argc, char ** argv) 
{ 
    dim3 numBlocks (2) ; 
    dim3 numThreads (4, 4, 4) ; 

    double * vptr = NULL ; 

    kernel1< FluidModelIncompressible< LatticeArrangement<3,19> > > 
     <<< numBlocks, numThreads >>> (vptr) ; 

    return 0 ; 
} 

Я хотел бы использовать один и тот же код на хосте и устройстве и в то же время выгоды от компилятора оптимизаций из constexpr выражений. Возможно, есть еще один способ избежать дублирования кода между хостом и устройством? В настоящее время у меня большой код в коде устройства.

Я использую NVCC: NVIDIA (R) Cuda драйвер компилятора Copyright (с) 2005-2015 NVIDIA Corporation Построенный на Mon_Feb_16_22: 59: 02_CST_2015 Cuda компиляции инструментов, выпуск 7.0, V7.0.27

Заранее спасибо :)

ответ

4

Не могли бы вы рассказать мне, есть ли способ использовать массивы constexpr в коде устройства?

Не поддерживается в CUDA 7.0.

Если вы хотите, чтобы это поддерживалось, я предлагаю подать RFE (ошибка) на NVIDIA CUDA developer portal.

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

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