2014-01-13 33 views
-1

我正在寻找模板的CUDA内核。 ,而不是SO都特别提出。在这个内核中,我想要一个依赖于typename的typedef。我尝试了以下(假设/希望),它会类似于C++,但它没有。是否可以在CUDA内核中使用std :: conditional?

#include <type_traits> // for std::conditional. Not sure if it's necessary 
#include <cuda_runtime.h> 
#include <cuComplex.h> 

template <typename fType> 
__global__ void DummyKernel() { 
    typedef std::conditional<sizeof(fType) == sizeof(double), cuDoubleComplex, cuFloatComplex>::type cfType; 
} 

这会产生错误

nontype "std::conditional<_Test, _Ty1, _Ty2>::type [with _Test=<expression>, _Ty1=cuDoubleComplex, _Ty2=cuFloatComplex]" is not a type name 

有没有办法做我想要什么?我正在使用CUDA 5.5和VS2012。

+3

您在'typedef'之后缺少'typename'关键字。 – catscradle

+0

@catscradle当我意识到Nvidia编译器是分开的时,我正要说我正在使用VS,并且它不符合标准。我必须打破我愚蠢的懒惰习惯。如果发布,我会接受这个答案。 –

回答

1

std::conditional取决于模板参数fType,因此您必须将typename关键字放在typedef之后。

+2

你可以在CUDA内核中使用'std :: conditional'吗? – JackOLantern

2

注意,对于那些谁想要达到同样的效果,而不依赖于C++ 11(用C与CUDA ++ 11可能不是现在那样简单),你可以使用Boost MPL代替:

#include <boost/type_traits/conditional.hpp> 

template <typename fType> 
__global__ void DummyKernel() { 
    typedef typename boost::conditional<sizeof(fType) == sizeof(double), cuDoubleComplex, cuFloatComplex>::type cfType; 
// Which is an equivalent of: 
// typedef typename boost::mpl::if_<boost::mpl::bool_<sizeof(fType) == sizeof(double)>, cuDoubleComplex, cuFloatComplex>::type cfType; 

    // Quick size check 
    printf("size = %u\n", sizeof (cfType)); 
} 

编译简单(适应你的CUDA架构):

nvcc test.cu -o test -gencode arch=compute_30,code=sm_30 

然后,您可以:

DummyKernel<float> ---> size = 8 
DummyKernel<double> ---> size = 16 

在Arch Linux上使用CUDA 5.5和Boost 1.55进行测试。

相关问题