Improved --list-metric pretty print
Signed-off-by: colramos-amd <colramos@amd.com>
[ROCm/rocprofiler-compute commit: 7120f87963]
Αυτή η υποβολή περιλαμβάνεται σε:
υποβλήθηκε από
Cole Ramos
γονέας
bf27665e99
υποβολή
e1f82cb8a5
@@ -77,23 +77,21 @@ class OmniAnalyze_Base():
|
|||||||
@demarcate
|
@demarcate
|
||||||
def list_metrics(self):
|
def list_metrics(self):
|
||||||
args = self.__args
|
args = self.__args
|
||||||
if args.list_metrics in file_io.supported_arch.keys():
|
if args.list_metrics in self.__supported_archs.keys():
|
||||||
arch = args.list_metrics
|
arch = args.list_metrics
|
||||||
if arch not in self._arch_configs.keys():
|
if arch not in self._arch_configs.keys():
|
||||||
sys_info = file_io.load_sys_info(Path(self.__args.path[0][0], "sysinfo.csv"))
|
sys_info = file_io.load_sys_info(Path(self.__args.path[0][0], "sysinfo.csv"))
|
||||||
self.generate_configs(arch, args.config_dir, args.list_kernels, args.filter_metrics, sys_info)
|
self.generate_configs(arch, args.config_dir, args.list_kernels, args.filter_metrics, sys_info.iloc[0])
|
||||||
print(
|
|
||||||
tabulate(
|
for key, value in self._arch_configs[args.list_metrics].metric_list.items():
|
||||||
pd.DataFrame.from_dict(
|
prefix = ""
|
||||||
self._arch_configs[args.list_metrics].metric_list,
|
if "." not in str(key):
|
||||||
orient="index",
|
prefix = ""
|
||||||
columns=["Metric"],
|
elif str(key).count(".") == 1:
|
||||||
),
|
prefix = "\t"
|
||||||
headers="keys",
|
else:
|
||||||
tablefmt="fancy_grid"
|
prefix = "\t\t"
|
||||||
),
|
print(prefix + key, "->", value)
|
||||||
file=self._output
|
|
||||||
)
|
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
else:
|
else:
|
||||||
error("Unsupported arch")
|
error("Unsupported arch")
|
||||||
@@ -149,7 +147,7 @@ class OmniAnalyze_Base():
|
|||||||
def sanitize(self):
|
def sanitize(self):
|
||||||
"""Perform sanitization of inputs
|
"""Perform sanitization of inputs
|
||||||
"""
|
"""
|
||||||
if not self.__args.list_metrics and not self.__args.path:
|
if not self.__args.path:
|
||||||
error("The following arguments are required: -p/--path")
|
error("The following arguments are required: -p/--path")
|
||||||
# verify not accessing parent directories
|
# verify not accessing parent directories
|
||||||
if ".." in str(self.__args.path):
|
if ".." in str(self.__args.path):
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ Panel Config:
|
|||||||
data source:
|
data source:
|
||||||
- metric_table:
|
- metric_table:
|
||||||
id: 301
|
id: 301
|
||||||
|
title: Memory Chart
|
||||||
header:
|
header:
|
||||||
metric: Metric
|
metric: Metric
|
||||||
#alias: #alias
|
#alias: #alias
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ Panel Config:
|
|||||||
data source:
|
data source:
|
||||||
- metric_table:
|
- metric_table:
|
||||||
id: 301
|
id: 301
|
||||||
|
title: Memory Chart
|
||||||
header:
|
header:
|
||||||
metric: Metric
|
metric: Metric
|
||||||
#alias: #alias
|
#alias: #alias
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ Panel Config:
|
|||||||
data source:
|
data source:
|
||||||
- metric_table:
|
- metric_table:
|
||||||
id: 201
|
id: 201
|
||||||
|
title: Speed-of-Light
|
||||||
header:
|
header:
|
||||||
metric: Metric
|
metric: Metric
|
||||||
value: Value
|
value: Value
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ Panel Config:
|
|||||||
data source:
|
data source:
|
||||||
- metric_table:
|
- metric_table:
|
||||||
id: 301
|
id: 301
|
||||||
|
title: Memory Chart
|
||||||
header:
|
header:
|
||||||
metric: Metric
|
metric: Metric
|
||||||
#alias: #alias
|
#alias: #alias
|
||||||
|
|||||||
-274
@@ -1,274 +0,0 @@
|
|||||||
---
|
|
||||||
# Add description/tips for each metric in this section.
|
|
||||||
# So it could be shown in hover.
|
|
||||||
Metric Description:
|
|
||||||
|
|
||||||
# Define the panel properties and properties of each metric in the panel.
|
|
||||||
Panel Config:
|
|
||||||
id: 1900
|
|
||||||
title: Memory Chart Analysis
|
|
||||||
data source:
|
|
||||||
- metric_table:
|
|
||||||
id: 1901
|
|
||||||
title: # subtitle for this table(optional)
|
|
||||||
header:
|
|
||||||
metric: Metric
|
|
||||||
value: Value
|
|
||||||
alias: Alias
|
|
||||||
tips: Tips
|
|
||||||
metric:
|
|
||||||
Wave Life:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((4 * (SQ_WAVE_CYCLES / SQ_WAVES)) if (SQ_WAVES != 0) else
|
|
||||||
None)), 0)
|
|
||||||
alias: wave_life_
|
|
||||||
tips:
|
|
||||||
Active CUs:
|
|
||||||
value: CONCAT(CONCAT($numActiveCUs, "/"), $numCU)
|
|
||||||
alias: active_cu_
|
|
||||||
tips:
|
|
||||||
SALU:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_SALU / $denom)), 0)
|
|
||||||
alias: salu_
|
|
||||||
tips:
|
|
||||||
SMEM:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_SMEM / $denom)), 0)
|
|
||||||
alias: smem_
|
|
||||||
tips:
|
|
||||||
VALU:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_VALU / $denom)), 0)
|
|
||||||
alias: valu_
|
|
||||||
tips:
|
|
||||||
MFMA:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_MFMA / $denom)), 0)
|
|
||||||
alias: mfma_
|
|
||||||
tips:
|
|
||||||
VMEM:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_VMEM / $denom)), 0)
|
|
||||||
alias: vmem_
|
|
||||||
tips:
|
|
||||||
LDS:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_LDS / $denom)), 0)
|
|
||||||
alias: lds_
|
|
||||||
tips:
|
|
||||||
GWS:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_GDS / $denom)), 0)
|
|
||||||
alias: gws_
|
|
||||||
tips:
|
|
||||||
BR:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_BRANCH / $denom)), 0)
|
|
||||||
alias: br_
|
|
||||||
tips:
|
|
||||||
VGPR:
|
|
||||||
value: ROUND(AVG(vgpr), 0)
|
|
||||||
alias: vgpr_
|
|
||||||
tips:
|
|
||||||
SGPR:
|
|
||||||
value: ROUND(AVG(sgpr), 0)
|
|
||||||
alias: sgpr_
|
|
||||||
tips:
|
|
||||||
LDS Allocation:
|
|
||||||
value: ROUND(AVG(lds), 0)
|
|
||||||
alias: lds_alloc_
|
|
||||||
tips:
|
|
||||||
Scratch Allocation:
|
|
||||||
value: ROUND(AVG(scr), 0)
|
|
||||||
alias: scratch_alloc_
|
|
||||||
tips:
|
|
||||||
Wavefronts:
|
|
||||||
value: ROUND(AVG(SPI_CSN_WAVE), 0)
|
|
||||||
alias: wavefronts_
|
|
||||||
tips:
|
|
||||||
Workgroups:
|
|
||||||
value: ROUND(AVG(SPI_CSN_NUM_THREADGROUPS), 0)
|
|
||||||
alias: workgroups_
|
|
||||||
tips:
|
|
||||||
LDS Req:
|
|
||||||
value: ROUND(AVG((SQ_INSTS_LDS / $denom)), 0)
|
|
||||||
alias: lds_req_
|
|
||||||
tips:
|
|
||||||
IL1 Fetch:
|
|
||||||
value: ROUND(AVG((SQC_ICACHE_REQ / $denom)), 0)
|
|
||||||
alias: il1_fetch_
|
|
||||||
tips:
|
|
||||||
IL1 Hit:
|
|
||||||
value: ROUND((AVG((SQC_ICACHE_HITS / SQC_ICACHE_REQ)) * 100), 0)
|
|
||||||
alias: il1_hit_
|
|
||||||
tips:
|
|
||||||
IL1_L2 Rd:
|
|
||||||
value: ROUND(AVG((SQC_TC_INST_REQ / $denom)), 0)
|
|
||||||
alias: il1_l2_req_
|
|
||||||
tips:
|
|
||||||
vL1D Rd:
|
|
||||||
value: ROUND(AVG((SQC_DCACHE_REQ / $denom)), 0)
|
|
||||||
alias: sl1_rd_
|
|
||||||
tips:
|
|
||||||
vL1D Hit:
|
|
||||||
value:
|
|
||||||
ROUND((AVG(((SQC_DCACHE_HITS / SQC_DCACHE_REQ) if (SQC_DCACHE_REQ !=
|
|
||||||
0) else None)) * 100), 0)
|
|
||||||
alias: sl1_hit_
|
|
||||||
tips:
|
|
||||||
vL1D_L2 Rd:
|
|
||||||
value: ROUND(AVG((SQC_TC_DATA_READ_REQ / $denom)), 0)
|
|
||||||
alias: sl1_l2_rd_
|
|
||||||
tips:
|
|
||||||
vL1D_L2 Wr:
|
|
||||||
value: ROUND(AVG((SQC_TC_DATA_WRITE_REQ / $denom)), 0)
|
|
||||||
alias: sl1_l2_wr_
|
|
||||||
tips:
|
|
||||||
vL1D_L2 Atomic:
|
|
||||||
value: ROUND(AVG((SQC_TC_DATA_ATOMIC_REQ / $denom)), 0)
|
|
||||||
alias: sl1_l2_atom_
|
|
||||||
tips:
|
|
||||||
VL1 Rd:
|
|
||||||
value: ROUND(AVG((TCP_TOTAL_READ_sum / $denom)), 0)
|
|
||||||
alias: vl1_rd_
|
|
||||||
tips:
|
|
||||||
VL1 Wr:
|
|
||||||
value: ROUND(AVG((TCP_TOTAL_WRITE_sum / $denom)), 0)
|
|
||||||
alias: vl1_wr_
|
|
||||||
tips:
|
|
||||||
VL1 Atomic:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((TCP_TOTAL_ATOMIC_WITH_RET_sum + TCP_TOTAL_ATOMIC_WITHOUT_RET_sum)
|
|
||||||
/ $denom)), 0)
|
|
||||||
alias: vl1_atom_
|
|
||||||
tips:
|
|
||||||
VL1 Hit:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((100 - ((100 * (((TCP_TCC_READ_REQ_sum + TCP_TCC_WRITE_REQ_sum)
|
|
||||||
+ TCP_TCC_ATOMIC_WITH_RET_REQ_sum) + TCP_TCC_ATOMIC_WITHOUT_RET_REQ_sum))
|
|
||||||
/ TCP_TOTAL_CACHE_ACCESSES_sum)) if (TCP_TOTAL_CACHE_ACCESSES_sum != 0) else
|
|
||||||
None)), 0)
|
|
||||||
alias: vl1_hit_
|
|
||||||
tips:
|
|
||||||
VL1 Lat:
|
|
||||||
value:
|
|
||||||
# ROUND(AVG(((TCP_TCP_LATENCY_sum / TCP_TA_TCP_STATE_READ_sum) if (TCP_TA_TCP_STATE_READ_sum
|
|
||||||
# != 0) else None)), 0)
|
|
||||||
alias: vl1_lat_
|
|
||||||
tips:
|
|
||||||
VL1_L2 Rd:
|
|
||||||
value: ROUND(AVG((TCP_TCC_READ_REQ_sum / $denom)), 0)
|
|
||||||
alias: vl1_l2_rd_
|
|
||||||
tips:
|
|
||||||
VL1_L2 Wr:
|
|
||||||
value: ROUND(AVG((TCP_TCC_WRITE_REQ_sum / $denom)), 0)
|
|
||||||
alias: vl1_l2_wr_
|
|
||||||
tips:
|
|
||||||
vL1_L2 Atomic:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((TCP_TCC_ATOMIC_WITH_RET_REQ_sum + TCP_TCC_ATOMIC_WITHOUT_RET_REQ_sum)
|
|
||||||
/ $denom)), 0)
|
|
||||||
alias: vl1_l2_atom_
|
|
||||||
tips:
|
|
||||||
L2 Rd:
|
|
||||||
value: ROUND(AVG((TCC_READ_sum / $denom)), 0)
|
|
||||||
alias: l2_rd_
|
|
||||||
tips:
|
|
||||||
L2 Wr:
|
|
||||||
value: ROUND(AVG((TCC_WRITE_sum / $denom)), 0)
|
|
||||||
alias: l2_wr_
|
|
||||||
tips:
|
|
||||||
L2 Atomic:
|
|
||||||
value: ROUND(AVG((TCC_ATOMIC_sum / $denom)), 0)
|
|
||||||
alias: l2_atom_
|
|
||||||
tips:
|
|
||||||
L2 Hit:
|
|
||||||
value:
|
|
||||||
ROUND(AVG((((100 * TCC_HIT_sum) / (TCC_HIT_sum + TCC_MISS_sum)) if ((TCC_HIT_sum
|
|
||||||
+ TCC_MISS_sum) != 0) else None)), 0)
|
|
||||||
alias: l2_hit_
|
|
||||||
tips:
|
|
||||||
L2 Rd Lat:
|
|
||||||
value:
|
|
||||||
# ROUND(AVG(((TCP_TCC_READ_REQ_LATENCY_sum / (TCP_TCC_READ_REQ_sum + TCP_TCC_ATOMIC_WITH_RET_REQ_sum))
|
|
||||||
# if ((TCP_TCC_READ_REQ_sum + TCP_TCC_ATOMIC_WITH_RET_REQ_sum) != 0) else None)),
|
|
||||||
# 0)
|
|
||||||
alias: l2_rd_lat_
|
|
||||||
tips:
|
|
||||||
L2 Wr Lat:
|
|
||||||
value:
|
|
||||||
# ROUND(AVG(((TCP_TCC_WRITE_REQ_LATENCY_sum / (TCP_TCC_WRITE_REQ_sum +
|
|
||||||
# TCP_TCC_ATOMIC_WITHOUT_RET_REQ_sum)) if ((TCP_TCC_WRITE_REQ_sum + TCP_TCC_ATOMIC_WITHOUT_RET_REQ_sum)
|
|
||||||
# != 0) else None)), 0)
|
|
||||||
alias: l2_wr_lat_
|
|
||||||
tips:
|
|
||||||
Fabric Rd Lat:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((TCC_EA0_RDREQ_LEVEL_sum / TCC_EA0_RDREQ_sum) if (TCC_EA0_RDREQ_sum
|
|
||||||
!= 0) else None)), 0)
|
|
||||||
alias: fabric_rd_lat_
|
|
||||||
tips:
|
|
||||||
Fabric Wr Lat:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((TCC_EA0_WRREQ_LEVEL_sum / TCC_EA0_WRREQ_sum) if (TCC_EA0_WRREQ_sum
|
|
||||||
!= 0) else None)), 0)
|
|
||||||
alias: fabric_wr_lat_
|
|
||||||
tips:
|
|
||||||
Fabric Atomic Lat:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((TCC_EA0_ATOMIC_LEVEL_sum / TCC_EA0_ATOMIC_sum) if (TCC_EA0_ATOMIC_sum
|
|
||||||
!= 0) else None)), 0)
|
|
||||||
alias: fabric_atom_lat_
|
|
||||||
tips:
|
|
||||||
Fabric_L2 Rd:
|
|
||||||
value: ROUND(AVG((TCC_EA0_RDREQ_sum / $denom)), 0)
|
|
||||||
alias: l2_fabric_rd_
|
|
||||||
tips:
|
|
||||||
Fabric_L2 Wr:
|
|
||||||
value: ROUND(AVG((TCC_EA0_WRREQ_sum / $denom)), 0)
|
|
||||||
alias: l2_fabric_wr_
|
|
||||||
tips:
|
|
||||||
Fabric_l2 Atomic:
|
|
||||||
value: ROUND(AVG((TCC_EA0_ATOMIC_sum / $denom)), 0)
|
|
||||||
alias: l2_fabric_atom_
|
|
||||||
tips:
|
|
||||||
HBM Rd:
|
|
||||||
value: ROUND(AVG((TCC_EA0_RDREQ_DRAM_sum / $denom)), 0)
|
|
||||||
alias: hbm_rd_
|
|
||||||
tips:
|
|
||||||
HBM Wr:
|
|
||||||
value: ROUND(AVG((TCC_EA0_WRREQ_DRAM_sum / $denom)), 0)
|
|
||||||
alias: hbm_wr_
|
|
||||||
tips:
|
|
||||||
LDS Util:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((100 * SQ_LDS_IDX_ACTIVE) / (GRBM_GUI_ACTIVE * $numCU))),
|
|
||||||
0)
|
|
||||||
alias: lds_util_
|
|
||||||
tips:
|
|
||||||
VL1 Coalesce:
|
|
||||||
value:
|
|
||||||
ROUND(AVG(((((TA_TOTAL_WAVEFRONTS_sum * 64) * 100) / (TCP_TOTAL_ACCESSES_sum
|
|
||||||
* 4)) if (TCP_TOTAL_ACCESSES_sum != 0) else 0)), 0)
|
|
||||||
alias: vl1_coales_
|
|
||||||
tips:
|
|
||||||
VL1 Stall:
|
|
||||||
value:
|
|
||||||
ROUND(AVG((((100 * TCP_TCR_TCP_STALL_CYCLES_sum) / TCP_GATE_EN1_sum)
|
|
||||||
if (TCP_GATE_EN1_sum != 0) else None)), 0)
|
|
||||||
alias: vl1_stall_
|
|
||||||
tips:
|
|
||||||
LDS Lat:
|
|
||||||
value: ROUND(AVG(((SQ_ACCUM_PREV_HIRES / SQ_INSTS_LDS)
|
|
||||||
if (SQ_INSTS_LDS != 0) else None)), 0)
|
|
||||||
alias: lds_lat_
|
|
||||||
coll_level: SQ_INST_LEVEL_LDS
|
|
||||||
tips:
|
|
||||||
vL1D Lat:
|
|
||||||
value: ROUND(AVG(((SQ_ACCUM_PREV_HIRES / SQC_DCACHE_REQ)
|
|
||||||
if (SQC_DCACHE_REQ != 0) else None)), 0)
|
|
||||||
alias: sl1_lat_
|
|
||||||
tips:
|
|
||||||
IL1 Lat:
|
|
||||||
value: ROUND(AVG(((SQ_ACCUM_PREV_HIRES / SQC_ICACHE_REQ)
|
|
||||||
if (SQC_ICACHE_REQ != 0) else None)), 0)
|
|
||||||
alias: il1_lat_
|
|
||||||
tips:
|
|
||||||
Wave Occupancy:
|
|
||||||
value: ROUND(AVG(((SQ_ACCUM_PREV_HIRES / GRBM_GUI_ACTIVE) / $numActiveCUs)), 0)
|
|
||||||
alias: wave_occ_
|
|
||||||
coll_level: SQ_LEVEL_WAVES
|
|
||||||
tips:
|
|
||||||
@@ -493,7 +493,11 @@ def build_dfs(archConfigs, filter_metrics, sys_info):
|
|||||||
for type, data_config in data_source.items():
|
for type, data_config in data_source.items():
|
||||||
if type == "metric_table":
|
if type == "metric_table":
|
||||||
headers = ["Dispatch_ID"]
|
headers = ["Dispatch_ID"]
|
||||||
|
data_source_idx = str(data_config["id"] // 100)
|
||||||
|
if (data_source_idx != 0 or
|
||||||
|
data_source_idx in filter_metrics
|
||||||
|
):
|
||||||
|
metric_list[data_source_idx] = panel["title"]
|
||||||
if (
|
if (
|
||||||
"cli_style" in data_config
|
"cli_style" in data_config
|
||||||
and data_config["cli_style"] == "simple_box"
|
and data_config["cli_style"] == "simple_box"
|
||||||
@@ -541,6 +545,8 @@ def build_dfs(archConfigs, filter_metrics, sys_info):
|
|||||||
values.append(metric_idx)
|
values.append(metric_idx)
|
||||||
values.append(key)
|
values.append(key)
|
||||||
|
|
||||||
|
metric_list[data_source_idx] = data_config["title"]
|
||||||
|
|
||||||
if (
|
if (
|
||||||
"cli_style" in data_config
|
"cli_style" in data_config
|
||||||
and data_config["cli_style"] == "simple_box"
|
and data_config["cli_style"] == "simple_box"
|
||||||
@@ -850,10 +856,10 @@ def apply_filters(workload, dir, is_gui, debug):
|
|||||||
# Verify valid kernel filter
|
# Verify valid kernel filter
|
||||||
kernels_df = pd.read_csv(os.path.join(dir, "pmc_kernel_top.csv"))
|
kernels_df = pd.read_csv(os.path.join(dir, "pmc_kernel_top.csv"))
|
||||||
for kernel_id in workload.filter_kernel_ids:
|
for kernel_id in workload.filter_kernel_ids:
|
||||||
if kernel_id > len(kernels_df["KernelName"]):
|
if kernel_id > len(kernels_df["Kernel_Name"]):
|
||||||
error(
|
error(
|
||||||
"{} is an invalid kernel id. Please enter an id between 0-{}".format(
|
"{} is an invalid kernel id. Please enter an id between 0-{}".format(
|
||||||
kernel_id, len(kernels_df["KernelName"])
|
kernel_id, len(kernels_df["Kernel_Name"])
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
kernels = []
|
kernels = []
|
||||||
@@ -863,19 +869,19 @@ def apply_filters(workload, dir, is_gui, debug):
|
|||||||
kernel_top_df["S"] = ""
|
kernel_top_df["S"] = ""
|
||||||
for kernel_id in workload.filter_kernel_ids:
|
for kernel_id in workload.filter_kernel_ids:
|
||||||
# print("------- ", kernel_id)
|
# print("------- ", kernel_id)
|
||||||
kernels.append(kernel_top_df.loc[kernel_id, "KernelName"])
|
kernels.append(kernel_top_df.loc[kernel_id, "Kernel_Name"])
|
||||||
kernel_top_df.loc[kernel_id, "S"] = "*"
|
kernel_top_df.loc[kernel_id, "S"] = "*"
|
||||||
|
|
||||||
if kernels:
|
if kernels:
|
||||||
# print("fitlered df:", len(df.index))
|
# print("fitlered df:", len(df.index))
|
||||||
ret_df = ret_df.loc[
|
ret_df = ret_df.loc[
|
||||||
ret_df[schema.pmc_perf_file_prefix]["KernelName"].isin(kernels)
|
ret_df[schema.pmc_perf_file_prefix]["Kernel_Name"].isin(kernels)
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
if debug:
|
if debug:
|
||||||
print("GUI kernel filtering")
|
print("GUI kernel filtering")
|
||||||
ret_df = ret_df.loc[
|
ret_df = ret_df.loc[
|
||||||
ret_df[schema.pmc_perf_file_prefix]["KernelName"].isin(
|
ret_df[schema.pmc_perf_file_prefix]["Kernel_Name"].isin(
|
||||||
workload.filter_kernel_ids
|
workload.filter_kernel_ids
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|||||||
Αναφορά σε νέο ζήτημα
Block a user