编译 openacc 例程时出错"pgf90_copy_f77_argl_i8"



不支持对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例程,所以我想这种方法会产生问题。

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

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

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

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

这是我们内部正在讨论的问题。我们希望用户能够更容易地移植他们的代码,但我们知道,如果我们添加这种支持,会影响性能,而且原因并不明显。因此,目前,我们鼓励用户避免传递数组切片,而是传递基数组并为索引添加额外的参数。

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

最新更新