Чому CUDA закріплює пам’ять так швидко?


83

Я спостерігаю значні прискорення передачі даних, коли використовую закріплену пам’ять для передачі даних CUDA. У Linux основним системним викликом для досягнення цього є mlock. На сторінці користувача mlock зазначено, що блокування сторінки не дозволяє її замінити:

mlock () блокує сторінки в діапазоні адрес, починаючи з addr і продовжуючи довгий байт. Усі сторінки, які містять частину зазначеного діапазону адрес, гарантовано залишатимуться в оперативній пам'яті, коли дзвінок успішно повернеться;

У моїх тестах у мене було кілька концертів вільної пам'яті в моїй системі, тому ніколи не було ризику того, що сторінки пам'яті могли бути замінені, але я все ще спостерігав пришвидшення. Хто-небудь може пояснити, що насправді тут відбувається?, Будь-яка інформація та інформація дуже цінуються.


Ви вимірювали час самого mlock?
osgx

Ні, фактичний час, необхідний для виконання виклику mlock, вважається незначним (якщо це те, про що ви просите). Справжні накладні витрати - це фактична передача даних, яка в моєму алгоритмі становить значну частку загального часу циклу.
Gearoid Murphy

Який ваш процесор? Можливо, вузли з підтримкою NUMA не виграють від простих mlock().
osgx

Процесор AMD Phenom (tm) II X4 970
Gearoid Murphy

Відповіді:


84

Драйвер CUDA перевіряє , якщо діапазон пам'яті заблокований чи ні, і тоді він буде використовувати інший шлях шляху. Заблокована пам'ять зберігається у фізичній пам'яті (ОЗУ), тому пристрій може отримати її без допомоги CPU (DMA, вона ж асинхронна копія; пристрій потребує лише списку фізичних сторінок). Незаблокована пам’ять може спричинити помилку сторінки при доступі, і вона зберігається не тільки в пам’яті (наприклад, вона може бути заміненою), тому драйверу потрібно отримати доступ до кожної сторінки незаблокованої пам’яті, скопіювати її в закріплений буфер і передати до DMA (синхронізована, копіювання сторінки за сторінкою).

Як описано тут http://forums.nvidia.com/index.php?showtopic=164661

пам'ять хоста, що використовується асинхронним викликом копіювання пам'яті, повинна бути заблокована сторінками через cudaMallocHost або cudaHostAlloc.

Я також можу порекомендувати перевірити посібники cudaMemcpyAsync та cudaHostAlloc на веб-сайті developer.download.nvidia.com. HostAlloc каже, що драйвер Cuda може виявити закріплену пам'ять:

Драйвер відстежує діапазони віртуальної пам'яті, виділені за допомогою цієї функції (cudaHostAlloc), і автоматично прискорює виклики таких функцій, як cudaMemcpy ().


1
Цікаво, скільки хаоку ви можете створити, спробувавши ще один потік спробувати зібрати сторінки після видачі команд асинхронного копіювання?
Zan Lynx

1
Зан Рись, цікаве питання. Чому ви хочете розблокувати цю пам’ять? Навіть на 32-розрядному ПК може бути заблоковано до 2-4 ГБ пам’яті, і більше, якщо карта PCI-express має доступ до 64-розрядної (реальної 40 або 48-бітної) адреси. Набагато дешевше купувати більше пам'яті, ніж платити за програміст із високим терміном дії (18 тис. Повторень! На SO). Як і в Linux, я думаю (вірю), munlock буде заблоковано або поверне помилку, і ніякої шкоди системі не буде завдано.
osgx

Чи можу я застосувати cudaHostRegisterдо вказівника на зіставлений файл пам'яті?
Томілов Анатолій

15

CUDA використовує DMA для передачі закріпленої пам'яті на графічний процесор. Пам'ять хоста, що переноситься на сторінку, не може використовуватися з DMA, оскільки вона може знаходитися на диску. Якщо пам'ять не закріплена (тобто заблокована сторінкою), її спочатку копіюють у заблокований сторінкою буфер "проходження", а потім копіюють на графічний процесор через DMA. Таким чином, використовуючи закріплену пам’ять, ви економите час на копіювання зі сховища хост-пам’яті в заблоковану сторінку пам’ять хоста.


5

Якщо сторінки пам'яті ще не були доступні, їх, мабуть, ніколи не міняли місцями для початку . Зокрема, нещодавно виділені сторінки будуть віртуальними копіями універсальної "нульової сторінки" і не матимуть фізичної інстанції, доки на них не буде записано. Нові карти файлів на диску також залишатимуться суто на диску, доки вони не будуть прочитані чи записані.


Я думаю, що це не так (я пишу про це в ранньому варіанті моєї відповіді), оскільки це справжня програма, і програма mlock()швидко працювала (перевірте коментар №2 до Q).
osgx,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.