2014-01-13 32 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進行測試。

相關問題