模块中的变量而不是通用语句

时间:2013-07-23 14:47:04

标签: cuda fortran openacc

我正在尝试使用cuda fortran加速一段代码。此代码使用变量定义中的公共语句,该变量在使用cuda的设备代码中无效。

我所做的是在模块中定义变量而不是使用common语句,但这给了我一个错误的答案。我正在使用普通代码执行所有这些操作,以便找到公共语句的替代。

Code(common)

Code(without common)

我认为它应该以这种方式工作,因为这些变量仅由这些函数使用,但事实并非如此。这是为什么?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

在看了一下你的文件后,我发现你正在使用OpenACC for Fortran,这不是我所说的CUDA Fortran。我将假设这是你的意图,并且你实际上并不打算使用CUDA fortran,而是试图让OpenACC代码正常工作。

我有2条建议。

  1. 具体。哪些变量,哪些功能无法正常工作,以及您获得的结果是什么以及您期望得到的结果是什么?最好的方案是提供一个简短的完整,可编译的示例,而不是仅仅将整个代码文件转储到一个问题中。将您的问题缩小到某个不起作用的特定示例。
  2. 同样,假设您的意图是使用OpenACC fortran,您已经证明您至少对如何使用!acc kernels指令有所了解。我快速查看了你的代码,你所包围的循环看起来并不复杂。我的建议是,您可以识别这些循环所需的所有数据(输入)并从这些循环中生成(输出),并包含其他!acc data指令,以便为输入数据指定这些数据copyincopyout输出数据。给出了一个具体的示例/教程here。话虽如此,只要数据在编译器试图在!acc kernels区域中使用时就在范围内,我认为你不应该得到不正确的结果。但为了进一步追求这一点,我认为一个具体的例子是合适的。通常,使用!acc data指令将帮助您将注意力集中在所需的数据上,并确保编译器了解如何将其传输到设备或从设备传输。何时。
  3. 正如我已经提到的,请粘贴您希望其他人在实际问题中查看的代码示例,而不是包含链接。