相关阅读
CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm=1001.2014.3001.5482
核函数(Kernel Function)指的是在主机(CPU)调用(某些情况下也可以在设备调用),在设备(GPU)上执行的函数,使用__global__限定符修饰。
主机函数(Host Function)指的是在主机(CPU)调用,在主机(CPU)上执行的函数,可以使用__host__限定符修饰,一个普通的C函数其实就是一个主机函数。
设备函数(Device Function)指的是在设备(GPU)调用,在设备(GPU)上指定的函数,使用__device__限定符修饰。
其中__host__和__device__可以一起使用,代表这个函数既可以在主机调用,主机执行;也可以在设备调用,设备执行。
上面的函数修饰符信息总结于表1。
表1 函数类型限定符
限定符 | 调用 | 执行 | 备注 |
__global__ | 可以从主机调用,也可以从计算能力3以上的设备调用 | 在设备执行 | |
__host__ | 从主机调用 | 在主机执行 | 可省略 |
__device__ | 从设备调用 | 在设备执行 |
CUDA提供了一系列运行时(runtime)API供开发者使用,它们大部分是主机函数,小部分即是主机函数也是设备函数。
例如对于下面的内存拷贝API函数,它就是一个主机函数。
__host__ cudaError_t cudaMemcpy ( void* dst, const void* src, size_t count, cudaMemcpyKind kind )
这个函数中的返回值是一个cudaError_t枚举类型,参数dst是目标内存指针,参数src是源内存指针,参数count是需要拷贝的字节数,参数kind是一个cudaMemcpyKind枚举类型。
· cudaMemcpyKind枚举类型的定义如下所示。
cudaMemcpyHostToHost = 0 //Host -> Host
cudaMemcpyHostToDevice = 1 //Host -> Device
cudaMemcpyDeviceToHost = 2 //Device -> Host
cudaMemcpyDeviceToDevice = 3 //Device -> Device//Direction of the transfer is inferred from the pointer values.
Requires unified virtual addressing
cudaMemcpyDefault = 4
下面的设备同步API函数既是一个主机函数,也是一个设备函数。
__host____device__cudaError_t cudaDeviceSynchronize ( void )