Доступ графического процессора к системной памяти - PullRequest
1 голос
/ 03 марта 2011

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

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

2) В более общем смысле, какие алгоритмы / решениясуществуют для оптимизации передачи данных между процессором и графическим процессором во время таких вычислений с привязкой к памяти?

Спасибо за вашу помощь в этом!Я в восторге от перехода на CUDA просто потому, что распараллеливание намного более интуитивно понятно!

Ответы [ 3 ]

3 голосов
/ 05 апреля 2011

1) Да, вы можете сделать это с большинством пакетов GPGPU.

Тот, с которым я больше всего знаком - AMD Stream SDK, позволяет вам выделить буфер в «системной» памяти и использовать его кактекстура, которая читается или пишется вашим ядром.Cuda и OpenCL имеют одинаковые возможности, ключ состоит в том, чтобы установить правильные флаги для выделения буфера.

НО ...

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

  • Реализация может свободно интерпретировать ваши запросы.Я имею в виду, что вы можете сказать ему, чтобы он находил буфер в системной памяти, но программный стек может свободно делать такие вещи, как перемещение его в память графического процессора на лету - до тех пор, пока вычисленные результаты будут такими же

2) Все основные программные среды GPGPU (Cuda, OpenCL, Stream SDK) поддерживают передачи DMA, чего вы, вероятно, и хотите.

0 голосов
/ 06 апреля 2012

Я предлагаю руководство по программированию cuda. вы найдете много ответов там. Проверка на потоки, унифицированная адресация, cudaHostRegister.

0 голосов
/ 03 марта 2011

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

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

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