CUDA内联函数

来源:互联网 发布:下载excel软件 编辑:程序博客网 时间:2024/05/22 17:34
 一、内联函数的作用
    每一次函数调用都要把原来正在运行的函数的大量数据以及状态标志等压栈,所以每一次函数调用都要消耗栈空间,而频繁的调用小函数便会大量的消耗栈空间。于是c++中便特别引入了inline修饰符,表示位内联函数。
    内联函数事实上是在调用程序中对被调用的内联函数进行展开,这样便避免了频繁调用函数对栈内存重复开辟所带来的消耗。
    
    二、内联函数的具体实现方式
    编译器将函数类型包括函数名、参数个数及其类型还有返回值类型保存在符号表中,当函数体的语法无误时将其实现也保存在符号表中,代码的形式取决于编译器。当遇到调用内联函数时,编译器会分析参数和返回值类型并可能做适当的强制转换,都没有问题时就会进行代码替换,并可能还有进一步的优化。
    
    三、内联函数与宏展开的区别
    宏展开是单纯的代码替换,在预处理阶段完成,因为是简单的代码替换,所以很容易出现悲剧;inline函数虽然也是对函数进行展开,但是在编译阶段进行代码展开,参与类型检查,满足类型和作用域规则。
    
    四、内联函数的局限
  内联函数是编程者向编译器提出的一个申请,当内联函数的函数体过大时,编译器可以拒绝申请,这样内联函数的执行效率便和普通函数一样了,所以内联函数不能包含复杂的控制语句例如while、switch等,并且不能内联函数本身不能是直接递归函数。
  
  五、内联函数应用
  对类中的私有成员进行赋值和访问等操作的函数常常声明为内联函数,因为这些函数往往函数题较小,但却经常被调用,使用内联函数可以大大提高程序效率。
  
  六、CUDA中device函数使用内联函数的原因
  因为global函数和device函数只能在设备上执行,只能对设备存储器进行操作,因为当今的GPU设备虽有有大量的计算单元,但存储单元非常有限,如果global程序每次调用device程序时都进行压栈操作,那会大大浪费珍贵的设备存储空间,所以device函数便默认为内联函数,这样可以节省稀缺的设备存储器资源。
  当然如果实在不希望device函数内联,可以使用_noinline_ 函数限定符暗示编译器尽可能不要内联该函数。然而如果函数有指针参数或者较大的参数列表,则编译器会否决_noinline_ 限定
原创粉丝点击