2017-11-26 1 views
0

나는 주 요소가 텐서 (tensors)에 대한 계산을 수행 할 수있는 계산 그래프의 노드 인 간단한 심화 학습 프레임 워크의 작동 CPU 기반 구현을 가지고있다.CUDA를 기존 클래스 구조에 통합하는 방법은 무엇입니까?

이제 구현을 GPU로 확장해야합니다. 기존 클래스 구조를 사용하고 GPU로만 기능을 확장하고 싶습니다. 그래도 가능한지 확실하지 않습니다. 클래스의 대부분

같은 텐서에서 작동 반환 방법이 있습니다 tensor_ptr 내 텐서 클래스의 단순히 std::shared_ptr 포인터

tensor_ptr get_output(); 

. 이제 내가하고 싶은 것은 각각의 메소드마다 GPU 버전을 추가하는 것입니다. 내가 생각했던 아이디어는

struct cu_shape { 
    int n_dims; 
    int x,y,z; 
    int len; 
}; 

struct cu_tensor { 
    __device__ float * array; 
    cu_shape shape; 
}; 

를 다음과 다음 이전 기능으로 미러링 할 것 같은 별도의 파일 tensor_gpu.cuhstruct를 정의했다 :

cu_tensor cu_get_output(); 

문제 때문인 것으로 보인다 .cuh 파일은 일반 헤더 파일로 취급됩니다 및 기본 C++ 컴파일러에 의해 컴파일되고 있습니다 오류 : 일에

error: attribute "device" does not apply here 

e 라인은 __device__ float * array의 정의와 일치합니다.

CUDA와 순수 C++ 코드를 섞어서 CUDA 런타임 API 함수를 모두 .cu 파일에 숨기려고 계획 했으므로 .h 파일에 정의됩니다. 문제는 내 클래스 내에서 장치 포인터를 저장 한 다음 CUDA 호출 함수에 전달하려는 것입니다.

이 방법을 사용하면 여전히 기존의 모든 개체 구조를 사용할 수 있으며 초기화 및 계산 부분 만 수정할 수 있습니다.

일반 C++ 클래스가 __device__ 플래그가있는 항목을 만질 수없는 경우 어떻게 CUDA 코드를 C++ 코드에 통합 할 수 있습니까?

파일에 CUDA 런타임 호출과 키워드 만 사용할 수 있습니까?

또는 CUDA 포인터를 다루는 C++ 컴파일러에서 사실을 숨기는 방법이 있습니까?

어떤 통찰력이라도 깊이 감사드립니다!

편집 : 내 부분에 오해가있는 것 같습니다. __device__ 플래그를 넣어야하며, 여전히 장치 메모리에 대한 포인터로 사용할 수 있습니다. CUDA 통합에 대한 우수 사례를 추가하거나 다른 것을 명확히하는 데 귀중한 것이 있으면 주저하지 마십시오!

답변

1

'__'은 구현 목적으로 예약되어 있습니다. 이것이 Nvidia 구현이 __device__을 사용할 수있는 이유입니다. 그러나 다른 "일반적인"C++ 구현에는 자체 예약 기호가 있습니다.

자세히보기 엔비디아는 더 나은 솔루션을 설계 할 수 있었지만 여기서는 도움이되지 않습니다.

+0

더 자세히 설명해 주시겠습니까? 구현 목적은 무엇을 의미합니까? 이러한 속성은'.cu' 파일 내에서 사용할 수 있지만 다른 곳에서는 사용할 수 없습니다. 내 생각 엔 nvcc 컴파일러에 대해서만 유효한 속성일까요 아니면 완전히 다른 것입니까? – Addy

+0

nvcc에는 유효합니다. 나는 그것이 파이썬이나 자바에서 무엇을하는지 전혀 모른다. 문맥에서 벗어난 단어의 문제입니다. 그리고 C++에서도, 명시 적으로 컨텍스트에 맞지 않습니다. – MSalters

관련 문제