Не могли бы вы рассказать мне, есть ли способ использовать массивы 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
Заранее спасибо :)