【问题标题】:Slatec + CUDA FortranSlatec + CUDA Fortran
【发布时间】:2013-08-02 23:45:41
【问题描述】:

我有使用老式 Fortran 95 编写的用于燃烧建模的代码。该问题的特点之一是必须求解刚性 ODE 系统以考虑化学反应的影响。为此,我使用了 Fortran SLATEC 库,它也很老了。求解过程很简单,只需要在计算域的每个单元格中调用子程序 ddriv3,如下所示:

do i = 1,Number_of_cells ! Number of cells is about 2000
call ddriv3(...)     ! All calls are independent on cell number i
end do

ddriv3 相当复杂,并利用了许多其他库函数。

有没有什么方法可以利用 CUDA Fortran 获得优势,而无需为此搜索其他库?如果我只是将其作为“并行循环”运行,那将是有效的,还是可能有另一种方式?

对于这样的问题,我很抱歉立即出现了最明显的答案:“你为什么不尝试自己去了解它?”,但我的时间非常紧迫。我没有任何 CUDA 经验,我只想选择最正确和最简单的方式开始。

提前致谢!

【问题讨论】:

  • 这在很大程度上取决于子程序的结构、所涉及的算法和所需的内存传输。

标签: cuda fortran equation-solving


【解决方案1】:

您将无法使用或并行化 ddriv3 调用而不费力气。您对“并行循环”一词的使用表明您可能正在考虑使用OpenACC directives with Fortran,而不是CUDA Fortran,但一般答案在这两种情况下都没有任何不同。

ddriv3 调用是 Fortran 库的一部分(可能是为 x86 使用而编译的)不能直接在 CUDA Fortran(即在 Fortran 中使用 CUDA GPU 内核)或 OpenACC Fortran 中直接使用,基本相同原因:库代码是x86代码,不能在GPU上使用。

假设您可能可以访问ddriv3 的源代码实现,您可能能够提取源代码,并努力创建它的 CUDA 版本(或 OpenACC 不会阻塞的版本),但如果它使用许多其他库例程,则可能意味着您还必须为每个库调用创建 CUDA(或直接 Fortran 源代码,用于 OpenACC)版本。如果您没有使用 CUDA 的经验,这可能不是您想要做的(我不知道。)如果您走这条路,那肯定意味着更多地了解 CUDA,或者至少将库调用转换为直接调用Fortran 源代码(用于 OpenACC 版本)。

由于上述原因,调查ddriv3 调用是否存在 GPU 库替换(或类似的东西)可能是有意义的(但您在问题中明确排除了该选项。)当然有 GPU 库可以帮助解决 ODE 的问题。

【讨论】:

  • 非常感谢您的回答!据我了解,库的预编译是问题所在。实际上,我的 Fortran 项目由我的 *.F90 文件和 SLATEC 库的源代码(也是 *.F90,自治)组成,当我编译我的项目时,也编译了 SLATEC 的源代码,就像一堆补充子程序。如果我用错了“图书馆”这个词,如果它改变了情况,我很抱歉。
  • 那么我的第 3 段将介绍您的情况。只要没有任何补充子例程引用任何主机库,就值得尝试看看 OpenACC 会发生什么(尽管我对结果并不十分乐观)。使用 CUDA Fortran,您仍然面临将所有子程序代码转换为 CUDA 并行代码的任务(即它不像 OpenACC 中的“并行循环”那么简单)。在任何一种情况下,都可能涉及一些不平凡的工作,即除了使用一些指令对代码进行简单注释之外的其他事情。
猜你喜欢
  • 2021-03-21
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多