#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.