Patchwork New package: cache-calibrator

login
register
mail settings
Submitter Stephan Hoffmann
Date Jan. 28, 2013, 4:49 p.m.
Message ID <1359391753-14216-1-git-send-email-sho@relinux.de>
Download mbox | patch
Permalink /patch/216248/
State Superseded
Headers show

Comments

Stephan Hoffmann - Jan. 28, 2013, 4:49 p.m.
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

Signed-off-by: Stephan Hoffmann <sho@relinux.de>
---
 package/Config.in                                  |    1 +
 package/cache-calibrator/Config.in                 |    8 ++
 ...calibrator-Fix-conflicting-round-function.patch |  108 ++++++++++++++++++++
 package/cache-calibrator/cache-calibrator.mk       |   21 ++++
 4 files changed, 138 insertions(+), 0 deletions(-)
 create mode 100644 package/cache-calibrator/Config.in
 create mode 100644 package/cache-calibrator/cache-calibrator-Fix-conflicting-round-function.patch
 create mode 100644 package/cache-calibrator/cache-calibrator.mk
Arnout Vandecappelle - Jan. 28, 2013, 6:07 p.m.
On 28/01/13 17:49, Stephan Hoffmann wrote:
[snip]

> diff --git a/package/cache-calibrator/Config.in b/package/cache-calibrator/Config.in
> new file mode 100644
> index 0000000..ba3e021
> --- /dev/null
> +++ b/package/cache-calibrator/Config.in
> @@ -0,0 +1,8 @@
> +config BR2_PACKAGE_CACHE_CALIBRATOR
> +	bool "cache-calibrator"
> +	help
> +	  Cache Ccalibrator is a small C program that is
                 ^^^ typo

> +	  supposed to analyze a computers (cache-) memory
> +	  system and extract useful information
> +
> +	  http://homepages.cwi.nl/~manegold/Calibrator/

[snip]
> +CACHE_CALIBRATOR_SOURCE = calibrator.c
> +CACHE_CALIBRATOR_SITE = http://homepages.cwi.nl/~manegold/Calibrator/src
> +CACHE_CALIBRATOR_EXTRACT_CMDS = cp $(DL_DIR)/$(CACHE_CALIBRATOR_SOURCE) $(CACHE_CALIBRATOR_DIR)

  Hehe, yet another $(FOO_DIR) for Thomas to fix :-)

  Please change into $(@D).

> +CACHE_CALIBRATOR_LICENSE = Free

  I haven't looked at the actual license, but 'Free' doesn't sound like a 
sufficiently descriptive term. If all else fails, use "Cache calibrator 
license".

> +CACHE_CALIBRATOR_LICENSE_FILES = calibrator.c
> +
> +define CACHE_CALIBRATOR_BUILD_CMDS
> +	$(TARGET_CC) $(@D)/calibrator.c -o $(@D)/cache_calibrator -lm

  Please use $(TARGET_CFLAGS) and $(TARGET_LDFLAGS). These may actually 
have an impact on the measurements.


  Otherwise, looks good :-)

  Regards,
  Arnout


> +endef
> +
> +define CACHE_CALIBRATOR_INSTALL_TARGET_CMDS
> +	$(INSTALL) -D -m 0755 $(@D)/cache_calibrator $(TARGET_DIR)/usr/bin/cache_calibrator
> +endef
> +
> +$(eval $(generic-package))
>

Patch

diff --git a/package/Config.in b/package/Config.in
index ebd9817..e6682fc 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -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"
diff --git a/package/cache-calibrator/Config.in b/package/cache-calibrator/Config.in
new file mode 100644
index 0000000..ba3e021
--- /dev/null
+++ b/package/cache-calibrator/Config.in
@@ -0,0 +1,8 @@ 
+config BR2_PACKAGE_CACHE_CALIBRATOR
+	bool "cache-calibrator"
+	help
+	  Cache Ccalibrator 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/
diff --git a/package/cache-calibrator/cache-calibrator-Fix-conflicting-round-function.patch b/package/cache-calibrator/cache-calibrator-Fix-conflicting-round-function.patch
new file mode 100644
index 0000000..71181a6
--- /dev/null
+++ b/package/cache-calibrator/cache-calibrator-Fix-conflicting-round-function.patch
@@ -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
+
diff --git a/package/cache-calibrator/cache-calibrator.mk b/package/cache-calibrator/cache-calibrator.mk
new file mode 100644
index 0000000..7042320
--- /dev/null
+++ b/package/cache-calibrator/cache-calibrator.mk
@@ -0,0 +1,21 @@ 
+#############################################################
+#
+# cache-calibrator
+#
+#############################################################
+
+CACHE_CALIBRATOR_SOURCE = calibrator.c
+CACHE_CALIBRATOR_SITE = http://homepages.cwi.nl/~manegold/Calibrator/src
+CACHE_CALIBRATOR_EXTRACT_CMDS = cp $(DL_DIR)/$(CACHE_CALIBRATOR_SOURCE) $(CACHE_CALIBRATOR_DIR)
+CACHE_CALIBRATOR_LICENSE = Free
+CACHE_CALIBRATOR_LICENSE_FILES = calibrator.c
+
+define CACHE_CALIBRATOR_BUILD_CMDS
+	$(TARGET_CC) $(@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))