0

我正在尝试使用 cuda fortran 加速一段代码。该代码使用了变量定义中的通用语句,这在带有 cuda 的设备代码中是无效的。

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

代码(普通)

代码(无公用)

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

4

1 回答 1

1

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

我有 2 条建议。

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

正如我已经提到的,请粘贴您希望其他人在实际问题中查看的代码示例,而不是包含链接。

于 2013-07-24T04:36:23.990 回答