свободная память, выделенная на устройстве от хоста

действительно ли для освобождения памяти устройства выделена функция хоста?
Я пишу некоторый класс C ++, который должен использоваться на хосте и устройстве. Мой конструктор и деструктор примерно такие:

class myClass {
public:
__host__ __device__ myClass() {
#if defined(__CUDA_ARCH__)
data = (char*)malloc(DATA_SIZE);
#else
cudaMalloc(&data,DATA_SIZE);
#endif
}

__host__ __device__ ~myClass() {
#if defined(__CUDA_ARCH__)
free(data);
#else
cudaFree(data);
#endif
}

private:
char* data;
}

Приведенный выше код компилируется, и я не получаю сообщение об ошибке, если создаю класс на устройстве и освобождаю его на хосте. Но этот случай не задокументирован в документах разработчика CUDA.

2

Решение

Как для CUDA 4.2, так и для CUDA 5.0 RC руководство программиста CUDA C упоминает в разделе B.17, что: «Память, выделенная с помощью malloc (), не может быть освобождена с помощью среды выполнения (то есть путем вызова любого
свободных функций памяти из памяти устройства). «(Этот конкретный текст взят из документа CUDA 5.0 RC. В исходном документе« Память устройства »является гиперссылкой на раздел 3.2.2). Документ CUDA 4.2 можно найти Вот (у него похожая формулировка.) Мне интересно, если: 1.) В действительности все происходит так, как вы думаете. В зависимости от того, как вы разместите переменную в коде ядра, я думаю, что она может выйти из области видимости при завершении ядра, что неявно вызовет ваш (на стороне устройства) деструктор. 2.) вызов cudaFree с неверным указателем (возможно, потому что это указатель устройства или, возможно, потому что он уже был освобожден) просто игнорируется. Без вашего кода, чтобы играть, все это просто предположение. Но если вы проверяете ошибки и не получаете их, то это может игнорироваться.

2

Другие решения

Если NVIDIA недавно не сняла это ограничение, вы должны освободить память с помощью встроенного в ядро ​​malloc (), вызвав внутриядерное free (). Т.е. вы не можете вызвать cudaFree () для освобождения памяти, которая была выделена в ядре с помощью malloc ().

Возможно, он не возвращает ошибку, но также может быть утечка памяти.

0