关键词:
并行虚拟机(精选四篇)
并行虚拟机 篇1
1 容错并行虚拟机原型系统的体系结构
FTPVM原型系统体系结构如图1所示。其中SPTC (single processes tree checkpo inting) 单元是在LINUX操作内核内实现单进程树检查点设置的模块。整个系统建立在一个由PC机组成的集群之上。在集群系统中实现检查点卷回恢复技术时, 应该采用镜像平均存储策略, 即以一定的原则选择备份机, 使各节点的镜像节点是均衡分布的, 这样既保证负载均衡, 又避免了瓶颈, 能够更好地实现容错。
2 容错并行虚拟机原型系统的实现
2.1 检查点的恢复
在发生故障后, 检查点的卷回恢复过程可以分为两个阶段:派生阶段和重新加入阶段。
第一阶段:派生阶段。M_pvmd (pvmd) 读取全局检查点文件, 根据文件提供的信息分别在备份节点和其他正常节点机上重新启动用户进程, 重新启动用户进程的过程就是根据单进程检查点文件卷回恢复进程到上一个检查点时刻继续执行。
第二阶段:重新加入阶段。在各个进程成功的卷回恢复后, 重新加入到并行虚拟机PVM中, 但这时还不能马上恢复计算任务。所其中涉及到的主要数据结构如下描述。
(1) Pvmgs返回消息GSLS的结构。
int ngroups//任务组总数
GROUP_STRUCT*groups//存放任务组信息的数组
(2) 同步请求消息DXB_SYN的结构。
int ntids//同步任务数
int*t ids//存放同步任务TID的数组
(3) 任务重新加入PVM消息DXB_RJN的结构。
int otid//任务最早的任务标识符
int ct id//任务当前的任务标识符
(4) 消息路由表更新消息DXB_LST的结构。
int count//表中元素的个数
int otids[count]//由最早的任务标识符tid组成的表
int ntids[count]//由最新的任务标识符tid组成的表
2.2 故障检测和处理
故障在这里主要是指节点机故障, 同时我们假定节点机发生故障和节点机不可达属于同一种情况。在FTPVM原型系统中沿用了PVM原有的故障检测方法。PVM原有的故障检测方法非常巧妙, 它结合心跳法和捎带法两者的优点, 能够及时地检测节点机的故障, 同时又不会明显增加系统的负担[2]。在节点机之间的一般通信中, 即pvmd-pvmd之间的一般通信中, 如果发送的某个消息在规定的时间内无应答, 则可以断定目的节点故障。
PVM中断定一个节点机故障所需要的时间同具体的应用相关。在通信密集型应用中, 主要由D D M I N T I M E O U T决定:在计算密集型应用中, 主要由DDPINGTIME决定。D D M I N T I M E O U T等于D D M I N R E T R I E S*D D M A X R T T*。其中D D M I N R E T R I E S是pvmd-pvmd通信中的最小重发次数, 默认值为10;DDMAXRTT是pvmd-pvmd通信中的最大等待时间, 默认值为9秒;是一个系数, 默认值为2。所以在默认情况下, DDMI N T I M E O U T等于1 8 0秒。
FTPVM原型系统的节点机故障处理是在PVM原有的故障处理之上新增加了任务检查点恢复模块。故障处理模块的算法描述如下。
3 结语
并行虚拟机PVM是当今最流行的并行计算环境之一, 本文在保留原有PVM优点的基础之上, 提出了融入检查点技术的FTPVM原型系统的设计方案。FTPVM系统都能够自动采用检查点卷回恢复CRR技术在集群内恢复故障进程, 并且得到正确的计算结果。
参考文献
[1]汪东升.一种基于检查点的卷回恢复与进程迁移系统[J].软件学报, 2007, 10 (1) :68~73.
物理机连接虚拟机数据库 篇2
虚拟机ip
现在物理机和虚拟机应该就能相互通信了
第二步:加载配置文件找到虚拟机数据库配置文件tnsnames.ora..oracleproduct10.1.0Db_1NETWORKADMIN
复制里面的配置文件加到物理机的数据库连接配置文件,
物理机连接虚拟机数据库
,
具体操作如下:打开plsql,help ->support info
复制这个目录在计算机打开,把虚拟机的数据库配置文件加进去。
并行虚拟机 篇3
关键词:虚拟手术,碰撞检测,CUDA,并行化,AABB,层次包围盒
1 引言
虚拟手术系统在医学手术排练演习、手术教学、手术技能训练等方面有着非常重要的作用, 它靠术前获得的医学影像信息, 建立三维模型, 在计算机建立的虚拟的环境中设计手术过程、进刀的部位、角度, 从而提高手术的成功率。由于在虚拟手术环境中尽可能满足沉浸感和真实感, 因而实行性要求非常高。碰撞检测作为虚拟手术中的重要一环, 承担大量复杂的计算, 是制约实时性的最主要因素。
碰撞检测是游戏、虚拟现实中重点研究的问题, 对于能否产生真实感的场景至关重要。研究学者对此进行了许多有意义的工作, 针对不同的应用场景, 采用不同的方法提出了很多实用的碰撞检测算法。这些算法主要分为以下四类:
(1) 基于层次包围盒的碰撞检测算法。
(2) 基于空间层次分割的碰撞检测算法。
(3) 基于CPU多核多线程的碰撞检测算法。
(4) 基于GPU的碰撞检测算法。
其中, 基于层次包围盒的算法根据包围盒类型的不同, 又可分为包围球、轴对齐包围盒 (AABB) 、方向包围盒 (OBB) 、离散方向凸包围盒 (k-dop) 和凸包的层次树算法。基于空间层次分割的碰撞检测是将整个虚拟空间划分为体积相等的单元格, 只对占据同一单元或领域的单元格的对象进行相交测试。常用的空间分割方法有K-D树、八叉树、BSP树等。基于CPU多核多线程和基于GPU的的算法是在这些碰撞检测算法的基础上进行的一种改进, 然而, 前者效率提升并不十分明显, 后者算法的实现较为复杂, 且有很大的提升空间。
随着虚拟系统的规模越来越大, 模型也越来越复杂, 很多算法将无法满足实时性的要求。本文在分析了已有算法的基础上, 利用GPU可以大量并行计算的优点, 对碰撞检测算法分成两个阶段进行并行处理, 同时采用CUDA平台简化算法的实现, 使之较传统的基于CPU算法, 效率提升了3-5倍, 完全满足虚拟手术中实时性的要求。
2 并行碰撞检测算法的思想
本文采用基于AABB的层次包围盒的并行碰撞检测算法。该方法是利用体积略大而形状简单的包围盒把复杂的几何对象包裹起来。在进行碰撞检测时, 首先进行包围盒之间的相交测试, 当包围盒之间相交时, 再进行几何对象之间精确的碰撞检测。基于AABB的层次包围盒的碰撞检测算法由于具有良好的计算性能, 适用于复杂环境中的碰撞检测, 因而得到了广泛的关注。具体而言, 对于虚拟场景中的两个对象, 首先分别生成层次包围盒树, 然后通过递归遍历层次包围盒树来确定发生碰撞的区域。另外, 在虚拟手术过程中, 由于要实时地对标定的干扰点或区域进行剔除, 因而在下一次进行碰撞检测前应对包围树进行更新, 实时地生成包围盒树。通过实验和分析, 生成包围盒树和遍历包围盒树执行多次重复的代码, 每次处理不同的数据, 因此, 可以采用多线程的方式, 在同一时刻同时执行相同的代码, 同时完成处理不同的数据。由于CPU处理器数量有限, 而GPU处理流非常多且每个处理流可以作为一个计算单元, 因而可以利用GPU流处理单元进行并行计算, 从而可以大幅缩减计算的时间。
2.1 并行生成包围盒树
常用的生成包围盒树有两种方法, 分别是自顶向上和自底向上两种方法。自底向上生成包围盒树的方法与霍夫曼编码类似:
(1) 对于一个含有n个基本几何图元 (一般为三角面片) 的包围盒, 将每个基本几何图元用AABB进行包围, 组成n棵二叉树的集合F={T0, T1, …, Tn}, 其中每棵二叉树Ti中只有一个根结点, 其左右子树均为空。
(2) 遍历F中的每个Ti, 在其余的二叉树中找到与Ti距离最近的Tj, 将Ti与Tj作为左右子树重新合并成一棵新的二叉树, 并更新生成后的二叉树包围盒大小。重复该过程直到F中所有的二叉树被处理完成, 该过程的时间复杂度为O (n2) 。
(3) 每合并一颗二叉树, 将从F中删除原有的二叉树, 并将新生成的树加入到F中。
(4) 重复b和c过程, 直到F中只含有一棵树为止。
上述算法的时间复杂度为O (n2log2n) 。从上述算法的描述过程中可以看出, 遍历与合并都是做着重复的工作, 只是处理的数据不同, 因此, 可以使用并行的方式进行改进:
(1) 根据n个基本几何图元的包围盒构成n棵二叉树的集合F={T0, T1, …, Tn}, 初始时, 每棵二叉树只有一个根结点, 且其左右子树均为空。
(2) 从F中取出Ti, 并行计算其余根结点到Ti的距离, 再用并行的方式找到与Ti距离最小的根结点Tj, 然后将这两个节点合并为一个节点, 并以此节点并行计算到其他节点的距离。
重复该过程直到F中只含有一棵树为止。
上述过程如图1所示。
由并行树生成过程可知, 对于有n个基本几何元素的模型, 该算法在计算根节点之间距离的时间复杂度为O (n) , 在每一次寻找最小的距离根节点采用二分查找算法, 时间复杂度为log2n, 因而整个算法的时间复杂度为O (nlog2n) 。
2.2 并行遍历包围树
原始的遍历算法可以用图2所示伪代码进行描述。
从图2中可以发现, 对于含有n个模型的复杂场景, 假设每个模型平均含有m个多边形, 则此碰撞检测算法的时间复杂度为O (n2m2) , 即使问题退化到只含有几个模型的场景, 其复杂度也为O (m2) 。这对于实时性要求高的虚拟手术场合是无法满足的。很多研究者在此算法的基础上进行了深入的研究, 在权衡精度与速度之间提出了很多改进的算法, 但只满足一定场景的情形。
经过分析, 算法在遍历的过程中, 总是将每一个多边形 (可以用AABB进行近似, 简化计算) 串行与另一个模型的每一个多边形进行计算判断, 这个过程完全可以通过多线程的方式并行计算。因此, 对于将要发生碰撞的两个模型, 我们只对其中一个进行生成AABB包围盒树, 然后用另一个模型中的每个基本图元的包围盒并行的对这个包围盒树进行遍历, 从而获取碰撞信息, 并将其结果存放在一个数组中返回。
并行遍历包围树的过程如图3所示。
算法伪代码如下图4所示。
3 测试结果与性能分析
NVIDIA公司开发了一种称为CUDA通用并行计算架构, 它是一种基于NVIDIA图形处理器的并行计算体系架构, 并使用标准的C语言作为其编程语言, 因此很容易将上述算法在CUDA平台上进行实现。采用实验室配有的PC机及配置的GTX480显卡, 它含有480个SP (Streaming Processor) 基本处理单元, 对并行算法进行测试。为了对比说明效果, 分别采用了开源的碰撞检测库coldet和CUDA进行了对比测试, 测试结果如表1所示。
通过实验结果表明, 在虚拟手术仿真的过程中, 采用CUDA的并行加速算法的帧率达到60帧以上, 完全满足实时性的要求, 而采用coldet的开源碰撞检测库, 在整个过程中有明显的滞留感。
4 总结
本文对碰撞检测进行了分析, 将算法进行了并行化处理, 并采用CUDA对算法进行实现, 最后在虚拟手术系统中进行了测试, 结果表明, 采用CUDA的并行碰撞检测算法明显缩短了系统的耗时, 完全满足虚拟手术系统实时性的要求。该算法具有很好的通用性, 因此也可以用于视频游戏, CAD等场景。
参考文献
[1]马登武, 孙隆和, 佟明安.虚拟场景中的碰撞检测算法[J].火力与指挥控制.2004, 29 (4) :45-48.
[2]芦鸿雁.基于层次包围盒的碰撞检测算法研究[J].计算机与数字工程, 2008, 36 (2) :23-25.
[3]Tang M, Manocha D, Tong R.MCCD:Multicore collision detection between deformable models using front-based decomposition[C].SIAM/ACM Joint Conference on Geometric and physical modeling, 2009:355-360.
[4]A.Greβ, M.Guthe, R.Klein.GPU-based Collision Detection for Deformable Parameterized Surfaces[J].Eurographi cs, 2006, 25 (3) :497-506.
[5]Kim D, Heo J P, et al.HPCCD:Hybrid parallet continuous collision detection using CPUs and GPUs[J].Compter Graphics Forum, 2009, 28 (7) :1791-1800.
并行虚拟机 篇4
关键词:计算机,并口,中断,线程
0 引言
单片机与PC机进行数据通信,一般采用RS232串口或USB(通用串行总线)进行数据传输。RS232串口是PC机一个标准接口。由于RS232传输速度慢,可靠性不高,因此,一般用在一些低速设备的数据传输上。而USB接口虽然优点多,如USB2.0在全速时可达480Mbit/s,支持热插拔等,但由于其接口协议复杂,开发难度相对来说也比较复杂。
文章阐述一种基于Windows 2000/NT/XP下,计算机并口与单片机进行并行数据通信的方法。该方法接口简单,上下位机通信编程容易。
1 计算机并口介绍
计算机并行口是每台计算机的标准接口之一。一个标准的25芯并行口由以下功能脚组成:
a) 脚1:undefined,选通脉冲输出端;
b) 脚2~9:D0~D7,八位并行总线,用于向打印机输入命令和打印数据;
c) 脚10:undefined,打印机应答信号输入;
d) 脚11:BUSY,打印机状态输入;
e) 脚12:打印机缺纸PE输入;
f) 脚13:打印机SEL输入;
g) 脚15:打印机undefined输入;
h) 脚17:打印机undefined选择输出;
i) 脚18~25:GND。
由上可见,计算机的标准并行口由三类数据通道组成:一类为输出打印数据与命令数据的通道;另一类为输入打印机状态数据的通道;还有一类为对打印机输出控制数据的通道。这三类数据通道在PC机中对应的端口地址分别为:0x378,0x379,0x37A。
2 单片机与计算机并行通信的原理
设计的某无线数据采集器采集完现场信息后,通过无线局域网上传至通信控制器,由通信控制器再将收集到的数据送入计算机中作进一步的处理。同时,上位计算机向采集器发送的数据与命令也由该通信控制器转发至采集器。其中,通信控制器的主控芯片由80C552担任。由于系统上下传输数据量较大,为了提高通信控制器的数据吞吐能力与传输速度,简化通信软件的编制。在设计中提出了一种通过计算机并口进行并行数据通信的方法。为此设计的通信接口电路如图1所示。
由图1可看出,该接口电路用到了并口的三种数据通道。其中:打印口的脚2~9通过(U2)74LS244与单片机80C552的P5口相连;打印口的脚10,12,13,15通过(U1)74LS244与单片机80C552的P4口的低四位相连;打印口的脚11,1,17通过(U1)74LS244与单片机80C552的P3.4,P3.2(INT1),P3.3(INT0)相连。
相应的打印口读状态字节与发送的控制字节对应的引脚如图2所示。
从图2中可看到,控制字节输出时其引脚17和1的电平与字节对应的位值刚好反相。状态字节的D7位值与外部引脚的电平也刚好反相。也就是STB外部请求电平与PC状态口读到的值反相。因此在PC通信编程时对STB的巡检要和自己的编程意图相一致。经图1连接后,实现通信的过程如下:
a) 当PC向通信控制器发数据时,由PC机首先向打印口的数据端口打入数据并锁存,然后,再由PC机往打印口的控制端口第17脚发要求通信控制器取走数据的中断脉冲(INT0)。通信控制器就在其执行的中断程序中通过P5口将数据取走,并送入相应的缓存。
b) 当通信控制器向PC机上传数据时,PC机通过后台线程不断监视打印口的状态端口D7位(即第11脚STB),一旦发现引脚上有请求,则转入对通信控制器上传数据的处理。具体也是由PC机往打印口的控制端口第1脚发要求通信控制器上传数据的中断脉冲(INT1),通信控制器就在其执行的中断程序中将要求上传的数据拆分成半个字节送到打印口的状态口上(10,12,13,15脚)。可以规定前四次中断得到的为通信控制器要求上传数据的长度。然后,PC机再以此长度乘2作为向通信控制器发中断脉冲的次数。当然,也可以采用自己规定的数据传送结束符(比如0xFF等)作为传送结束的标志。这样,就完成了一次双向传输数据的过程。
该电路数据的收/发之所以要由上位机来决定(既收/发数据均由上位机发中断脉冲实现),是因为Windows是一个分时多任务的操作系统。时间分片往往导致编程人员不可能对程序指令的实际执行时间进行准确预测。这是由Windows的分时调度机制所决定的。为了保证传输可靠,由上位机发脉冲来控制外设中断程序的执行,在中断程序中完成数据传送。这样就能确保上下位机获得准确的数据。
众所周知,Windows是一个多任务分时操作系统,在Windows下不提倡对计算机底层硬件进行直接操作。尤其是具有NT内核的操作系统(Windows 2000/NT/XP)。Win98及以下的操作系统还可以通过在VC++中内嵌汇编语言来实现对端口的操作。具有NT内核的操作系统对I/O的操作实行了严格的控制。
为了在Windows 2000/NT/XP下操作I/O端口,可采用著名的PortTalk设备驱动来实现端口的直接读写。PortTalk是一个用于Windows 2000/NT/XP操作系统端口读写驱动程序,它的官方网站是:http://www.beyondlogic.org。可以在其网站中获得最新的版本。限与篇幅,有关PortTalk设备驱动如何调用请参看《Delphi下深入Windows核心编程》一书。
3 程序实现
a) 通信控制器软件流程:根据上面所述的通信接口及工作原理,在通信控制器中实现上述通信功能的单片机主程序及数据收/发中断处理子程序框图如图3所示。
图3(b)和图3(c)中断子程序的执行均由上位机发中断脉冲引发。如上所述,数据的传送就在中断程序执行中完成。
b) 上位机(PC机)通信软件实现原理:上位机软件采用Visual C++6.0作为编程语言。Visual C++6.0具有非常方便的线程创建、终止、同步功能。为了实现数据通信功能,在程序中创建一个工作者线程,由线程在后台监视并行口的数据上传请求。而PC机发送数据则可在要求发送的对话框中调用相应的成员函数实现。由于通信控制器与PC机存在速度匹配问题,为了适应外设的速度,在PC机向通信控制器发中断脉冲后插入了一定的延时,以等待外设有足够的时间将数据读走或送到引脚并稳定。该延时在PC机中可达到微秒级精度。实现微秒级定时的两个API函数定义如下:
QueryPerformanceFrequency(LARGE_INTEGER*lpFrequency);QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)。
在Windows 2000/NT/XP下,程序是不允许直接操作I/O端口的,如上所述,使用PortTalk设备驱动程序并调用API函数CreateFile(…)来获得设备的句柄,进一步通过该句柄调用API函数DeviceIoControl(…)可实现对端口的数据交换。
4 结束语
上述方案是在Windows 2000/NT/XP下实现单片机与计算机并口通信的最简单方法之一。通过该方法,在开发成功的酒店无线点菜系统中完全达到了设计要求,通信控制器与计算机之间的数据传送速度达到200Kbit/s。经过一年的运行,该系统运行稳定,数据传输准确可靠,而且大大缩短了开发周期。
参考文献
[1][美]Microsoft Corporation著.Visual C++6.0MFC应用程序开发[M].北京博彦科技发展有限公司译.北京:清华大学出版社,2002.
[2]飞思科技产品研发中心编著.Delphi下深入Windows核心编程[M].北京:电子工业出版社,2003.
[3]徐爱均,彭秀华.单片机高级语言C51 Windows环境编程与应用[M].北京:电子工业出版社,2001.