Замена cudaMemcpy2D на cudaMemPrefetchAsync

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

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

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

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

Мой вопрос:

Как я могу перенести мои данные, которые (а) находятся в Унифицированной памяти, в (б) асинхронно с хоста на устройство, в то же время, убедившись, что данные копируются (в) с правильным шагом ценность?

Мой текущий перевод с использованием 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 - может это поможет?)

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

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

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

0 ответов

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

Другие вопросы по тегам