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

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

?? marssort.cu

?? GPU實現的MapReduce framework,對于學習并行編程和cuda平臺的編程方面有著極好的參考價值
?? CU
?? 第 1 頁 / 共 4 頁
字號:
	size_t chunkSize = chunkRecCount / (sortInfo->realChunkCount+1);
	size_t *recOffsets = (size_t*)BenMalloc(sizeof(size_t)*sortInfo->realChunkCount);

	size_t totalKeyCount = 0;

	for (int i = 0; i < sortInfo->realChunkCount; i++)
	{
		//initialize small chunk
		GetSmallSortChunk(file, smallChunks, sortInfo->chunks, 
			chunkSize, bigChunkBitmap, i, recOffsets);
		totalKeyCount += sortInfo->chunks[i].diffKeyCount;
	}

	ChunkInfo_t *outputChunk = (ChunkInfo_t*)BenMalloc(sizeof(ChunkInfo_t));

	SortRec_t *minRec = (SortRec_t*)BenMalloc(sizeof(SortRec_t));
	char flag = 0;
	size_t which = 0;
	size_t only_one = 0;
	size_t finishedCount = 0;

	size_t actualRecCount = 0;
	SortRec_t tmpRec;
	while (1)
	{		
		finishedCount = 0;
		for (int i = 0; i < sortInfo->realChunkCount; i++)
		{
			if (bigChunkBitmap[i] == 0) 
			{
				finishedCount++;
				continue;
			}
			else
			{
				only_one = i;

				//run out small chunk?
				if (smallChunks[i].smallCursor >= smallChunks[i].diffKeyCount)
				{
					BenFree((char**)&smallChunks[i].keys, smallChunks[i].keySize);
					BenFree((char**)&smallChunks[i].vals, smallChunks[i].valSize);
					BenFree((char**)&smallChunks[i].index, smallChunks[i].indexSize);
					BenFree((char**)&smallChunks[i].keyListRange, smallChunks[i].rangeSize);

					if(!GetSmallSortChunk(file, smallChunks, sortInfo->chunks, 
						chunkSize, bigChunkBitmap, i, recOffsets))
						continue;
					smallChunks[i].smallCursor = 0;
				}

				if (flag == 0)
				{
					GetSortRec(minRec, smallChunks, i, recOffsets);
					flag = 1;
					which = i;
					continue;
				}
 
				//fetch record from small chunk
				GetSortRec(&tmpRec, smallChunks, i, recOffsets);

				//compare
				if (cpu_compare(minRec->key, minRec->keySize,
					tmpRec.key, tmpRec.keySize) <= 0)
				{ 
					continue;
				}
				else
				{
					BenMemcpy(minRec, &tmpRec, sizeof(SortRec_t));
					which = i;
				}
			}//if -- else --

		}//for

		if (finishedCount != (sortInfo->realChunkCount-1))
		{
			smallChunks[which].smallCursor++;	
			flag = 0;
		}
		else
		{
			break;
		}

		actualRecCount++;
		BenLog("*****************%d in %d chunk, \n", *(int*)minRec->key, which);

		//output records
		OutputAndGroupRecs(outputChunk, tmpfile, minRec, chunkSize);
	}//while(1)

	BenLog("actualRecCount:%d,totalKeyCount:%d\n", actualRecCount, totalKeyCount);

	//reminder
	if (actualRecCount < totalKeyCount)
	{
		do
		{
			if (smallChunks[only_one].smallCursor >= 
				smallChunks[only_one].diffKeyCount)
			{
				if(!GetSmallSortChunk(file, smallChunks, sortInfo->chunks, 
					chunkSize, bigChunkBitmap, only_one, recOffsets))
					break;
				smallChunks[only_one].smallCursor = 0;
			}
			
			for (int i = smallChunks[only_one].smallCursor; 
				i < smallChunks[only_one].diffKeyCount;
				i++)
			{
				actualRecCount++;
				GetSortRec(&tmpRec, smallChunks, only_one, recOffsets);
				smallChunks[only_one].smallCursor++;
				BenLog("*****************%d in %d chunk, \n", *(int*)minRec->key, which);

				OutputAndGroupRecs(outputChunk, tmpfile, &tmpRec, chunkSize);
			}

			BenFree((char**)&smallChunks[only_one].keys, smallChunks[only_one].keySize);
			BenFree((char**)&smallChunks[only_one].vals, smallChunks[only_one].valSize);
			BenFree((char**)&smallChunks[only_one].index, smallChunks[only_one].indexSize);
			BenFree((char**)&smallChunks[only_one].keyListRange, smallChunks[only_one].rangeSize);
		} while(smallChunks[only_one].cursor < sortInfo->chunks[only_one].diffKeyCount);
	}//if (actualRecCount < totalKeyCount)

	BenLog("actualRecCount:%d,totalKeyCount:%d,groupOffset:%d,totalRecCount:%d\n", 
		actualRecCount, totalKeyCount, groupOffset, totalRecCount);	

	FlushSortChunk(outputChunk, tmpfile);
	
	*totalOutputRecCount = totalRecCount;
	*totalOutputDiffKeyCount = totalGroupCount;

	BenFree((char**)&recOffsets, sizeof(size_t)*sortInfo->realChunkCount);
	BenFree((char**)&minRec, sizeof(SortRec_t));

	BenFree((char**)&outputChunk, sizeof(ChunkInfo_t));

	BenFree((char**)&bigChunkBitmap, sortInfo->realChunkCount);
	BenFree((char**)&smallChunks, 
		sizeof(SortChunk_t)*sortInfo->realChunkCount);

	//LeaveFunc("MergeSortFile");
}

//==============================================================
//GPU sort
//==============================================================
#define NUM_BLOCK_PER_CHUNK_BITONIC_SORT 512//b256
#define SHARED_MEM_INT2 256
#define NUM_BLOCKS_CHUNK 512
#define	NUM_THREADS_CHUNK 256//(256)
#define CHUNK_SIZE (NUM_BLOCKS_CHUNK*NUM_THREADS_CHUNK)
#define NUM_CHUNKS_R (NUM_RECORDS_R/CHUNK_SIZE)

__device__ int getCompareValue(void *d_rawData, cmp_type_t value1, cmp_type_t value2)
{
	int compareValue=0;
	int v1=value1.x;
	int v2=value2.x;
	if((v1==-1) || (v2==-1))
	{
		if(v1==v2)
			compareValue=0;
		else
			if(v1==-1)
				compareValue=-1;
			else
				compareValue=1;
	}
	else
		compareValue=gpu_compare((void*)(((char*)d_rawData)+v1), value1.y, (void*)(((char*)d_rawData)+v2), value2.y); 

	return compareValue;
}

void * s_qsRawData=NULL;


__global__ void
partBitonicSortKernel( void* d_rawData, int totalLenInBytes,cmp_type_t* d_R, unsigned int numRecords, int chunkIdx, int unitSize)
{
	__shared__ cmp_type_t shared[NUM_THREADS_CHUNK];

	int tx = threadIdx.x;
	int bx = blockIdx.x;

	//load the data
	int dataIdx = chunkIdx*CHUNK_SIZE+bx*blockDim.x+tx;
	int unitIdx = ((NUM_BLOCKS_CHUNK*chunkIdx + bx)/unitSize)&1;
	shared[tx] = d_R[dataIdx];
	__syncthreads();
	int ixj=0;
	int a=0;
	cmp_type_t temp1;
	cmp_type_t temp2;
	int k = NUM_THREADS_CHUNK;

	if(unitIdx == 0)
	{
		for (int j = (k>>1); j>0; j =(j>>1))
		{
			ixj = tx ^ j;
			//a = (shared[tx].y - shared[ixj].y);				
			temp1=shared[tx];
			temp2= shared[ixj];
			if (ixj > tx) {
				//a=temp1.y-temp2.y;
				//a=compareString((void*)(((char4*)d_rawData)+temp1.x),(void*)(((char4*)d_rawData)+temp2.x)); 
				a=getCompareValue(d_rawData, temp1, temp2);
				if ((tx & k) == 0) {
					if ( (a>0)) {
						shared[tx]=temp2;
						shared[ixj]=temp1;
					}
				}
				else {
					if ( (a<0)) {
						shared[tx]=temp2;
						shared[ixj]=temp1;
					}
				}
			}
				
			__syncthreads();
		}
	}
	else
	{
		for (int j = (k>>1); j>0; j =(j>>1))
		{
			ixj = tx ^ j;
			temp1=shared[tx];
			temp2= shared[ixj];
			
			if (ixj > tx) {					
				//a=temp1.y-temp2.y;					
				//a=compareString((void*)(((char4*)d_rawData)+temp1.x),(void*)(((char4*)d_rawData)+temp2.x));
				a=getCompareValue(d_rawData, temp1, temp2);
				if ((tx & k) == 0) {
					if( (a<0))
					{
						shared[tx]=temp2;
						shared[ixj]=temp1;
					}
				}
				else {
					if( (a>0))
					{
						shared[tx]=temp2;
						shared[ixj]=temp1;
					}
				}
			}
			
			__syncthreads();
		}
	}

	d_R[dataIdx] = shared[tx];
}

__global__ void
unitBitonicSortKernel(void* d_rawData, int totalLenInBytes, cmp_type_t* d_R, unsigned int numRecords, int chunkIdx )
{
	__shared__ cmp_type_t shared[NUM_THREADS_CHUNK];

	int tx = threadIdx.x;
	int bx = blockIdx.x;
	int unitIdx = (NUM_BLOCKS_CHUNK*chunkIdx + bx)&1;

	//load the data
	int dataIdx = chunkIdx*CHUNK_SIZE+bx*blockDim.x+tx;
	shared[tx] = d_R[dataIdx];
	__syncthreads();

	cmp_type_t temp1;
	cmp_type_t temp2;
	int ixj=0;
	int a=0;
	if(unitIdx == 0)
	{
		for (int k = 2; k <= NUM_THREADS_CHUNK; (k =k<<1))
		{
			// bitonic merge:
			for (int j = (k>>1); j>0; (j=j>>1))
			{
				ixj = tx ^ j;	
				temp1=shared[tx];
				temp2= shared[ixj];
				if (ixj > tx) {					
					//a=temp1.y-temp2.y;
					//a=compareString((void*)(((char4*)d_rawData)+temp1.x),(void*)(((char4*)d_rawData)+temp2.x));
					a=getCompareValue(d_rawData, temp1, temp2);
					if ((tx & k) == 0) {
						if ( (a>0)) {
							shared[tx]=temp2;
							shared[ixj]=temp1;
						}
					}
					else {
						if ( (a<0)) {
							shared[tx]=temp2;
							shared[ixj]=temp1;
						}
					}
				}
				
				__syncthreads();
			}
		}
	}
	else
	{
		for (int k = 2; k <= NUM_THREADS_CHUNK; (k =k<<1))
		{
			// bitonic merge:
			for (int j = (k>>1); j>0; (j=j>>1))
			{
				ixj = tx ^ j;
				temp1=shared[tx];
				temp2= shared[ixj];
				if (ixj > tx) {					
					//a=temp1.y-temp2.y;
					//a=compareString((void*)(((char4*)d_rawData)+temp1.x),(void*)(((char4*)d_rawData)+temp2.x));
					a=getCompareValue(d_rawData, temp1, temp2);
					if ((tx & k) == 0) {
						if( (a<0))
						{
							shared[tx]=temp2;
							shared[ixj]=temp1;
						}
					}
					else {
						if( (a>0))
						{
							shared[tx]=temp2;
							shared[ixj]=temp1;
						}
					}
				}
				
				__syncthreads();
			}
		}

	}

	d_R[dataIdx] = shared[tx];
}

__global__ void
bitonicKernel( void* d_rawData, int totalLenInBytes, cmp_type_t* d_R, unsigned int numRecords, int k, int j)
{
	int bx = blockIdx.x;
	int by = blockIdx.y;
	int tid = threadIdx.x;
	int dataIdx = by*gridDim.x*blockDim.x + bx*blockDim.x + tid;

	int ixj = dataIdx^j;

	if( ixj > dataIdx )
	{
		cmp_type_t tmpR = d_R[dataIdx];
		cmp_type_t tmpIxj = d_R[ixj];
		if( (dataIdx&k) == 0 )
		{
			//if( tmpR.y > tmpIxj.y )
			//if(compareString((void*)(((char4*)d_rawData)+tmpR.x),(void*)(((char4*)d_rawData)+tmpIxj.x))==1) 
			if(getCompareValue(d_rawData, tmpR, tmpIxj)==1)
			{
				d_R[dataIdx] = tmpIxj;
				d_R[ixj] = tmpR;
			}
		}
		else
		{
			//if( tmpR.y < tmpIxj.y )
			//if(compareString((void*)(((char4*)d_rawData)+tmpR.x),(void*)(((char4*)d_rawData)+tmpIxj.x))==-1) 
			if(getCompareValue(d_rawData, tmpR, tmpIxj)==-1)
			{
				d_R[dataIdx] = tmpIxj;
				d_R[ixj] = tmpR;
			}
		}
	}
}

__device__ inline void swap(cmp_type_t & a, cmp_type_t & b)
{
	// Alternative swap doesn't use a temporary register:
	// a ^= b;
	// b ^= a;
	// a ^= b;
	
    cmp_type_t tmp = a;
    a = b;
    b = tmp;
}

__global__ void bitonicSortSingleBlock_kernel(void* d_rawData, int totalLenInBytes, cmp_type_t * d_values, int rLen, cmp_type_t* d_output)
{
	__shared__ cmp_type_t bs_cmpbuf[SHARED_MEM_INT2];
	

    //const int by = blockIdx.y;
	//const int bx = blockIdx.x;
	const int tx = threadIdx.x;
	const int ty = threadIdx.y;	
	const int tid=tx+ty*blockDim.x;
	//const int bid=bx+by*gridDim.x;
	//const int numThread=blockDim.x;
	//const int resultID=(bx)*numThread+tid;
	
	if(tid<rLen)
	{
		bs_cmpbuf[tid] = d_values[tid];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美韩日一区二区三区四区| 麻豆成人久久精品二区三区红 | 日韩欧美黄色影院| 国产视频一区二区在线观看| 亚洲一区二区三区爽爽爽爽爽 | 亚洲国产精品国自产拍av| 亚洲制服丝袜一区| 成人一级片在线观看| 欧美一区二区三区在线观看| 亚洲视频免费看| 国产精品亚洲а∨天堂免在线| 欧美日韩一区三区四区| 成人免费一区二区三区在线观看| 久久99热这里只有精品| 欧美性猛交xxxxxx富婆| 亚洲欧洲精品一区二区三区| 国产精品自拍毛片| 精品免费一区二区三区| 肉色丝袜一区二区| 欧美性极品少妇| 亚洲综合男人的天堂| 在线看日韩精品电影| ㊣最新国产の精品bt伙计久久| 国产精品一线二线三线| 精品国产精品一区二区夜夜嗨| 亚洲成精国产精品女| 欧美午夜一区二区三区免费大片| 亚洲图片你懂的| 91天堂素人约啪| 亚洲欧美色综合| 日本乱码高清不卡字幕| 亚洲码国产岛国毛片在线| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 中文在线免费一区三区高中清不卡| 久草精品在线观看| 久久亚洲综合色一区二区三区 | 欧美mv和日韩mv国产网站| 日韩高清不卡一区二区| 欧美一卡2卡三卡4卡5免费| 毛片av一区二区| 久久久精品黄色| 国产白丝精品91爽爽久久 | 99久久精品免费观看| 国产精品国产三级国产aⅴ原创 | 国产一区二区三区久久久| 久久亚洲综合av| 91亚洲大成网污www| 亚洲精品久久久久久国产精华液| 欧美日韩激情一区二区三区| 首页综合国产亚洲丝袜| 欧美成人a视频| 国产精一品亚洲二区在线视频| 国产婷婷色一区二区三区在线| 懂色一区二区三区免费观看| 亚洲激情网站免费观看| 欧美一级欧美一级在线播放| 国产精品资源站在线| 亚洲免费观看高清| 欧美一级片在线观看| 国产福利电影一区二区三区| 尤物av一区二区| 欧美一区二区三区啪啪| 国产.欧美.日韩| 午夜视频一区二区| 国产日韩欧美制服另类| 一本色道久久加勒比精品| 日本va欧美va精品发布| 中文字幕免费不卡| 制服丝袜日韩国产| av一区二区三区黑人| 蜜臀久久99精品久久久久宅男| 国产欧美一区二区精品性色| 精品视频色一区| 成人激情免费视频| 麻豆成人在线观看| 亚洲自拍欧美精品| 国产精品视频九色porn| 欧美一级一区二区| 色av一区二区| 国产成人欧美日韩在线电影| 天天av天天翘天天综合网 | 91麻豆精品视频| 久久精品99国产精品| 亚洲乱码国产乱码精品精的特点| 欧美精品一区二区久久婷婷| 一本色道久久综合亚洲91| 国产大陆亚洲精品国产| 美女在线观看视频一区二区| 亚洲精品成人天堂一二三| 国产日韩精品一区二区三区| 日韩一区二区三区av| 欧美在线免费播放| 91丨porny丨国产入口| 国产超碰在线一区| 国产一区二区三区香蕉| 日本女人一区二区三区| 亚洲午夜三级在线| 亚洲欧美韩国综合色| 欧美国产视频在线| 久久久亚洲综合| 精品免费视频一区二区| 日韩区在线观看| 日韩一二三区视频| 欧美日韩一区中文字幕| 欧美色综合久久| 欧亚洲嫩模精品一区三区| 91免费看`日韩一区二区| 成人手机在线视频| 国产成人丝袜美腿| 国产不卡一区视频| 成人午夜av电影| 成人午夜短视频| 91亚洲资源网| 日本黄色一区二区| 在线观看免费亚洲| 欧美日韩免费不卡视频一区二区三区 | 国产婷婷一区二区| 日本一二三四高清不卡| 国产精品久久看| 国产精品国产精品国产专区不蜜| 国产精品理论片| 一区二区三区小说| 一级中文字幕一区二区| 亚洲成av人综合在线观看| 婷婷国产在线综合| 日本aⅴ免费视频一区二区三区 | 亚洲成人高清在线| 香蕉av福利精品导航| 免费在线观看一区| 久久99精品久久久| 成人国产精品免费观看动漫 | 亚洲综合一二三区| 午夜精品视频一区| 国产一区久久久| av不卡免费在线观看| 欧美三级电影一区| 制服丝袜国产精品| 中文字幕乱码一区二区免费| 亚洲综合在线电影| 日本中文一区二区三区| 丁香激情综合国产| 欧美唯美清纯偷拍| 欧美成人三级在线| 亚洲品质自拍视频| 蜜桃精品视频在线观看| 成人18精品视频| 欧美一区二区三区白人| 中文成人av在线| 亚洲bt欧美bt精品777| 国产一区欧美二区| 在线观看日韩一区| 久久人人爽人人爽| 亚洲国产综合在线| 国产99精品国产| 91精品国产色综合久久久蜜香臀| 亚洲国产精品t66y| 污片在线观看一区二区| 成人h版在线观看| 欧美一区二区网站| 亚洲精品美腿丝袜| 国产精品白丝jk黑袜喷水| 日本乱码高清不卡字幕| 欧美精品一区二区三区一线天视频 | 91麻豆swag| 久久久精品国产免费观看同学| 亚洲国产成人精品视频| 成人av免费在线| 欧美tickling挠脚心丨vk| 亚洲无人区一区| av一本久道久久综合久久鬼色| 日韩欧美你懂的| 五月天精品一区二区三区| www.久久久久久久久| 欧美精品一区二区不卡| 日本美女一区二区| 在线精品亚洲一区二区不卡| 国产精品少妇自拍| 国产一区二区三区四| 欧美变态tickling挠脚心| 亚洲成人av一区| 欧美午夜视频网站| 一区二区三区在线免费播放| 成人美女在线视频| 久久久久久97三级| 国模无码大尺度一区二区三区| 在线不卡中文字幕播放| 亚洲精品高清在线| av成人老司机| 自拍偷拍欧美激情| 成人爽a毛片一区二区免费| 国产午夜亚洲精品羞羞网站| 国产一区二区三区在线看麻豆| 欧美大片日本大片免费观看| 蜜桃一区二区三区四区| 欧美一区二区在线看| 看电视剧不卡顿的网站| 欧美一区二视频| 久久精品国产77777蜜臀| 欧美成人a∨高清免费观看| 精品一区二区三区视频|