Andrey
В каком смысле и почему?
Такого быть не должно.
Конечно, зависит от архитектуры и вендора, но если в общем смысле, то компьют очередь выполняется на выделенных из общей корзины юнитах.
Страшно как-то читать что Resource Barrier - LEGACY.
luckyleo769
> В каком смысле и почему?
сам же ответил
>Конечно, зависит от архитектуры и вендора, но если в общем смысле, то компьют очередь выполняется на выделенных из общей корзины юнитах.
Не спросат есть специальный enum для этого
Andrey
Я ответил, что компьют это в целом просто подмножество от директа, если, вообще нативно доступен. ДХ может вежливо игнорить тип очереди если девайс его нативно не сапортит
luckyleo769
> ДХ может вежливо игнорить тип очереди если девайс его нативно не сапортит
Не совсем так. У меня было +50% от асинк компьюта на интел 620, где компьют очереди вообще нет. Теоретически это возможно если сначала запустить компьют на части ядер, а потом рисование, которое будет использовать освободившиеся ядра. В том тесте рисование было неоптимизированно поэтому меньшее количество ядер никак не влияло.
/A\
> на интел 620, где компьют очереди вообще нет.
Об этом я и говорю. Компьют очередь это больше гарантия что лишние юниты не участвуют в распределении.
То что + к перфу, просто планировщик мог оптимальнее распределил юниты между двумя виртуальными очередями. Конкурентная работа выполняется всегда, когда возможно и без асинка
То, что прям +50%, не верю. Может там время кадра было на уровне погрешности
В общем сделал так, нслииесть опция показывать статистику для compute создаётся D3D12_COMMAND_LIST_TYPE_DIRECT queue,иначе D3D12_COMMAND_LIST_TYPE_COMPUTE
Ребят, при создании кучи, есть ли смысл позаботиться и узнать поддерживается ли L1 и указать D3D12_MEMORY_POOL_L1? Или же можно всегда выставлять D3D12_MEMORY_POOL_UNKNOWN и он сам всегда будет брать L1 если она есть?
s3dworld
Для подавляющего большинства кейсов будет достаточно unknown.
При unknown DXGI сам выбирает где аллоцировать хип, а в случае OOM будет переливать данные из одного пула в другой. При OOM будут значительные просадки по перфу, но без крашей.
Если же менеджить выбор пулов, то перекачку данных (освобождение L1) или другой механизм защиты от ООМ придется делать ручками, как в вулкане.
Ну еще может быть получится более оптимально плясать между пулами, чем у DXGI.
s3dworld
> Или же можно всегда выставлять D3D12_MEMORY_POOL_UNKNOWN и он сам всегда будет
> брать L1 если она есть?
Если тип кучи DEFALUT или GPU_UPLOAD, то будет браться пул L1, при условии, что такой пул есть.
Для UPLOAD и READBACK всегда берётся пул L0 (т. е. оперативная память).
Ребят, а для матрицы ModelViewProj нормальная практика создать константный буфер в UPLOAD кучи, делать Map() и в таком состоянии держать? Не нужно создавать второй константный буфер в DEFAULT и данные перемещать между UPLOAD в DEFAULT при обновлении?
s3dworld
Для per instance констант думаю смысла нет. Per frame, наверное, лучше закинуть в дефолт хип.
HolyDel
> Для per instance констант думаю смысла нет. Per frame, наверное, лучше закинуть в дефолт хип.
Не понимаю это раздение на per instance и per frame. Вот в примере от Microsoft, они создают константный буфер в UPLOAD, один раз вызывают Map(), получают указатель на область памяти. Сохраняют этот указатель и каждый кадр записывают новое значение (предварительно синхронизируя что работа завершена). И что же, даже не нужно вызывать никакой функции, сообща устройству что данные обновлены (а если вдруг там 1000 кадров в секунду, он всё равно успеет 1000 раз новые данные извлечь?)? Я так понимаю это и называется per frame и тут лучше делать COPY в память GPU если она есть? А что тогда per instance?
s3dworld
> они создают константный буфер в UPDATE, один раз вызывают Map()
Так можно, но нужно помнить, эта память параллельно с аплоадом юзается и гпу и нужно синхронизировать выполнение команд, использующих константный буфер для чтения и команд записи на цпу.
Upload и default про другое, про скорость доступа со стороны гпу. Но чтобы данные попали в default со стороны цпу, они сперва должны попасть в синхронизированный upload.
luckyleo769
Я там ошибся, вместо UPLOAD написал UPDATE.