我正在编写一些线性代数代码(使用Fortran 2003,但在Fortran 90或C中也会遇到同样的问题),需要一些工作向量进行计算。我处理这个问题的想法是创建一个私有的工作数组
我将其想象为在黑板上解决一个大问题,并为解决问题的每个部分选择一个黑板区域。
按照这个类比,我还可以有一堆小白板:定义一个
对于哪种方法更好的编程实践,有什么想法吗?
编辑:我也不认为当我开始使用OpenMP时会有问题,因为我已经在这个代码的旧版本中这样做了。在问题设置之后,每个线程只访问其未知量的一部分,而不是其他线程的未知量。尽管如此,并发问题可能是不使用静态变量的一个很好的理由。
如果我每次调用求解器时都必须保持动态分配空间来存储临时数组(这经常发生),那么这不会产生很多开销吗?
w(:,:)
,它是线性代数模块的“隐藏全局变量”,即在此讨论中定义的真正全局变量的可怕之处。我将其想象为在黑板上解决一个大问题,并为解决问题的每个部分选择一个黑板区域。
按照这个类比,我还可以有一堆小白板:定义一个
work_array
数据类型,并根据需要将它们传递给求解器。(PETSc通过另一层抽象有效地使用了这种方法;一个solver
是一个数据类型,包括一些用于方法的过程指针以及一些工作向量。)当从一个求解器嵌套调用到另一个时,这会变得有点复杂,所以我更喜欢第一种方式。它也不需要太多的误导。对于哪种方法更好的编程实践,有什么想法吗?
编辑:我也不认为当我开始使用OpenMP时会有问题,因为我已经在这个代码的旧版本中这样做了。在问题设置之后,每个线程只访问其未知量的一部分,而不是其他线程的未知量。尽管如此,并发问题可能是不使用静态变量的一个很好的理由。
如果我每次调用求解器时都必须保持动态分配空间来存储临时数组(这经常发生),那么这不会产生很多开销吗?