# 7.5。關于 Numba Runtime 的注意事項
> 原文: [http://numba.pydata.org/numba-doc/latest/developer/numba-runtime.html](http://numba.pydata.org/numba-doc/latest/developer/numba-runtime.html)
_Numba Runtime(NRT)_ 為 _nopython 模式 _ Python 子集提供語言運行時。 NRT 是一個帶有 Python 綁定的獨立 C 庫。這允許在沒有 GIL 的情況下使用 NPM 運行時功能。目前,NRT 中實現的唯一語言功能是內存管理。
## 7.5.1。內存管理
NRT 實現 NPM 代碼的內存管理。它使用 _ 原子引用計數 _ 進行線程安全的確定性內存管理。 NRT 維護一個單獨的`MemInfo`結構,用于存儲有關每個分配的信息。
### 7.5.1.1。與 CPython 合作
為了讓 NRT 與 CPython 合作,NRT python 綁定提供了用于轉換導出內存區域的 python 對象的適配器。當這樣的對象用作 NPM 函數的參數時,會創建一個新的`MemInfo`并獲取對 Python 對象的引用。當 NPM 值返回到 Python 解釋器時,將檢查關聯的`MemInfo`(如果有)。如果`MemInfo`引用 Python 對象,則會釋放并返回基礎 Python 對象。否則,`MemInfo`將包裝在 Python 對象中并返回。根據類型,可能需要額外的過程。
當前實現支持 Numpy 數組和任何緩沖區導出類型。
### 7.5.1.2。編譯器方面的合作
NRT 引用計數要求編譯器根據用法發出遞增/遞減操作。當引用計數降為零時,編譯器必須在 NRT 中調用析構函數例程。
### 7.5.1.3。優化
允許編譯器天真地發出遞增/遞減操作。它依賴于優化傳遞來刪除冗余引用計數操作。
優化過程在塊級別上運行以避免控制流分析。它取決于 LLVM 函數優化傳遞,以簡化控制流,堆棧到寄存器和簡化指令。它的工作原理是匹配和刪除每個塊中的 incrementf 和 decref 對。
### 7.5.1.4。怪癖
由于[引用計數優化傳遞](#nrt-refct-opt-pass)需要 LLVM 函數優化傳遞,因此傳遞在 LLVM IR 上作為文本工作。然后,優化的 IR 再次實現為新的 LLVM 內存中 bitcode 對象。
### 7.5.1.5。調試泄漏
要調試 NRT MemInfo 中的引用泄漏,每個 MemInfo python 對象都有一個`.refcount`屬性用于檢查。要從 NRT 分配的 ndarray 獲取 MemInfo,請使用`.base`屬性。
要調試 NRT 中的內存泄漏,`numba.runtime.rtsys`定義`.get_allocation_stats()`。它返回一個 namedtuple,它包含自程序啟動以來的分配和釋放次數。檢查分配和釋放計數器是否匹配是了解 NRT 是否泄漏的最簡單方法。
### 7.5.1.6。調試 C 中的泄漏
[numba / runtime / nrt.h](https://github.com/numba/numba/blob/master/numba/runtime/nrt.h) 的開頭有以下幾行:
```py
/* Debugging facilities - enabled at compile-time */
/* #undef NDEBUG */
#if 0
# define NRT_Debug(X) X
#else
# define NRT_Debug(X) if (0) { X; }
#endif
```
取消定義 NDEBUG(取消注釋`#undef NDEBUG`行)可以在 NRT 中啟用斷言檢查。
啟用 NRT_Debug(用`#if 1`替換`#if 0`)將打開 NRT 內的調試打印。
## 7.5.2。遞歸支持
在編譯一對相互遞歸函數期間,其中一個函數將包含未解析的符號引用,因為編譯器一次處理一個函數。在 LLVM 生成機器代碼之前,未分解符號的存儲器被分配并初始化為 _ 未解析符號中止 _ 函數(`nrt_unresolved_abort`)的地址。在編譯新函數時跟蹤和解析這些符號。如果錯誤阻止了這些符號的解析,則將調用中止函數,從而引發`RuntimeError`異常。
_ 未解析符號中止 _ 函數在 NRT 中定義為零參數簽名。調用者可以安全地使用任意數量的參數調用它。因此,可以安全地用于預定的被叫者。
## 7.5.3。未來計劃
NRT 的計劃是創建一個可以鏈接到 Numba 編譯代碼的獨立共享庫,包括在 Python 解釋器中使用而不需要 Python 解釋器。為了做到這一點,我們將進行一些重構:
* numba NPM 代碼引用“helperlib.c”中的靜態編譯代碼。這些功能應該轉移到 NRT。
- 1. 用戶手冊
- 1.1。 Numba 的約 5 分鐘指南
- 1.2。概述
- 1.3。安裝
- 1.4。使用@jit 編譯 Python 代碼
- 1.5。使用@generated_jit 進行靈活的專業化
- 1.6。創建 Numpy 通用函數
- 1.7。用@jitclass 編譯 python 類
- 1.8。使用@cfunc 創建 C 回調
- 1.9。提前編譯代碼
- 1.10。使用@jit 自動并行化
- 1.11。使用@stencil裝飾器
- 1.12。從 JIT 代碼 中回調到 Python 解釋器
- 1.13。性能提示
- 1.14。線程層
- 1.15。故障排除和提示
- 1.16。常見問題
- 1.17。示例
- 1.18。會談和教程
- 2. 參考手冊
- 2.1。類型和簽名
- 2.2。即時編譯
- 2.3。提前編譯
- 2.4。公用事業
- 2.5。環境變量
- 2.6。支持的 Python 功能
- 2.7。支持的 NumPy 功能
- 2.8。與 Python 語義的偏差
- 2.9。浮點陷阱
- 2.10。 Python 2.7 壽命終止計劃
- 3. 用于 CUDA GPU 的 Numba
- 3.1。概述
- 3.2。編寫 CUDA 內核
- 3.3。內存管理
- 3.4。編寫設備功能
- 3.5。 CUDA Python 中支持的 Python 功能
- 3.6。支持的原子操作
- 3.7。隨機數生成
- 3.8。設備管理
- 3.10。示例
- 3.11。使用 CUDA 模擬器 調試 CUDA Python
- 3.12。 GPU 減少
- 3.13。 CUDA Ufuncs 和廣義 Ufuncs
- 3.14。共享 CUDA 內存
- 3.15。 CUDA 陣列接口
- 3.16。 CUDA 常見問題
- 4. CUDA Python 參考
- 4.1。 CUDA 主機 API
- 4.2。 CUDA 內核 API
- 4.3。內存管理
- 5. 用于 AMD ROC GPU 的 Numba
- 5.1。概述
- 5.2。編寫 HSA 內核
- 5.3。內存管理
- 5.4。編寫設備功能
- 5.5。支持的原子操作
- 5.6。代理商
- 5.7。 ROC Ufuncs 和廣義 Ufuncs
- 5.8。示例
- 6. 擴展 Numba
- 6.1。高級擴展 API
- 6.2。低級擴展 API
- 6.3。示例:間隔類型
- 7. 開發者手冊
- 7.1。貢獻給 Numba
- 7.2。 Numba 建筑
- 7.3。多態調度
- 7.4。關于發電機的注意事項
- 7.5。關于 Numba Runtime 的注意事項
- 7.6。使用 Numba Rewrite Pass 獲得樂趣和優化
- 7.7。實時變量分析
- 7.8。上市
- 7.9。模板注釋
- 7.10。關于自定義管道的注意事項
- 7.11。環境對象
- 7.12。哈希 的注意事項
- 7.13。 Numba 項目路線圖
- 8. Numba 增強建議
- 9. 術語表