是否可以在CUDA内核中使用std :: conditional?

时间:2014-01-13 14:08:11

标签: c++ cuda

我正在寻找CUDA内核的模板。 Google,而不是SO都没有特别即将到来。在这个内核中,我希望有一个取决于typename的typedef。我尝试了以下(假设/希望)它将与C ++类似,但它没有。

#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。

2 个答案:

答案 0 :(得分:2)

请注意,对于那些想要在不依赖C ++ 11的情况下获得相同结果的人(使用带有CUDA的C ++ 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进行测试。

答案 1 :(得分:1)

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