Замена 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)