2012-03-22 4 views
1

GPU에 전역 메모리를 할당하는 다음 코드가 있습니다.전역 메모리 할당

__global__ void mallocTest() 
{ 
    char* ptr = (char*)malloc(123); 
    //.... 
    free(ptr); 
} 

모든 스레드가 별도의 ptr에 메모리를 할당합니까?
그래서 만약 내가 10 스레드의 2 블록을 누른 다음 20 배열이 할당됩니다 (즉, 모든 스레드가 자신의 사용을 위해 메모리를 할당)? 어떻게 스레드 당 대신에 블록 당 메모리 만 할당 할 수 있습니까? 즉, 2 개의 블록과 10 개의 스레드가있는 경우 2 개의 배열 만 할당됩니다. 이 가능합니까?

답변

2

컴퓨팅 기능 2.0 또는 2.1 장치에서 해당 코드를 실행하면 모든 스레드가 런타임 전역 메모리 힙에서 할당을 수행합니다. 따라서 실행 그리드에 20 개의 스레드가 있으면 스레드 당 20 개의 할당이 발생합니다.

블록 당 배열을 원한다면 (블록의 각 스레드가 동일한 배열에 액세스하도록하려는 경우) 논리적 인 접근 방법은 공유 메모리를 사용하는 것입니다. 특히 메모리가 차단하고 다시 사용할 수 없습니다.

+0

내가 언급 했어야하지만 배열의 크기가 공유 메모리에 맞지 않습니다 ... – scatman

+0

그러면 블록 당 하나의 스레드가 malloc/new로 힙에 메모리를 할당하고 ** 주소 **를 저장합니다 각 스레드가 읽을 수있는 공유 메모리의 할당 그런 다음 블록의 각 스레드가 메모리를 사용할 수 있습니다. – talonmies

+0

Scatman : 모든 스레드가 동일한 크기의 메모리를 할당해야한다면 호스트 코드 (cudaMalloc)의 모든 스레드를 할당하고 커널에 전달하여 각 스레드가 메모리에서 해당 스레드에 액세스하도록하십시오. –