Как объединить эти два кода?
Код | // Function for parallel Shell sorting void ParallelShellSort(double* pData, int Size) { InitializeParallelSections(); int* Index = new int [2*ThreadNum]; int* BlockSize = new int [2*ThreadNum]; int * BlockPairs = new int [2*ThreadNum]; for (int i=0; i<2*ThreadNum; i++) { Index[i] = int((i*Size)/double(2*ThreadNum)); if (i<2*ThreadNum-1) BlockSize[i] = int (((i+1)*Size)/double(2*ThreadNum)) - Index[i]; else BlockSize[i] = Size-Index[i]; } // Local sorting of data blocks (reverse cycle scheme) #pragma omp parallel { int BlockID = ReverseGrayCode(ThreadNum+ThreadID, DimSize); QuickSorter(pData, Index[BlockID], Index[BlockID]+BlockSize[BlockID]-1); BlockID = ReverseGrayCode(ThreadID, DimSize); QuickSorter(pData, Index[BlockID], Index[BlockID]+BlockSize[BlockID]-1); } // Iterations of the Shell method for (int Iter=0; (Iter<DimSize) && (!IsSorted(pData, Size)); Iter++) { // Block pairs determination SetBlockPairs(BlockPairs, Iter); // ”Compare-split” operation for data blocks #pragma omp parallel { int MyPairNum = FindMyPair(BlockPairs, ThreadID, Iter); int FirstBlock = ReverseGrayCode(BlockPairs[2*MyPairNum], DimSize); int SecondBlock = ReverseGrayCode(BlockPairs[2*MyPairNum+1], DimSize); CompareSplitBlocks(pData, Index[FirstBlock], BlockSize[FirstBlock], Index[SecondBlock], BlockSize[SecondBlock]); } // pragma omp parallel } // for // Odd-even blocks’ transposition int Iter = 1; while (!IsSorted(pData, Size)) { #pragma omp parallel { if (Iter%2 == 0) // Even iteration MergeBlocks(pData, Index[2*ThreadID], BlockSize[2*ThreadID], Index[2*ThreadID+1], BlockSize[2*ThreadID+1]); else // Odd iteration if (ThreadID<ThreadNum-1) MergeBlocks(pData, Index[2*ThreadID+1], BlockSize[2*ThreadID+1], Index[2*ThreadID+2], BlockSize[2*ThreadID+2]); } // pragma omp parallel Iter++; 22 } // while delete [] Index; delete [] BlockSize; delete [] BlockPairs; }
|
|