2013-11-19 4 views
1

Теперь, если я использую этот код, чтобы попытаться доступ к GPU-RAM от CPU-ядер с помощью CUDA5.5 в GeForce GTX460SE (CC2.1), то я получаю исключение "Access Violation":Можно ли получить доступ к GPU-RAM от CPU-Core простым указателем в новом CUDA6?

#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 (Унифицированная виртуальная адресация). И есть некоторые новые:

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

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

ответ

8

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

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

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

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

+0

Спасибо! То есть, возможности доступа из CPU-Core напрямую в GPU-RAM по-прежнему не будут. Но это будет возможно, выделите управляемую память, которая автоматически на уровне страницы переместится из CPU-RAM в GPU-RAM и обратно, в зависимости от того, как драйвер считается более оптимальной. И если управляемая память переместилась в GPU-RAM, а затем CPU-Core попытается получить к ней доступ, тогда CPU начнет DMA-контроллер для отправки данных на этот GPU-RAM (страница памяти). Это правильно? – Alex

+1

С точки зрения программиста, процессор «появляется», чтобы иметь возможность прямого доступа к памяти GPU (если он был выделен с помощью 'cudaMallocManaged'). Остальные ваши высказывания кажутся мне верными. –

+0

I.e. если я использую SSE-инструкции для доступа с CPU-Core в GPU-RAM, тогда данные будут отправляться в PCI-Express BAR (базовые регистры адресов - как аппаратная функция http://en.wikipedia.org/wiki/Base_Address_Register#Bus_enumeration), в котором отображается GPU-RAM, а главное - DMA-контроллер для него не будет использоваться (поскольку DMA-контроллер добавляет задержку для небольших пакетов), не так ли? – Alex

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

  • Нет связанных вопросов^_^