diff --git a/web/frontend/src/filters/DoubleRangeSlider.svelte b/web/frontend/src/filters/DoubleRangeSlider.svelte
index aca460a..2d4795f 100644
--- a/web/frontend/src/filters/DoubleRangeSlider.svelte
+++ b/web/frontend/src/filters/DoubleRangeSlider.svelte
@@ -21,6 +21,8 @@ Changes: remove dependency, text inputs, configurable value ranges, on:change ev
export let max;
export let firstSlider;
export let secondSlider;
+ export let inputFieldFrom = 0;
+ export let inputFieldTo = 0;
const dispatch = createEventDispatcher();
@@ -33,7 +35,6 @@ Changes: remove dependency, text inputs, configurable value ranges, on:change ev
let leftHandle;
let body;
let slider;
- let inputFieldFrom, inputFieldTo;
let timeoutId = null;
function queueChangeEvent() {
@@ -45,10 +46,10 @@ Changes: remove dependency, text inputs, configurable value ranges, on:change ev
timeoutId = null;
// Show selection but avoid feedback loop
- if (values[0] != null && inputFieldFrom.value != values[0].toString())
- inputFieldFrom.value = values[0].toString();
- if (values[1] != null && inputFieldTo.value != values[1].toString())
- inputFieldTo.value = values[1].toString();
+ if (values[0] != null && inputFieldFrom != values[0].toString())
+ inputFieldFrom = values[0].toString();
+ if (values[1] != null && inputFieldTo != values[1].toString())
+ inputFieldTo = values[1].toString();
dispatch('change', values);
}, 250);
@@ -176,7 +177,7 @@ Changes: remove dependency, text inputs, configurable value ranges, on:change ev
const leftHandleLeft = leftHandle.getBoundingClientRect().left;
- const pxStart = clamp((leftHandleLeft + event.detail.dx) - left, 0, parentWidth - width);
+ const pxStart = clamp((leftHandleLeft + evt.detail.dx) - left, 0, parentWidth - width);
const pxEnd = clamp(pxStart + width, width, parentWidth);
const pStart = pxStart / parentWidth;
@@ -190,12 +191,12 @@ Changes: remove dependency, text inputs, configurable value ranges, on:change ev
diff --git a/web/frontend/src/filters/Filters.svelte b/web/frontend/src/filters/Filters.svelte
index d4c390e..b8264d3 100644
--- a/web/frontend/src/filters/Filters.svelte
+++ b/web/frontend/src/filters/Filters.svelte
@@ -60,7 +60,10 @@
isTagsOpen = false,
isDurationOpen = false,
isResourcesOpen = false,
- isStatsOpen = false
+ isStatsOpen = false,
+ isNodesModified = false,
+ isHwthreadsModified = false,
+ isAccsModified = false
// Can be called from the outside to trigger a 'update' event from this component.
export function update(additionalFilters = null) {
@@ -181,7 +184,7 @@
Tags
(isResourcesOpen = true)}>
- Nodes/Accelerators
+ Resources
(isStatsOpen = true)}>
(isStatsOpen = true)}/> Statistics
@@ -268,9 +271,15 @@
{/if}
- {#if filters.numNodes.from != null || filters.numNodes.to != null}
+ {#if filters.numNodes.from != null || filters.numNodes.to != null ||
+ filters.numHWThreads.from != null || filters.numHWThreads.to != null ||
+ filters.numAccelerators.from != null || filters.numAccelerators.to != null }
(isResourcesOpen = true)}>
- Nodes: {filters.numNodes.from} - {filters.numNodes.to}
+ {#if isNodesModified } Nodes: {filters.numNodes.from} - {filters.numNodes.to} {/if}
+ {#if isNodesModified && isHwthreadsModified }, {/if}
+ {#if isHwthreadsModified } HWThreads: {filters.numHWThreads.from} - {filters.numHWThreads.to} {/if}
+ {#if (isNodesModified || isHwthreadsModified) && isAccsModified }, {/if}
+ {#if isAccsModified } Accelerators: {filters.numAccelerators.from} - {filters.numAccelerators.to} {/if}
{/if}
@@ -316,6 +325,9 @@
bind:numNodes={filters.numNodes}
bind:numHWThreads={filters.numHWThreads}
bind:numAccelerators={filters.numAccelerators}
+ bind:isNodesModified={isNodesModified}
+ bind:isHwthreadsModified={isHwthreadsModified}
+ bind:isAccsModified={isAccsModified}
on:update={() => update()} />
clusters.reduce((max, cluster) => Math.max(max,
cluster.subClusters.reduce((max, sc) => Math.max(max, sc.topology.accelerators?.length || 0), 0)), 0)
- // console.log(header)
+ // Limited to Single-Node Thread Count
+ const findMaxNumHWTreadsPerNode = clusters => clusters.reduce((max, cluster) => Math.max(max,
+ cluster.subClusters.reduce((max, sc) => Math.max(max, (sc.threadsPerCore * sc.coresPerSocket * sc.socketsPerNode) || 0), 0)), 0)
+
+ // console.log(header)
let minNumNodes = 1, maxNumNodes = 0, minNumHWThreads = 1, maxNumHWThreads = 0, minNumAccelerators = 0, maxNumAccelerators = 0
$: {
if ($initialized) {
@@ -33,11 +36,13 @@
minNumNodes = filterRanges.numNodes.from
maxNumNodes = filterRanges.numNodes.to
maxNumAccelerators = findMaxNumAccels([{ subClusters }])
+ maxNumHWThreads = findMaxNumHWTreadsPerNode([{ subClusters }])
} else if (clusters.length > 0) {
const { filterRanges } = header.clusters[0]
minNumNodes = filterRanges.numNodes.from
maxNumNodes = filterRanges.numNodes.to
maxNumAccelerators = findMaxNumAccels(clusters)
+ maxNumHWThreads = findMaxNumHWTreadsPerNode(clusters)
for (let cluster of header.clusters) {
const { filterRanges } = cluster
minNumNodes = Math.min(minNumNodes, filterRanges.numNodes.from)
@@ -52,27 +57,53 @@
pendingNumNodes = { from: 0, to: maxNumNodes }
}
}
+
+ $: {
+ if (isOpen && $initialized && pendingNumHWThreads.from == null && pendingNumHWThreads.to == null) {
+ pendingNumHWThreads = { from: 0, to: maxNumHWThreads }
+ }
+ }
+
+ $: if ( maxNumAccelerators != null && maxNumAccelerators > 1 ) {
+ if (isOpen && $initialized && pendingNumAccelerators.from == null && pendingNumAccelerators.to == null) {
+ pendingNumAccelerators = { from: 0, to: maxNumAccelerators }
+ }
+ }
(isOpen = !isOpen)}>
- Select Number of Nodes, HWThreads and Accelerators
+ Select number of utilized Resources
- Number of Nodes
+ Number of Nodes
(pendingNumNodes = { from: detail[0], to: detail[1] })}
+ on:change={({ detail }) => {
+ pendingNumNodes = { from: detail[0], to: detail[1] }
+ isNodesModified = true
+ }}
min={minNumNodes} max={maxNumNodes}
- firstSlider={pendingNumNodes.from} secondSlider={pendingNumNodes.to} />
-
+ firstSlider={pendingNumHWThreads.from} secondSlider={pendingNumHWThreads.to}
+ inputFieldFrom={pendingNumHWThreads.from} inputFieldTo={pendingNumHWThreads.to}/>
{#if maxNumAccelerators != null && maxNumAccelerators > 1}
+ Number of Accelerators
(pendingNumAccelerators = { from: detail[0], to: detail[1] })}
+ on:change={({ detail }) => {
+ pendingNumAccelerators = { from: detail[0], to: detail[1] }
+ isAccsModified = true
+ }}
min={minNumAccelerators} max={maxNumAccelerators}
- firstSlider={pendingNumAccelerators.from} secondSlider={pendingNumAccelerators.to} />
+ firstSlider={pendingNumAccelerators.from} secondSlider={pendingNumAccelerators.to}
+ inputFieldFrom={pendingNumAccelerators.from} inputFieldTo={pendingNumAccelerators.to}/>
{/if}
@@ -80,7 +111,10 @@
disabled={pendingNumNodes.from == null || pendingNumNodes.to == null}
on:click={() => {
isOpen = false
- numNodes = { from: pendingNumNodes.from, to: pendingNumNodes.to }
+ pendingNumNodes = isNodesModified ? pendingNumNodes : { from: null, to: null }
+ pendingNumHWThreads = isHwthreadsModified ? pendingNumHWThreads : { from: null, to: null }
+ pendingNumAccelerators = isAccsModified ? pendingNumAccelerators : { from: null, to: null }
+ numNodes ={ from: pendingNumNodes.from, to: pendingNumNodes.to }
numHWThreads = { from: pendingNumHWThreads.from, to: pendingNumHWThreads.to }
numAccelerators = { from: pendingNumAccelerators.from, to: pendingNumAccelerators.to }
dispatch('update', { numNodes, numHWThreads, numAccelerators })
@@ -95,6 +129,9 @@
numNodes = { from: pendingNumNodes.from, to: pendingNumNodes.to }
numHWThreads = { from: pendingNumHWThreads.from, to: pendingNumHWThreads.to }
numAccelerators = { from: pendingNumAccelerators.from, to: pendingNumAccelerators.to }
+ isNodesModified = false
+ isHwthreadsModified = false
+ isAccsModified = false
dispatch('update', { numNodes, numHWThreads, numAccelerators })
}}>Reset
diff --git a/web/frontend/src/filters/Stats.svelte b/web/frontend/src/filters/Stats.svelte
index e7b658d..cf559da 100644
--- a/web/frontend/src/filters/Stats.svelte
+++ b/web/frontend/src/filters/Stats.svelte
@@ -93,7 +93,8 @@
(stat.from = detail[0], stat.to = detail[1], stat.enabled = true)}
min={0} max={stat.peak}
- firstSlider={stat.from} secondSlider={stat.to} />
+ firstSlider={stat.from} secondSlider={stat.to}
+ inputFieldFrom={stat.from} inputFieldTo={stat.to}/>
{/each}
@@ -104,7 +105,8 @@
}}>Close & Apply