Эффективный memcpy большого ввода в CUDA? - PullRequest
0 голосов
/ 20 декабря 2011

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

Чтобы этот подход работал, я использую промежуточный массив, так как cudaMemcpyFromArray и cudaMemcpyToArray, похоже, работают только для Texture Memory. Это приводит к ненужным операциям копирования памяти. Кто-нибудь знает более эффективный способ?

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

некоторые опции:

Также убедитесь, что вы знаете о блокировке алгоритма: http://en.wikipedia.org/wiki/Loop_tiling

0 голосов
/ 20 декабря 2011

Вы можете использовать асинхронное копирование памяти, если операции над одним сегментом массива не зависят от операций над другим сегментом массива. Это поможет вам копировать вещи назад и вперед при выполнении вычислений. Из руководства по программированию cuda c:

некоторые вызовы функций асинхронны: управление возвращается хосту поток до того, как устройство завершило запрошенную задачу. Это:

  • Запускает ядро;
  • Копии с устройства на устройство;
  • Копии памяти хост-устройства из блока памяти объемом 64 КБ или менее;
  • Копии из памяти выполняются функциями с суффиксом Async;
  • Вызов функции памяти в памяти.

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

...