CUDA runtime API 관련해서 cudadevicereset()이 하는 일
조회수 2951회
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가 확실하게 완료되고나서 리셋된다는 보장이 없습니다. 따라서 안전하게 사용하려면 다음과 같이 사용하는걸 추천합니다.- cudaDeviceSynchronize() 또는 cudaMemcpy()로 Synchronize한다.
- 디바이스 메모리에 있는 내용중 저장해야 하는 내용은 따로 저장한다.
- 호스트 스레드에서 혹시나 디바이스 액티비티와 관련된 작업을 하는게 있으면 그 스레드의 작업이 모두 종료되었는지 확인한다.
- 사용중인 C++ 객체중에, Destructor에 디바이스 액티비티와 관련된 작업이 있는 객체가 없는지 확인한다.
- 마지막으로 cudaDeviceReset()을 불러서 프로그램을 종료한다.
댓글 입력