亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mpi.cpp

?? * 算法描述: 分段 -> 段內排序 -> 歸約結果。 * 1
?? CPP
字號:
//=================================================================  
// Name : 基于分段的平行排序  
// Author : 袁冬(2107020046)  
// Copyright : 中國海洋大學  
// LastUpdate : 2007.10.03      
// Develop Evrionment : Windows Server 2003 SP2  
//                        + Eclipse 3.3.1 + CDT 4.0.1   
//                        + MinGW 3.81 + GDB 6.6   
//                        + mpich2-1.0.6-win32-ia32
//=================================================================

/*
* 算法描述: 分段 -> 段內排序 -> 歸約結果。
* 1,根進程讀取輸入,將元素個數廣播給各個進程。
* 2,然后各進程計算段長度和段偏移。
* 3,然后根進程選擇第一個段,標記站位符。
* 4,跟進程將剩余元素發送給下一進程,下一進程選擇段的同時,根進程排序。
* 5,下一進程繼續此過程,直到最后一個進程,所有元素都進行排序。
* 6,進程將排序好的元素,按照段偏移歸約給根進程。
* 7,根進程輸入結果。
* 
* 時間復雜度計算:
* 設共有進程p,共有元素n
* 則段數為p,每段長度為m = n / p
* 最長時間為從根進程分段開始,至末進程規約為止,又注意到,分段時串行進行的,故
* 
*         t = 分段時間 * 段數 + 最后一段的排序時間
* 
* 用大歐米伽表示法表示
* 
*         O(分段時間) = m * n = n * n / p
*         O(最后一段的排序時間) = m * m
* 
* 所以
* 
*         O(t) = n * n / p * p + m * m
*              = n * n + m * m; 
*              = n * n
* 
* 所以,此算法排序時間復雜度為n的平方,和起泡排序的時間復雜度相同。
* 
* 分析與優化:
* 從時間復雜度的分析可以知道,算法的瓶頸在于分段算法,因為該算法從本質上講,是串行進行的。
* 因個人水平有限,分段沒有找到并行算法,導致整個算法為偽并行。
* 但是有一個辦法可以將分算法的時間減半,
* 即從最大和最小兩邊開始,分別進行分組,可以使時間復雜度減低一半,但總體時間復雜度的O認為n*n。
* 
* 另外,在“取得當前段”的算法中,如果每次循環i時,段索引沒有改變,再下一輪時,可以不再遍歷。
* 相當于加入緩存,估計此緩存命中幾率比較高,可以較大幅度的改善時間復雜度。
* 
*/

//#define DEBUG 1 //調試符號
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
#include "mpi.h"

using namespace std;

#define TRUE 1
#define FALSE 0
#define Bool int

#define MAX_LENGTH 5000 //允許的最大元素個數
#define MAX_LENGTH_WITH_MARK 10000 //允許的最大元素數及其對應的標記的長度,此值應為MAX_LENGTH的兩倍


int pID, pSize; //pID:當前進程ID,pSize:總的進程數
int input[MAX_LENGTH][2], length, packageSize; //input:輸入,length:輸入的元素個數,packageSize:段大小
int result[MAX_LENGTH], finalResult[MAX_LENGTH], packageIndex[MAX_LENGTH]; //result:當前結果,finalResult:最終結果,packageIndex:段值索引
int resultOffset; //resultOffset:短偏移

//讀取輸入
void read() {
	int i;
	//讀取元素個數
	printf("Input the length of the array(100-5000):");
	fflush(stdout);
	scanf("%d", &length);

	//讀取元素
	printf("Input the element of the array total %d:", length);
	fflush(stdout);
	//randomize(); 
	for (i = 0; i < length; i++) {
		//讀取元素,經對應站位標記標記為0
		input[i][0] = rand();
		input[i][1] = 0;
	}
}
//輸出
void output() {
	int i;
	printf("\n");
	for (i = 0; i < length; i++)
		printf("%d\t", finalResult[i]);
	fflush(stdout);
}

//準備:計算進程常量
int prepare() {
	packageSize = length / pSize; //段大小
	cout << endl << length << endl << pSize << endl;
	resultOffset = packageSize * pID; //結果起始偏移值,表示該段位于整體的哪個部分

	//對于最后一個進程,需要修正段大小,包含所有余下的元素
	if (pID == pSize - 1)
		packageSize += length % pSize;

#ifdef DEBUG
	//調試信息:段大小
	printf("resultOffset: %d, From %d.\n", resultOffset, pID);
#endif
	return 0;
}

//分段,取得當前進程負責的段
void findCurrentRange() {
	int i, j = 0, maxIndex, beginIndex = 0;

	//填充默認的值
	for (i = 0; i < packageSize; i++) {
		while (input[beginIndex][1])
			beginIndex++;
		packageIndex[i] = beginIndex;
		beginIndex++;
	}

#ifdef DEBUG    
	//調試信息:默認值
	for (i = 0; i < packageSize; i++)
		printf("%d", packageIndex[i]);
	printf(" From %d\n", pID);
#endif

	//查找所有元素,找到最小的packageSize個元素,取得其索引值
	for (i = beginIndex; i < length; i++) {
		//忽略被其他進程占用的元素
		if (input[i][1])
			continue;

		//查找比當前元素索引中最大的元素的索引
		maxIndex = 0;
		for (j = 1; j < packageSize; j++)
			if (input[packageIndex[j]][0] > input[packageIndex[maxIndex]][0])
				maxIndex = j;

		//如果元素索引中的最大的小于當前元素,則替換
		if (input[packageIndex[maxIndex]][0] > input[i][0])
			packageIndex[maxIndex] = i;
	}
#ifdef DEBUG    
	//調試信息:當前段索引,用于判斷是否取得了正確的段索引
	for (i = 0; i < packageSize; i++)
		printf("%d", packageIndex[i]);
	printf(" From %d\n", pID);
#endif

	//將索引轉化為值,存放在result中,并標記輸入信息,表明已占用
	for (j = 0; j < packageSize; j++) {
		result[resultOffset + j] = input[packageIndex[j]][0];
		input[packageIndex[j]][1] = 1;
	}

#ifdef DEBUG    
	//調試信息:排序前的當前段,用于判斷是否取得了正確的段
	for (i = 0; i < length; i++)
		printf("%d", result[i]);
	printf(" From %d\n", pID);
#endif
}
//排序一個段
void sort() {
	//段內起泡
	int i, j, temp;
	for (i = 0; i < packageSize; i++)
		for (j = 0; j < packageSize; j++) {
			if (result[resultOffset + i] < result[resultOffset + j]) {
				temp = result[resultOffset + i];
				result[resultOffset + i] = result[resultOffset + j];
				result[resultOffset + j] = temp;
			}
		}
#ifdef DEBUG
		//調試信息:排序后的當前段
		for (i = 0; i < length; i++)
			printf("%d", result[i]);
		printf(" From %d\n", pID);
#endif
}
//主處理進程
void process() {
	//取得該進程負責的段
	findCurrentRange();
	//如果此進程不是最后一個進程,則將剩余部分傳遞給下一個進程
	if (pID != pSize - 1)
		MPI_Send(input, MAX_LENGTH_WITH_MARK, MPI_INT, pID + 1, 0, MPI_COMM_WORLD);

	//排序當前進程負責的段
	sort();
	//歸約結果,因為最終結果初始皆為零,故采用求和的形式歸約當前結果到最終結果
	MPI_Reduce(result, finalResult, MAX_LENGTH_WITH_MARK, MPI_INT, MPI_SUM, 0,
		MPI_COMM_WORLD);
}

//入口,主函數
int main(int argc, char* argv[]) {

	clock_t totalStart,totalEnd,sortStart,sortEnd;

	MPI_Status status; //無用

	MPI_Init(&argc, &argv); //初始化
	MPI_Comm_rank(MPI_COMM_WORLD, &pID); //取得當前進程的ID
	MPI_Comm_size(MPI_COMM_WORLD, &pSize); //取得總進程數

	//根進程負責輸入
	if (!pID)
	{
		read();
		totalStart = clock();
	}

	//廣播輸入數數組的長度
	MPI_Bcast(&length, 1, MPI_INT, 0, MPI_COMM_WORLD);
	//準備:計算各進程常量
	prepare();

	sortStart = clock();

	//從根進程啟動,處理第一段
	if (!pID)
		process();
	else {
		//其余進程等待上一進程傳遞的數據
		MPI_Recv(input, MAX_LENGTH_WITH_MARK, MPI_INT, pID - 1, 0, MPI_COMM_WORLD,
			&status);
		//收到數據后進行處理
		process();
	}


	//根進程負責輸出
	if (!pID)
	{
		sortEnd = clock();
		output();
		totalEnd = clock();

		printf("\n------------------------------\n");
		printf("Total time is %f seconds\n",(double)(totalEnd - totalStart) / CLOCKS_PER_SEC);
		printf("Sort time is %f seconds\n",(double)(sortEnd - sortStart) / CLOCKS_PER_SEC);
	}

	//結束
	MPI_Finalize();
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品色在线| 精品一区二区在线观看| 日本美女视频一区二区| a亚洲天堂av| 久久久久久9999| 日韩和欧美一区二区| 一本色道久久综合亚洲91| 欧美xxxxxxxx| 日日欢夜夜爽一区| 91久久精品国产91性色tv| 欧美高清在线精品一区| 久草热8精品视频在线观看| 欧美专区亚洲专区| 国产精品久久久久一区| 国产一区二区在线免费观看| 欧美美女网站色| 亚洲综合无码一区二区| 成人av资源网站| 国产嫩草影院久久久久| 精品一区二区三区不卡| 日韩一级二级三级精品视频| 天涯成人国产亚洲精品一区av| 91污在线观看| 一区二区中文字幕在线| 国产99久久久久久免费看农村| 日韩午夜精品视频| 美女国产一区二区三区| 69堂成人精品免费视频| 丝袜美腿亚洲一区二区图片| 欧美三级视频在线播放| 亚洲第一主播视频| 欧美午夜理伦三级在线观看| 亚洲欧美日韩精品久久久久| 99久久久久久99| 一区视频在线播放| caoporn国产一区二区| 国产精品久久久久精k8| 99re这里都是精品| 伊人婷婷欧美激情| 欧美三级电影精品| 视频一区欧美精品| 欧美一区二区三区免费大片| 蜜桃一区二区三区在线| 精品剧情在线观看| 国产黄色成人av| 中文字幕中文字幕一区二区| 成人av免费网站| 亚洲黄色小视频| 欧美另类高清zo欧美| 久久精品国产99久久6| 久久久久久久免费视频了| 成人午夜看片网址| 亚洲九九爱视频| 欧美一区二区三区视频在线观看| 美女任你摸久久| 国产日韩精品久久久| 97久久超碰国产精品电影| 亚洲第一福利视频在线| 精品处破学生在线二十三| 成人精品免费网站| 亚洲成人1区2区| 久久久午夜精品| 欧美影院精品一区| 久久99精品久久久| 亚洲欧美在线观看| 日韩一区二区中文字幕| www.日韩av| 免费在线观看成人| 中文字幕一区二区在线播放| 欧美日韩久久久| 国产激情精品久久久第一区二区 | av在线一区二区| 亚洲成人av电影在线| 国产性天天综合网| 欧美日韩大陆在线| 成人黄色免费短视频| 日韩电影网1区2区| 亚洲欧美经典视频| 精品国产一区久久| 欧美在线观看视频一区二区| 国产精品18久久久| 奇米精品一区二区三区在线观看一| 国产精品毛片a∨一区二区三区| 欧美美女一区二区在线观看| av午夜精品一区二区三区| 奇米精品一区二区三区在线观看 | 免费av成人在线| 亚洲视频一区在线观看| 久久噜噜亚洲综合| 91精品久久久久久久99蜜桃| 色美美综合视频| 国产白丝精品91爽爽久久| 秋霞国产午夜精品免费视频| 亚洲激情网站免费观看| 国产精品欧美一级免费| 亚洲精品一区二区在线观看| 在线不卡一区二区| 色一情一乱一乱一91av| 成人夜色视频网站在线观看| 极品美女销魂一区二区三区免费| 亚洲线精品一区二区三区| 中文字幕一区二区5566日韩| 久久久天堂av| www国产成人免费观看视频 深夜成人网| 欧美日韩久久一区| 欧美日韩国产综合视频在线观看| 色婷婷激情综合| 91蝌蚪porny成人天涯| 成人午夜视频免费看| 高清不卡在线观看av| 国产精品一区三区| 国产精品影视网| 国产精品一品二品| 国产成人亚洲综合a∨猫咪| 国产乱对白刺激视频不卡| 国产在线国偷精品产拍免费yy| 久久不见久久见中文字幕免费| 青椒成人免费视频| 久久精品国产99久久6| 麻豆国产一区二区| 久久精品国产久精国产| 狠狠色综合日日| 国产成人av电影在线| 不卡一区在线观看| 欧美精品一区二区三区很污很色的| 制服丝袜av成人在线看| 日韩亚洲欧美成人一区| 精品999久久久| 久久久久久久久久久99999| 国产欧美日本一区视频| 亚洲视频你懂的| 性久久久久久久| 激情图片小说一区| www.一区二区| 欧美日韩久久一区二区| 精品1区2区在线观看| 久久久99精品久久| 亚洲男人天堂av| 日韩精品亚洲一区| 国产精品一区二区三区乱码| 99麻豆久久久国产精品免费| 日本韩国欧美在线| 欧美一区二区三区性视频| 国产亚洲综合在线| 一区二区在线电影| 青草av.久久免费一区| 春色校园综合激情亚洲| 91黄色免费观看| 精品日韩一区二区| 自拍偷拍亚洲综合| 久久精品国产99国产| 91影院在线观看| 日韩欧美二区三区| 亚洲欧美在线高清| 久久av中文字幕片| 色呦呦一区二区三区| 精品国一区二区三区| 亚洲激情网站免费观看| 国产在线精品免费| 欧美狂野另类xxxxoooo| 国产拍揄自揄精品视频麻豆| 亚洲国产一区视频| 成人久久视频在线观看| 91精品国产综合久久精品| 国产精品麻豆视频| 精品伊人久久久久7777人| 91豆麻精品91久久久久久| 国产亚洲欧美激情| 免费在线观看不卡| 欧洲精品在线观看| 亚洲国产精品高清| 激情综合色综合久久| 67194成人在线观看| 亚洲私人黄色宅男| 国产不卡高清在线观看视频| 欧美一三区三区四区免费在线看 | 亚洲免费伊人电影| 国产一区二区h| 日韩免费电影一区| 亚洲国产一区二区在线播放| 成人高清av在线| 久久一留热品黄| 免费精品视频在线| 欧美日韩成人一区二区| 亚洲精品五月天| 成人激情视频网站| 久久久国产一区二区三区四区小说| 视频在线观看一区二区三区| 91在线观看下载| 1区2区3区欧美| 成人午夜激情影院| 国产精品入口麻豆原神| 精品在线免费观看| 日韩免费高清视频| 精品一区二区三区欧美| 欧美精品久久久久久久多人混战| 亚洲国产视频a| 欧美男同性恋视频网站| 天天色综合成人网| 欧美一区二区三区免费视频 |