2012-07-20 2 views
1

필자는 데이터 전달을 쉽게하기 위해 호스트와 장치 코드 모두에서 사용하는 클래스를 가지고 있습니다. 이 클래스에는 데이터를 조작하는 메소드가 있습니다. 간단한 예제는 다음과 같습니다.CUDA - 소스 파일에 대한 __device__ 메쏘드

struct Vector { 
    float x, y, z; 
    __host__ __device__ Vector(float _x, float _y, float _z) { 
    //... 
    } 
}; 

이 클래스를 헤더 파일에 구현하면 잘 작동하고 nvcc가 행복해집니다. 그러나 소스 파일에 생성자를 구현하려고하면 nvcc는 생성자가 인라인되지 않는다고 불평합니다. 어쨌든 이것을 무시하거나 컴파일러의 한계에 불과합니까?

+0

'__forceinline__'지정자를 사용해 보셨습니까? 소스 파일은 .cu 파일 또는 .cpp를 의미합니까? – geek

+0

예, 저는'__forceinline__'을 시도했습니다. 내가하고 싶은 것은 클래스를 소스 (.cu)와 헤더 (.cuh)로 분리하는 것이지만, NVCC는 디바이스 클래스를 허용하지 않는다. –

+0

CUDA 및 CUDA 아키텍처의 해당 버전을 사용하고 있습니까? – geek

답변

1

CUDA 컴파일러는 CUDA 컴파일러가 커널 (예 : __global__ 함수)에 필요한 모든 것이 단일 변환 단위에 있어야한다는 제한을 가지고 있습니다. 페르미 이전 디바이스 (즉, 계산 기능 1.x)의 경우 컴파일러는 모든 __device__ 함수를 인라인해야했습니다. 따라서 struct a.cu에 정의 된 구조체와 b.cu에 정의 된 구조체를 사용하는 __global__ 커널을 가지고 있다면 컴파일러가 b.cu를 처리 할 때 __device__ 함수를 찾을 수 없습니다.

CUDA 5.0을 사용하면 두 파일을 따로 컴파일하고 함께 연결할 수 있습니다. 그래도 Fermi 이상 (2.x 이상)이 필요합니다.

관련 문제