2014-01-13 3 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 나는 VS를 사용하고 있으며 Nvidia 컴파일러가 분리되어 있다는 것을 깨달았을 때 표준을 따르지 않는다고 말하려고했습니다. 나는 어리석은 게으른 습관을 깨야한다. 게시하면 답변으로 받아 들일 것입니다. –

답변

1

std::conditional은 템플릿 매개 변수 fType에 따라 달라 지므로 typedef 뒤에 typename 키워드를 넣어야합니다. C++ (11)에 의존하지 않고 동일한 결과를 달성하고자하는 사람들을 위해 (지금과 같은 간단하지 않을 수 CUDA와 C++ (11)를 사용하는) 것을

+2

CUDA 커널에서'std :: conditional'을 전혀 사용할 수 있습니까? – JackOLantern

2

참고, 대신 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로 테스트되었습니다.

관련 문제