CUDA — единая память (по крайней мере, Паскаль)

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

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

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

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

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

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

0

Решение

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

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

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

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

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

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

2

Другие решения

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

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

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

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

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

2

По вопросам рекламы [email protected]