2014-11-06 3 views
5

나는 온라인에서 찾은 일부 코드를 분석하려고하는데, 나는 계속해서 자신을 구석으로 생각하고있다. 다음 매개 변수로 시작한 히스토그램 커널을보고 있습니다.이 CUDA 커널 시작 매개 변수 이해하기

histogram<<<2500, numBins, numBins * sizeof(unsigned int)>>>(...); 

매개 변수가 격자, 블록, 공유 메모리 크기라는 것을 알고 있습니다.

즉, numBins 개의 스레드가 각각 2500 개 블록이고 각 블록의 스레드에 공유 메모리가 numBins * sizeof(unsigned int) 개 있습니다.

또한 커널 내부에서 __syncthreads()에 대한 호출이 있고 numBins의 2500 세트가 커널 호출 중에 __syncthreads()에 호출됩니까?

+2

첫 번째 질문 : 예.두 번째 질문 : 다른 블록의 스레드와 독립적 인 2500 블록 안에있는 스레드는 블록의 모든 스레드가 해당 시점까지 공유 메모리에 대한 업데이트를 완료하고 도착할 때까지 '__syncthreads()'지점에 도달 할 것입니다. 그런 다음 계속 실행하십시오. 블록 안의 모든 쓰레드는'__syncthreads()'를보고,'__syncthreads()'*에 대한'numBins' 호출은 2500 세트라고 말할 수 있습니다.하지만 일반적인 함수 호출과는 다릅니다. 블록 내 스레드 동기화를위한 장벽 루틴입니다. – Farzad

답변

4

는 그래서 각 스레드 numBins 2500 개 블록이 있다는 것을 의미 하는가, 또한 스레드 가능한 공유 메모리 numBins *를 sizeof (부호 INT) 청크를 갖는 각각의 블록 ? 가입일

CUDA Toolkit documentation :

(전역 함수 호출)의 실행 구성 형태 <<<Dg,Db,Ns,S>>>의 식 삽입에 의해 지정된

:

  • DG (dim3을) 그리드의 크기와 크기를 지정합니다.
  • DB (dim3)는 각 블록
  • NS 개의 (를 size_t)의 치수 및 크기를 지정 동적이 호출에 대한 블록 당 할당되는 공유 메모리의 바이트 수를 지정 정적으로 할당 된 메모리에 추가.
  • S (cudaStream_t)는 관련 스트림을 지정 @Fazar가 지적했듯이, 대답은 '예'0

그래서 기본값, 선택적 매개 변수입니다. 이 메모리는 블록별로 할당됩니다.

또한, 커널 자체에서 __syncthreads()에 대한 호출은 numBins의 이 후 2500 세트가 커널 호출의 과정을 통해) __syncthreads (호출이 있습니까?

__syncthreads() 스레드 블록의 모든 스레드가이 지점에 도달 할 때까지 대기합니다. 동일한 블록의 스레드 간 통신을 조정하는 데 사용됩니다.

따라서 블록 당 __syncthread() 호출이 있습니다.