我正在尝试使用 cuda fortran 加速一段代码。该代码使用了变量定义中的通用语句,这在带有 cuda 的设备代码中是无效的。
我所做的是在模块中定义变量,而不是使用 common 语句,但这给了我一个错误的答案。我正在对普通代码执行所有这些操作,以便找到通用语句的替代方法。
我认为它应该以这种方式工作,因为这些变量仅由这些函数使用,但事实并非如此。这是为什么?我能做些什么来解决这个问题?
查看您的文件后,我发现您正在使用 OpenACC for Fortran,这不是我所说的 CUDA Fortran。我将假设这是您的意图,并且您实际上并不打算使用 CUDA fortran,而是您正在尝试使 OpenACC 代码正常工作。
我有 2 条建议。
!acc kernels
指令有所了解。我快速查看了您的代码,您封装的循环看起来并不复杂。我的建议是您识别这些循环所需(输入)和从这些循环生成(输出)的所有数据,并包括其他!acc data
指令,以将这些指定copyin
为输入数据和copyout
输出数据。这里给出了一个具体的例子/教程。话虽如此,只要数据在编译器尝试使用它的范围内!acc kernels
地区,我不认为你应该得到不正确的结果。但为了进一步探讨这一点,我认为一个具体的例子是合适的。通常,使用该!acc data
指令将帮助您将注意力集中在所需的数据上,并确保编译器了解如何将其传输到设备以及何时传输。正如我已经提到的,请粘贴您希望其他人在实际问题中查看的代码示例,而不是包含链接。