From patchwork Mon May 18 10:12:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sexton, Rory" X-Patchwork-Id: 70373 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 570FDA0093; Mon, 18 May 2020 12:33:51 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D3EEB1D40D; Mon, 18 May 2020 12:33:50 +0200 (CEST) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id 76DEC1D40B for ; Mon, 18 May 2020 12:33:48 +0200 (CEST) IronPort-SDR: qcVqXCOcESR1HgOMvSyaDPXKQ4Uo++zkBcObgQEd9wUDiWfT9jucaagya7FznyDezmmfUmtQk4 h/fbN8MCyrRQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 May 2020 03:33:45 -0700 IronPort-SDR: kT2T6IExmQjwwwwHBf3oFNPpXT/saN8Ayy5dkfSLe6PKZLNoAme+XcsM3Dp00PjyBGkoOYgwlK +lXJ3qhZvQJw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,406,1583222400"; d="scan'208";a="267473877" Received: from silpixa00399913.ir.intel.com (HELO silpixa00399913.ger.corp.intel.com) ([10.237.222.230]) by orsmga006.jf.intel.com with ESMTP; 18 May 2020 03:33:45 -0700 From: "Sexton, Rory" To: dev@dpdk.org, david.hunt@intel.com Cc: "Sexton, Rory" Date: Mon, 18 May 2020 11:12:09 +0100 Message-Id: <20200518101211.26025-1-rory.sexton@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [dpdk-dev] [PATCH v1 1/3] examples/vm_power_manager: Make branch ratio threshold per core X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This modification allows for the branch ratio threshold to be set per core rather than system wide. This gives greater flexibility to the branch ration monitoring allowing it to manage different workloads with different characteristics on the same system. --- examples/vm_power_manager/main.c | 40 +++++++++++--------- examples/vm_power_manager/oob_monitor_x86.c | 2 +- examples/vm_power_manager/parse.c | 42 ++++++++++++++++++++- examples/vm_power_manager/parse.h | 3 ++ examples/vm_power_manager/power_manager.c | 2 +- examples/vm_power_manager/power_manager.h | 2 +- 6 files changed, 68 insertions(+), 23 deletions(-) diff --git a/examples/vm_power_manager/main.c b/examples/vm_power_manager/main.c index 273bfec29..f077e3fe4 100644 --- a/examples/vm_power_manager/main.c +++ b/examples/vm_power_manager/main.c @@ -165,15 +165,14 @@ parse_args(int argc, char **argv) static struct option lgopts[] = { { "mac-updating", no_argument, 0, 1}, { "no-mac-updating", no_argument, 0, 0}, - { "core-list", optional_argument, 0, 'l'}, + { "core-branch-ratio", optional_argument, 0, 'b'}, { "port-list", optional_argument, 0, 'p'}, - { "branch-ratio", optional_argument, 0, 'b'}, {NULL, 0, 0, 0} }; argvopt = argv; ci = get_core_info(); - while ((opt = getopt_long(argc, argvopt, "l:p:q:T:b:", + while ((opt = getopt_long(argc, argvopt, "p:q:T:b:", lgopts, &option_index)) != EOF) { switch (opt) { @@ -185,7 +184,8 @@ parse_args(int argc, char **argv) return -1; } break; - case 'l': + case 'b': + branch_ratio = BRANCH_RATIO_THRESHOLD; oob_enable = malloc(ci->core_count * sizeof(uint16_t)); if (oob_enable == NULL) { printf("Error - Unable to allocate memory\n"); @@ -193,32 +193,36 @@ parse_args(int argc, char **argv) } cnt = parse_set(optarg, oob_enable, ci->core_count); if (cnt < 0) { - printf("Invalid core-list - [%s]\n", + printf("Invalid core-list section in " + "core-branch-ratio matrix - [%s]\n", + optarg); + free(oob_enable); + break; + } + cnt = parse_branch_ratio(optarg, &branch_ratio); + if (cnt < 0) { + printf("Invalid branch-ratio section in " + "core-branch-ratio matrix - [%s]\n", optarg); free(oob_enable); break; } + if (branch_ratio <= 0.0) { + printf("invalid branch ratio specified\n"); + return -1; + } for (i = 0; i < ci->core_count; i++) { if (oob_enable[i]) { - printf("***Using core %d\n", i); + printf("***Using core %d " + "with branch ratio %f\n", + i, branch_ratio); ci->cd[i].oob_enabled = 1; ci->cd[i].global_enabled_cpus = 1; + ci->cd[i].branch_ratio_threshold = branch_ratio; } } free(oob_enable); break; - case 'b': - branch_ratio = 0.0; - if (strlen(optarg)) - branch_ratio = atof(optarg); - if (branch_ratio <= 0.0) { - printf("invalid branch ratio specified\n"); - return -1; - } - ci->branch_ratio_threshold = branch_ratio; - printf("***Setting branch ratio to %f\n", - branch_ratio); - break; /* long options */ case 0: break; diff --git a/examples/vm_power_manager/oob_monitor_x86.c b/examples/vm_power_manager/oob_monitor_x86.c index aecfcb2eb..3c514475f 100644 --- a/examples/vm_power_manager/oob_monitor_x86.c +++ b/examples/vm_power_manager/oob_monitor_x86.c @@ -109,7 +109,7 @@ apply_policy(int core) * down. Each core_details struct has it's own array. */ freq_window_idx = ci->cd[core].freq_window_idx; - if (ratio > ci->branch_ratio_threshold) + if (ratio > ci->cd[core].branch_ratio_threshold) ci->cd[core].freq_directions[freq_window_idx] = 1; else ci->cd[core].freq_directions[freq_window_idx] = 0; diff --git a/examples/vm_power_manager/parse.c b/examples/vm_power_manager/parse.c index 8231533b6..91d26ea43 100644 --- a/examples/vm_power_manager/parse.c +++ b/examples/vm_power_manager/parse.c @@ -60,7 +60,7 @@ parse_set(const char *input, uint16_t set[], unsigned int num) min = idx; else /* avoid continuous '-' */ return -1; - } else if ((*end == ',') || (*end == '\0')) { + } else if ((*end == ',') || (*end == ':') || (*end == '\0')) { max = idx; if (min == num) @@ -75,7 +75,45 @@ parse_set(const char *input, uint16_t set[], unsigned int num) return -1; str = end + 1; - } while (*end != '\0'); + } while ((*end != '\0') && (*end != ':')); + + return str - input; +} + +int +parse_branch_ratio(const char *input, float *branch_ratio) +{ + const char *str = input; + char *end = NULL; + + while (isblank(*str)) + str++; + + if (*str == '\0') + return -1; + + /* Go straight to the ':' seperator if present */ + while ((*str != '\0') && (*str != ':')) + str++; + + /* Branch ratio not specified in args so leave it at default setting */ + if (*str == '\0') + return 0; + + /* Confirm ':' seperator present */ + if (*str != ':') + return -1; + + str++; + errno = 0; + *branch_ratio = strtof(str, &end); + if (errno || end == NULL) + return -1; + + if (*end != '\0') + return -1; + + str = end + 1; return str - input; } diff --git a/examples/vm_power_manager/parse.h b/examples/vm_power_manager/parse.h index a5971e9a2..1f0120a81 100644 --- a/examples/vm_power_manager/parse.h +++ b/examples/vm_power_manager/parse.h @@ -12,6 +12,9 @@ extern "C" { int parse_set(const char *, uint16_t [], unsigned int); +int +parse_branch_ratio(const char *, float *); + #ifdef __cplusplus } #endif diff --git a/examples/vm_power_manager/power_manager.c b/examples/vm_power_manager/power_manager.c index 7b4f4b3c4..b52128db1 100644 --- a/examples/vm_power_manager/power_manager.c +++ b/examples/vm_power_manager/power_manager.c @@ -60,7 +60,6 @@ core_info_init(void) ci = get_core_info(); ci->core_count = get_nprocs_conf(); - ci->branch_ratio_threshold = BRANCH_RATIO_THRESHOLD; ci->cd = malloc(ci->core_count * sizeof(struct core_details)); memset(ci->cd, 0, ci->core_count * sizeof(struct core_details)); if (!ci->cd) { @@ -69,6 +68,7 @@ core_info_init(void) } for (i = 0; i < ci->core_count; i++) { ci->cd[i].global_enabled_cpus = 1; + ci->cd[i].branch_ratio_threshold = BRANCH_RATIO_THRESHOLD; } printf("%d cores in system\n", ci->core_count); return 0; diff --git a/examples/vm_power_manager/power_manager.h b/examples/vm_power_manager/power_manager.h index e324766b6..d35f8cbe0 100644 --- a/examples/vm_power_manager/power_manager.h +++ b/examples/vm_power_manager/power_manager.h @@ -26,12 +26,12 @@ struct core_details { uint16_t freq_directions[FREQ_WINDOW_SIZE]; uint16_t freq_window_idx; uint16_t freq_state; + float branch_ratio_threshold; }; struct core_info { uint16_t core_count; struct core_details *cd; - float branch_ratio_threshold; }; #define BRANCH_RATIO_THRESHOLD 0.1 From patchwork Mon May 18 10:12:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sexton, Rory" X-Patchwork-Id: 70374 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9CC7FA0093; Mon, 18 May 2020 12:33:59 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4D2D31D422; Mon, 18 May 2020 12:33:59 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id 23FF21D417 for ; Mon, 18 May 2020 12:33:56 +0200 (CEST) IronPort-SDR: b3WNb8pXZKeEgvlKYwawkY/B7ksN3WeoTBPzOp6SSl4levbL7jNXQ7Hnm33/mbDLCDHhnIxxzc ccl5P2bgODNA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 May 2020 03:33:56 -0700 IronPort-SDR: aDdfTnigsWZ42tbxje8m4ZYUNDnpfXmpgDxWkVHYo28zb6xwVbv0elAF1wCQxceJVbw+m7QHAw 92wVtpypZcCg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,406,1583222400"; d="scan'208";a="267473931" Received: from silpixa00399913.ir.intel.com (HELO silpixa00399913.ger.corp.intel.com) ([10.237.222.230]) by orsmga006.jf.intel.com with ESMTP; 18 May 2020 03:33:54 -0700 From: "Sexton, Rory" To: dev@dpdk.org, david.hunt@intel.com Cc: "Sexton, Rory" Date: Mon, 18 May 2020 11:12:10 +0100 Message-Id: <20200518101211.26025-2-rory.sexton@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200518101211.26025-1-rory.sexton@intel.com> References: <20200518101211.26025-1-rory.sexton@intel.com> Subject: [dpdk-dev] [PATCH v1 2/3] examples/vm_power_manager: Allowing power managing of idle cores X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This change is required to allow the branch ratio algorithm to power manage cores with no workload running on them. This is useful both when idle cores don't use C-states and for a number of hyperthreading scenarios. --- examples/vm_power_manager/oob_monitor_x86.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/vm_power_manager/oob_monitor_x86.c b/examples/vm_power_manager/oob_monitor_x86.c index 3c514475f..a5b1c168c 100644 --- a/examples/vm_power_manager/oob_monitor_x86.c +++ b/examples/vm_power_manager/oob_monitor_x86.c @@ -96,12 +96,12 @@ apply_policy(int core) g_branch_misses = miss_diff; if (hits_diff < (INTERVAL*100)) { - /* Likely no workload running on this core. Skip. */ - return -1.0; + /* Likely no workload running on this core. */ + ratio = 0.0; + } else { + ratio = (float)miss_diff * (float)100 / (float)hits_diff; } - ratio = (float)miss_diff * (float)100 / (float)hits_diff; - /* * Store the last few directions that the ratio indicates * we should take. If there's on 'up', then we scale up From patchwork Mon May 18 10:12:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sexton, Rory" X-Patchwork-Id: 70375 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1FB57A0093; Mon, 18 May 2020 12:34:08 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 88FCE1D440; Mon, 18 May 2020 12:34:01 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id DE16C1D40B for ; Mon, 18 May 2020 12:33:59 +0200 (CEST) IronPort-SDR: PcLTSQAHBTS7T/pJd1J+py4eTJFHczGspoPhOHm2NxZmNfUvhhYTwSc2dwdozZ/AE1/8awCgVi zhRmR+N/nXNQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 May 2020 03:33:59 -0700 IronPort-SDR: d60KHGeh1nzz6L554IAN4DlEYDR+M2E2fzHz3o1cpqyCQCLY08sM8F6eDnpvwc5Ul2q/mflAwx fkq6xwt+2ajA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,406,1583222400"; d="scan'208";a="267473941" Received: from silpixa00399913.ir.intel.com (HELO silpixa00399913.ger.corp.intel.com) ([10.237.222.230]) by orsmga006.jf.intel.com with ESMTP; 18 May 2020 03:33:58 -0700 From: "Sexton, Rory" To: dev@dpdk.org, david.hunt@intel.com Cc: "Sexton, Rory" Date: Mon, 18 May 2020 11:12:11 +0100 Message-Id: <20200518101211.26025-3-rory.sexton@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200518101211.26025-1-rory.sexton@intel.com> References: <20200518101211.26025-1-rory.sexton@intel.com> Subject: [dpdk-dev] [PATCH v1 3/3] doc: update vm_power_manager cmdline options in doc X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" --- doc/guides/sample_app_ug/vm_power_management.rst | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/doc/guides/sample_app_ug/vm_power_management.rst b/doc/guides/sample_app_ug/vm_power_management.rst index e98277ccb..dd0f46158 100644 --- a/doc/guides/sample_app_ug/vm_power_management.rst +++ b/doc/guides/sample_app_ug/vm_power_management.rst @@ -410,20 +410,17 @@ There are a couple of command line parameters for enabling the out-of-band monitoring of branch ratios on cores doing busy polling using PMDs as described below: -``--core-list {list of cores}`` +``--core-branch-ratio {list of cores}:{branch ratio for listed cores}`` Specify the list of cores to monitor the ratio of branch misses to branch hits. A tightly-polling PMD thread has a very low branch ratio, therefore the core frequency scales down to the minimum allowed value. On receiving packets, the code path changes, causing the branch ratio to increase. When the ratio goes above the ratio threshold, the core frequency scales up to the maximum - allowed value. - -``--branch-ratio {ratio}`` - Specify a floating-point number that identifies the threshold at which - to scale up or down for the given workload. The default branch ratio - is 0.01 and needs adjustment for different workloads. - + allowed value. The specified branch-ratio is a floating point number + that identifies the threshold at which to scale up or down for the + elements of the core-list. If not included the default branch ratio of + 0.01 but will need adjustment for different workloads Compiling and Running the Guest Applications --------------------------------------------