CUDA runtime API 관련해서 cudadevicereset()이 하는 일


cudaDeviceReset();이 하는 역할이 무엇인가요? 단순히 cudaMemcpy와 같은 역할을 해서 cudaDeviceReset();이 있어야지만 kernel에 들어있는 printf가 실행되는 건가요?

CudaDeviceReset(); 대신 cudaDeviceSynchronize();를 써넣으면 무엇이 달라지는지 궁금합니다.

소스코드

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

__global__ void funct(void){
    printf("Hello from GPU!\n");
}

int main(void){
    funct << < 2, 4 >> >();


    printf("Hello, World from CPU!\n");
        cudaDeviceReset();  

    return 0;
}

  • 2016년 03월 15일에 작성됨

조회수 444


1 답변


참고: Cuda란? NVIDIA가 만든 병렬컴퓨팅 플랫폼이자 API이다. 개발자가 CUDA기능을 가진 그래픽카드(GPU)를 이용해서 연산을 처리할 수 있도록 해 준다.

아래는 stackoverflow에 같은 질문에 대한 답변이 있어서 번역(의역 다수)한 내용입니다.

cudaDeviceReset()은 모든 자원할당을 제거하는데 사용합니다. cudaDeviceReset()이 Synchonize를 하는 효과도 있습니다. 하지만 API문서에 보면 즉시 리셋된다고 나와있기 때문에 synchronize가 확실하게 완료되고나서 리셋된다는 보장이 없습니다. 따라서 안전하게 사용하려면 다음과 같이 사용하는걸 추천합니다.

  1. cudaDeviceSynchronize() 또는 cudaMemcpy()로 Synchronize한다.
  2. 디바이스 메모리에 있는 내용중 저장해야 하는 내용은 따로 저장한다.
  3. 호스트 스레드에서 혹시나 디바이스 액티비티와 관련된 작업을 하는게 있으면 그 스레드의 작업이 모두 종료되었는지 확인한다.
  4. 사용중인 C++ 객체중에, Destructor에 디바이스 액티비티와 관련된 작업이 있는 객체가 없는지 확인한다.
  5. 마지막으로 cudaDeviceReset()을 불러서 프로그램을 종료한다.
  • 2016년 03월 17일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close