Чому 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.