微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NBody问题并行化对于相同的输入给出不同的结果

如何解决NBody问题并行化对于相同的输入给出不同的结果

这是 NBody 问题的 MPI 版本。我已经有一个 OpenMP 版本,它的结果与带有一个线程的 nbody 版本相同,但 MPI 结果不同,尤其是在最后的交互中。在第一次交互时,输出非常相似,但在最后,输出却大不相同。

$('.Container').on('click',function(){ 
            $(this).closest('div').find('input').prop('checked',true);
        $(this).find('input').prop('checked',true);
        $(this).find('input[data-type="prodType"]').prop('checked',true);
    
    });

解决方法

您会得到不同的结果,因为您的算法在运行多个 MPI 等级时正在解决一个完全不同的问题。

您正在通过将粒子阵列分成几部分来执行域分解,然后每个等级计算力仅考虑其子域中的粒子:

MPI_Scatter(bodies.data(),particles.size(),particletype,particles.data(),MPI_COMM_WORLD);

ComputeForces(particles,gTerm,deltaT); // <---- only knows about its own particles
MoveBodies(particles,deltaT);
      
MPI_Gather(particles.data(),final.data(),MPI_COMM_WORLD);

在整个计算过程中不考虑域间交互。因此,您正在模拟许多非相互作用的粒子簇的轨迹,这与原始问题不同。起初差异很小,但随后集群开始逐渐分开,差异呈指数增长。

相反,当您使用单个 MPI 等级运行时,只有一个包含所有粒子的子域,并且您仍在解决原始问题。同样适用于 OpenMP 版本,其中每个线程都可以看到系统中的所有粒子。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。