2012-02-28 2 views
3

많은 수의 malloc 및 장치 별 API malloc (GPU 프로그래밍이므로 cudaMalloc)이 있습니다.일련 할당 자/할당 취소 자

기본적으로 내 코드의 시작 부분은 할당 호출의 큰 부분이며, 닫는 부분은 할당 취소입니다.

구조에 내 전역 데이터를 캡슐화 했으므로 할당 해제는 상당히 길지만 적어도 분리 함수로 분리 할 수 ​​있습니다. 반면에, 나는 더 짧은 해결책을 원할 것이다. 또한 자동 할당 해제자는 전역 할당 자 함수에서 할당 해제를 명시 적으로 작성하는 것을 잊어 버리면 작성되는 메모리 누수의 위험을 줄입니다.

malloc/cudaMalloc 프로세스 중에 변수를 "등록"할 수있는 템플릿 클래스 래퍼를 작성할 수 있는지 궁금 해서요. 그리고 시뮬레이션이 끝나면 대량 루프 기반 할당 해제 (등록 해제). 다시 말해, 개별 할당 해제 (free/cudaFree 초)를 입력하지 않기를 바란다. 왜냐하면이 또한 길고 바람직하지 않으며, 디바이스 시뮬레이션이 완료되고 메인이 될 때까지 내가 등록한 모든 것이 할당 해제되지 않을 것이기 때문이다 종료 중입니다.

새로운 시뮬레이션 기간 변수를 등록하면 자동으로 할당이 해제되므로 할당 해제 나 메모리 누수가 생기는 것을 잊을 위험이 없습니다.

그런 래퍼가 가능합니까?

제안 하시겠습니까?

그렇다면 어떻게됩니까?

미리 감사드립니다.

+0

오래된 문제이지만 CUDA는 새로운 맛을냅니다. 흥미 롭 군. –

+0

C++ 응답을 받거나 "C"태그가 의도적입니까? – harrism

+0

C++이어야합니다. 원래이 프로젝트는 C에 있었지만 호스트쪽에 STL을 추가했습니다. 내 머리 속에 깨끗한 인쇄 제어 기능을 제공했기 때문입니다. 장치 코드와 할당/할당 해제는 모두 전통적인 C이지만 클래스가 없습니다. –

답변

3

아이디어 :

이 두 기능을 작성, 메모리를 할당하고 유효한 포인터 후 할당 된 포인터의 "목록"에 등록하십시오 제공 하나. 모든 포인터 두 번째 방법, 루프이 목록 및 할당 해제 : 같은

listOfPointer1 = getNewListOfPointers(); 
listOfPointer2 = getNewListOfPointers(); 
.... 
p1 = allocatePointer(size, listOfPointer1); 
p2 = allocatePointer(size, listOfPointer2); 
... 
deallocatePointers(listOfPointers1); 
... 
deallocatePointers(listOfPointers2); 
1

고양이 스킨하는 방법에는 여러 가지가 있습니다 : 심지어

// ask for new allocated pointer that will be registered automatically in list of pointers. 
pointer1 = allocatePointer(size, listOfPointers); 
pointer2 = allocatePointer(size, listOfPointers); 

... 
// deallocate all pointers 
deallocatePointers(listOfPointers); 

, 당신은 당신의 시뮬레이션 범위의 따라 다른 listOfPointers를 사용할 수있다 그들은 말한다.

메모리 관리 도구로 thrust의 device_vector을 권하고 싶습니다. CUDA에서 할당, 할당 해제 및 memcpy를 추상화합니다. 또한 Thrust가 제공하는 모든 알고리즘에 액세스 할 수 있습니다.

티오 페페 (Tio Pepe)가 권장하는 바와 같이 무관 한 포인터의 무작위 목록을 유지하지 않는 것이 좋습니다. 대신 관련 데이터를 클래스에 캡슐화해야합니다. thrust::device_vector을 사용하는 경우에도 여러 관련 벡터 및 연산을 클래스로 캡슐화 할 수 있습니다.

+0

하지만 C++입니까? 편집 : 이제는 CUDA가 C++을 지원하지만 원래는 그렇지 않다는 것을 알게되었습니다. 어쨌든, 질문은 C에 관한 것이지만 그것은 물론 OP의 감독 일 수 있습니다. –

+0

CUDA는 C++입니다. 그것은 항상 템플릿과 같은 C++의 부분을 지원해 왔으며 점점 더 완전한 지원을 추가하고 있습니다. 나는 C로 제한하는 질문에서 아무것도 보지 못한다. – harrism

+0

어쨌든 Wikipedia는 "CUDA (계산 기능 1.x 포함)는 재귀없는 함수 포인터가없는 C 언어의 서브 세트를 사용한다. 몇 가지 간단한 확장 기능 "이라고 말합니다. 아마도 이러한 간단한 확장 기능은 내가 모르는 템플릿이었을 것입니다. 질문은 "C"로 표기되어 있지만, 제가 말했듯이 그것은 OP 부분에 대한 감독 일 것입니다. –

0

아마도 C++ 부스트 라이브러리의 스마트 포인터를 사용하는 것이 가장 좋습니다.

그렇지 않은 경우 C에서 최선의 결과를 얻으려면 할당 및 할당 취소를 한 곳에서 작성할 수있는 프로그램 디자인이 필요합니다.아마도 다음과 같은 의사 코드와 같은 것일 수 있습니다 :

while(!terminate_program) 
{ 
    switch(state_machine) 
    { 
    case STATE_PREOPERATIONAL: 
     myclass_init(); // only necessary for non-global/static objects 
     myclass_mem_manager(); 
     state_machine = STATE_RUNNING; 
    break; 

    case STATE_RUNNING: 
     myclass_do_stuff(); 
     ... 
    break; 

    ... 

    case STATE_EXIT: 
     myclass_mem_manager(); 
     terminate_program = true; 
    break; 
    } 


void myclass_init() 
{ 
    ptr_x = NULL; 
    ptr_y = NULL; 

    /* Where ptr_x, ptr_y are some of the many objects to allocate/deallocate. 
    If ptr is a global/static, (static storage duration) it is 
    already set to NULL automatically and this function isn't 
    necessary */ 
} 

void myclass_mem_manager() 
{ 
    ptr_x = mem_manage (ptr_x, items_x*sizeof(Type_x)); 
    ptr_y = mem_manage (ptr_y, items_y*sizeof(Type_y)); 
} 


static void* mem_manage (const void* ptr, size_t bytes_n) 
{ 
    if(ptr == NULL) 
    { 
    ptr = malloc(bytes_n); 

    if (ptr == NULL) 
    {} // error handling 
    } 
    else 
    { 
    free(ptr); 
    ptr = NULL; 
    } 

    return ptr; 
}