C++ CUDA编程#2

CUDA程序的基本框架

单源CUDA程序的框架

包含头文件

定义常量或宏

声明 c++ 自定义函数和 cuda 核函数的原型

int main()
{
    1. 分配主机和设备内存
    2. 初始化主机中数据
    3. 将某些数据从主机复制到设备
    4. 调用核函数在设备中计算
    5. 将某些数据从设备复制到主机
    6. 释放主机和设备内存
}

c++ 自定义函数和 cuda 核函数的定义

CUDA核函数的要求

  • 返回类型必须是void,但是可以在程序中return,但是不能返回任何值
  • 必须使用__global__限定符,也可以使用C++中的限定符
  • 支持C++重载
  • 不支持可变的参数列表,参数必须确定
  • 一般情况下,传递给核函数的数组、指针必须指向设备内存(统一内存编程机制除外)
  • 类的成员函数不可以是核函数,一般用包装函数调用核函数,将包装函数定义为类成员
  • 在计算能力3.5(3.5是版本号)之前,核函数间不能相互调用,在动态并行引入以后可以相互调用
  • 无论从主机调用还是从设备调用,核函数都运行在设备上

自定义设备函数

核函数可以调用不带执行配置的自定义函数,即 设备函数

设备函数在设备中执行、在设备中被调用;而核函数在设备中执行、在主机中被调用。

  1. __global__修饰的函数称为核函数,一般由主机调用、在设备中执行;
  2. __device__修饰的函数称为设备函数,只能被核函数或其他设备函数调用、在设备中执行;
  3. __host__修饰主机段的普通 c++ 函数,在主机中被调用、在主机中执行,一般可以省略;
  4. 可以同时用 __host__ 和 __device__ 修饰函数,从而减少代码冗余,此时编译器将 分别在主机和设备上编译该函数;
  5. 不能同时用 __global__ 和 __device__ 修饰函数;
  6. 不能同时用 __global__ 和 __host__ 修饰函数;
  7. 可以通过 __noinline__ 建议编译器不要将一个设备函数当作内联函数;
  8. 可以通过 __forceinline__ 建议编译器将一个设备函数当作内联函数。

设备函数可以有返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值