我计划将我的计算划分为一个细粒度的函数/类框架,它封装了某个部分。
这样的东西,但是更多的类,通常更长的参数列表:
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__
并在内核中调用它们时 - 它们将如何实现?对于成员函数的调用,我是否会有很大的开销,还是会内联或以其他方式有效地优化?通常,这些功能非常短,但很多次都被称为。
答案 0 :(得分:3)
GPU编译器将积极地inline函数用于性能原因。在这种情况下,应该对绩效没有特别的影响。
如果无法内联函数,则会发生通常的性能开销,包括创建堆栈帧和调用函数 - 正如您在CPU调用非内联函数时所观察到的那样。
如果您对特定示例有疑虑,可以使用cuobjdump -sass myexe
创建一个简短的测试代码并查看生成的汇编语言(SASS),并确定该函数是否内联。
在__device__
函数的内联中没有general restrictions作为类成员/方法。