Что происходит с временами жизни объектов 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? Могу ли я просто передать по ссылке? Разрешено ли даже по ссылке (похоже, что-то сломать)?
Буду признателен за любые предложения или ссылки на документацию.