【并行计算】Circular-Shift Routing in Hypercube

本文介绍了在并行计算课程中,使用MPI和Visual Studio搭建环境,实现Circular-Shift Routing in Hypercube的方法。通过格雷码转换进行顶点重新编号,解决了移位过程中的拥塞问题。然而,程序在某些情况下会崩溃,可能需要通过添加sleep来避免。此外,由于硬件限制,进程并行数过多会导致系统崩溃。作者提供了一种新的优化方法,使得任意移位可在p步内完成,确保无拥塞。最后,作者提醒同学们不要抄袭,因为老师会进行代码查重。
摘要由CSDN通过智能技术生成

QAQ:经过映射的Hypercube就不是Hypercube了。。尴尬
并行计算导论课作业,折腾了一下午,基本搞定了。
但是还有几个问题没有解决:

  • 有时候执行会莫名崩溃,在send和receive之间加入sleep后,就很少崩溃,这是为什么?
  • 我的i7 4700最多只能跑1000多个进程,进程数过多磁盘,cpu使用率直接爆炸,电脑死机,程序运行崩溃。如何才能提高进程并行数?

用的MPI实现的多进程。

MPI+VS环境的搭建可以参考这篇转载的文章:

http://blog.csdn.net/qq379548839/article/details/52770424


Circular-Shift Routing in Hypercube实现方法:

循环移位的实现首先需要对一般的hypercube的顶点重新编号。
具体的方法是:
将一般的hypercube顶点编号作为格雷码,将这个格雷码转换为二进制编码,这个二进制编码即为这个定点的新编号。
以上就是《并行计算导论》书中说的reflected gray code(RGC),中文翻译:反射格雷码。
对于这个概念我只能说,呵呵。我google了很久也没有查到这个所谓的RGC到底是个什么东西,最后我观察规律才发现所谓的反射是上面这个意思。
然后将移位数二进制拆分,拆分成最多logp(p为节点数)项进行移位。

然后,这样编号和二进制拆分有两个极大的好处:

  • 当移位是2^0时,每个节点只需要进行1次消息发送与接收;当移位不为2^k(k!=0)时,每个节点只需要进行2次消息发送与接收
  • 在消息传递时,是无拥塞的

// MPI_Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"  
#include "mpi.h"  
#include <stdio.h>  
#include <math.h>  
#include <Windows.h>  
#include <iostream>
#include <ctime>

using namespace std;

int val;
int p, q;
int srcRelation[20], dstRelation[20];

void getPQ(char* argv[]) {
  //读取p,q
    p = 0;
    int i = 0;
    while (argv[1][i] != '\0') {
        p = p * 10 + argv[1][i] - '0';
        i++;
    }

    q = 0;
    i = 0;
    while (argv[2][i] != '\0') {
        q = q * 10 + argv[2][i] - '0';
        i++;
    }
}

int grayToBit(int x) {
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值