0

我有用老式 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 经验,我只想选择最正确和最简单的方式开始。

提前致谢 !

4

1 回答 1

1

不费吹灰之力,您将无法使用或并行化ddriv3调用。您对“并行循环”一词的使用向我表明您可能正在考虑将OpenACC 指令与 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 版本)。

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

于 2013-08-02T15:45:41.923 回答