簡體   English   中英

在什么條件下Metal着色器代碼“崩潰?”

[英]Under what conditions does Metal shader code “crash?”

我正在開發一個基於金屬的應用程序,在某些情況下,正確編譯和鏈接的着色器代碼將導致應用程序簡單崩潰而不會拋出任何錯誤。

“崩潰”包括視覺輸出的停頓(在某些情況下,前面是一對交替幀的短斷續續續),但是否則是應用程序其余部分的正常處理。 Xcode性能監視實用程序報告60fps但GPU延遲為0ms,並且CPU端執行仍在繼續,對Metal API的調用仍然成功完成。

沒有錯誤報告給控制台。

這是非常難以調試的,因為我沒有指出錯誤來自着色器代碼的位置。 如果我知道在什么條件下實際應該發生這種情況會有所幫助,這樣我就可以有一個很好的清單來檢查。 否則我只是在黑暗中拍攝。

當您讀取或注銷MTLBuffer的末尾,注銷MTLTexture的末尾或者只是運行太長時,GPU可能會崩潰。 有一個看門狗定時器,如果它在幾秒鍾內沒有完成其工作,它將重置GPU。 GPU上的工作不是預先安排的。 通過阻止執行基本GUI任務,長時間運行的工作可能會使設備看起來被鎖定。 如果您有長時間運行的工作負載,則需要將其拆分為許多較小的內核。 為了保持界面響應,您應該保持工作負載<100毫秒。 為避免視頻卡頓,建議使用一致的幀速率。

由於重金屬着色器,我經常發生崩潰,並通過限制調度率來修復它。 您可以通過測量最后一個“幀”的運行時間來輕松完成此操作,並在每次調度之前插入一個等待的比例:

[NSthread sleepFortimeInterval: _lastRunTime*RATIO];
NSDate *startTime = [NSDate date];
... [use Metal shaders] ...
_lastRunTime = -[startTime timeIntervalSinceNow];

我將RATIO設置為1.0。 所以它永遠不會使用超過50%的gpu。 它顯然會影響幀速率,但會擊敗隨機崩潰。 你可以玩這個比例。 好的一點是你不必擔心在不同的產品上節流太多或太少,因為它的運行時間比例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM