我有用旧式Fortran 95编写的代码用于燃烧建模。该问题的一个特征是必须解决刚性ODE系统以考虑化学反应的影响。对于这个purpouse我使用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没有任何经验,我只想选择最合适,最简单的方法。
提前致谢!
答案 0 :(得分:1)
如果不付出一些努力,您将无法使用或并行ddriv3
电话。您对“并行循环”这一短语的使用向我建议您可能正在考虑使用OpenACC directives with Fortran,而不是CUDA Fortran,但在任何一种情况下,一般答案都没有任何不同。
作为Fortran库(可能是为x86使用而编译)的一部分的ddriv3
调用不能直接用于CUDA Fortran(即在Fortran中使用CUDA GPU内核)或OpenACC Fortran中同样的原因:库代码是x86代码,不能在GPU上使用。
由于您可能有权访问ddriv3
的源代码实现,因此您可能能够提取源代码,并且可以创建它的CUDA版本(或OpenACC不会阻塞的版本) ),但如果它使用许多其他库例程,则可能意味着您必须为每个库调用创建CUDA(或直接Fortran源,对于OpenACC)版本。如果您没有使用CUDA的经验,这可能不是您想要做的(我不知道。)如果沿着这条路走下去,那肯定意味着要更多地了解CUDA,或者至少将库调用转换为直接Fortran源代码(适用于OpenACC版本)。
由于上述原因,调查ddriv3
调用是否存在GPU库替换(或类似内容)可能是有意义的(但您在问题中明确排除了该选项。)当然有GPU可以帮助解决ODE问题的图书馆。