在學習代碼的時候,遇到cudaFree(0),疑惑了一下,之前記得是釋放顯存,那麼參數0是做什麼操作?查閱資料並記錄一下。
1:cudaFree函數API:接收void* devptr指針。釋放指針指向的顯存。如果輸入參數時0,不會進行釋放操作。
extern __host__ __cudart_builtin__ cudaError_t CUDARTAPI cudaFree(void *devPtr);
2:那cudaFree(0)的到底是幹嘛的呢?
參考1:https://blog.csdn.net/dfdfdsfdfdfdf/article/details/76674734
cuda裏面沒有對設備的初始化函數InitDevice(),只能每次調用的api函數的時候,加載設備的上下文,自動進行初始化,這將帶來問題:
- First函數調用的時候,需要自動初始化設備,因此耗時過長
- 無法分析第一個api函數的耗時
處理辦法
- 在程序前加設置初始化函數: cudaFree(0),後面程序就不會再次初始化,cudamalloc()也將很快;
- 一次初始化後,程序cudamalloc()分配的內存不釋放,繼續使用,所有程序運行結束後,再一起釋放。 我這裏就把上面參考鏈接裏面的示例代碼拿過作爲示例,感興趣的可以去看一下原文中的完整版。
參考2:https://www.cnblogs.com/xingzifei/p/6119452.html 這篇解釋的更爲詳細和具體,感興趣的可以去參看原文。