LINUX.ORG.RU

cuda и конструкторы/деструкторы

 , ,


1

2

Есть некоторые классы, содержащие внутри указатели на память хоста или девайса. Сейчас эта память выделяется вручную с помощью методов .init(...) и освобождается через .release(), что не очень удобно. Хочется убрать всю работу с памятью в соответствующие конструкторы/деструкторы. Конструктор копирования, соответственно тривиален, не объявлен и создаётся компилятором автоматически. Теперь, если всё таки добавить явные конструкторы/деструкторы, то всё будет нормально при передаче параметра по ссылке, однако если передать параметр по значению, то по выходу из функции будет вызван деструктор, который в данном случае совершенно не нужен. Притом, деструктор, похоже, вызывается даже несмотря на то что у него не указан __device__ атрибут. Т.к. в __global__ функцию можно передавать параметры только по значению, то возникает проблема. Как всё это правильно сделать?

Первое что приходит на ум, это запихнуть всё тело деструктора в #ifdef __CUDACC__, но это выглядит грязным хаком.

★★★★★

Последнее исправление: thunar (всего исправлений: 1)

Обернуть работу с памятью в умный указатель совместного владения?

bonta ★★★★★
()

Конструктор копирования, соответственно тривиален, не объявлен и создаётся компилятором автоматически

Проблема находится тут. После копирования объекта и копия, и оригинал будут иметь указатель на память хоста/девайса. Это противоречит концепции одного владельца для каждого raw указателя.

Я бы рекомендовал переключиться на умные указатели (std::shared_ptr) с нетривиальным deleter для памяти девайса.

trex6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.