Доступ графического процессора к оперативной памяти системы

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

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

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

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


person omellette    schedule 03.03.2011    source источник
comment
проверьте stackoverflow.com/questions/5007556 /   -  person Dave O.    schedule 04.03.2011


Ответы (3)


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

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

НО...

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

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

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

person Die in Sente    schedule 05.04.2011

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

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

person Paul R    schedule 03.03.2011
comment
Что ж, это возможно с PCIe 3.0 и материнскими платами высокого класса. Я не понимаю, почему нет поддержки вычислений, требующих › 4 ГБ памяти! - person omellette; 03.03.2011

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

person amanda    schedule 06.04.2012