在CUDA内核调用期间,C ++对象的生存期会怎样?也就是说,传递给内核的对象的构造函数/析构函数是在内核调用时调用的吗?如果是,则是在主机端还是在设备端调用它们?
我观察到一些奇怪的行为(对我而言),但是我一直未能找到澄清的文档。
我一直试图理解以下代码:
#include <cstdio>
struct Foo {
explicit Foo() {}
~Foo() {
#ifdef __CUDA_ARCH__
printf("Destructor on device!\n");
#else
printf("Destructor on host!\n");
#endif
}
Foo(const Foo&) {
#ifdef __CUDA_ARCH__
printf("Copy constructor on device!\n");
#else
printf("Copy constructor on host!\n");
#endif
}
};
__global__ void kernel(Foo foo) {
}
int main() {
Foo f;
kernel<<<1, 1>>>(f);
return 0;
}
运行此命令时,会看到以下输出:
Copy constructor on host!
Destructor on host!
Destructor on host!
因此,基于输出,在内核调用期间,Foo
被复制构造,然后在主机上被解构。我希望这种情况不会发生,所以我很好奇是否存在设计对象或内核调用的方法,以便不调用复制构造函数和析构函数。
是否有任何文档说明有关CUDA内核调用的C ++对象生存期?我可以简单地引用一下吗?甚至允许通过引用传递(这似乎很麻烦)吗?
对于任何建议或文档指导,我将不胜感激。