New package: cache-calibrator
The Calibrator is a small C program that is supposed to analyze a computers (cache-) memory system and extract the following parameters: number of cache levels for each cache level: its size its linesize its access/miss latency main memory access latency number of TLB levels for each TLB level: its capacity (i.e. number of entries) the pagesize used the TLB miss latency http://homepages.cwi.nl/~manegold/Calibrator/ It is also recommended as a load generator for realtime testing in: https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO#Benchmarking [Peter: reformat help text, fix extract step] Signed-off-by: Stephan Hoffmann <sho@relinux.de> Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
This commit is contained in:
parent
42169a4e71
commit
3c80d680f2
@ -19,6 +19,7 @@ endmenu
|
||||
|
||||
menu "Debugging, profiling and benchmark"
|
||||
source "package/bonnie/Config.in"
|
||||
source "package/cache-calibrator/Config.in"
|
||||
source "package/dhrystone/Config.in"
|
||||
source "package/dstat/Config.in"
|
||||
source "package/dmalloc/Config.in"
|
||||
|
13
package/cache-calibrator/Config.in
Normal file
13
package/cache-calibrator/Config.in
Normal file
@ -0,0 +1,13 @@
|
||||
config BR2_PACKAGE_CACHE_CALIBRATOR
|
||||
bool "cache-calibrator"
|
||||
help
|
||||
Cache calibrator is a small C program that is supposed to
|
||||
analyze a computers (cache-) memory system and extract
|
||||
useful information
|
||||
|
||||
http://homepages.cwi.nl/~manegold/Calibrator/
|
||||
|
||||
It is also recommended as a load generator for realtime
|
||||
testing in:
|
||||
|
||||
https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO
|
@ -0,0 +1,108 @@
|
||||
From 39ac7268c4350040976005da98daf10edf676d3e Mon Sep 17 00:00:00 2001
|
||||
From: Stephan Hoffmann <sho@relinux.de>
|
||||
Date: Mon, 28 Jan 2013 17:32:10 +0100
|
||||
Subject: [PATCH] Fix conflicting round() function
|
||||
|
||||
calibrator.c defines a local round() function that conflicts
|
||||
with the one from the standard library.
|
||||
|
||||
This is fixed by renaming the local function.
|
||||
|
||||
Signed-off-by: Stephan Hoffmann <sho@relinux.de>
|
||||
---
|
||||
calibrator.c | 30 +++++++++++++++---------------
|
||||
1 files changed, 15 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/calibrator.c b/calibrator.c
|
||||
index e045dfd..8471c04 100644
|
||||
--- a/calibrator.c
|
||||
+++ b/calibrator.c
|
||||
@@ -128,7 +128,7 @@ void ErrXit(char *format, ...) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
-lng round(dbl x)
|
||||
+lng lng_round(dbl x)
|
||||
{
|
||||
return (lng)(x + 0.5);
|
||||
}
|
||||
@@ -890,16 +890,16 @@ void plotCache(cacheInfo *cache, lng **result, lng MHz, char *fn, FILE *fp, lng
|
||||
fprintf(fp, ")\n");
|
||||
fprintf(fp, "set y2tics");
|
||||
for (l = 0, s = " ("; l <= cache->levels; l++, s = ", ") {
|
||||
- if (!delay) fprintf(fp, "%s'(%ld)' %f", s, round(CYperIt(cache->latency1[l] - delay)), NSperIt(cache->latency1[l] - delay));
|
||||
- else fprintf(fp, "%s'(%ld)' %f", s, round(CYperIt(cache->latency2[l] - delay)), NSperIt(cache->latency2[l] - delay));
|
||||
+ if (!delay) fprintf(fp, "%s'(%ld)' %f", s, lng_round(CYperIt(cache->latency1[l] - delay)), NSperIt(cache->latency1[l] - delay));
|
||||
+ else fprintf(fp, "%s'(%ld)' %f", s, lng_round(CYperIt(cache->latency2[l] - delay)), NSperIt(cache->latency2[l] - delay));
|
||||
}
|
||||
for (y = 1; y <= yh; y *= 10) {
|
||||
fprintf(fp, "%s'%1.3g' %ld", s, (dbl)(y * MHz) / 1000.0, y);
|
||||
}
|
||||
fprintf(fp, ")\n");
|
||||
for (l = 0; l <= cache->levels; l++) {
|
||||
- if (!delay) z = (dbl)round(CYperIt(cache->latency1[l] - delay)) * 1000.0 / (dbl)MHz;
|
||||
- else z = (dbl)round(CYperIt(cache->latency2[l] - delay)) * 1000.0 / (dbl)MHz;
|
||||
+ if (!delay) z = (dbl)lng_round(CYperIt(cache->latency1[l] - delay)) * 1000.0 / (dbl)MHz;
|
||||
+ else z = (dbl)lng_round(CYperIt(cache->latency2[l] - delay)) * 1000.0 / (dbl)MHz;
|
||||
fprintf(fp, "set label %ld '(%1.3g) ' at %f,%f right\n", l + 1, z, xl, z);
|
||||
fprintf(fp, "set arrow %ld from %f,%f to %f,%f nohead lt 0\n", l + 1, xl, z, xh, z);
|
||||
}
|
||||
@@ -986,16 +986,16 @@ void plotTLB(TLBinfo *TLB, lng **result, lng MHz, char *fn, FILE *fp, lng delay)
|
||||
fprintf(fp, "%s'<L1>' %ld)\n", s, TLB->mincachelines);
|
||||
fprintf(fp, "set y2tics");
|
||||
for (l = 0, s = " ("; l <= TLB->levels; l++, s = ", ") {
|
||||
- if (!delay) fprintf(fp, "%s'(%ld)' %f", s, round(CYperIt(TLB->latency1[l] - delay)), NSperIt(TLB->latency1[l] - delay));
|
||||
- else fprintf(fp, "%s'(%ld)' %f", s, round(CYperIt(TLB->latency2[l] - delay)), NSperIt(TLB->latency2[l] - delay));
|
||||
+ if (!delay) fprintf(fp, "%s'(%ld)' %f", s, lng_round(CYperIt(TLB->latency1[l] - delay)), NSperIt(TLB->latency1[l] - delay));
|
||||
+ else fprintf(fp, "%s'(%ld)' %f", s, lng_round(CYperIt(TLB->latency2[l] - delay)), NSperIt(TLB->latency2[l] - delay));
|
||||
}
|
||||
for (y = 1; y <= yh; y *= 10) {
|
||||
fprintf(fp, "%s'%1.3g' %ld", s, (dbl)(y * MHz) / 1000.0, y);
|
||||
}
|
||||
fprintf(fp, ")\n");
|
||||
for (l = 0; l <= TLB->levels; l++) {
|
||||
- if (!delay) z = (dbl)round(CYperIt(TLB->latency1[l] - delay)) * 1000.0 / (dbl)MHz;
|
||||
- else z = (dbl)round(CYperIt(TLB->latency2[l] - delay)) * 1000.0 / (dbl)MHz;
|
||||
+ if (!delay) z = (dbl)lng_round(CYperIt(TLB->latency1[l] - delay)) * 1000.0 / (dbl)MHz;
|
||||
+ else z = (dbl)lng_round(CYperIt(TLB->latency2[l] - delay)) * 1000.0 / (dbl)MHz;
|
||||
fprintf(fp, "set label %ld '(%1.3g) ' at %f,%f right\n", l + 1, z, xl, z);
|
||||
fprintf(fp, "set arrow %ld from %f,%f to %f,%f nohead lt 0\n", l + 1, xl, z, xh, z);
|
||||
}
|
||||
@@ -1023,9 +1023,9 @@ void printCPU(cacheInfo *cache, lng MHz, lng delay)
|
||||
FILE *fp = stdout;
|
||||
|
||||
fprintf(fp, "CPU loop + L1 access: ");
|
||||
- fprintf(fp, " %6.2f ns = %3ld cy\n", NSperIt(cache->latency1[0]), round(CYperIt(cache->latency1[0])));
|
||||
+ fprintf(fp, " %6.2f ns = %3ld cy\n", NSperIt(cache->latency1[0]), lng_round(CYperIt(cache->latency1[0])));
|
||||
fprintf(fp, " ( delay: ");
|
||||
- fprintf(fp, " %6.2f ns = %3ld cy )\n", NSperIt(delay), round(CYperIt(delay)));
|
||||
+ fprintf(fp, " %6.2f ns = %3ld cy )\n", NSperIt(delay), lng_round(CYperIt(delay)));
|
||||
fprintf(fp, "\n");
|
||||
fflush(fp);
|
||||
}
|
||||
@@ -1047,8 +1047,8 @@ void printCache(cacheInfo *cache, lng MHz)
|
||||
fprintf(fp, " %3ld KB ", cache->size[l] / 1024);
|
||||
}
|
||||
fprintf(fp, " %3ld bytes ", cache->linesize[l + 1]);
|
||||
- fprintf(fp, " %6.2f ns = %3ld cy " , NSperIt(cache->latency2[l + 1] - cache->latency2[l]), round(CYperIt(cache->latency2[l + 1] - cache->latency2[l])));
|
||||
- fprintf(fp, " %6.2f ns = %3ld cy\n", NSperIt(cache->latency1[l + 1] - cache->latency1[l]), round(CYperIt(cache->latency1[l + 1] - cache->latency1[l])));
|
||||
+ fprintf(fp, " %6.2f ns = %3ld cy " , NSperIt(cache->latency2[l + 1] - cache->latency2[l]), lng_round(CYperIt(cache->latency2[l + 1] - cache->latency2[l])));
|
||||
+ fprintf(fp, " %6.2f ns = %3ld cy\n", NSperIt(cache->latency1[l + 1] - cache->latency1[l]), lng_round(CYperIt(cache->latency1[l + 1] - cache->latency1[l])));
|
||||
}
|
||||
fprintf(fp, "\n");
|
||||
fflush(fp);
|
||||
@@ -1075,9 +1075,9 @@ void printTLB(TLBinfo *TLB, lng MHz)
|
||||
} else {
|
||||
fprintf(fp, " %3ld KB ", TLB->pagesize[l + 1] / 1024);
|
||||
}
|
||||
- fprintf(fp, " %6.2f ns = %3ld cy ", NSperIt(TLB->latency2[l + 1] - TLB->latency2[l]), round(CYperIt(TLB->latency2[l + 1] - TLB->latency2[l])));
|
||||
+ fprintf(fp, " %6.2f ns = %3ld cy ", NSperIt(TLB->latency2[l + 1] - TLB->latency2[l]), lng_round(CYperIt(TLB->latency2[l + 1] - TLB->latency2[l])));
|
||||
/*
|
||||
- fprintf(fp, " %6.2f ns = %3ld cy" , NSperIt(TLB->latency1[l + 1] - TLB->latency1[l]), round(CYperIt(TLB->latency1[l + 1] - TLB->latency1[l])));
|
||||
+ fprintf(fp, " %6.2f ns = %3ld cy" , NSperIt(TLB->latency1[l + 1] - TLB->latency1[l]), lng_round(CYperIt(TLB->latency1[l + 1] - TLB->latency1[l])));
|
||||
*/
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
--
|
||||
1.7.0.4
|
||||
|
24
package/cache-calibrator/cache-calibrator.mk
Normal file
24
package/cache-calibrator/cache-calibrator.mk
Normal file
@ -0,0 +1,24 @@
|
||||
#############################################################
|
||||
#
|
||||
# cache-calibrator
|
||||
#
|
||||
#############################################################
|
||||
|
||||
CACHE_CALIBRATOR_SOURCE = calibrator.c
|
||||
CACHE_CALIBRATOR_SITE = http://homepages.cwi.nl/~manegold/Calibrator/src
|
||||
CACHE_CALIBRATOR_LICENSE = Cache calibrator license
|
||||
CACHE_CALIBRATOR_LICENSE_FILES = calibrator.c
|
||||
|
||||
define CACHE_CALIBRATOR_EXTRACT_CMDS
|
||||
cp $(DL_DIR)/$(CACHE_CALIBRATOR_SOURCE) $(@D)
|
||||
endef
|
||||
|
||||
define CACHE_CALIBRATOR_BUILD_CMDS
|
||||
$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(@D)/calibrator.c -o $(@D)/cache_calibrator -lm
|
||||
endef
|
||||
|
||||
define CACHE_CALIBRATOR_INSTALL_TARGET_CMDS
|
||||
$(INSTALL) -D -m 0755 $(@D)/cache_calibrator $(TARGET_DIR)/usr/bin/cache_calibrator
|
||||
endef
|
||||
|
||||
$(eval $(generic-package))
|
Loading…
Reference in New Issue
Block a user