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<<<...,...>>>();
에있는 객체없이 호출 전적으로 해당 될 것이다.
내가 무엇을 놓치고를 ?
은 _ _global_ _ 기능을 가진 수업을 갖기위한 목적입니까? – 4pie0
"내 질문은 구현되지 않은 이유입니다. 지금까지는이 기능을 구현하지 못하게하는 이유를 생각해 내지 못했습니다."- 구현할 수있는 천부적 인 것들이 있지만 그러한 필요성은 없으며 구현되지 않은 상태로 남겨집니다. – 4pie0
그래서 당신의 대답은 :"단지 그렇지 않습니다. "- – JorenHeit