|
|
|
|
@ -29,27 +29,84 @@ max_tile <- 0.5
|
|
|
|
|
# Generate all heatmaps with crossproduct of this
|
|
|
|
|
benchmarks <- c("ip", "mem", "regs")
|
|
|
|
|
markers <- c(
|
|
|
|
|
"OK_MARKER", "FAIL_MARKER", "DETECTED_MARKER",
|
|
|
|
|
"ACCESS_OUTERSPACE", "WRITE_TEXTSEGMENT",
|
|
|
|
|
"GROUP1_MARKER", "TRAP", "TIMEOUT"
|
|
|
|
|
"OK_MARKER",
|
|
|
|
|
"FAIL_MARKER",
|
|
|
|
|
"DETECTED_MARKER",
|
|
|
|
|
"ACCESS_OUTERSPACE",
|
|
|
|
|
"WRITE_TEXTSEGMENT",
|
|
|
|
|
"GROUP1_MARKER",
|
|
|
|
|
"TRAP",
|
|
|
|
|
"TIMEOUT"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Labels for _start/_end symbols from linker.ld
|
|
|
|
|
regions <- list(
|
|
|
|
|
list(label = "WAMR AOT", start = "_wamr_aot_start", end = "_wamr_aot_end"),
|
|
|
|
|
list(label = "WAMR os_mmap", start = "_wamr_mmap_start", end = "_wamr_mmap_end"),
|
|
|
|
|
list(label = "WAMR runtime mem", start = "_wamr_runtime_pool_start", end = "_wamr_runtime_pool_end"),
|
|
|
|
|
list(label = "WAMR linear mem", start = "_wamr_linear_pool_start", end = "_wamr_linear_pool_end"),
|
|
|
|
|
list(label = "WAMR global heap", start = "_wamr_global_heap_start", end = "_wamr_global_heap_end"),
|
|
|
|
|
list(label = "IWASM AOT runtime", start = "_iwasm_aot_runtime_start", end = "_iwasm_aot_runtime_end"),
|
|
|
|
|
list(label = "IWASM bh/util", start = "_iwasm_bh_start", end = "_iwasm_bh_end"),
|
|
|
|
|
list(label = "IWASM mem_alloc", start = "_iwasm_mem_alloc_start", end = "_iwasm_mem_alloc_end"),
|
|
|
|
|
list(label = "IWASM platform", start = "_iwasm_platform_init_start", end = "_iwasm_platform_init_end"),
|
|
|
|
|
list(label = "IWASM exec_env", start = "_iwasm_exec_env_start", end = "_iwasm_exec_env_end"),
|
|
|
|
|
list(label = "IWASM interp", start = "_iwasm_interp_classic_start", end = "_iwasm_interp_classic_end"),
|
|
|
|
|
list(label = "IWASM memory", start = "_iwasm_memory_start", end = "_iwasm_memory_end"),
|
|
|
|
|
list(label = "IWASM native", start = "_iwasm_native_start", end = "_iwasm_native_end"),
|
|
|
|
|
list(label = "IWASM runtime", start = "_iwasm_runtime_start", end = "_iwasm_runtime_end"),
|
|
|
|
|
list(
|
|
|
|
|
label = "WAMR os_mmap",
|
|
|
|
|
start = "_wamr_mmap_start",
|
|
|
|
|
end = "_wamr_mmap_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "WAMR runtime mem",
|
|
|
|
|
start = "_wamr_runtime_pool_start",
|
|
|
|
|
end = "_wamr_runtime_pool_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "WAMR linear mem",
|
|
|
|
|
start = "_wamr_linear_pool_start",
|
|
|
|
|
end = "_wamr_linear_pool_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "WAMR global heap",
|
|
|
|
|
start = "_wamr_global_heap_start",
|
|
|
|
|
end = "_wamr_global_heap_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM AOT runtime",
|
|
|
|
|
start = "_iwasm_aot_runtime_start",
|
|
|
|
|
end = "_iwasm_aot_runtime_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM bh/util",
|
|
|
|
|
start = "_iwasm_bh_start",
|
|
|
|
|
end = "_iwasm_bh_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM mem_alloc",
|
|
|
|
|
start = "_iwasm_mem_alloc_start",
|
|
|
|
|
end = "_iwasm_mem_alloc_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM platform",
|
|
|
|
|
start = "_iwasm_platform_init_start",
|
|
|
|
|
end = "_iwasm_platform_init_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM exec_env",
|
|
|
|
|
start = "_iwasm_exec_env_start",
|
|
|
|
|
end = "_iwasm_exec_env_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM interp",
|
|
|
|
|
start = "_iwasm_interp_classic_start",
|
|
|
|
|
end = "_iwasm_interp_classic_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM memory",
|
|
|
|
|
start = "_iwasm_memory_start",
|
|
|
|
|
end = "_iwasm_memory_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM native",
|
|
|
|
|
start = "_iwasm_native_start",
|
|
|
|
|
end = "_iwasm_native_end"
|
|
|
|
|
),
|
|
|
|
|
list(
|
|
|
|
|
label = "IWASM runtime",
|
|
|
|
|
start = "_iwasm_runtime_start",
|
|
|
|
|
end = "_iwasm_runtime_end"
|
|
|
|
|
),
|
|
|
|
|
list(label = "TEXT", start = "_text_start", end = "_text_end"),
|
|
|
|
|
list(label = "BSS", start = "_sbss", end = "_ebss")
|
|
|
|
|
)
|
|
|
|
|
@ -75,22 +132,27 @@ if (length(args) < 1) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
experiment <- args[1]
|
|
|
|
|
faults_file <- if (length(args) >= 2) args[2] else "faults.csv"
|
|
|
|
|
suffix <- gsub("^faults|\\.csv$", "", faults_file)
|
|
|
|
|
|
|
|
|
|
# =============================================================================
|
|
|
|
|
# INPUT DATA (read once)
|
|
|
|
|
# =============================================================================
|
|
|
|
|
|
|
|
|
|
datafile <- file.path(experiment, "faults.csv")
|
|
|
|
|
datafile <- file.path(experiment, faults_file)
|
|
|
|
|
if (!file.exists(datafile)) {
|
|
|
|
|
stop(paste("Input file not found:", datafile))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
raw <- read_csv(datafile, col_types = cols(
|
|
|
|
|
benchmark = col_character(),
|
|
|
|
|
resulttype = col_character(),
|
|
|
|
|
faults = col_double(),
|
|
|
|
|
fault_address = col_character() # hex string "0x10001A"; converted below
|
|
|
|
|
))
|
|
|
|
|
raw <- read_csv(
|
|
|
|
|
datafile,
|
|
|
|
|
col_types = cols(
|
|
|
|
|
benchmark = col_character(),
|
|
|
|
|
resulttype = col_character(),
|
|
|
|
|
faults = col_double(),
|
|
|
|
|
fault_address = col_character() # hex string "0x10001A"; converted below
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# =============================================================================
|
|
|
|
|
# ELF SYMBOLS (parsed once)
|
|
|
|
|
@ -155,10 +217,12 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
|
|
|
|
|
# "0x10001A" -> substr strips "0x" -> strtoi parses base-16 -> integer
|
|
|
|
|
aggregated <- aggregated |>
|
|
|
|
|
mutate(addr_int = strtoi(
|
|
|
|
|
substr(.data$fault_address, 3L, nchar(.data$fault_address)),
|
|
|
|
|
16L
|
|
|
|
|
))
|
|
|
|
|
mutate(
|
|
|
|
|
addr_int = strtoi(
|
|
|
|
|
substr(.data$fault_address, 3L, nchar(.data$fault_address)),
|
|
|
|
|
16L
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# ===========================================================================
|
|
|
|
|
# SCALE ROWS
|
|
|
|
|
@ -168,17 +232,24 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
row_width <- row_width_init
|
|
|
|
|
|
|
|
|
|
# Double row_width until occupied rows <= max_rows
|
|
|
|
|
while (row_width < 65536L && n_occupied_rows(
|
|
|
|
|
aggregated$addr_int, row_width
|
|
|
|
|
) > max_rows) {
|
|
|
|
|
while (
|
|
|
|
|
row_width < 65536L &&
|
|
|
|
|
n_occupied_rows(
|
|
|
|
|
aggregated$addr_int,
|
|
|
|
|
row_width
|
|
|
|
|
) >
|
|
|
|
|
max_rows
|
|
|
|
|
) {
|
|
|
|
|
row_width <- row_width * 2L
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (row_width > row_width_init) {
|
|
|
|
|
message(sprintf(
|
|
|
|
|
"Note: [%s/%s] row_width auto-scaled to %d (%d occupied rows)",
|
|
|
|
|
target_resulttype, target_benchmark,
|
|
|
|
|
row_width, n_occupied_rows(aggregated$addr_int, row_width)
|
|
|
|
|
target_resulttype,
|
|
|
|
|
target_benchmark,
|
|
|
|
|
row_width,
|
|
|
|
|
n_occupied_rows(aggregated$addr_int, row_width)
|
|
|
|
|
))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -210,8 +281,8 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
# - Adding that offset to 1...n gives the row_idx values with gap slots
|
|
|
|
|
cumulative_gaps <- cumsum(has_gap_before)
|
|
|
|
|
row_order <- tibble(
|
|
|
|
|
row = rows_sorted,
|
|
|
|
|
row_idx = seq_len(n_data_rows) + cumulative_gaps,
|
|
|
|
|
row = rows_sorted,
|
|
|
|
|
row_idx = seq_len(n_data_rows) + cumulative_gaps,
|
|
|
|
|
has_gap_before = has_gap_before
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
@ -240,8 +311,8 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
|
|
|
|
|
region_rects <- data.frame(
|
|
|
|
|
label = character(0),
|
|
|
|
|
ymin = numeric(0),
|
|
|
|
|
ymax = numeric(0)
|
|
|
|
|
ymin = numeric(0),
|
|
|
|
|
ymax = numeric(0)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if (length(sym_addr) > 0) {
|
|
|
|
|
@ -256,7 +327,8 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
# Row with base address r covers bytes r ... r + row_width - 1.
|
|
|
|
|
# Overlap if r < e && r + row_width > s
|
|
|
|
|
overlapping <- row_order[
|
|
|
|
|
row_order$row < e & (row_order$row + row_width) > s, ,
|
|
|
|
|
row_order$row < e & (row_order$row + row_width) > s,
|
|
|
|
|
,
|
|
|
|
|
drop = FALSE
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
@ -266,8 +338,8 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
|
|
|
|
|
data.frame(
|
|
|
|
|
label = reg$label,
|
|
|
|
|
ymin = min(overlapping$row_idx) - 0.5,
|
|
|
|
|
ymax = max(overlapping$row_idx) + 0.5
|
|
|
|
|
ymin = min(overlapping$row_idx) - 0.5,
|
|
|
|
|
ymax = max(overlapping$row_idx) + 0.5
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
@ -310,9 +382,14 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
# PLOT
|
|
|
|
|
# ===========================================================================
|
|
|
|
|
|
|
|
|
|
plot <- ggplot(grid_complete, aes(
|
|
|
|
|
x = col, y = .data$row_idx, fill = .data$faults
|
|
|
|
|
)) +
|
|
|
|
|
plot <- ggplot(
|
|
|
|
|
grid_complete,
|
|
|
|
|
aes(
|
|
|
|
|
x = col,
|
|
|
|
|
y = .data$row_idx,
|
|
|
|
|
fill = .data$faults
|
|
|
|
|
)
|
|
|
|
|
) +
|
|
|
|
|
|
|
|
|
|
# One rectangle per (col, row_idx) tuple
|
|
|
|
|
geom_tile(width = 1, height = 1, colour = NA) +
|
|
|
|
|
@ -330,10 +407,10 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
|
|
|
|
|
# Heatmap color ramp
|
|
|
|
|
scale_fill_viridis_c(
|
|
|
|
|
name = "Faults",
|
|
|
|
|
trans = "log1p",
|
|
|
|
|
name = "Faults",
|
|
|
|
|
trans = "log1p",
|
|
|
|
|
na.value = "grey85",
|
|
|
|
|
option = "viridis"
|
|
|
|
|
option = "viridis"
|
|
|
|
|
) +
|
|
|
|
|
|
|
|
|
|
# X-axis hex labels
|
|
|
|
|
@ -355,10 +432,13 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
# Title + axis labels
|
|
|
|
|
labs(
|
|
|
|
|
title = paste(target_resulttype, "/", target_benchmark),
|
|
|
|
|
subtitle = paste("Total:", format(
|
|
|
|
|
sum(aggregated$faults, na.rm = TRUE),
|
|
|
|
|
big.mark = ","
|
|
|
|
|
)),
|
|
|
|
|
subtitle = paste(
|
|
|
|
|
"Total:",
|
|
|
|
|
format(
|
|
|
|
|
sum(aggregated$faults, na.rm = TRUE),
|
|
|
|
|
big.mark = ","
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
x = "Byte Offset",
|
|
|
|
|
y = "Base Address"
|
|
|
|
|
) +
|
|
|
|
|
@ -367,7 +447,10 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
theme_minimal() +
|
|
|
|
|
theme(
|
|
|
|
|
axis.text.x = element_text(
|
|
|
|
|
family = "mono", angle = 45, hjust = 1, size = 9
|
|
|
|
|
family = "mono",
|
|
|
|
|
angle = 45,
|
|
|
|
|
hjust = 1,
|
|
|
|
|
size = 9
|
|
|
|
|
),
|
|
|
|
|
axis.text.y = element_text(family = "mono", size = 9),
|
|
|
|
|
panel.grid = element_blank(),
|
|
|
|
|
@ -399,9 +482,17 @@ make_heatmap <- function(target_resulttype, target_benchmark) {
|
|
|
|
|
fig_w <- row_width * tile_size + 4.5
|
|
|
|
|
fig_h <- total_slots * tile_size + 2.5
|
|
|
|
|
|
|
|
|
|
outfile <- file.path(experiment, paste0(
|
|
|
|
|
"heatmap_", target_resulttype, "_", target_benchmark, ".svg"
|
|
|
|
|
))
|
|
|
|
|
outfile <- file.path(
|
|
|
|
|
experiment,
|
|
|
|
|
paste0(
|
|
|
|
|
"heatmap_",
|
|
|
|
|
target_resulttype,
|
|
|
|
|
"_",
|
|
|
|
|
target_benchmark,
|
|
|
|
|
suffix,
|
|
|
|
|
".svg"
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
ggsave(outfile, plot = plot, width = fig_w, height = fig_h, units = "in")
|
|
|
|
|
message(sprintf("Saved: %s", basename(outfile)))
|
|
|
|
|
|