[edk2-devel] [PATCH V2] UefiCpuPkg/CpuFeature: reduce time complexty to calc CpuInfo.First

Zeng, Star star.zeng at intel.com
Mon Dec 14 03:18:07 UTC 2020


Reviewed-by: Star Zeng <star.zeng at intel.com>

-----Original Message-----
From: Dong, Eric <eric.dong at intel.com> 
Sent: Monday, December 14, 2020 8:41 AM
To: Ni, Ray <ray.ni at intel.com>; devel at edk2.groups.io
Cc: Zeng, Star <star.zeng at intel.com>; Lou, Yun <yun.lou at intel.com>; Laszlo Ersek <lersek at redhat.com>
Subject: RE: [PATCH V2] UefiCpuPkg/CpuFeature: reduce time complexty to calc CpuInfo.First

Reviewed-by: Eric Dong <eric.dong at intel.com>

-----Original Message-----
From: Ni, Ray <ray.ni at intel.com> 
Sent: Friday, December 11, 2020 6:48 PM
To: devel at edk2.groups.io
Cc: Dong, Eric <eric.dong at intel.com>; Zeng, Star <star.zeng at intel.com>; Lou, Yun <yun.lou at intel.com>; Laszlo Ersek <lersek at redhat.com>
Subject: [PATCH V2] UefiCpuPkg/CpuFeature: reduce time complexty to calc CpuInfo.First

CpuInfo.First stores whether the current thread belongs to the first package in the platform, first core in a package, first thread in a core.

But the time complexity of original algorithm to calculate the CpuInfo.First is O (n) * O (p) * O (c).
  n: number of processors
  p: number of packages
  c: number of cores per package

The patch trades time with space by storing the first package, first core per package, first thread per core in an array.
The time complexity becomes O (n).

Signed-off-by: Ray Ni <ray.ni at intel.com>
Cc: Eric Dong <eric.dong at intel.com>
Cc: Star Zeng <star.zeng at intel.com>
Cc: Yun Lou <yun.lou at intel.com>
Cc: Laszlo Ersek <lersek at redhat.com>
---
 .../CpuFeaturesInitialize.c                   | 96 +++++++++----------
 1 file changed, 47 insertions(+), 49 deletions(-)

diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
index d4a576385f..a1e972b1a2 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
@@ -105,7 +105,10 @@ CpuInitDataInitialize (
   EFI_CPU_PHYSICAL_LOCATION            *Location;   UINT32                               PackageIndex;   UINT32                               CoreIndex;-  UINT32                               First;+  UINTN                                Pages;+  UINT32                               FirstPackage;+  UINT32                               *FirstCore;+  UINT32                               *FirstThread;   ACPI_CPU_DATA                        *AcpiCpuData;   CPU_STATUS_INFORMATION               *CpuStatus;   UINT32                               *ThreadCountPerPackage;@@ -236,74 +239,69 @@ CpuInitDataInitialize (
    //   // Initialize CpuFeaturesData->InitOrder[].CpuInfo.First+  // Use AllocatePages () instead of AllocatePool () because pool cannot be freed in PEI phase but page can.   //+  Pages     = EFI_SIZE_TO_PAGES (CpuStatus->PackageCount * sizeof (UINT32) + CpuStatus->PackageCount * CpuStatus->MaxCoreCount * sizeof (UINT32));+  FirstCore = AllocatePages (Pages);+  ASSERT (FirstCore != NULL);+  FirstThread  = FirstCore + CpuStatus->PackageCount;    //-  // Set First.Package for each thread belonging to the first package.+  // Set FirstPackage, FirstCore[], FirstThread[] to maximum package ID, core ID, thread ID.   //-  First = MAX_UINT32;+  FirstPackage = MAX_UINT32;+  SetMem32 (FirstCore,   CpuStatus->PackageCount * sizeof (UINT32), MAX_UINT32);+  SetMem32 (FirstThread, CpuStatus->PackageCount * CpuStatus->MaxCoreCount * sizeof (UINT32), MAX_UINT32);+   for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {     Location = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.ProcessorInfo.Location;-    First = MIN (Location->Package, First);++    //+    // Save the minimum package ID in the platform.+    //+    FirstPackage                 = MIN (Location->Package, FirstPackage);+  +    //+    // Save the minimum core ID per package.+    //+    FirstCore[Location->Package] = MIN (Location->Core, FirstCore[Location->Package]);+  +    //+    // Save the minimum thread ID per core.+    //+    FirstThread[Location->Package * CpuStatus->MaxCoreCount + Location->Core] = MIN (+      Location->Thread,+      FirstThread[Location->Package * CpuStatus->MaxCoreCount + Location->Core]+    );   }++  //+  // Update the First field.+  //   for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {     Location = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.ProcessorInfo.Location;-    if (Location->Package == First) {++    if (Location->Package == FirstPackage) {       CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.First.Package = 1;     }-  } -  //-  // Set First.Die/Tile/Module for each thread assuming:-  //  single Die under each package, single Tile under each Die, single Module under each Tile-  //-  for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {+    //+    // Set First.Die/Tile/Module for each thread assuming:+    //  single Die under each package, single Tile under each Die, single Module under each Tile+    //     CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.First.Die = 1;     CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.First.Tile = 1;     CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.First.Module = 1;-  } -  for (PackageIndex = 0; PackageIndex < CpuStatus->PackageCount; PackageIndex++) {-    //-    // Set First.Core for each thread in the first core of each package.-    //-    First = MAX_UINT32;-    for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {-      Location = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.ProcessorInfo.Location;-      if (Location->Package == PackageIndex) {-        First = MIN (Location->Core, First);-      }+    if (Location->Core == FirstCore[Location->Package]) {+      CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.First.Core = 1;     }--    for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {-      Location = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.ProcessorInfo.Location;-      if (Location->Package == PackageIndex && Location->Core == First) {-        CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.First.Core = 1;-      }+    if (Location->Thread == FirstThread[Location->Package * CpuStatus->MaxCoreCount + Location->Core]) {+      CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.First.Thread = 1;     }   } -  for (PackageIndex = 0; PackageIndex < CpuStatus->PackageCount; PackageIndex++) {-    for (CoreIndex = 0; CoreIndex < CpuStatus->MaxCoreCount; CoreIndex++) {-      //-      // Set First.Thread for the first thread of each core.-      //-      First = MAX_UINT32;-      for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {-        Location = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.ProcessorInfo.Location;-        if (Location->Package == PackageIndex && Location->Core == CoreIndex) {-          First = MIN (Location->Thread, First);-        }-      }--      for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {-        Location = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.ProcessorInfo.Location;-        if (Location->Package == PackageIndex && Location->Core == CoreIndex && Location->Thread == First) {-          CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.First.Thread = 1;-        }-      }-    }-  }+  FreePages (FirstCore, Pages); }  /**-- 
2.27.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#68757): https://edk2.groups.io/g/devel/message/68757
Mute This Topic: https://groups.io/mt/78876501/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list