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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? marssort.cu

?? GPU實現(xiàn)的MapReduce framework,對于學(xué)習(xí)并行編程和cuda平臺的編程方面有著極好的參考價值
?? CU
?? 第 1 頁 / 共 4 頁
字號:
/**
 *This is the source code for Mars, a MapReduce framework on graphics
 *processors.
 *Author: Wenbin Fang (HKUST), Bingsheng He (HKUST)
 *Mentor: Naga K. Govindaraju (Microsoft Corp.), Qiong Luo (HKUST), Tuyong
 *Wang (Sina.com).
 *If you have any question on the code, please contact us at {saven,
 *wenbin, luo}@cse.ust.hk.
 *The copyright is held by HKUST. Mars is provided "as is" without any 
 *guarantees of any kind.
 */
 
#undef __CPU_MAP__
#undef __GPU_MAP__
#undef __CPU_REDUCE__
#undef __GPU_REDUCE__
#define __COMPARE__
#include "MarsInc.h"
#include "MarsInc/MarsConfig.h"
 
//==============================================================
//CPU sort
//==============================================================
ChunkInfo_t *g_chunk = NULL;

int cmp_wrap(const void *arg1, const void *arg2)
{
	int4 *arg_1 = (int4*)arg1;
	int4 *arg_2 = (int4*)arg2;

	char *key1 = g_chunk->keys + arg_1->x + g_chunk->keyOffset;
	char *key2 = g_chunk->keys + arg_2->x + g_chunk->keyOffset;
	size_t key1Size = arg_1->y;
	size_t key2Size = arg_2->y;
	int ret = cpu_compare(key1, key1Size, key2, key2Size);
	return ret;
}

void InitGroupMem(ChunkInfo_t *chunk)
{
	BEN_ASSERT(chunk != NULL);
	g_chunk = chunk;
}
 
void QuickSortMem(ChunkInfo_t *chunk)
{
	BEN_ASSERT(chunk != NULL);
	g_chunk = chunk;
	qsort(chunk->index, chunk->recCount,sizeof(int4), 
		cmp_wrap);
}
 
void GroupByMem(ChunkInfo_t *chunk)
{
	BEN_ASSERT(chunk != NULL);
		
	chunk->keyListRange = (int2*)BenMalloc(sizeof(int2)*chunk->recCount);
	chunk->diffKeyCount = 1;
	chunk->keyListRange[0].x = 0;
	int4 *preOffsetSize = chunk->index;
 
	int i;
	for (i = 1; i < chunk->recCount; i++)
	{
		if (cmp_wrap(preOffsetSize, &chunk->index[i]) != 0)
		{
			chunk->keyListRange[chunk->diffKeyCount].x = i;
			chunk->keyListRange[chunk->diffKeyCount-1].y = i;
			chunk->diffKeyCount++;
			preOffsetSize = &(chunk->index[i]);
		}
	}
	chunk->keyListRange[chunk->diffKeyCount-1].y = i;
	chunk->keyListRange = (int2*)BenRealloc(chunk->keyListRange, sizeof(int2)*chunk->recCount, sizeof(int2)*chunk->diffKeyCount);
}

//--------------------------------------------------------------
//external merge sort
//--------------------------------------------------------------
static char GetSmallSortChunk(FileName_t *file,
							  SortChunk_t *smallChunk, 
							  SortChunk_t *bigChunk, 
							  size_t chunkSize,
							  char *bitmap, int index,
							  size_t *recOffsets)
{
	BEN_ASSERT(smallChunk != NULL);
	BEN_ASSERT(bigChunk != NULL);
	BEN_ASSERT(file != NULL);
	BEN_ASSERT(bitmap != NULL);
	BEN_ASSERT(recOffsets != NULL);

	if (smallChunk[index].cursor >= bigChunk[index].diffKeyCount)
	{
		bitmap[index] = 0;
		return 0;
	}

	smallChunk[index].diffKeyCount = chunkSize;
	if (smallChunk[index].diffKeyCount + smallChunk[index].cursor >
		bigChunk[index].diffKeyCount)
		smallChunk[index].diffKeyCount = bigChunk[index].diffKeyCount - 
		smallChunk[index].cursor;

	//read rangeFile
	smallChunk[index].rangeOffset = sizeof(int2)*(smallChunk[index].cursor)+bigChunk[index].rangeOffset;
	smallChunk[index].rangeSize = sizeof(int2)*smallChunk[index].diffKeyCount;
	smallChunk[index].keyListRange = (int2*)BenReadFile(file->rangeFile, 
		smallChunk[index].rangeOffset, 
		smallChunk[index].rangeSize);
	smallChunk[index].rangeOffset = sizeof(int2)*smallChunk[index].cursor;

	//read indexFile
	smallChunk[index].recCount = smallChunk[index].keyListRange[smallChunk[index].diffKeyCount-1].y
		- smallChunk[index].keyListRange[0].x;
	smallChunk[index].indexOffset = sizeof(int4)*smallChunk[index].keyListRange[0].x+bigChunk[index].indexOffset;
	smallChunk[index].indexSize = sizeof(int4)*smallChunk[index].recCount;
	smallChunk[index].index = (int4*)BenReadFile(file->indexFile, 
		smallChunk[index].indexOffset,
		smallChunk[index].indexSize);
	smallChunk[index].indexOffset = sizeof(int4)*smallChunk[index].keyListRange[0].x;
	
	//read keyFile
	smallChunk[index].keyOffset = smallChunk[index].index[0].x+bigChunk[index].keyOffset;
	smallChunk[index].keySize = smallChunk[index].index[smallChunk[index].recCount - 1].x +
		smallChunk[index].index[smallChunk[index].recCount - 1].y;
	smallChunk[index].keys = (char*)BenReadFile(file->keyFile, 
		smallChunk[index].keyOffset,
		smallChunk[index].keySize);
	smallChunk[index].keyOffset = smallChunk[index].index[0].x;

	//read valFile
	smallChunk[index].valOffset = smallChunk[index].index[0].z+bigChunk[index].valOffset;
	smallChunk[index].valSize = smallChunk[index].index[smallChunk[index].recCount - 1].z +
		smallChunk[index].index[smallChunk[index].recCount - 1].w;
	smallChunk[index].vals = (char*)BenReadFile(file->valFile, 
		smallChunk[index].valOffset,
		smallChunk[index].valSize);
	smallChunk[index].valOffset = smallChunk[index].index[0].z;

	smallChunk[index].cursor += smallChunk[index].diffKeyCount;

	recOffsets[index] += smallChunk[index].recCount;

	bitmap[index] = 1;

	return 1;
}

//used only when ((GPU_SORT or GPU_SORT_REDUCE) and USE_FILE)
void RearrangeKeyVal(ChunkInfo_t *chunk)
{
	char *newKeys = (char*)BenMalloc(chunk->keySize);
	char *newVals = (char*)BenMalloc(chunk->valSize);

	size_t keyOffset = 0;
	size_t valOffset = 0;
	for (int i = 0; i < chunk->recCount; i++)
	{
		int4 index = chunk->index[i];
		//BenLog("%d,%d\n", *(int*)(chunk->keys+index.x),
		//	*(int*)(chunk->vals+index.z));
		BenMemcpy(newKeys+keyOffset, chunk->keys+index.x, index.y);
		BenMemcpy(newVals+valOffset, chunk->vals+index.z, index.w);
		chunk->index[i].x = keyOffset;
		chunk->index[i].z = valOffset;
		keyOffset += index.y;
		valOffset += index.w;
	}

	BenFree((char**)&chunk->keys, chunk->keySize);
	BenFree((char**)&chunk->vals, chunk->valSize);
	chunk->keys = newKeys;
	chunk->vals = newVals;
}

//get a group of records from small sort chunk
static void GetSortRec(SortRec_t *rec, SortChunk_t *chunks, 
					   int index, size_t *recOffsets)
{
	BEN_ASSERT(rec != NULL);
	BEN_ASSERT(chunks != NULL);

	SortChunk_t *chunk = &chunks[index];
	if (chunk->smallCursor >= chunk->diffKeyCount)
		return;
	size_t i = chunk->smallCursor;

	rec->keyListRange = chunk->keyListRange[i];
	rec->valCount = rec->keyListRange.y - rec->keyListRange.x;
	rec->index = &chunk->index[rec->keyListRange.x-recOffsets[index]+ chunk->recCount];
	rec->allValSize = 0;
	for (int j = 0; j < rec->valCount; j++)
		rec->allValSize += rec->index[j].w;
	rec->keySize = rec->index[0].y;
	rec->allKeySize = rec->valCount * rec->keySize;
	rec->key = chunk->keys + rec->index[0].x - chunk->keyOffset ;
	rec->val = chunk->vals + rec->index[0].z - chunk->valOffset ;
}

//--------------------------------------------------------------
//add record, group, 
//--------------------------------------------------------------
//static offset control
static int4 outputSize = make_int4(DEFAULT_SORT_OUTPUT_SIZE,
	DEFAULT_SORT_OUTPUT_SIZE, DEFAULT_SORT_OUTPUT_SIZE,
	DEFAULT_SORT_OUTPUT_SIZE);
//0,1,2,3,4,5, ... 0, 1,2, 3,...0,1,2,...
static int4 perRecSizeOffset = make_int4(0,0,0,0);
//0,0,0,0,1,1,1,1,2,2,2,2, 333,444
static int2 perChunkSizeOffset = make_int2(0,0);
//1,2,3,4,5...n for index
static size_t recOffset = 0;
//0,0,0, 1,1,1,...
static size_t curOffset = 0;
static size_t groupOffset = 0;
//0, 1, 2, 3, ... n
static int2 keyValOffset = make_int2(0, 0);
//used in WriteChunk
static size_t totalRecCount = 0;
static size_t totalGroupCount = 0;
static void OutputAndGroupRecs(ChunkInfo_t *outBuf,
							   FileName_t *file,
							   SortRec_t *rec, 
							   size_t chunkSize)
{
	BEN_ASSERT(outBuf != NULL);
	BEN_ASSERT(chunkSize > 0);
	BEN_ASSERT(rec != NULL);
	BEN_ASSERT(file != NULL);

	//flag symbol control
	static char firstRec = 1;
	static char firstGroup = 1;

	//allocate buffer
	if (firstRec == 1)
	{
		outBuf->keys = (char*)BenMalloc(outputSize.x);
		outBuf->vals = (char*)BenMalloc(outputSize.y);
		outBuf->index = (int4*)BenMalloc(outputSize.z);
		outBuf->keyListRange = (int2*)BenMalloc(outputSize.w);
		
		firstRec = 0;
	}

	//key
	if (perRecSizeOffset.x + rec->allKeySize >= outputSize.x)
	{
		outBuf->keys = (char*)BenRealloc(outBuf->keys, outputSize.x, outputSize.x*2);
		outputSize.x *= 2;
	}
	BenMemcpy(outBuf->keys+perRecSizeOffset.x, rec->key, rec->allKeySize);

	//val
	if (perRecSizeOffset.y + rec->allValSize >= outputSize.y)
	{
		outBuf->vals = (char*)BenRealloc(outBuf->vals, outputSize.y, outputSize.y*2);
		outputSize.y *= 2;
	}
	BenMemcpy(outBuf->vals+perRecSizeOffset.y, rec->val, rec->allValSize);

	//index
	size_t indexSize = rec->valCount*sizeof(int4);
	if (perRecSizeOffset.z + indexSize >= outputSize.z)
	{
		outBuf->index = (int4*)BenRealloc(outBuf->index, outputSize.z, outputSize.z*2);
		outputSize.z *= 2;
	}
	for (int i = 0; i < rec->valCount; i++)
	{
		rec->index[i].x = keyValOffset.x;
		rec->index[i].z = keyValOffset.y;
		keyValOffset.x += rec->index[i].y;
		keyValOffset.y += rec->index[i].w;
	}
	BenMemcpy(((char*)outBuf->index)+perRecSizeOffset.z, rec->index, indexSize);

	//keyListRange
	if (perRecSizeOffset.w + sizeof(int2) >= outputSize.w)
	{
		outBuf->keyListRange = (int2*)BenRealloc(outBuf->keyListRange, outputSize.w, outputSize.w*2);
		outputSize.w *= 2;
	}
		
	//group
	static int4 preIndex = *rec->index;
	int4 curIndex = *rec->index;
	if (preIndex.x >= perChunkSizeOffset.x)
	{
		preIndex.x -= perChunkSizeOffset.x;
		preIndex.z -= perChunkSizeOffset.y;
	}
	if (curIndex.x >= perChunkSizeOffset.x)
	{
		curIndex.x -= perChunkSizeOffset.x;
		curIndex.z -= perChunkSizeOffset.y;
	}

	//!!!
	if (firstGroup != 1)
	{
		InitGroupMem(outBuf);
		size_t backKeyOffset = outBuf->keyOffset;
		size_t backValOffset = outBuf->valOffset;
		outBuf->keyOffset = 0;
		outBuf->valOffset = 0;

		if (cmp_wrap(&preIndex, &curIndex) != 0)
		{
			outBuf->keyListRange[outBuf->diffKeyCount].x = recOffset;
			outBuf->keyListRange[outBuf->diffKeyCount-1].y = recOffset;
			totalGroupCount ++;			
			preIndex = outBuf->index[recOffset - curOffset];
			outBuf->diffKeyCount++;
			perRecSizeOffset.w += sizeof(int2);
			outBuf->rangeSize += sizeof(int2);
		}

		outBuf->keyOffset = backKeyOffset;
		outBuf->valOffset = backValOffset;
	}
	else
	{
		firstGroup = 0;
		perRecSizeOffset.w += sizeof(int2);	
		outBuf->diffKeyCount = 1;
		outBuf->keyListRange[0].x = recOffset;
		outBuf->rangeSize += sizeof(int2);
	}
	//!!!

	//proceed
	//adjust chunk
	outBuf->keySize += rec->allKeySize;
	outBuf->valSize += rec->allValSize;
	outBuf->indexSize += indexSize;
	outBuf->recCount += rec->valCount;

	//adjust offset
	perRecSizeOffset.x += rec->allKeySize;
	perRecSizeOffset.y += rec->allValSize;
	perRecSizeOffset.z += indexSize;
	recOffset += rec->valCount;
	groupOffset++;

	//flush
	if (outBuf->diffKeyCount >= chunkSize)
	{
		//flush
		char mode = EXTERNAL_SORT;
		outBuf->keySize -= rec->allKeySize;
		outBuf->valSize -= rec->allValSize;
		outBuf->indexSize -= rec->valCount*sizeof(int4);
		outBuf->rangeSize -= sizeof(int2);
		outBuf->recCount -= rec->valCount;

		WriteChunkToFile(outBuf, file, &totalRecCount, mode);

		//adjust offset
		perRecSizeOffset = make_int4(rec->allKeySize,
			rec->allValSize, rec->valCount*sizeof(int4), sizeof(int2));
		perChunkSizeOffset.x += outBuf->keySize;
		perChunkSizeOffset.y += outBuf->valSize;

		curOffset += outBuf->recCount;
		recOffset = outBuf->keyListRange[outBuf->diffKeyCount-1].x;
		preIndex = outBuf->index[0];
		
		//adjust chunk
		BenMemcpy(outBuf->keys, rec->key, rec->allKeySize);
		BenMemcpy(outBuf->vals, rec->val, rec->allValSize);
		BenMemcpy(outBuf->index, rec->index, rec->valCount*sizeof(int4));
		
		outBuf->recCount = rec->valCount;
		outBuf->keySize = rec->allKeySize;
		outBuf->valSize = rec->allValSize;
		outBuf->indexSize = rec->valCount*sizeof(int4);
		outBuf->rangeSize = sizeof(int2);
		outBuf->diffKeyCount = 1;
		outBuf->keyListRange[0].x = recOffset;
		recOffset += rec->valCount;
	}
}

//------------------------------------------------------------
//the last flush of sort chunk
//------------------------------------------------------------
static void FlushSortChunk(ChunkInfo_t *chunk, FileName_t *file)
{
	BEN_ASSERT(chunk != NULL);
	BEN_ASSERT(file != NULL);

	char mode = EXTERNAL_SORT;
	chunk->keyListRange[chunk->diffKeyCount-1].y = recOffset;
	WriteChunkToFile(chunk, file, &totalRecCount, mode);
	totalGroupCount ++;

	BenFree((char**)&chunk->keys, outputSize.x);
	BenFree((char**)&chunk->vals, outputSize.y);
	BenFree((char**)&chunk->index, outputSize.z);
	BenFree((char**)&chunk->keyListRange, outputSize.w);
}

void MergeSortFile(FileName_t *file, 
				   FileName_t *tmpfile,
				   SortInfo_t *sortInfo, 
				   size_t chunkRecCount,
				   size_t *totalOutputRecCount,
				   size_t *totalOutputDiffKeyCount)
{
	//EnterFunc("MergeSortFile");

	BEN_ASSERT(file != NULL);
	BEN_ASSERT(sortInfo != NULL);
	BEN_ASSERT(chunkRecCount > 0);

	SortChunk_t *smallChunks = 
		(SortChunk_t*)BenMalloc
		(sizeof(SortChunk_t)*sortInfo->realChunkCount);
	char *bigChunkBitmap = (char*)BenMalloc(sortInfo->realChunkCount);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕亚洲在| 久久99国产精品麻豆| 中文字幕av不卡| 久久影院视频免费| 日韩欧美在线网站| 日韩欧美中文字幕制服| 欧美一级视频精品观看| 欧美精品自拍偷拍| 欧美男人的天堂一二区| 在线播放/欧美激情| 欧美日韩国产一级二级| 欧美日韩高清影院| 欧美一级午夜免费电影| 欧美成人女星排名| 精品久久99ma| 国产农村妇女精品| 99精品视频一区二区| 三级在线观看一区二区| 日本欧美一区二区三区乱码| 日韩vs国产vs欧美| 国内精品伊人久久久久av一坑| 国产成人av电影在线| 成人黄色国产精品网站大全在线免费观看 | 欧美电影一区二区三区| 欧美日本在线视频| 日韩精品一区二区三区中文精品| 欧美成人猛片aaaaaaa| 国产亚洲一本大道中文在线| 国产精品视频免费看| 亚洲精品老司机| 亚洲成人先锋电影| 国产一区二区三区高清播放| 成人午夜短视频| 欧美在线免费视屏| 日韩午夜在线影院| 国产日产亚洲精品系列| 一卡二卡三卡日韩欧美| 日本一道高清亚洲日美韩| 国产在线观看免费一区| 99re热视频精品| 在线综合+亚洲+欧美中文字幕| 久久久久久久久岛国免费| 亚洲免费观看高清完整| 日本vs亚洲vs韩国一区三区二区 | 欧美欧美午夜aⅴ在线观看| 日韩色在线观看| 日本一二三四高清不卡| 亚洲国产视频在线| 精品一区二区三区欧美| 色综合天天性综合| 精品少妇一区二区三区在线播放| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 91丨九色丨国产丨porny| 精品视频在线看| 日本一区免费视频| 亚洲国产成人av网| 成人免费视频app| 欧美日韩一区二区三区视频| 国产三级精品三级| 亚洲成人中文在线| 国产91精品久久久久久久网曝门 | 欧美一区二区人人喊爽| 中文在线一区二区| 日韩主播视频在线| 91丨九色丨蝌蚪丨老版| 精品国产一区二区三区四区四| 亚洲伦理在线免费看| 久久99精品国产91久久来源 | 亚洲日本va午夜在线电影| 免费在线观看成人| 色婷婷久久久综合中文字幕| 精品国产一区二区三区忘忧草 | 免费在线一区观看| 色狠狠色噜噜噜综合网| 日韩午夜在线观看视频| 亚洲国产视频在线| 波多野结衣一区二区三区| 精品国产乱码久久久久久图片| 亚洲国产精品麻豆| 波多野结衣精品在线| 精品国产99国产精品| 五月天欧美精品| 欧美综合天天夜夜久久| 国产精品免费久久| 狠狠色伊人亚洲综合成人| 欧美日韩在线播放| 亚洲日本va午夜在线影院| 国产91丝袜在线观看| 久久久午夜精品理论片中文字幕| 日本午夜精品一区二区三区电影| 91久久免费观看| 中文字幕综合网| 不卡av在线免费观看| 国产网红主播福利一区二区| 精品在线观看免费| 宅男在线国产精品| 日本特黄久久久高潮| 欧美老女人在线| 香蕉加勒比综合久久| 欧美性色黄大片| 亚洲第一在线综合网站| 欧美日韩一区二区三区在线| 亚洲一区在线观看免费 | 337p粉嫩大胆噜噜噜噜噜91av | 天天综合天天综合色| 欧美亚男人的天堂| 亚洲午夜激情av| 欧美日韩国产精品自在自线| 亚洲综合免费观看高清完整版 | 国产成人精品三级| 国产欧美精品一区| 成人av影院在线| 国产精品欧美久久久久无广告| 国产91精品免费| 亚洲欧美日韩综合aⅴ视频| 色94色欧美sute亚洲线路一久 | 国产91精品欧美| 最新不卡av在线| 欧洲国内综合视频| 亚洲国产精品久久人人爱| 91精品国产乱| 国产一区二区三区在线观看免费| www一区二区| 成人免费视频免费观看| 亚洲精品久久嫩草网站秘色| 欧美日韩国产一级片| 青草国产精品久久久久久| 精品剧情在线观看| 成人精品一区二区三区中文字幕| 亚洲黄色片在线观看| 欧美美女一区二区在线观看| 久久精品国产99久久6| 欧美激情一区二区| 久久免费看少妇高潮| 国产精品91一区二区| 一区在线观看视频| 欧美精品vⅰdeose4hd| 久久草av在线| 国产欧美视频一区二区| 91麻豆成人久久精品二区三区| 亚洲午夜精品久久久久久久久| 日韩欧美中文一区| 国产成人精品影院| 亚洲电影你懂得| 26uuu精品一区二区三区四区在线| 成人一区二区视频| 亚洲成人午夜电影| 久久久久久久综合色一本| 色综合久久综合中文综合网| 视频在线观看国产精品| 国产三级欧美三级| 在线观看三级视频欧美| 捆绑调教一区二区三区| 国产精品麻豆一区二区| 欧美日韩精品一区二区三区| 国产一区不卡在线| 亚洲h动漫在线| 国产精品色哟哟| 欧美乱妇23p| 成人av免费在线观看| 日韩成人一级大片| 日韩一区中文字幕| 日韩一级片网址| 欧美综合久久久| 国产精品一区二区不卡| 午夜精品福利一区二区三区av| 久久美女艺术照精彩视频福利播放| 色婷婷久久久久swag精品| 国产曰批免费观看久久久| 亚洲一区二区三区四区的| 国产午夜精品在线观看| 日韩一级完整毛片| 91久久奴性调教| 国产成人精品网址| 美女精品自拍一二三四| 亚洲激情中文1区| 国产午夜亚洲精品理论片色戒| 这里只有精品电影| 在线观看精品一区| 成人激情免费视频| 国产综合久久久久久久久久久久| 一区二区三区免费网站| 中文字幕av一区二区三区免费看| 日韩你懂的在线播放| 欧美三级一区二区| 色综合久久中文字幕综合网| 国产一区二区三区四区五区入口| 亚洲成av人在线观看| 亚洲女爱视频在线| 中文字幕一区二区三区四区| 日韩精品在线一区| 91麻豆精品国产91久久久| 欧美做爰猛烈大尺度电影无法无天| 成人深夜福利app| 久久99这里只有精品| 秋霞国产午夜精品免费视频| 亚洲香蕉伊在人在线观| 伊人一区二区三区| 亚洲女与黑人做爰| 亚洲欧美日本韩国|