Что происходит с временами жизни объектов C ++ во время вызовов ядра CUDA? - PullRequest
1 голос
/ 18 мая 2019

Что происходит с временами жизни объектов C ++ во время вызова ядра CUDA? А именно, вызваны ли конструкторы / деструкторы для объектов, передаваемых ядрам при вызове ядра, и если да, то они вызываются на стороне хоста или на стороне устройства?

Я наблюдаю какое-то странное (для меня) поведение, и я не смог найти разъясняющую документацию по этому вопросу.

Я пытался понять следующий код:

#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 является созданной копией, затем деконструированной, как на хосте, во время вызова ядра. Я бы предпочел, чтобы этого не происходило, поэтому мне любопытно, есть ли способы спроектировать мой объект или вызов ядра, чтобы не вызывать конструктор копирования и деструктор.

Существует ли какая-либо документация о том, что время жизни объектов C ++ должно быть связано с вызовами ядра CUDA? Могу ли я просто передать по ссылке? Разрешено ли даже по ссылке (похоже, что-то сломать)?

Буду признателен за любые предложения или ссылки на документацию.

...