Можно ли получить доступ к GPU-RAM из CPU-Core с помощью простого указателя в новом CUDA6?

Теперь, если я использую этот код, чтобы попытаться получить доступ к GPU-RAM из CPU-Core с помощью CUDA5.5 в GeForce GTX460SE (CC2.1), то я получаю исключение «Нарушение прав доступа»:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <iostream>

int main()
{
    unsigned char* gpu_ptr = NULL;
    cudaMalloc((void **)&gpu_ptr, 1024*1024);

    *gpu_ptr = 1;

    int q; std::cin >> q;
    return 0;
}

Но мы знаем, что есть UVA (Unified Virtual Addressing). И есть несколько новинок:

  • 25 октября 2013 г. - 331.17 Beta Linux GPU Driver: новый модуль NVIDIA Unified Kernel Memory - это новый модуль ядра для функции Unified Memory, которая будет представлена ​​в предстоящем выпуске NVIDIA CUDA. Новый модуль - nvidia-uvm.ko, он позволит использовать единое пространство памяти между графическим процессором и системной оперативной памятью. http://www.phoronix.com/scan.php?page=news_item&px=MTQ5NDc
  • Ключевые особенности CUDA 6: Унифицированная память - упрощает программирование, позволяя приложениям получать доступ к памяти ЦП и ГП без необходимости вручную копировать данные из одного в другой, а также упрощает добавление поддержки ускорения ГП в широком диапазоне языки программирования. http://www.techpowerup.com/194505/nvidia-dramatically-simplify-parallel-programming-with-cuda-6.html

Можно ли получить доступ к памяти GPU-RAM из CPU-Core с помощью простого указателя в новом CUDA6?


person Alex    schedule 19.11.2013    source источник


Ответы (1)


Да, новая функция unified memory в CUDA 6 позволит на устройствах Kepler и не только (но не на вашем графическом процессоре Fermi) обмениваться указателями между кодом хоста и устройства.

Для этого вам нужно будет использовать устройство Kepler (например, cc 3.0 или 3.5) и новый cudaMallocManaged API. Это будет дополнительно задокументировано, когда CUDA 6.0 официально станет доступным, но пока вы можете узнать больше об этом на этот блог, в котором есть примеры.

Этот механизм не вызывает волшебного исчезновения эффектов шины PCI Express, поэтому фактически происходит то, что две копии данных создаются «за кулисами», а cudaMemcpy операции автоматически планируются средой выполнения cuda по мере необходимости. . Есть множество других проблем с реализацией, о которых следует знать, а пока я бы посоветовал почитать блог.

Обратите внимание, что унифицированная память (UM) отличается от унифицированной виртуальной адресации (UVA), которая была доступна начиная с CUDA 4.0, и является задокументировано.

person Robert Crovella    schedule 19.11.2013
comment
Спасибо! То есть возможности доступа от CPU-Core напрямую к GPU-RAM по-прежнему не будет. Но будет возможно выделить управляемую память, которая автоматически на уровне страницы будет перемещаться из CPU-RAM в GPU-RAM и обратно, в зависимости от того, как драйвер считается более оптимальной производительностью. И если управляемая память перемещена в GPU-RAM, а затем CPU-Core пытается получить к ней доступ, то CPU инициирует DMA-контроллер для отправки данных в эту GPU-RAM (страницу памяти). Это правильно? - person Alex; 19.11.2013
comment
С точки зрения программиста, ЦП может иметь прямой доступ к памяти графического процессора (если она была выделена с помощью cudaMallocManaged). Остальные ваши утверждения мне кажутся правильными. - person Robert Crovella; 19.11.2013
comment
Т.е. если я использую SSE-инструкции для доступа от CPU-Core к GPU-RAM, то данные будут отправлены в PCI-Express BAR (регистры базовых адресов - как аппаратная функция en.wikipedia.org/wiki/Base_Address_Register#Bus_enumeration), в котором отображается GPU-RAM, и главное - DMA-контроллера для него не будет используется (потому что DMA-контроллер добавляет задержку для небольших пакетов), не так ли? - person Alex; 19.11.2013
comment
Я не буду вдаваться в подробности реализации этой функции, которая не является общедоступной. Но если вы используете указатель, выделенный с помощью cudaMallocManaged, и соблюдаете другие требования (например, не обращаетесь к нему, пока ядро, которое также обращается к нему, работает), тогда он должен работать независимо от того, использует ваш код SSE или нет. - person Robert Crovella; 19.11.2013
comment
Ok. Меня интересует только производительность, на которую влияет, работает DMA-контроллер или нет. - person Alex; 19.11.2013