2016-08-11 5 views
3

Я изучаю cuda, но в настоящее время не имею доступа к устройству cuda, и мне интересно узнать о некотором объединенном поведении памяти. Насколько я понял, унифицированная функциональность памяти, передает данные с хоста на устройство с необходимостью знать основы. Поэтому, если процессор называет некоторые данные 100 раз, то есть на gpu, он передает данные только во время первой попытки и очищает это пространство памяти на gpu. (Моя интерпретация правильно до сих пор?)Единая память cuda: поведение передачи памяти

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

Дополнительно я был бы признателен, если вы могли бы прояснить что-то еще, связанное с поведением передачи данных. Кажется очевидным, что данные будут переданы обратно при доступе к фактическим данным, но как насчет доступа к указателю? например, если у меня было 2 массива одних и тех же указателей UM (данные в указателе в настоящее время находятся на gpu и следующий код выполняется из процессора) и должны были срезать первый массив, возможно, чтобы удалить элемент, будет ли итерация шаг над указателями, помещенными в новый массив, чтобы получить доступ к данным для передачи cudamem? конечно нет.

ответ

2

Насколько я понял, функция единой памяти переносит данные с хоста на устройство с необходимостью знать основы. Поэтому, если процессор называет некоторые данные 100 раз, то есть на gpu, он передает данные только во время первой попытки и очищает это пространство памяти на gpu. (моя интерпретация до сих пор?)

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

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

Перед CUDA 8, нет, вы не могли выделить больше () превышать намеченную сумму, чем то, что может поместиться на устройстве. Поскольку CUDA 8, возможно: страницы повреждены в памяти устройства и из него (возможно, используя политику LRU, но я не уверен, что это указано где угодно), что позволяет обрабатывать наборы данных, которые в противном случае не могли бы быть на устройстве и требуют ручной потоковой передачи.

Кажется очевидным, что данные будут переданы обратно при доступе к фактическим данным, но как насчет доступа к указателю?

Он работает точно так же. Не имеет значения, разрываете ли вы указатель, который был возвращен cudaMalloc (или даже malloc), или какой-либо указатель в пределах этих данных. Драйвер обрабатывает его одинаково.

+0

Возможно, мой пример для последнего вопроса был не столь ясен, я не хочу освобождать память в указателе. т.е. есть 2 массива с теми же указателями UM, но формируйте первое, что мне нужно, чтобы отрезать несколько. Фактические данные не предназначены для освобождения, просто происходит некоторая игра с указателем. Вы случайно не знаете о таком поведении? – user2255757

+0

Я не понимаю вашего комментария, я не упоминал о том, чтобы освободить что-нибудь. –

+0

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

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