在CUDA内核调用期间,C ++对象的生存期会怎样?

时间:2019-05-17 21:56:00

标签: c++ cuda object-lifetime

在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 ++对象生存期?我可以简单地引用一下吗?甚至允许通过引用传递(这似乎很麻烦)吗?

对于任何建议或文档指导,我将不胜感激。

0 个答案:

没有答案