我已经成功地用PETSc库(这是一个基于MPI的并行求解大型线性系统的科学库)编写了一个复杂的函数。该库提供了自己的“malloc”版本和基本数据类型(即“PetscInt”作为标准的“int”)。对于这个函数,我一直使用PETSc的东西,而不是像“malloc”和“int”这样的标准东西。该功能经过了严格的测试,并始终正常工作。尽管使用了MPI,但该函数是完全串行的,并且所有处理器都使用相同的数据执行它(每个处理器都有其副本):根本不涉及任何通信。C和MPI:函数与相同数据的工作方式不同
然后,我决定不使用PETSc并编写标准的MPI版本。基本上,我重写了所有的代码,用经典的C代码替代PETSc的东西,而不是用残酷的力量,但注意替换(没有“替换”任何编辑器的工具,我的意思是!全部用手完成)。在替代期间,已经做出了一些小的改变,例如声明两个不同的变量a和b,而不是声明一个[2]。这些是取代:
PetscMalloc - >的malloc
PetscScalar - >双
PetscInt - > INT
PetscBool - >创建一个枚举结构复制它,因为C没有布尔数据类型。
基本上,算法在替换过程中没有改变。主函数是一个“for”循环(实际上是4个嵌套循环)。在每次迭代中,它会调用另一个函数。我们称之为失效。那么,Disfunction在4周期以外完美运行(就像我单独测试的那样),但是在4周期内,在某些情况下可以工作,有些情况下不会。此外,我在每次迭代时都检查传递给Disfunction的数据:使用ECXACTELY输入相同,Disfunction在一次迭代和另一次迭代之间执行不同的计算。 此外,计算的数据似乎不是未定义的行为,因为Disfunction总是通过程序的不同运行返回相同的结果。 我注意到,改变“mpiexec”的处理器数量给出了不同的计算结果。
这是我的问题。其他几点考虑:该程序广泛使用“malloc”;计算的数据对于所有进程是相同的,是否正确; Valgrind没有检测到错误(除了检测到正常使用printf错误(这是另一个问题和OT)之外); Disfunction递归调用另外两个函数(在PETSc版本中也进行了广泛的测试);涉及的算法在数学上是正确的; Disfunction取决于一个整数参数p> 0:对于p = 1,2,3,4,5它可以很好地工作,对于p> = 6它不会。
如果被问到,我可以发布代码,但它很长且很复杂(科学,而不是信息),我认为这需要时间来解释。
我的想法是,我搞砸了内存分配,但我不明白在哪里。 对不起,我的英文和格式不好。
您是否尝试过运行valgrind或任何类似的工具?有可能是你有一个错误,没有出现一个不同的分配算法... – Antzi
好吧,Valgrind似乎没有发现任何出界。此外,算法是相同的,我只是用标准C“malloc”替换“PetscMalloc”。 – user3029623
我使用的算法在数值上是稳定的(正如提出它的科学论文所述)。代码中的其他算法用于整数算术。而且,代码的特定部分没有并行性。我在其他部分使用MPI通信。它似乎不是非确定性的:结果总是相同的。它们只能用不同数量的处理器进行更改。它可能是分配不当的问题吗?像分配一个浮点数组为整数? – user3029623