2015-08-12 4 views
3

Я разрабатываю приложение на основе металла, а в некоторых случаях правильно скомпилированный и связанный шейдерный код приведет к простому сбою приложения без каких-либо ошибок.При каких условиях Металлический шейдерный код "crash?"

«Сбой» состоит из остановки визуального вывода (в некоторых случаях предшествует короткое заикание пары чередующихся кадров), но в остальном нормальное шествие остальной части приложения. Утилиты мониторинга производительности Xcode сообщают 60 кадров в секунду, но 0 мс латентности графического процессора, а исполнение на стороне процессора продолжается, а вызовы Metal API все еще успешно завершаются.

На консоль не сообщается никаких ошибок.

Это очень сложно отлаживать, поскольку у меня нет указаний на то, где в шейдерном коде возникает ошибка. Это помогло бы, если бы я знал, при каких условиях это должно произойти, чтобы у меня был хороший список вещей для проверки. В противном случае я просто стреляю в темноте, когда это возникает.

+0

Я работаю с вычислительными ядрами, и у меня также есть частые сбои. Никакой помощи от xcode в любом случае. Я прокомментирую код до тех пор, пока он не будет работать, а затем добавим части обратно. Занимает огромное количество времени. Металлическая площадка была бы потрясающей. Быстрое тестирование небольших фрагментов кода. –

+0

После небольшого рабочего времени, похоже, это побочный эффект систем восстановления от отказа iOS (я не получаю много этих проблем в OS X). Я сократил большинство сбоев либо в шейдере, выполняющем слишком медленно (iOS, кажется, автоматически разбивает приложения, когда FPS идет ниже 1, чтобы предотвратить сбой приложения во всем устройстве) или когда я обращаюсь к недопустимой области памяти (приложения iOS, в конце концов, песочница). Теперь было бы неплохо, если бы эти системы действительно обменивались данными с интерфейсом Metal, что драйвер был разбит, так что вызовы API сообщили бы о реальной ошибке. – Textfield

+0

У меня есть тестовый проект, настроенный для C++, чтобы просто отлаживать код. Выделение и отладка синтаксиса намного лучше. Я думаю, что большие шейдеры с множеством петель. а затем он сбой, такой же, как у вас. –

ответ

2

Графический процессор может быть поврежден, когда вы читаете или списываете конец MTLBuffer, сбрасываете конец MTLTexture или просто запускаете слишком долго. Существует сторожевой таймер, который сбросит GPU, если он не завершит свою работу менее чем за несколько секунд. Работа с графическим процессором не выполняется заранее. Возможно, что при длительной работе устройство блокируется, предотвращая выполнение основных задач GUI. Если у вас есть длительные рабочие нагрузки, необходимо разбить его на несколько меньших ядер. Чтобы поддерживать отзывчивость интерфейса, вы должны сохранять рабочие нагрузки < 100 мс. Во избежание заикания видео рекомендуется согласованная частота кадров.

+0

Это очень затрудняет использование Металла для любой тяжелой/переменной вычислительной нагрузки на iOS. Действительно ли нет опции preemption, поэтому тяжелые вычисления могут продолжаться, не блокируя задачи GUI? – Hashman

0

У меня были частые сбои из-за тяжелых металлических шейдеров, а также исправлены, чтобы исправить это, регулируя скорость отправки. Вы можете сделать это легко, измеряя время выполнения последнего «кадра», и вставляя ждать перед каждой отправкой в ​​соотношении от этой суммы:

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

Я установил RATIO 1.0. Таким образом, он никогда не использует более 50% gpu. Это, очевидно, влияет на частоту кадров, но превосходит случайные сбои. Вы можете играть с коэффициентом. Приятно, что вам не нужно беспокоиться о том, чтобы слишком сильно или слишком мало воздействовать на разные продукты, так как это соотношение времени выполнения.

Смежные вопросы