5

私は Metal ベースのアプリを開発しています。場合によっては、適切にコンパイルおよびリンクされたシェーダー コードによって、エラーが発生することなくアプリケーションが単純にクラッシュすることがあります。

「クラッシュ」は、視覚的な出力の停止 (場合によっては、いくつかの交互フレームの短いスタッターが先行する) で構成されますが、それ以外の場合は、アプリケーションの残りの通常の進行です。Xcode パフォーマンス監視ユーティリティは 60fps を報告しますが、GPU レイテンシは 0ms であり、CPU 側の実行は継続し、Metal API への呼び出しは引き続き正常に完了します。

コンソールにエラーは報告されません。

これは、シェーダー コードのどこからエラーが発生したかを示す兆候がないため、デバッグが非常に困難です。これが実際にどのような条件下で発生するのかを知っていれば、チェックすべき項目のリストを作成できるので助かります。それ以外の場合は、これが発生するたびに暗闇で撮影しています。

4

2 に答える 2

2

GPU は、MTLBuffer の末尾を読み書きするか、MTLTexture の末尾を書き出すか、単純に実行時間が長すぎるとクラッシュする可能性があります。GPU が数秒以内に作業を完了しない場合に GPU をリセットするウォッチドッグ タイマーがあります。GPU での作業は事前にスケジュールされていません。基本的な GUI タスクの実行を妨げることで、長時間実行されている作業によってデバイスがロックされているように見える可能性があります。ワークロードを長時間実行している場合は、ワークロードを多数の小さなカーネルに分割する必要があります。インターフェイスの応答性を維持するには、ワークロードを 100 ミリ秒未満に保つ必要があります。ビデオのスタッタリングを回避するには、一定のフレーム レートを使用することをお勧めします。

于 2016-06-18T16:17:13.540 に答える