我正在寻找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。
答案 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
之后。