background image

Vol. 3A 8-45

MULTIPLE-PROCESSOR MANAGEMENT

For (ProcessorNum = 1; ProcessorNum < NumStartedLPs; ProcessorNum++) { 

ProcessorMask << = 1; 
For (i=0; i < PackageNum; i++) {

// we may be comparing bit-fields of logical processors residing in different
// packages, the code below assume package symmetry
If (PackageID[ProcessorNum] = PackageIDBucket[i]) {

PackageProcessorMask[i] |= ProcessorMask;
Break; // found in existing bucket, skip to next iteration

}

}
if (i =PackageNum) {

//PACKAGE_ID did not match any bucket, start new bucket
PackageIDBucket[i] = PackageID[ProcessorNum];
PackageProcessorMask[i] = ProcessorMask;
PackageNum++;

}

}
// PackageNum has the number of Packages started in OS
// PackageProcessorMask[] array has the processor set of each package

c) Using the list of CORE_ID to count the number of cores in a MP system and construct, for each core, a multi-bit mask corresponding 

to those logical processors residing in the same core. 

Processors in the same core can be determined by bucketing the processors with the same PACKAGE_ID and CORE_ID. Note that code 

below can BIT OR the values of PACKGE and CORE ID because they have not been shifted right.
The algorithm below assumes there is symmetry across package boundary if more than one socket is populated in an MP system.

//Bucketing PACKAGE and CORE IDs and computing processor mask for every core

CoreNum = 1;
CoreIDBucket[0] = PackageID[0] | CoreID[0];
ProcessorMask = 1;
CoreProcessorMask[0] = ProcessorMask;
For (ProcessorNum = 1; ProcessorNum < NumStartedLPs; ProcessorNum++) { 

ProcessorMask << = 1; 
For (i=0; i < CoreNum; i++) {

// we may be comparing bit-fields of logical processors residing in different
// packages, the code below assume package symmetry
If ((PackageID[ProcessorNum] | CoreID[ProcessorNum]) = CoreIDBucket[i]) {

CoreProcessorMask[i] |= ProcessorMask;
Break; // found in existing bucket, skip to next iteration

}

}
if (i = CoreNum) {

//Did not match any bucket, start new bucket
CoreIDBucket[i] = PackageID[ProcessorNum] | CoreID[ProcessorNum];
CoreProcessorMask[i] = ProcessorMask;
CoreNum++;

}

}
// CoreNum has the number of cores started in the OS
// CoreProcessorMask[] array has the processor set of each core

Other processor relationships such as processor mask of sibling cores can be computed from set operations of the 
PackageProcessorMask[] and CoreProcessorMask[].