【发布时间】:2014-12-30 01:56:03
【问题描述】:
我计划将我的计算划分为一个细粒度的函数/类框架,这些框架封装了某个部分。
类似这样,但有更多的类和通常更长的参数列表:
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__ 并在内核中调用它们时——它们将如何实现?成员函数的调用会产生很大的开销,还是会被内联或以其他方式有效优化?通常,这些函数非常短,但会被调用很多次。
【问题讨论】:
-
我在所有 CUDA 应用程序中都遵循面向对象的模式,从未经历过显着的性能开销,但没有图表来支持我的陈述。我想开发您的应用程序然后对其进行分析,与
__device__函数不是成员函数的版本进行比较...实际上,我确实遇到了一个稍微相关的性能问题,请参阅更多信息 here 但这是由优化器引起的在非常特殊的情况下(包括调用__device__成员函数)无法正确解开循环。