Пока с BAR памятью обращаются правильно (только пишут в нее последовательно блоками) - все будет хорошо. При любой попытке что-то из нее _прочитать_ будет гигантская задержка (потому что она не кэширована и находится физически на видеокарте, т.е. надо дождаться пока этот условный байт прилетит по PCI-e обратно, что невероятно долго. Обычный способ заливать всякое барахло на видеокарту (всмысле без BAR) это взять кусок обычной системной некешированной памяти, записать в него что нужно а затем либо отдельной командой скопировать на gpu (обычно делают для мешей/текстур, которые один раз залил а потом постоянно на гпушке читаешь), либо напрямую в гпушных шейдерах читать из системной памяти (для мелких буфферов, которые каждый кадр меняются это стандартная схема, нет смысла в отдельном копировании). Оба способа предполагают запись в некешированный кусок обычной памяти. Попытка прочитать что-то оттуда тоже будет медленной, и так делать не надо, но это в десятки/сотни раз быстрее, чем чтение из BAR (потому что эта память поближе, не нужно по pci ее доставать). Почему вообще эти медленные чтения могут происходить - обычно недосмотр, типа сделал какую-нить операцию типа += на куске памяти, помеченном как некешированный, вот тебе и просадка. Это довольно частая причина просадок перформанса в рендере
Я не специалист, но могу предположить, что в разных играх используются разные методы оптимизации "графического конвейера". И в зависимости от того как он устроен в конкретной игре (и в чем в нём возникают бутылочные горлышки, от игровой сцены к сцене), ReBAR может быть эффективен или нет.
А есть спецы, которые объяснят почему из-за ReBar могут быть просадки? С чем это связано? Вроде бы должно же наоборот все работать лучше?
Пока с BAR памятью обращаются правильно (только пишут в нее последовательно блоками) - все будет хорошо. При любой попытке что-то из нее _прочитать_ будет гигантская задержка (потому что она не кэширована и находится физически на видеокарте, т.е. надо дождаться пока этот условный байт прилетит по PCI-e обратно, что невероятно долго.
Обычный способ заливать всякое барахло на видеокарту (всмысле без BAR) это взять кусок обычной системной некешированной памяти, записать в него что нужно а затем либо отдельной командой скопировать на gpu (обычно делают для мешей/текстур, которые один раз залил а потом постоянно на гпушке читаешь), либо напрямую в гпушных шейдерах читать из системной памяти (для мелких буфферов, которые каждый кадр меняются это стандартная схема, нет смысла в отдельном копировании). Оба способа предполагают запись в некешированный кусок обычной памяти. Попытка прочитать что-то оттуда тоже будет медленной, и так делать не надо, но это в десятки/сотни раз быстрее, чем чтение из BAR (потому что эта память поближе, не нужно по pci ее доставать).
Почему вообще эти медленные чтения могут происходить - обычно недосмотр, типа сделал какую-нить операцию типа += на куске памяти, помеченном как некешированный, вот тебе и просадка. Это довольно частая причина просадок перформанса в рендере
Я не специалист, но могу предположить, что в разных играх используются разные методы оптимизации "графического конвейера". И в зависимости от того как он устроен в конкретной игре (и в чем в нём возникают бутылочные горлышки, от игровой сцены к сцене), ReBAR может быть эффективен или нет.