Замена cudaMemcpy2D на cudaMemPrefetchAsync - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь выполнить асинхронную передачу памяти (хост-устройство) данных, находящихся в Unified Memory , так же, как предлагает cudaMemcpy2DAsync(), т. Е. Используя значение шага для памяти назначения (устройства).

Однако, насколько я понимаю:

  • Я не могу использовать cudaMemcpy2DAsync(), поскольку для него требуется закрепленная память, а блок объединенной памяти, выделенный с помощью cudaMallocManaged(), не закреплен по умолчанию и не может быть закреплен вручную.

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

Мой вопрос:

Как я могу передать мои данные, которые (a) находятся в объединенной памяти , в (b) асинхронно с хоста на устройство, одновременно проверяя, что данные копируются (c) с правильным значением шага ?

Мой текущий перевод с использованием cudaMemcpy2D() выглядит примерно так:

cudaMemcpy2D( 
    dest_ptr, dest_pitch,         // dst address & pitch
    src_ptr, dim_x*sizeof(float)  // src address & pitch
    dim_x*sizeof(float), dim_y,   // transfer width & height
    cudaMemcpyHostToDevice ) );

(Как вы можете видеть, высота звука в источнике фактически равна нулю, в то время как высота звука в месте назначения равна dest_pitch - может быть, это поможет?)

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

Одна из идей, которые у меня были , заключалась в простом копировании данных по строкам. Однако это будет означать очень большое количество очень маленьких передач данных, что звучит немного ужасно. В моем примере это было бы 3 040 000 передач по 304 байта каждый ... но, может быть, это хорошо для Pascal, если передачи распределены асинхронно по нескольким потокам ..?

Любые указатели / идеи будут оценены!

1 Ответ

0 голосов
/ 04 июня 2019

Ответ в том, что вам нужно будет сделать копию. Асинхронные копии с объединенной памятью не поддерживают передачи, потому что объединенная память не поддерживает передачи. Вы можете скопировать предварительно выбранный унифицированный буфер на устройстве в разделенную область памяти, или вы можете скопировать объединенный буфер хоста в разделенную область памяти, а затем скопировать его асинхронно. Вы не можете выполнить все три условия (a, b и c) одновременно

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