内核是操作系统提供软件对计算机硬件进行访问的软件
内核启动是异步的,这意味着在内核完成执行之前,他将在启动gpu进程后立即将控制权返回给cpu线程,而cpu线程的下一步是应用程序的退出,在应用程序退出时,其将输出发送到标准输出的功能由操作系统终止,因此内核以后生成的输出无处可去,将无法看到它。
因此,cudaDeviceSynchronize()在gpu完成之前交给cpu,cpu用内核去找到出口,将gpu进程的返回值进行保存。
hello.h
#pragma once
#define HELLO_GPU_API __declspec(dllexport) //说明可以在其他工程中使用接下来的定义
#include "cufft.h"
#include "stdio.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
HELLO_GPU_API int useCUDA();
hello.cu
#include "hello.h"
__global__ void helloCUDA()
{
printf("Hello gpu\n");
}
int useCUDA()
{
helloCUDA << <1, 5 >> > ();
cudaDeviceSynchronize();
return 0;
}
main.cpp
#include <stdio.h>
#include <iostream>
#include "hello.h"
int main()
{
useCUDA();
return 0;
}
如果在把cuda程序生成动态库在主函数调用的情况下,不使用cudaDeviceSynchronize(),将无法将核函数里的打印输出到控制台。
若使用cudaDeviceSynchronize(),保证可以完成内核(内核的输出将找到一个等待的标准输出队列),在允许应用程序之前退出。