Я пытаюсь выполнить асинхронную передачу памяти (хост-устройство) данных, находящихся в 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, если передачи распределены асинхронно по нескольким потокам ..?
Любые указатели / идеи будут оценены!