Стоит ли беспокоиться о местонахождении GPU?

9

Влияет ли локальность ссылок на производительность GPU так же сильно, как на производительность CPU?

Например, если я отправлю 200 команд рисования в графический процессор, увижу ли я (потенциально) заметную разницу, если данные для каждой команды будут смежными в памяти, а не перемещаться по буферам / картам текстур?

Дополнительный вопрос: я предполагаю, что GPU защищает от ложных проблем с совместным использованием, поскольку большинство ресурсов являются неизменяемыми. Но в случае, если это не так, то почему потоки всегда выполняют работу из четырех фрагментов?

Xenoprimate
источник

Ответы:

10

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

При использовании OpenGL / DirectX вы обычно имеете ограниченный контроль над макетом памяти, остальное сделает драйвер. Например, вы можете попробовать несколько макетов буферов вершин, таких как использование данных вершин с чередованием или без чередования, и в зависимости от производительности ваших данных / драйвера / графического процессора будет зависеть. Профиль и выберите то, что лучше всего подходит для вашего приложения.

Например, при оптимизации GPU Gems Pipeline местность ссылок упоминается дважды , первая:

Доступ к данным вершин относительно последовательным образом. Современные графические процессоры обращаются к кеш-памяти при извлечении вершин. Как и в любой иерархии памяти, пространственная привязка помогает максимизировать попадания в кэш, тем самым снижая требования к пропускной способности.

А второй

Оптимизировать для кэша вершин после T & L. Современные графические процессоры имеют небольшой кэш «первым пришел - первым вышел» (FIFO), в котором хранятся результаты самых последних преобразованных вершин; попадание в этот кэш сохраняет всю работу по преобразованию и освещению, а также всю работу, выполненную ранее в конвейере. Чтобы воспользоваться преимуществами этого кэша, вы должны использовать индексированные примитивы и упорядочить вершины, чтобы максимизировать локальность ссылок по сетке. Доступны инструменты, в том числе D3DX и NVTriStrip (NVIDIA 2003), которые могут помочь вам в этой задаче.

По моему мнению, эти рекомендации следуют тому, о чем я говорил, и подразумевают, что вы не имеете абсолютного контроля над макетом памяти, но то, что вы контролируете, например, как выложены все вершины VBO, может влиять на производительность.

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

Я думаю, что вам следует больше беспокоиться о локальности ссылок при использовании OpenCL / CUDA, где вы часто имеете абсолютный контроль над макетом памяти.

concept3d
источник
3

Первоначально графические процессоры использовались только для мультимедийных приложений, которые показывают небольшое повторное использование данных. Поскольку графические процессоры все шире используются для приложений общего назначения (отсюда и термин GPGPU), в настоящее время они оснащены аппаратно-управляемыми кешами большого размера, например, в графическом процессоре Fermi 768 КБ кэша последнего уровня, в графическом процессоре Kepler - 1536 КБ. Кэш последнего уровня, а графический процессор Maxwell имеет 2048 КБ кэша последнего уровня. Это, наряду с обширным исследованием кэшей графических процессоров, показывает, что локальность данных определенно важна для графических процессоров. См. Мой обзорный документ для деталей и ссылки на выше.

user984260
источник