0

不支持调用 PGI 运行时函数 - pgf90_copy_f77_argl_i8

我相信正在将一个 8 字节整数参数传递给 !$acc 例程。

任何解决方法或更新?

PGI 编译器 17.4

例子。

type some
integer(4),pointer :: xx(:)
integer(4),pointer :: yy(:)
end type

type(some), pointer :: data(:)
call func(data(3) % xx, data(5) % yy)

这里 func 是 acc 例程,所以我想这种方法会产生问题。

我们将创建临时数组,然后传递它们。

4

1 回答 1

1

此例程检查在使用 F77 调用约定时传递的数组是否连续。如果它不连续,则运行时必须创建一个临时数组,以便连续传递数组切片。

虽然你说你传入的是一个 8 字节的整数,但你是不是也传入了一个数组切片?

我们(PGI)在这方面确实有一个难题。“解决方案”是让我们创建模仿我们在主机上的行为的设备端运行时例程。但是,这意味着编译器可能需要在设备上为每个线程分配一个临时数组,将切片数据复制到临时数组,传入临时数组,然后将结果复制回主数组。但是,这绝对会破坏循环的性能,所以不是我们真正想做的事情。

这是我们内部正在讨论的问题。我们希望用户能够更轻松地移植他们的代码,但要知道如果我们添加这种支持,它会损害性能并且不会很明显为什么。所以现在,我们鼓励用户避免传递数组切片,而是传递基本数组并为索引添加额外的参数。

诚然,我们需要首先处理错误消息,以便更清楚地了解问题。我已经推动了我们的编译器团队,但这并不是直截了当的。同时,如果您看到任何这些“argl”运行时调用,这就是正在发生的事情。

于 2017-10-20T17:35:00.517 回答