C和MPI:函数对相同数据的工作方式不同

时间:2013-11-25 02:03:56

标签: c memory-management mpi petsc

我已经成功地用PETSc库编写了一个复杂的函数(它是一个基于MPI的科学库,用于并行求解大型线性系统)。该库提供其自己的“malloc”版本和基本数据类型(即“PetscInt”作为标准“int”)。对于这个函数,我一直在使用PETSc而不是标准的东西,比如“malloc”和“int”。该功能经过严格测试,始终工作正常。尽管使用了MPI,但该功能是完全串行的,并且所有处理器都在相同的数据上执行它(每个处理器都有它的副本):根本不涉及任何通信。

然后,我决定不使用PETSc并编写标准的MPI版本。基本上,我重写了所有代码用经典的C代替PETSc的东西,不是用残酷的力量而是注意替换(没有任何编辑器的“替换”工具,我的意思是!全部用手完成)。在替换期间,几乎没有做出微小的改变,例如声明两个不同的变量a和b,而不是声明a [2]。这些是替换:

PetscMalloc - >的malloc

PetscScalar - >双

PetscInt - > INT

PetscBool - >创建了一个枚举结构来复制它,因为C没有布尔数据类型。

基本上,在替换过程中,算法没有改变。主要功能是“for”循环(实际上是4个嵌套循环)。在每次迭代时,它调用另一个函数。我们称之为Disfunction。好吧,Disfunction在4个周期之外完美运行(我单独测试),但在4个周期内,在某些情况下有效,有些则没有。此外,我检查了每次迭代时传递给Disfunction的数据:ECXACTELY是相同的输入,Disfunction在一次迭代和另一次迭代之间执行不同的计算。 此外,计算数据似乎不是未定义行为,因为Disfunction总是在程序的不同运行中返回相同的结果。 我注意到,更改“mpiexec”的处理器数量会产生不同的计算结果。

这是我的问题。很少有其他考虑因素:该程序广泛使用“malloc”;所有过程的计算数据都是相同的,无论是否正确; Valgrind没有检测到错误(除了检测到正常使用printf时的错误,这是另一个问题和OT); Disfunction会递归调用另外两个函数(在PETSc版本中也经过广泛测试);涉及的算法在数学上是正确的;函数取决于整数参数p> 0:对于p = 1,2,3,4,5它完全有效,对于p> = 6则不然。

如果被问到,我可以发布代码,但它很长而且很复杂(科学地,不是信息性的),我认为需要时间来解释。

我的想法是我搞乱了内存分配,但我无法理解在哪里。 对不起我的英文和格式错误。

2 个答案:

答案 0 :(得分:1)

好吧,我不知道是否有人对此感兴趣,但问题是PETSc功能PetscMalloc对数据进行零初始化,而不是标准C malloc。愚蠢的错误... - user3029623

答案 1 :(得分:0)

我可以在不参考代码本身的情况下提供的唯一建议是尝试构建逐步简化的测试用例来证明您的问题。

当您将迭代过程缩小到数据集中的单个点或单个步骤(通过消除某些循环)时,错误是否仍会发生?如果没有,那可能表明他们的界限是错误的。

错误的输出是否总是出现在特定的循环索引上,尤其是第一个或最后一个?也许你会遗漏一些幽灵或光环值或者你没有正确考虑的边界条件。