2014-12-11 4 views
1

내 질문은 다음과 같습니다 :CUDA 변수가 글로벌 커널

1) 글로벌 커널에서 변수를 선언 할 때 각 스레드에 대해이 변수의 복사본이 달라질 것이라는 점을 이해 했습니까? 이렇게하면 모든 스레드에 대해이 변수에 중간 결과를 저장할 수 있습니다. 예 : 벡터 c = a + b :

__global__ void addKernel(int *c, const int *a, const int *b) 
{ 
    int i = threadIdx.x; 
    int p; 
    p = a[i] + b[i]; 
    c[i] = p; 
} 

여기서 중간 변수 p를 선언합니다. 그러나 실제로이 변수의 N 사본이 각 스레드마다 하나씩 있습니다.

2) 배열을 선언하면이 배열의 N 개의 복사본이 각 스레드마다 만들어집니다. 그리고 글로벌 커널 내부의 모든 것이 gpu 메모리에서 발생하는 한, 선언 된 모든 변수에 대해 gpu에서 N 배의 메모리가 필요합니다. 여기서 N은 스레드의 수입니다.

3) 현재 프로그램에는 35 * 48 = 1680 블록이 있고 각 블록에는 32 * 32 = 1024 스레드가 있습니다. 글로벌 커널 내에서 선언 된 변수는 커널 외부에서 N = 1024 * 1680 = 1 720 320의 비용이들 것입니까?

4) 공유 메모리를 사용하려면 일반적으로 각 변수에 대해 M 배의 메모리가 필요합니다. 여기서 M은 블록의 수이고입니다. 그게 사실이야?

+1

5) 왜 사람들이 항상 내 질문에 투표합니까? – Mihon

+1

나는 당신에게 다운 다운을하지 않았지만, 한 번에 몇 가지 질문을했다. Stack Overflow는 일반적으로 질문이 명확하고 집중 될 것으로 기대합니다. –

+0

네,하지만 질문은 서로 관련이 있습니다 .. – Mihon

답변

4

1) 예. 각 스레드는 함수에서 선언 된 비공유 변수의 개인 사본을 가지고 있습니다. 보통 GPU register 메모리로 이동하지만 메모리는 local으로 유출 될 수 있습니다.

2), 3) 4) 당신이 그 개인 메모리의 많은 사본이 필요하다는 사실이지만 , 당신의 GPU를 의미하지 않는다 한 번에 모든 스레드에 대한 충분한 개인 메모리를 가지고있다. 이것은 하드웨어에서 모든 스레드가 동시에 실행할 필요가 없기 때문입니다. 예를 들어, N 개의 스레드를 시작하면 주어진 시간에 절반이 활성화되고 다른 절반은 사용 가능한 여유 자원이 생길 때까지 나머지 절반이 시작되지 않습니다.

스레드가 사용하는 리소스가 많을수록 하드웨어에서 동시에 실행할 수있는 리소스가 더 적지 만 GPU에 리소스가없는 모든 스레드는 한 번만 실행되므로 실행을 요청할 수있는 수를 제한하지 않습니다 일부 리소스가 무료입니다.

이것은 미쳐서 엄청난 양의 로컬 리소스를 선언해야한다는 것을 의미하지 않습니다. 병렬로 스레드를 실행할 수 있기 때문에 GPU가 빠릅니다. 이 스레드를 병렬로 실행하려면 주어진 시간에 많은 스레드를 채울 필요가 있습니다. 매우 일반적인 의미에서, 쓰레드 당 사용하는 리소스가 많을수록 주어진 순간에 쓰레드가 적어지고 하드웨어가 이용할 수있는 병렬성이 줄어들게됩니다.

+1

고마워, 알 겠어! – Mihon