用于亚洲期权定价的 Monte Carlo 模拟

本文对基于多核处理器和众核 (MIC) 协处理器的异构英特尔架构系统进行了一项性能优化练习。

注:本实验根据《利用英特尔至强融核协处理器进行并行编程与优化》("Parallel Programming and Optimization with Intel Xeon Phi Coprocessors",2015 年第二版)中的第 4.7.1 节和第 4.7.2 节内容操作。如欲获取本书,请访问xeonphi.com/book

本文讨论了如何在异构集群中实现 MPI 应用的负载平衡。本文涉及的源代码来自用于亚洲期权定价的 Monte Carlo 模拟。为了便于练习,模拟的实际实施并不重要,如果您有兴趣了解关于模拟的更多知识,请访问 Colfax Research 网站。

亚洲期权代码示例链接:https://github.com/ColfaxResearch/Asian-Options

  1. 学习并编译 "workdistribution.cc"。然后在所有节点(包括 MIC)间运行 MPI 应用,每个节点运行一个进程。

    您会发现负载不平衡,即某个节点比其它节点完成得早。

  2. 维持负载平衡的一个简单方法就是根据目标系统的差异,不均匀地分配任务。实施一个调试变量 "alpha"(应为 typefloat 或 double),MIC 接受的工作负载数量是 CPU 接受的工作负载数量的 alpha 倍。每个节点应通过计算决定处理哪个选项。为了执行这一操作,使用函数输入 "rankTypes",后者存储了全球所有的节点类型(CPU 或 MIC)。如果“i”队列节点位于协处理器,则"rankTypes[i]" 为 "1";如果“i”队列节点位于 CPU,则 "rankTypes[i]"为 "0"。请确保每一个选项都被计算在内。

    编译并运行该应用。然后,尝试寻找提供最佳性能的 "alpha" 值。

  3. 尽管之前的实施更为简单,但是存在缺陷 - alpha 值取决于集群。为了使应用独立于其运行的集群,请实施 boss-worker 模式,在该模式下,worker 完成工作后,由 boss 将工作分配给 worker。

    编译并运行代码,以查看性能。请记住,Boss 进程所在的节点应该有两个进程。

    提示:为了实施 boss worker 模式,您将需要一个包含两个 while 循环的 if 语句。worker 循环应将队列发送到主机,并接收需要计算的索引。主机应使用 MPI_ANY_SOURCE 接收队列,并将下一个索引发送到其接收的 worker 队列。等到没有需要模拟的选项时,boss 应发送一个" terminate" 索引(如 -1 索引)。当 worker 收到 "terminate" 索引时,应当退出 while 循环。当 "terminate" 发送到每个进程后,主机应当退出 while 循环。最后,请不要忘记在运行 MPI_Reduce 之前首先运行 MPI_Barrier,以确保在模拟结束前完成所有进程。

亚洲期权 代码 GitHub 链接:https://github.com/ColfaxResearch/Asian-Options

有关编译器优化的更完整信息,请参阅优化通知