Как перенести часть массива устройств в другой массив устройств с помощью компилятора PGI cuda fortran?

#cuda #fortran #pgi

#cuda #fortran #pgi

Вопрос:

Теперь я хочу перенести часть массива устройств в другой массив устройств, используя следующий код:

 program main
  implicit none
  integer :: a(5,5,5,5)
  integer, device :: a_d(5,5,5,5),b_d(5,5,5,5)
  a=0
  a_d=a
  b_d(1:2,:,:,:)=a_d(2:3,:,:,:)
end program
  

Компилятор pgi возвращает следующую ошибку для b_d(1:2,:,:,:)=a_d(2:3,:,:,:) :

PGF90-S-0519 — Более одного объекта-резидента устройства в назначении.

Как решить эту проблему или есть эффективный способ перенести только часть массива устройств в другой массив устройств?

Комментарии:

1. У меня нулевой опыт работы с Fortran, но можете ли вы создать промежуточное integer соединение, которого нет в устройстве, и скопировать туда и оттуда?

2. Я почти уверен, что ответ будет заключаться в том, что для разделения копирования между двумя переменными устройства требуется запуск ядра на устройстве, в отличие от простого назначения, которое генерирует вызов cudaMemcpy. Возможно, вы могли бы попробовать какое-то необычное решение на основе цикла cuf или, может быть, вызов cudaMemcpy2D. Может быть, кто-нибудь из PGI может подключиться….

Ответ №1:

В документации говорится следующее:

3.4.2. Неявная передача данных в выражениях

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

Я почти уверен, что это означает, что назначение среза, которое вы пытаетесь выполнить, не поддерживается, потому что у вас есть массив устройств в левой части выражения.

Я не уверен, какой лучший способ решить эту проблему. cudaMemcpy2D определенно сработает, если вы сможете определить высоту массивов. Надеюсь, кто-нибудь из PGI сможет отредактировать решение в этой записи сообщества wiki.