2014-12-21 3 views
1

Я понимаю, что cudaMallocManaged упрощает доступ к памяти, устраняя необходимость в явных выделениях памяти на хост и устройство. Рассмотрим сценарий, в котором память хоста значительно больше, чем память устройства, скажем, 16 ГБ хоста & 2 ГБ устройства, которое довольно распространено в наши дни. Если я имею дело с входными данными большого размера, скажем, 4-5 ГБ, которые считываются из внешнего источника данных. Я вынужден прибегать к явному распределению памяти хоста и устройства (поскольку памяти устройства недостаточно для одновременного размещения) или у модели единой модели памяти CUDA есть способ обойти это (что-то вроде автоматического распределения/освобождения на основе необходимости)?cudaMallocManaged vs cudaMalloc - сценарий ограничения памяти устройства

+0

Если шаблон доступа не показывает много повторного использования (или если повторное использование может обслуживаться из иерархии кеша GPU), сопоставленная закрепленная память может быть хорошим вариантом. – ArchaeaSoftware

+0

Интересно! Но, как говорится в документации, это ухудшит производительность хост-системы, если выделены большие куски закрепленной памяти, не так ли? Как вы сказали, когда он не демонстрирует много повторного использования, это действительный вариант. Благодаря! – mssrivatsa

+0

Это зависит от того, что еще делает система. В ходе тестирования, которое я выполнил (в Windows 7), вам необходимо заблокировать более половины системной памяти, прежде чем производительность начнет заметно ухудшаться. – ArchaeaSoftware

ответ

5

Я вынужден прибегать к явному распределению памяти хоста и устройства?

Вы не вынуждены прибегать к явной хоста и устройства памяти распределения, но вы будете вынуждены обрабатывать объем выделенной памяти вручную. Это связано с тем, что, по крайней мере, на нынешнем оборудовании унифицированная виртуальная память CUDA не позволяет вам переписывать память GPU. Другими словами, cudaMallocManaged сработает, если вы выделите больше памяти, чем то, что доступно на устройстве. Но это не значит, что вы не можете использовать cudaMallocManaged, это просто означает, что вам нужно отслеживать объем выделенной памяти и никогда не превышать того, что может поддерживать устройство, путем «потоковой передачи» ваших данных, а не распределения всего сразу.

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


И действительно, один год и полтора после выше прогноза, по состоянию на CUDA 8, Pascal графические процессоры в настоящее время усиливаются с возможностью страничного разломообразованием, что позволяет странице памяти мигрировать между хостом и устройством без явного вмешательства от программиста.

+0

Спасибо! Да, мой вопрос был, если я вынужден прибегать к работе с памятью вручную, когда памяти устройства недостаточно. Это было бы действительно хорошим улучшением. – mssrivatsa

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