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

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

?? marssort.cu

?? GPU實現(xiàn)的MapReduce framework,對于學(xué)習(xí)并行編程和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];

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产网红主播福利一区二区| 午夜不卡在线视频| 国产三级精品视频| 精品国产电影一区二区| 日韩欧美在线网站| 精品少妇一区二区三区在线视频| 欧美精品自拍偷拍动漫精品| 欧美日韩高清一区二区不卡| 91精品国产欧美一区二区| 欧美一区二区三区小说| 日韩精品一区二区三区视频播放| 欧美大黄免费观看| 久久综合色一综合色88| 久久九九99视频| 国产精品美女久久久久久久 | 日韩色视频在线观看| 日韩欧美国产一区在线观看| 久久亚洲影视婷婷| 国产欧美日韩不卡免费| 亚洲国产高清aⅴ视频| 国产精品亲子伦对白| 亚洲视频中文字幕| 亚洲午夜激情av| 美女被吸乳得到大胸91| 国产精品一区久久久久| 91麻豆6部合集magnet| 欧美日韩免费一区二区三区视频| 日韩欧美亚洲国产另类| 国产偷国产偷精品高清尤物| 国产精品成人一区二区三区夜夜夜| 亚洲免费观看高清| 日韩av高清在线观看| 国产寡妇亲子伦一区二区| 色94色欧美sute亚洲13| 日韩欧美电影一区| 国产精品欧美一区喷水| 五月天欧美精品| 国产99久久久精品| 欧美特级限制片免费在线观看| 91精品久久久久久久99蜜桃| 国产三级精品视频| 亚洲福利国产精品| 国产成人精品www牛牛影视| 日本久久一区二区| www一区二区| 亚洲线精品一区二区三区八戒| 麻豆国产欧美日韩综合精品二区| 国产v综合v亚洲欧| 欧美肥妇bbw| 中文字幕在线视频一区| 日产精品久久久久久久性色| 成人av资源下载| 欧美大肚乱孕交hd孕妇| 一区二区三区在线免费| 韩国成人在线视频| 欧美亚一区二区| 国产精品美女久久久久久久久| 日韩成人免费电影| 91尤物视频在线观看| 精品少妇一区二区三区日产乱码| 亚洲免费伊人电影| 国产精品正在播放| 7777女厕盗摄久久久| 亚洲欧美日韩中文播放 | 久久福利视频一区二区| 97久久人人超碰| 久久你懂得1024| 蜜桃视频一区二区三区在线观看 | 久久精品视频免费| 日本视频一区二区| 色爱区综合激月婷婷| 日本一区二区三区四区| 美女尤物国产一区| 欧美性受极品xxxx喷水| 亚洲欧美日韩中文字幕一区二区三区| 久久精品999| 91精选在线观看| 亚洲午夜在线观看视频在线| 不卡av在线免费观看| 久久五月婷婷丁香社区| 天天色综合天天| 在线这里只有精品| 亚洲女女做受ⅹxx高潮| 成人黄色免费短视频| xfplay精品久久| 精品一区二区免费视频| 91麻豆精品国产91久久久久 | 成人在线综合网| 精品久久久久av影院| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产清纯白嫩初高生在线观看91 | 久久亚洲精精品中文字幕早川悠里| 香蕉成人啪国产精品视频综合网| 色婷婷综合五月| 亚洲欧美日韩系列| jlzzjlzz亚洲日本少妇| 欧美激情一区不卡| 国产激情精品久久久第一区二区| 精品国产一区二区三区四区四| 青青草国产成人99久久| 欧美一级午夜免费电影| 欧美aⅴ一区二区三区视频| 91精品国产综合久久香蕉麻豆| 性久久久久久久久| 欧美老女人第四色| 偷拍亚洲欧洲综合| 555www色欧美视频| 蜜臀久久久久久久| 欧美刺激脚交jootjob| 久久成人麻豆午夜电影| 日韩欧美一级在线播放| 精品一区二区影视| 国产亚洲精品超碰| aa级大片欧美| 一区二区在线免费观看| 精品视频在线免费看| 日本aⅴ精品一区二区三区| 日韩欧美国产三级电影视频| 黄一区二区三区| 欧美经典一区二区三区| 北条麻妃国产九九精品视频| 亚洲日本护士毛茸茸| 欧美性猛交xxxxxx富婆| 性久久久久久久久| 欧美精品一区二区三区四区| 国产毛片精品一区| 国产精品久久久久久久久免费桃花 | 91精品午夜视频| 国产一区二区看久久| 国产精品网站在线播放| 91麻豆蜜桃一区二区三区| 亚洲综合清纯丝袜自拍| 欧美三级三级三级爽爽爽| 日产精品久久久久久久性色| 久久久国产精品不卡| 色综合天天狠狠| 日韩1区2区日韩1区2区| 日本一区二区高清| 欧洲一区二区三区免费视频| 精品一区二区三区av| 1024成人网色www| 欧美一区二区精美| 成人av手机在线观看| 午夜精品久久久久影视| 精品国产电影一区二区| 色先锋资源久久综合| 久久国产精品免费| 亚洲男人的天堂网| 久久日韩粉嫩一区二区三区| 在线观看成人免费视频| 精品亚洲免费视频| 一区二区三区高清不卡| 337p粉嫩大胆噜噜噜噜噜91av| 99视频一区二区| 久久99精品一区二区三区| 亚洲美女电影在线| 久久综合色8888| 欧美影片第一页| 成人一级视频在线观看| 香蕉av福利精品导航| 国产精品免费视频网站| 欧美一区二区三区四区视频| bt7086福利一区国产| 麻豆精品视频在线观看视频| 一区二区激情小说| 欧美国产乱子伦| 日韩一区二区免费在线电影| 色婷婷精品久久二区二区蜜臂av| 国产在线不卡一卡二卡三卡四卡| 亚洲综合久久久久| 国产精品系列在线| 欧美一区日韩一区| 色婷婷av一区二区| 国产成人自拍高清视频在线免费播放| 天堂蜜桃一区二区三区 | 91麻豆123| 国产成人鲁色资源国产91色综 | 久草在线在线精品观看| 一区av在线播放| 中文字幕中文字幕在线一区 | 午夜精品久久久久久久99樱桃| 国产日产欧美一区二区三区| 7777精品久久久大香线蕉 | 亚洲国产高清在线| 久久色在线观看| 日韩欧美一二三区| 91精品蜜臀在线一区尤物| 91传媒视频在线播放| 97aⅴ精品视频一二三区| 国产福利精品导航| 国产乱码精品一品二品| 激情另类小说区图片区视频区| 日本欧美久久久久免费播放网| 亚洲妇女屁股眼交7| 亚洲国产美国国产综合一区二区| 亚洲欧美综合色| 最新高清无码专区| 亚洲视频资源在线| 亚洲欧美一区二区三区久本道91| 国产精品人妖ts系列视频|