Si ce n'est pas le cas, quelle est la méthode standard pour libérer cudaMalloc
(Notez que je ne suis pas en mesure d'utiliser Thrust).
Réponses
Trop de publicités?Vous pouvez utiliser RAII idiome et mettez votre cudaMalloc()
y cudaFree()
au constructeur et au destructeur de votre objet respectivement.
Une fois l'exception levée, votre destructeur sera appelé, ce qui libérera la mémoire allouée.
Si vous intégrez cet objet dans un pointeur intelligent (ou si vous le faites se comporter comme un pointeur), vous obtiendrez votre pointeur intelligent CUDA.
Vous pouvez utiliser cet outil personnalisé cuda::shared_ptr
la mise en œuvre. Comme indiqué plus haut, cette implémentation utilise std::shared_ptr
en tant qu'enveloppe pour la mémoire des périphériques CUDA.
Exemple d'utilisation :
std::shared_ptr<T[]> data_host = std::shared_ptr<T[]>(new T[n]);
.
.
.
// In host code:
fun::cuda::shared_ptr<T> data_dev;
data_dev->upload(data_host.get(), n);
// In .cu file:
// data_dev.data() points to device memory which contains data_host;
Ce dépôt est en fait un seul fichier d'en-tête ( cudasharedptr.h
), de sorte qu'il sera facile de la manipuler si cela s'avère nécessaire pour votre application.