我计划将我的计算划分为一个封装特定部分的函数/类的细粒度框架。
类似这样,但是有更多的类和通常更长的参数列表:
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/