Войти
ПрограммированиеФорумГрафика

[Решено] Pipeline Statistics Query в Вулкане периодически возвращает -1

Страницы: 1 2 Следующая »
#0
10:06, 12 янв. 2020

Всем привет!
Может быть кто сталкивался с такой проблемой: Pipeline Statistics Query в Вулкане периодически возвращает -1 (0xFFFFFFFFFFFFFFFF) во всех полях, при этом показывает, что данные доступны.
Данные из query забираю следующим образом:
- vkCmdResetQueryPool
- vkCmdBeginQuery
- vkCmdEndQuery
- Проверяю фенс пока все не испонится на GPU
- vkGetQueryPoolResults(VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)

Обычно все работает нормально, но периодически все поля данных устанавилваются в 0xFFFFFFFFFFFFFFFF, последнее - 1 (т.е. данные есть). vkGetQueryPoolResults возвращает VK_SUCCESS.

В качестве эксперимента попробовал не проверять фенс - тогда все поля остаются неизменными, а последнее - 0, как в спеке и написано. Т.е. query специально записывает -1 во все поля, и показывает, что данные есть. Что это значит, в спеке не нашел. Воспроизводится чрезвычайно нерегулярно и вообще никакой закономерности найти не смог. Может кто знает, что это?


#1
11:44, 12 янв. 2020

assiduous
слои молчат?
код смотреть нужно, минимальный рабочий пример выкладывать сюда и на сайт поддержки разработчиков соответствующего вендора.

#2
(Правка: 12:03) 11:58, 12 янв. 2020

assiduous
> Может кто знает, что это?

на разных вендорах? думаю что очередной баг

без K_QUERY_RESULT_WITH_AVAILABILITY_BIT работает без бага?

#3
20:43, 12 янв. 2020

Andrey
> слои молчат?
Слои молчат, конечно.

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

Я пытаюсь понять, что бы это вообще могло значить, потому что согласно спеке:
- Если vkGetQueryPoolResults исполняется после того, как vkCmdResetQueryPool испонился в очереди, то он возвращает 0 в качестве флага и ничего не пишет
- Если vkGetQueryPoolResults исполняется до того как vkCmdResetQueryPool испонился в очереди, он вернет предыдущее состояние Query (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html… ryPoolResults).

Нигде не написано, что может означить -1

#4
20:45, 12 янв. 2020

innuendo
> без K_QUERY_RESULT_WITH_AVAILABILITY_BIT работает без бага?
То же самое. Я готовность query проверяю три раза - по фенсу, по результату vkGetQueryPoolResults и по флагу. Так что флаг, видимо, ни при чем.

#5
21:49, 12 янв. 2020

assiduous
выложи минимальный пример

#6
21:50, 12 янв. 2020

Andrey
> слои молчат?
Кстати, с выключенными слоями не воспроизводится (во всяком случае, я не смог воспроизвести ни разу). Может, действительно в слоях косяк? Спрошу на гитхабе.

#7
0:46, 13 янв. 2020

может VK_QUERY_RESULT_WAIT_BIT добавить?

#8
0:59, 13 янв. 2020

/A\
> может VK_QUERY_RESULT_WAIT_BIT добавить?
Хм, по идеи это не должно навредить если результаты уже есть, надо попробовать. Но я склоняюсь к тому, что это действительно проблема слоев валидации. У них несколько открытых багов про query.

#9
(Правка: 6:46) 6:44, 13 янв. 2020

я ставлю QUERY_RESULT_WAIT_BIT, так как справшиваю результаты от кадра, который уже отображён на экране. если всё идёт по плану, то по факту ожидания быть не должно, на практике так и происходит. на вулкане подобных багов не встречал. однако, на d3d11 их query иногда возвращают ну просто всё что угодно, кроме моих таймингов. самый распространённый косяк — что один query возвращается аномально коротким, а какой-то другой при этом — аномально длинным, а их сумма сохраняется. причём разница бывает очень существенной и воспроизводится чуть ли не каждый второй кадр. ещё в d3d данные могут приходит с огромной задержкой в несколько кадров, если монитор подключен не к той видюхе, на которой происходит рендеринг (например, моник подключен к встроенной видюхе, когда рендеринг происходит на дискретной).

#10
7:53, 13 янв. 2020

Suslik, /A\
Нет, даже QUERY_RESULT_WAIT_BIT не помогает - я вообще тогда не понимаю, что происходит, т.к.

If VK_QUERY_RESULT_WAIT_BIT is set, Vulkan will wait for each query to be in the available state before retrieving the numerical results for that query. In this case, vkGetQueryPoolResults is guaranteed to succeed and return VK_SUCCESS if the queries become available in a finite time

Либо я что-то делаю совсем неправильно, либо где-то в драйвере проблема, потому что я и без слоев теперь могу воспроизвести. Откуда берется -1 во всех полях - фиг знает.
Странно, что эта проблема воспроизводится только с Pipeline Statistics. Timestamp работают без проблем.
Возможно, это как-то связано с тесселяцией

#11
(Правка: 8:34) 8:32, 13 янв. 2020

assiduous
может ли в твоём случае это быть связано с временем жизни объектов, привязанных к разным frame-in-flight? например, present engine может тебе возвращать изображения в одном и том же порядке 100 раз из 100, но на 101 раз порядок имеет право сбиться и если ты какие-то ресурсы ассоциируешь с image'ами из present queue, то они могут ломаться из-за этого так как ты будешь ждать не тот семафор.

в твоём случае слои валидации, возможно, меняют тайминги API вызовов на стороне CPU и поэтому проблему с ними может быть проще воспроизвести. можно попробовать ставить sleep'ы в разные места, чтобы понять, где именно задержки приводят к надёжному воспроизведению проблемы.

#12
8:44, 13 янв. 2020

Suslik
Я не совсем понимаю, почему и как может поменяться порядок. Я записываю следующие команды в командный буфер:
- vkCmdResetQueryPool
- vkCmdBeginQuery
- vkCmdDraw
- vkCmdDraw
...
- vkCmdEndQuery

Затем я отправляю этот буфер в очередь и записываю фенс. Когда фенс просигналился, я вызываю
vkGetQueryPoolResults(VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) и смотрю на результаты. Как это может работать неправильно с VK_QUERY_RESULT_WAIT_BIT я не понимаю, но там точно что-то с синхронизацией, потому что в зависимости от того, сколько времени проходит между vkCmdResetQueryPool и моментом использования query зависит как часто я получаю -1.

#13
8:58, 13 янв. 2020

assiduous

сделай пример - мы потестим

#14
(Правка: 9:01) 8:58, 13 янв. 2020

assiduous
сколько у тебя frames in flight и сколько у тебя image'ей в swapchain'е? попробуй сделать одно изображение и проверь, что с ним работает. далее попробуй с несколькими. смысл этого в том, что vkAcquireNextImageKHR может очень долго выдавать изображения по порядку, но иногда порядок может нарушаться (и это нормально, так как никто не даёт гарантии, что он обязан сохраняться) — это полурандомный процесс и, возможно, твои траблы связаны с нарушением этого порядка.

PS но эти все движения — чтобы более точно локализовать проблему. она может быть в итоге всё равно в драйвере, но тогда у тебя будут более конкретные данные, чтобы засабмитить багрепорт.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика