2013-11-25 33 views
0

我已经成功地用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它不会。

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

我的想法是,我搞砸了内存分配,但我不明白在哪里。 对不起,我的英文和格式不好。

+1

您是否尝试过运行valgrind或任何类似的工具?有可能是你有一个错误,没有出现一个不同的分配算法... – Antzi

+0

好吧,Valgrind似乎没有发现任何出界。此外,算法是相同的,我只是用标准C“malloc”替换“PetscMalloc”。 – user3029623

+0

我使用的算法在数值上是稳定的(正如提出它的科学论文所述)。代码中的其他算法用于整数算术。而且,代码的特定部分没有并行性。我在其他部分使用MPI通信。它似乎不是非确定性的:结果总是相同的。它们只能用不同数量的处理器进行更改。它可能是分配不当的问题吗?像分配一个浮点数组为整数? – user3029623

回答

0

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

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

错误的输出总是出现在特定的循环索引上,特别是第一个或最后一个?也许有一些幽灵或光环值你失踪或一些边界条件,你没有适当考虑。

+0

我想我会做那样的事情,虽然它非常无聊。边界应该能够工作,因为它们与PETSc版本相同,并且在该版本中它们工作正常。此外,数学检查边界。 – user3029623

+0

对不起,按错误输入。而且,错误的迭代不是第一个也不是最后一个,但有些在中间,没有明显的模式。如果这还不够,只有大量数据出现错误,如数百次迭代!我想对于像我这样的问题,只是详细的分步分析是解决方案...也许我应该学习如何使用调试器... – user3029623

1

嗯,我不知道有没有人会感兴趣,但问题是PETSc功能PetscMalloc零初始化数据,不像标准C malloc。愚蠢的错误... - user3029623

相关问题