在VisualStudio2010(vs)中启动MPI群集调试程序_第1页
在VisualStudio2010(vs)中启动MPI群集调试程序_第2页
在VisualStudio2010(vs)中启动MPI群集调试程序_第3页
在VisualStudio2010(vs)中启动MPI群集调试程序_第4页
在VisualStudio2010(vs)中启动MPI群集调试程序_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在此操作实例中,您将了解如何在本地计算机和 Microsoft Windows HPC Server 2008 群集上设置和启动 MPI 群集调试程序会话。此操作实例包括使用消息传递界面 (MPI) 和打开多进程 (OpenMP) 应用程序编程界面 (API) 创建应用程序所需的步骤和示例代码。本指南内容:使用 MPI 群集调试程序的要求在 Visual Studio 2010 中创建 C+ MPI 示例项目配置和启动 MPI 群集调试程序附录:除应用程序二进制外,Visual Studio 部署的文件和 CRT(如果要求)使用 MPI 群集调试程序的要求您的开发计算机上必须安装了 Visua

2、l Studio 2010 Professional Edition 或更高版本(包括远程调试程序)。您必须在群集上拥有管理权限。Visual Studio 必须能够访问要运行调试会话的计算节点。以下方案提供了所需的访问权限:您在群集头节点或专用登录节点上开发应用程序。所使用群集的计算节点被连接到企业网络(拓扑 2、4 或 5),并且您的开发计算机连接到了相同的域或是与群集域有信任关系的域。要从客户端计算机将应用程序提交到 HPC 群集,您必须安装了 Microsoft HPC Pack 2008。要使用 Microsoft 消息传递界面构建 MPI 程序,需要在开发计算机上安装 Window

3、s HPC Server 2008 SDK。在 Visual Studio 2010 中创建 C+ MPI 示例项目本部分的示例代码用于一个使用 Monte Carlo 模拟估算 Pi 值的并行应用程序。示例代码在每个 MPI 进程上运行 50,000,000 次迭代计算。在每次迭代计算中,示例代码都生成间隔为 0,1 的随机数字以确定一组 x 和 y 坐标。然后评估坐标组以确定点是否位于行 x2 + y2 = 1 下。如果点位于该行下,则变量 count 将加一。每个 MPI 的值 count 的总和将成为变量 result。将位于行 (result) 下的总点数乘以四,然后再用所乘的结果除

4、以总迭代计算次数以估算 Pi 值。以下步骤包含 Monte Carlo 模拟的两个实现。第一个示例使用的是 MPI 和 OpenMP。有关 OpenMP 的详细信息,请参阅 OpenMP in Visual C+。第二个示例使用的是 MPI 和并行格式库 (PPL)。有关 PPL 的详细信息,请参阅 Parallel Patterns Library (PLL)。创建示例项目的步骤运行 Visual Studio 2010。创建一个名为 ParallelPI 的新 C+ Win32 控制台应用程序。使用一个无预编译头的项目。在“文件”菜单上,指向“新建”,然后单击“项目”。在“新建项目”对话框

5、中,单击“已安装的模板”,然后选择“Visual C+”。 (根据 Visual Studio 的设置方式,“Visual C+”可能位于“其他语言”节点下。)在模板列表中,单击“Win32 控制台应用程序”。关于项目名称,请键入:ParallelPI.单击“确定”。此操作将打开“Win32 控制台应用程序”向导。单击“下一步”。在“应用程序设置”中的“其他选项”下,清除“预编译头”复选框。单击“结束”以关闭向导并创建项目。指定此项目的其他属性。在“解决方案资源管理器”中,右键单击 Parallel PI,然后单击“属性”。此操作将打开“属性页”对话框。展开“配置属性”,然后选择“VC+ 目录

6、”。在“包含目录”中,将指针指到文本框中显示的列表的开头,然后指定 MS MPI C 标头文件的位置,随后添加英文分号 (;)。例如:C:Program FilesMicrosoft HPC Pack 2008 SDKInclude;在“库目录”中,将指针指到文本框中显示的列表的开头,然后指定 Microsoft HPC Pack 2008 SDK 库文件的位置,随后添加英文分号 (;)。例如,如果您要构建和调试 32 位应用程序:C:Program FilesMicrosoft HPC Pack 2008 SDKLibi386;如果您要构建和调试 64 位应用程序:C:Program Fil

7、esMicrosoft HPC Pack 2008 SDKLibamd64;在“链接器”下,选择“输入”。在“附加依赖关系”中,将指针指到文本框中显示的列表开头,然后键入:msmpi.lib;如果您使用的是 OpenMP 代码示例:在“配置属性”中展开 “C/C+”,然后选择“语言”。在“打开 MP 支持”中,选择“是(/openmp)”以启用编译器对 OpenMP 的支持。单击“确定”关闭属性页。在主要源文件中,选择全部代码,然后将其删除。将以下示例代码之一粘贴到空的源文件中。第一个示例使用的是 MPI 和 OpenMP,第二个示例使用的是 MPI 和并行格式库 (PPL)。以下代码示例使用

8、的是 MPI 和 OpenMP。函数 ThrowDarts 使用 OpenMP 并行 for 循环,以利用多核硬件(如果可用)。/ ParallelPI.cpp : Defines the entry point for the MPI application./#include "mpi.h"#include "stdio.h"#include "stdlib.h"#include "limits.h"#include "omp.h"#include <random>int Thr

9、owDarts(int iterations)std:tr1:uniform_real<double> MyRandom;std:tr1:minstd_rand0 MyEngine;double RandMax = MyRandom.max();int count = 0;omp_lock_t MyOmpLock;omp_init_lock(&MyOmpLock);/Compute approximation of pi on each node#pragma omp parallel forfor(int i = 0; i < iterations; +i)doub

10、le x, y;x = MyRandom(MyEngine)/RandMax;y = MyRandom(MyEngine)/RandMax; if(x*x + y*y < 1.0)omp_set_lock(&MyOmpLock);count+;omp_unset_lock(&MyOmpLock);omp_destroy_lock(&MyOmpLock);return count;int main(int argc, char* argv)int rank;int size;int iterations;int count;int result;double tim

11、e;MPI_Status s;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);if(rank = 0)/Rank 0 asks the number of iterations from the user.iterations = 50000000;if(argc > 1)iterations = atoi(argv1);printf("Executing %d iterations.n", it

12、erations);fflush(stdout);/Broadcast the number of iterations to execute.if(rank = 0)for(int i = 1; i < size; +i)MPI_Ssend(&iterations, 1, MPI_INT, i, 0, MPI_COMM_WORLD);elseMPI_Recv(&iterations, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &s);/MPI_Bcast(&iterations, 1, MPI_INT, 0, MPI_COMM_

13、WORLD);count = ThrowDarts(iterations);/Gather and sum resultsif(rank != 0)MPI_Ssend(&count, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);elsefor(int i = 1; i < size; +i)int TempCount = 0;MPI_Recv(&TempCount, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &s);count += TempCount;result = count;/MPI_Reduce(&

14、;count, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);if(rank = 0)printf("The value of PI is approximated to be: %16f", 4*(float)result/(float)(iterations*size); MPI_Barrier(MPI_COMM_WORLD);MPI_Finalize();return 0;以下代码示例使用并行格式库 (PPL) 而非 OpenMP,使用 MPI 集体操作而非点对点操作。/ ParallelPI.cpp : D

15、efines the entry point for the MPI application./#include "mpi.h"#include "stdio.h"#include "stdlib.h"#include "limits.h"#include <ppl.h>#include <random>#include <time.h>using namespace Concurrency;int ThrowDarts(int iterations)combinable<

16、int> count;int result = 0;parallel_for(0, iterations, &(int i)std:tr1:uniform_real<double> MyRandom;double RandMax = MyRandom.max();std:tr1:minstd_rand0 MyEngine;double x, y;MyEngine.seed(unsigned int)time(NULL);x = MyRandom(MyEngine)/RandMax;y = MyRandom(MyEngine)/RandMax; if(x*x + y*y

17、 < 1.0)count.local() += 1;);result = bine(int left, int right) return left + right; );return result;void main(int argc, char* argv)int rank;int size;int iterations;int count;int result;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);i

18、f(rank = 0)/Rank 0 reads the number of iterations from the command line./50M iterations is the default.iterations = 50000000;if(argc > 1)iterations = atoi(argvargc-1);printf("Executing %d iterations on %d nodes.n", iterations, size);fflush(stdout);/Broadcast the number of iterations to

19、execute.MPI_Bcast(&iterations, 1, MPI_INT, 0, MPI_COMM_WORLD);count = ThrowDarts(iterations);/Gather and sum resultsMPI_Reduce(&count, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);if(rank = 0)printf("The value of PI is approximated to be: %16f", 4*(double)result/(double)(it

20、erations*size); MPI_Barrier(MPI_COMM_WORLD);MPI_Finalize();在“文件”菜单上单击“全部保存”。在“生成”菜单上单击“重新生成解决方案”。配置和启动 MPI 群集调试程序在构建您的应用程序后,即可配置和启动调试程序。本节介绍了用于调试的三个选项:在本地计算机上调试一个 MPI 进程在本地计算机上调试多个 MPI 进程在群集上调试一个或多个 MPI 进程Ee441265.note(zh-cn,VS.100).gif注意:在 MPI 群集调试程序中,不可未经过调试即启动。按 Ctrl+F5(或在“调试”菜单上选择“启动时不要进行调试”)也可以

21、启动调试。在本地计算机上调试一个 MPI 进程要在本地计算机上仅使用 MPI 进程进行调试,请使用与要调试任何其他应用程序相同的进程。在程序中希望的位置设置一个断点,然后按 F5 启动调试程序。MPI 程序通过端口上的 IP 进行通讯。首次启动 MPI 程序时,可能会出现一条防火墙安全警告,显示已经打开一个端口。阅读警告消息并确保了解了您对系统所做的更改。您必须解除防火墙锁定以继续在本地计算机上调试。在本地计算机上调试多个 MPI 进程以下步骤描述了如何为 ParallelPI 启动本地调试会话。在运行着四个 MPI 进程的本地计算机上启动 MPI 群集调试程序的步骤在“解决方案资源管理器”中

22、,右键单击 Parallel PI,然后单击“属性”。此操作将打开“属性页”对话框。展开“配置属性”,然后选择“调试”。在“要启动的调试程序”中,选择“MPI 群集调试程序”。在“运行环境”中,从下拉列表选择“编辑 Hpc 节点”。此操作将打开“节点选择器”对话框。在“头节点”下拉列表中选择“localhost”。在“进程数”中选择“4”。单击“确定”保存更改并关闭“节点选择器”对话框。ParallelPI 将接受一个确定要运行的迭代计算次数的参数。默认次数为 50,000,000。对于本地调试会话,请根据下面的步骤将迭代次数减少为 5,000:在“应用程序参数”中键入 5000。单击“确定”

23、保存更改并关闭“属性页”。在并行 for 循环代码中设置一个断点。按 F5 启动调试程序。将显示五个控制台窗口:一个 cmd.exe 窗口和四个 ParallelPI.exe 窗口(每个窗口用于您启动的每个进程)。与排名 0 进程对应的控制台窗口显示了迭代计算数和所计算的 Pi 估值。在“调试”菜单上单击“窗口”,然后单击“进程”。通过双击“进程”窗口中的一个进程以设置用于调试的活动进程。Ee441265.note(zh-cn,VS.100).gif注意:当调试多个进程时,默认情况下断点将会影响所有正在调试的进程。为避免在不希望的位置中断各个进程,请取消选择“一个进程中断时中断所有进程”选项。

24、(在“工具”菜单上单击“选项”,然后选择调试)。有关如何更改中断行为的详细信息,请参阅如何:中断执行。在群集上调试一个或多个 MPI 进程在群集上启动 MPI 调试程序时,调试程序会将您的应用程序作为作业提交给群集。与您的项目 (x86 或 x64、调试或发布)匹配的 Visual C 运行时必须位于计算节点的工作目录中。如果计算节点上没有这些正确的运行时,需通过指定“要部署的其他文件”属性将这些运行时纳入调试程序部署中。以下过程包含部署 OpenMP 调试运行时 DLL 的一个步骤。默认情况下,当启动 MPI 群集调试程序时,C 运行时 (CRT) 库将被部署。如果无正确的运行时,则尝试运行

25、应用程序时将会出现并列错误。如果未包含 OpenMP 运行时,将不会调用断点。在群集上启动 MPI 调试程序在“解决方案资源管理器”中,右键单击 Parallel PI,然后单击“属性”。此操作将打开“属性页”对话框。展开“配置属性”,然后选择“调试”。在“要启动的调试程序”中,选择“MPI 群集调试程序”。在“运行环境”中,从下拉列表选择“编辑 Hpc 节点”。此操作将打开“节点选择器”对话框。在“头节点”下拉列表中,为群集选择要使用的头节点名称。头节点列表已从 Active Directory 域控制器填充。仅域中的群集会显示在列表中。如果看不到您的头节点,请在属性字段中键入头节点名称或

26、IPv4 地址。在“进程数”中选择“4”。在“计划进程”中,选择如何分配您的进程。您可以选择每“核”、“套接字”或“节点”分配一个进程。单击“确定”保存更改并关闭“节点选择器”对话框。在“部署目录”中,在头节点上指定一个共享目录。如果部署目录不存在,并且您拥有指定根目录的写入权限,将自动创建部署目录。当 HPC Pack 2008 包安装到头节点上时,将创建 CcpSpoolDir 共享资源目录。例如,键入以下内容,其中 <myHeadNode> 是您使用的群集名称:<myHeadNode>CcpSpoolDir在“工作目录”中,在每个计算节点上指定一个本地工作目录。例如,键入以下内容,其中 <myUserName> 是您的用户名:C:Users<myUserName>ParallelPI如果使用的是含 OpenMP 的示例代码,请添加 OpenMP 调试运行时 DLL 文件 (Mi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论