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) {