CUDA - единая память (по крайней мере, Паскаль) - PullRequest
0 голосов
/ 04 июня 2018

Я хотел бы получить некоторые пояснения об объединенной памяти, как она действительно работает и как эффективно ее использовать.

Насколько я знаю, мы используем cudaMallocManaged(ptr, size); для выделения массива объединенной памяти.Начиная с архитектуры Pascal, можно установить размер больше, чем физическая память, доступная на GPU.

Предположим, теперь у меня есть ГХ с 4 ГБ ОЗУ, 32 ГБ ОЗУ для хоста и файл 1 ТБ.Я хочу обратиться к этому файлу размером 1 ТБ, как мне его обработать?

Если я правильно понимаю, я могу поместить файл в объединенную память, но как выполняется связь между этим унифицированным массивом и файлом?Означает ли это, что мне нужно memcpy весь файл в указателе, который я выделил с помощью cudaMallocManaged?

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

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

В некоторых системах можно переподписывать память процессора.Используя Power 9 + V100 на NVLink, вы можете использовать службу трансляции адресов операционной системы (ATS), как указано здесь .

. Таким образом, можно использовать 1 ТБ данных изGPU, даже с гораздо меньшим объемом оперативной памяти в хост-системе.Необходимо выполнить следующие операции:

  1. Создать файл - для резервного копирования данных объемом 1 ТБ - все, что вам нужно, - это дескриптор файла, который может быть mmap ped.
  2. Использоватьmmap для отображения всего файла в виртуальном адресном пространстве (ограничение составляет 49 бит в системе эксперимента, что составляет 512 ТБ).
  3. Передайте этот указатель на вызов ядра.

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

Нет упоминаний и успешных испытаний таких упражнений на x86_64 и / или предыдущих поколениях GPU и / или систем, подключенных к PCI-Express.

0 голосов
/ 04 июня 2018

В моем ответе предполагается, что вы используете CUDA 9.x или выше, графический процессор Pascal или Volta в Linux.

Вы сможете переподписывать память GPU приблизительно до размера памяти хоста (т.е.операционная система хоста позволяет вам выделить), за исключением некоторого разумного количества, которое было бы типично для любого процесса выделения памяти (вы не должны ожидать, что выделите каждый последний байт памяти хоста, и аналогично не должны пытаться делать то же самое с управляемой памятьювыделения).

Нет связи между объединенной памятью и файлами или чем-либо, хранящимся на диске.

Так же, как вы, вероятно, не можете загрузить весь этот файл объемом 1 ТБ в 32 ГБ ОЗУ, вы не можете получить к нему доступ.все сразу, используя управляемую память.Какую бы сумму операционная система хоста не разрешила вам выделить / загрузить, это размер, который вы будете иметь для графического процессора.

Поэтому, чтобы обработать этот файл объемом 1 ТБ, вам, вероятно, потребуется придуматьалгоритм, который разбивает его на части, которые помещаются в системную память.Эта концепция полностью независима от управляемой памяти.После этого, если вы хотите получить доступ к фрагменту вашего файла, который находится в системной памяти с помощью CUDA, вы можете использовать управляемую память, включая переподписку, если хотите, для этого.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...