2012-07-01 4 views
0

커널에서 공유 메모리 배열을 선언 할 때 동일한 크기의 배열이 모든 스레드에 의해 선언된다는 것을 알고 있습니다.CUDA 공유 메모리 주소 지정

__shared__ int s[5]; 

과 같은 코드는 각 스레드에 20 바이트 배열을 생성합니다. 공유 메모리를 다루는 방법은 모든 스레드에서 보편적이라는 점을 이해합니다. 그래서 만약 내가 아래 첨자 10을 주소하면

s[10] = 1900; 

모든 스레드에서 정확히 같은 메모리 위치입니다. 서로 다른 스레드가 하위 공유 10에 다른 공유 메모리 주소에 액세스하는 경우는 없습니다. 맞습니까? 물론 컴파일러는 첨자가 범위를 벗어났다는 경고를 던집니다.

+0

이름에서 알 수 있듯이 공유 메모리 배열은 각 스레드에서 생성되지 않고 공유 메모리에 있습니다. 다시 말해 공유 배열's'는 하나 뿐이므로 다른 스레드가 공유 메모리에서 같은 주소에 액세스 할 때 뱅크 충돌이 발생할 수 있습니다. – chaohuang

+0

공유 메모리는 블록의 스레드가 공유하며 커널의 모든 스레드는 공유하지 않습니다. 프로그램 가능 캐시로 간주 될 수 있습니다. – konjac

답변

3

실제로 스레드 당이 아닌 블록 당 012 바이트의 배열 이 생성됩니다.

블록 내의 모든 스레드는이 20 바이트에 액세스 할 수 있습니다. 따라서 스레드 당 N 바이트, M 스레드가있는 블록이 필요한 경우 블록 당 N * M 버퍼를 만들어야합니다. 128 개 스레드가 있다면 귀하의 경우에는

, 당신은

__shared__ int array[5*128]; 

그리고 배열 [10]했을 것이다 블록 내의 스레드에 대한 올바른 주소이었을 것입니다.