2013-04-09 6 views
0

I가 CUDA에서 다음 템플릿 __device__ 기능 : 컴파일 float로서 T 인스턴스화하면 잘 실행액세스

template<typename T> 
__device__ void MyatomicAdd(T *address, T val){ 
atomicAdd(address , val); 
} 

, 즉

__global__ void myKernel(float *a, float b){ 
MyatomicAdd<float>(a,b); 
} 

문제없이 실행됩니다.

이중 함수에 대해 atomicAdd()이 없으므로이 함수를 전문으로하고 싶었으므로 구현 코드에 배정도로 사용할 수 있습니다. 지금은 배정 밀도의 전문성을 무시하고, 단일 정밀도 전문화 및 템플릿는 다음과 같습니다 :

template<typename T> 
__device__ void MyatomicAdd(T *address, T val){ 
}; 


template<> 
__device__ void MyatomicAdd<float>(float *address, float val){ 
atomicAdd(address , val); 
} 

이제 컴파일러는 atomicAdd은() 내 전문에서 정의되지 않은 것을 불평 같은 적용 내가 어떤 CUDA 기능을 사용하려고 할 때 특수화 내에서 __syncthreads()를 사용하십시오. 어떤 아이디어? 감사.

+1

잘못된 컴파일러로 특성화를 컴파일하려고하는 것 같습니다. 정말로 nvcc를 사용하고 있으며 컴파일되는 파일의 확장자가 .cu입니까? – talonmies

+0

첫 번째 비특이적 인 예제와 두 번째 특수한 예제는 모두 같은 파일에 있습니다. 나는 두 번째 문장을 쓴 후에 첫 번째 예제를 주석 처리했다. 그것은 전문화에 특정한 문제 인 것을 보인다. – mjm26

+0

문제는 내가 게시 한 코드를 커널에 파일로 저장하고 nvcc로 컴파일하면 오류가 없다는 것입니다. 그래서 당신이 우리에게 말하는 것을 게을리하고있는 뭔가 다른 것이 있습니다 .. – talonmies

답변

0

동료가 개발 한 일부 OpenGL 코드와의 연결 문제가 발생했습니다. 전문화가 인라인되도록 강제하면 문제는 해결되지만 근본 원인은 분명하지 않습니다. 그럼에도 불구하고 다른 사람의 코드를 파헤 치려고 귀찮게 될 때까지는 지금 당장 할 것입니다.