2013-01-22 3 views
0

하나의 블록에 SM의 사용 가능한 공유 메모리를 모두 할당하려고합니다. 같은 SM에 여러 블록을 할당하지 않으려 고하기 때문에이 작업을 수행하고 있습니다. 내 GPU 카드에는 64KB (공유 + L1) 메모리가 있습니다. 현재 구성에서는 48KB가 공유 메모리에 할당되고 16KB는 L1에 할당됩니다. 사용 가능한 공유 메모리를 모두 사용하기 위해 다음 코드를 작성했습니다.CUDA의 단일 블록에 사용 가능한 공유 메모리를 모두 할당하는 방법은 무엇입니까?

  1. 가 어떻게 공유 메모리 공간을 모두가 사용되었는지 확인 할 수 있습니다

    __global__ void foo() 
    { 
    
        __shared__ char array[49152]; 
    ... 
    
    } 
    

    나는이 개 질문이?

  2. "48K"를 훨씬 더 높은 값으로 올릴 수 있습니다 (오류 또는 경고없이). 이것을 정당화 할 수있는 사람이 있습니까? 사전에

감사합니다,

이만

+2

(정적으로 할당 된) 공유 메모리 크기가 너무 크면 컴파일 할 때 ptxas에서 컴파일 오류가 발생합니다. 질문 2에 대한 추가 조사를 위해 컴파일 할 때 사용하는 명령 줄과 함께 공유 메모리 할당이 너무 큰 완전한 컴파일 가능한 코드 예제를 제공하십시오. Eugene이 제안한대로 커널 시작시 공유 메모리의 동적 할당으로 전환하면 요청 된 공유 메모리가 너무 크면 런타임 오류가 발생합니다 (오류를 확인하고 있습니까?). –

답변

2
  1. 당신은 당신의 크기를 지정할 필요가 없습니다 cudaGetDeviceProperties
  2. 를 호출하여 당신이 얻을 수 cudaDeviceProp::sharedMemPerBlock에서 사용 가능한 장치 공유 메모리의 크기를 읽을 수 있습니다 귀하의 배열. 대신 공유 메모리의 크기를 세 번째 커널 시작 매개 변수로 동적으로 전달할 수 있습니다.

"clock"CUDA SDK 샘플은 실행시 공유 메모리 크기를 지정하는 방법을 보여줍니다.

+0

응용 프로그램이 동시 커널 실행을 지원하지 않으면 SM 당 1 블록 점유를 제한하기 위해 1/2 * MAX_SHARED_MEMORY_PER_SM + 1 바이트의 공유 메모리 만 할당하면됩니다. –