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