2012-11-19 16 views
-2

스레드 번호 및 threadID에 대해 의심의 여지가 없습니다. 그 X 지수가 1 인 다음 스레드가 온다 Y 인덱스가 0이므로스레드 ID 및 ID

  1. 2D 스레드 (1,0) 스레드 1 (0,1) 스레드의 스레드 ID 또는 스레드 번호는 무엇 ? 나는 그것이 3라고 느낀다. 그러나 어떻게? 스레드 (0,1)에 대해 ThreadId = blockIdx.x * blockDim.x + threadIdx.x의 공식을 어떻게 적용 할 수 있습니까? 이 공식을 사용하여 thread 3의 thread (0,1)에 대한 threadID 값을 계산하려면 어떻게해야합니까? 아니면 다른 수식, 어떻게 찾을 수 있습니까? 3D를 어떻게?

  2. 어떻게 총계를 결정할 수 있습니까? x 방향의 나사산 함께? 예 : 행렬 요소에 액세스하는 경우. 행렬 크기가 3이면 스레드 (0,0)는 첫 번째 요소에 액세스하고 스레드 (1,0)는 두 번째 요소에 액세스하고 스레드 (2,0)는 세 번째 요소에 액세스 한 다음 스레드 (0,1)에 액세스합니다. 두 번째 행의 첫 번째 요소 (네 번째 요소)에 액세스합니다. 그러나 thread (3,0)은이 그림에서 어떻게 무시됩니까? 어떤 요소 스레드 (3,0)가 액세스하고 어떻게됩니까? 실행 설정에 따라 블록 크기와 격자 크기가 지정 되었습니까?

+4

CUDA C 프로그래밍 안내서의 "2.2 스레드 계층 구조"를 참조하십시오. – talonmies

+1

질문 1 개당 하나의 질문 : http://stackoverflow.com/faq –

+0

@PaulR. 오 그래. 확실한. 나는 질문 당 1 개의 질문을 넣을 것이다. – robot

답변

2

threadIdx는 .x, .y 및 .z 필드가있는 구조체입니다. "thread (x, y)"로 쓰면 혼란 스러울 수 있습니다.

  1. 2D 스레드 블록을 생성하여 1D 인덱스에 매핑하려고합니다. 물론 을 수행하면이되지만 2D에서 1D 로의 매핑은 애플리케이션 컨텍스트에 따라 다릅니다. 실제로 1D 색인을 원하면 대부분의 사람들이 1D를 사용합니다!

    물론 2D 스레드 인덱스를 가져와 선형 배열에 액세스해야 할 수도 있지만 배열의 레이아웃은 응용 프로그램에 따라 다릅니다. 일반적인 예는 offset = threadIdx.y * arraywidth + threadIdx.x입니다.

  2. x 방향의 총 스레드 수는 gridDim.x * blockDim.x입니다.

    주어진 스레드가 액세스하는 요소는 옵셋을 계산하는 방법에 따라 다릅니다 ((1) 참조).

Talonmies도 좋은 장소가 시작 문서의 Thread Hierarchy 섹션을 지적했다.

+0

답장을 보내 주셔서 감사합니다. Talonmies가 지적한 스레드 계층 구조 섹션을 반드시 살펴 보겠습니다. 1) 그러나 실제로, 나는 아직도 개념으로 정리되지 않았다. 실제로, 1D 매핑을 통해 2D를 수행하려고하지 않습니다. 오히려 스레드 (0,1)에 대한 스레드 ID (스레드 번호의 스레드 값)가 무엇인지 알고 싶습니까? 2) 2a) 또한 모든 요소는 1D, 2D 또는 3D 스레드 블록을 사용하여 액세스하는지 여부에 상관없이 메모리에 선형으로 배치됩니다. 2b) 'x'방향의 총 요소가 gridDim.x * blockDim.x 인 경우 2D 스레드 블록의 경우 총 번호는 무엇입니까? 'y'방향으로 스레드의 수를 합산해야합니까? – robot

+1

@robot : FOr (1) 선형 스레드 ID를 원한다면 왜 2D 블록/격자를 사용하고 있습니까? 그냥 1D 시스템을 사용하고 끝내십시오. vectorAdd 예제를 확인하십시오. (2b)에 대해 각 차원의 총 스레드는 P가 {x, y, z} 인 동일한 수식'gridDim.P * blockDim.P'을 사용합니다. 회신에 감사드립니다. – Tom

+0

나는 텍스트 북에서 1D 나 2D의 각 스레드가 고유 한 스레드 ID를 가지고 있다고 읽었습니다. 예를 들어 1D라면 blockIdx * blockDimx + threadIdx를 사용하여 값을 계산할 수 있습니다. 예를 들어, 총 10 개의 쓰레드/블럭 1은 블럭 1의 쓰레드 ID = 10 * 0 + 0 = 0이고 블럭 1의 thread0은 threadId = 10 * 1 + 0 = 10이다. 이것은 1D를위한 것이다. 이 사건이 2 차원 스레드인지, 고유 스레드 ID를 찾는 방법을 묻습니다. – robot