2013-08-31 2 views
6

nvcc (CUDA 5.0)를 사용하여 아래의 코드를 컴파일 할 때 클래스에 전역 커널을 사용할 수 없으므로 "메모리 한정자의 잘못된 조합"오류가 나타납니다.CUDA : 정적 글로벌 멤버 함수를 정의 할 수없는 이유는 무엇입니까?

class A 
{ 
public: 
    __global__ static void kernel(); 
}; 

__global__ void A::kernel() 
{} 

정적이 아닌 구성원을 처리 할 때이 제한 사항을 이해할 수 있지만 커널이 정적으로 선언 될 때 오류가 계속 발생하는 이유는 무엇입니까? 이러한 멤버의 호출은 네임 스페이스 (이 경우 A)에서 선언 된 함수를 호출하는 것과 다를 바 없습니다.

A::kernel <<< 1, 1 >>>(); 

이것이 아직 구현되지 않은 이유는 무엇입니까?

편집 : 답변 및 의견 모두에 대한 응답을 바탕으로, 나는 내 질문에 충분히 명확하지 않았습니다. 내 질문은 왜 오류가 나타나지 않습니다. 분명히 이것은 구현되지 않았기 때문입니다. 제 질문은 입니다. 왜이 구현되지 않았습니다. 지금까지이 기능을 구현하지 못하게하는 이유를 생각해 내지 못했습니다. 저는 사안을 복잡하게 만드는 특별한 경우를 잊어 버렸을지도 모릅니다.

나는 이것이 합리적인 기능을 생각하는 이유

은 다음과 같습니다

  • 은 정적 기능은 커널이 호스트에 살고 객체에서 호출 그래서 경우에도 this 포인터가없는,이 이 데이터는 처음에는 액세스 할 수 없기 때문에 데이터에 액세스하는 데 충돌이 없습니다 (어떤 개체의 데이터입니까?).
  • 클래스에 정적 데이터가 연결되어 있고 호스트에 있으면 정적 커널에서 액세스 할 수 있어야한다고 주장 할 수 있습니다. 그러나 정적 데이터도 지원되지 않으므로 다시 충돌이 발생하지 않습니다. 우리는 일반 C++에서 사용되는 것과 호스트 오브젝트에 정적 커널을 호출
  • (A a; a.staticKernel<<<...,...>>>();)는) 모든 (A::staticKernel<<<...,...>>>();에있는 객체없이 호출 전적으로 해당 될 것이다.

내가 무엇을 놓치고를 ?

+0

은 _ _global_ _ 기능을 가진 수업을 갖기위한 목적입니까? – 4pie0

+0

"내 질문은 구현되지 않은 이유입니다. 지금까지는이 기능을 구현하지 못하게하는 이유를 생각해 내지 못했습니다."- 구현할 수있는 천부적 인 것들이 있지만 그러한 필요성은 없으며 구현되지 않은 상태로 남겨집니다. – 4pie0

+0

그래서 당신의 대답은 :"단지 그렇지 않습니다. "- – JorenHeit

답변

1

다행히,이 질문 후 약 사년이 요청 된 clang 4.0 can compile the CUDA language이 예를 고려해보십시오. 나는 그 소리 4.0 컴파일 할 때

class A 
{ 
public: 
    __global__ static void kernel(); 
}; 

__device__ void A::kernel() 
{} 

int main() 
{ 
    A::kernel <<< 1, 1 >>>(); 
}; 

을 나는 다음과 같은 오류 얻을 :

class A 
{ 
public: 
    __global__ static void kernel() 
    { 
     // implementation would go here 
    } 
}; 

그런 다음 4.0을 성공적으로 컴파일하고이없이 실행 할 수 있습니다 연타 :

test.cu:7:1: error: kernel function 'kernel' must be a free function or static member function 
__global__ void A::kernel() 
^ 
/usr/local/cuda/include/host_defines.h:191:9: note: expanded from macro '__global__' 
     __location__(global) 
     ^
/usr/local/cuda/include/host_defines.h:88:9: note: expanded from macro '__location__' 
     __annotate__(a) 
     ^
/usr/local/cuda/include/host_defines.h:86:9: note: expanded from macro '__annotate__' 
     __attribute__((a)) 
     ^
test.cu:7:20: error: __host__ function 'kernel' cannot overload __global__ function 'kernel' 
__global__ void A::kernel() 
       ^
test.cu:4:28: note: previous declaration is here 
    __global__ static void kernel(); 
         ^
2 errors generated. 

이러한 오류를 만족하기를, 나는 클래스 선언에 커널 정의를 인라인했습니다 모든 오류. 따라서 CUDA 언어의 제한 사항은 아니지만 사실상 표준 컴파일러입니다. 그런데 nvcc에는 clang에는없는 많은 비슷한 부당한 제한이 있습니다.

+0

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#function-members – talonmies

+0

@talonmies 섹션 [E. C/C++ 언어 지원] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-cplusplus-language-support)은 프로그래밍 가이드의 일부 (부분) 사양에 불과합니다 'nvcc'가 지원하거나 지원하지 않는 것의 불행히도 존재하지 않는 CUDA 언어 사양과는 아무런 관련이 없습니다. [B. C 언어 확장] 섹션 (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions) 섹션은 비슷하지만 'nvcc'세부 사항과 CUDA 런타임 API. –