2011-11-28 1 views
8

특정 스레드 구성에 대해 CUDA 커널을 호출 할 때 에 어떤 메모리 공간 (장치/호스트) 커널 매개 변수가 있어야하며 어떤 유형이어야하는지에 대한 엄격한 규칙이 있습니까? 가정하자CUDA 커널 매개 변수

본인은 CUDA 커널에 직접 호스트 -integer 변수 정수 매개 변수 int foo, 을 통과 할 수

kernel<<<numblocks, threadsperblock >>> (/*parameters*/) 

와 스레드의 1-D 그리드를 시작? 또는 내가 cudaMalloc 단일 정수에 대한 메모리라고 말하면 dev_foo을 말한 다음 cudaMemcpyfoodevfoo에 입력하고 devfoo을 커널 매개 변수로 전달해야합니까?

답변

12

커널 인수에 대한 규칙은 C++ 매개 변수 전달 규칙과 장치 및 호스트 메모리가 물리적으로 분리되어 있다는 논리적 인 결과입니다.

CUDA는 인수로 인수를 전달할 수 없으므로 포인터에주의해야합니다.

특히 매개 변수를 값으로 전달해야합니다. 사용자 정의 유형을 전달하려면 기본 복사 생성자 또는 사용자의 복사 생성자 (있는 경우)에 메모리 할당 ("new"또는 "malloc"이있는 힙 할당)이 포함되어 있지 않아야합니다.

요약하면 pass-by-value는 정수, 부동 소수점 또는 기타 기본 유형, 간단한 플랫 사용자 정의 구조체 또는 클래스 객체에 적합합니다.

5

데이터 블록에 대해서만 cudaMalloc()cudaMemcpy()을 사용해야합니다. 단 하나가 아니다 int s. 호스트 메모리의 데이터 블록을 가리키는 멤버가없는 한 struct을 매개 변수로 전달할 수도 있습니다.

어림짐없이 : 커널에 포인터를 전달하는 경우 장치 메모리를 가리키는 지 확인하십시오.