CUDA __device__作为类成员的功能:内联和性能?

时间:2014-11-03 11:53:28

标签: 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__并在内核中调用它们时 - 它们将如何实现?对于成员函数的调用,我是否会有很大的开销,还是会内联或以其他方式有效地优化?通常,这些功能非常短,但很多次都被称为。

1 个答案:

答案 0 :(得分:3)

GPU编译器将积极地inline函数用于性能原因。在这种情况下,应该对绩效没有特别的影响。

如果无法内联函数,则会发生通常的性能开销,包括创建堆栈帧和调用函数 - 正如您在CPU调用非内联函数时所观察到的那样。

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

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