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

조회수 3062회

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;
}

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

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

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

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

    1. cudaDeviceSynchronize() 또는 cudaMemcpy()로 Synchronize한다.
    2. 디바이스 메모리에 있는 내용중 저장해야 하는 내용은 따로 저장한다.
    3. 호스트 스레드에서 혹시나 디바이스 액티비티와 관련된 작업을 하는게 있으면 그 스레드의 작업이 모두 종료되었는지 확인한다.
    4. 사용중인 C++ 객체중에, Destructor에 디바이스 액티비티와 관련된 작업이 있는 객체가 없는지 확인한다.
    5. 마지막으로 cudaDeviceReset()을 불러서 프로그램을 종료한다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)