c++ - CUDA __device__ 函数作为类成员 : Inlining and performance?

标签 c++ cuda

我计划将我的计算划分为一个封装特定部分的函数/类的细粒度框架。

类似这样,但是有更多的类和通常更长的参数列表:

class Point{

  Coordinates thisPoint;
  Value getPointValue();
  Point getPoint(Offset offset); 
  Point getNumNeighbors();
  Point getNeighbor(int i);
  // many more

}

class Operator{

  void doOperation(Point p){
    // calls some of the functions in Point
  }

} 

显然,这在任何面向对象的语言中都是一个很好的做法。但它旨在在 CUDA GPU 上运行。我不知道的是:当我将所有这些细粒度函数限定为 __device__ 并在内核中调用它们时 - 它们将如何实现?我是否会对成员函数的调用产生很大的开销,或者这是否会被内联或以其他方式有效优化?通常,这些函数非常短,但会调用很多很多次。

最佳答案

GPU 编译器会主动 inline出于性能原因的功能。在这种情况下,应该不会对性能产生特别的影响。

如果一个函数不能被内联,那么通常的性能开销就会发生,包括创建堆栈帧和调用一个函数——就像你在 CPU 调用一个非内联函数时观察到的那样。

如果您对特定示例有疑虑,您可以创建一个简短的测试代码并使用 cuobjdump -sass myexe 查看生成的汇编语言 (SASS) 并确定函数是否是内联。

没有 general restrictions关于作为类成员/方法的 __device__ 函数的内联。

关于c++ - CUDA __device__ 函数作为类成员 : Inlining and performance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26713756/

相关文章:

c++ - CUDA程序的问题

c++ - 使用开罗检查路径是否简单且封闭

c++ - 编码 PHP 代码浏览器 : is Bison/Flex a choice?

c++ - 处理许多自定义异常的最佳方法是什么

c++ - 如何在超时后关闭并退出使用 exec() 显示的 QDialog?

c++ - 将字符数组传递给 CUDA 内核

时间:2018-01-08 标签:c++cuda: cudaMallocManaged access outside of constructor

c++ - 如何为音频应用程序/插件模拟真空管的声音?

c++ - cuda 中的双调排序错误排序了一些值

cuda - 在 CUDA 中解除纹理绑定(bind)之前我应该​​同步吗?