快取注意事項

wujianming_110117發表於2020-12-27

快取注意事項
Numba支援將編譯後的函式快取到檔案系統中,以供將來使用相同的函式。
實施
通過儲存編譯後的目的碼(可執行程式碼的ELF物件)來完成快取。通過使用目的碼,由於不需要編譯,因此快取的函式具有最小的開銷。快取的資料儲存在快取目錄下(請參閱NUMBA_CACHE_DIR)。快取的索引儲存在.nbi檔案中,每個函式有一個索引,並且列出了為該函式編譯的所有load過載簽名。每load過載一個檔案,目的碼被儲存在具有.nbc副檔名檔案中。兩個檔案中的資料都以pickle序列化。
注意
在Python <= 3.7上,Numbapickle使用純Python Pickler進行擴充套件。要使用速度更快的C Pickler,請 從pip安裝pickle5。pickle5向後移植Python 3.8 Pickler功能。
快取要求
開發人員應注意允許快取功能的要求,以確保正在使用的功能與快取相容。
可快取功能的要求:
• LLVM模組必須是獨立的,這意味著如果不連結到其它已編譯的單元,則它不能依賴其它模組。
• 唯一允許的外部符號來自 NRT或系統庫中的其它常見符號(即libc和libm)。
除錯說明:
• inttoptr在LLVM IR或 target_context.add_dynamic_add()Python的降低程式碼中查詢的用法。指示執行時runtime地址的潛在用途。並非所有用途都是有問題的,有些用途是必需的。僅將常量整數轉換為指標會影響快取。
• 錯誤使用動態地址或動態標誌可能會導致段錯誤。
• 連結順序很重要,因為連結後會刪除未使用的符號。連結應從依賴關係圖的葉節點開始。
與快取相容的功能
明確驗證了以下功能可用於快取。
• cpu和parallel目標的ufuncs和gufuncs
• 並行加速器功能(即parallel=True)
快取限制
這是快取的已知限制的列表:
• 快取無效。無法識別在另一個檔案中定義的符號中的更改。
• 全域性變數被視為常量。快取將儲存編譯時使用的全域性變數中的值。在快取載入時,快取的函式將不會重新繫結到全域性變數的新值。
快取共享
在另一臺計算機上共享和重用快取目錄中的內容是安全的。快取會在編譯過程中記錄CPU模型和可用的CPU功能。如果CPU型號和CPU功能不完全匹配,則不會考慮快取內容。(參閱NUMBA_CPU_NAME)
如果快取記憶體目錄在網路檔案系統上共享,僅當檔案替換操作是檔案系統的原子操作時,併發讀取/寫入快取記憶體才是安全的。Numba始終首先寫入唯一的臨時檔案,然後用該臨時檔案替換目標快取檔案路徑。Numba可以容忍丟失的快取檔案和丟失的快取條目。
快取清除
修改相應的原始檔後,快取將失效。但是,有時有需要手動清除快取目錄。例如,由於未修改原始檔,因此無法識別編譯器中的更改。
要清除快取,可以簡單地刪除快取目錄。
在執行Numba應用程式時,刪除快取目錄可能會導致 OSError在編譯站點引發異常。

相關文章