mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
From: Markus Niebel <list-09@tqsc.de>
To: ptxdist@pengutronix.de
Cc: m.olbrich@pengutronix.de
Subject: Re: [ptxdist] [RFC][PATCH] arm-memspeed: add patches for configurable cache sizes
Date: Fri, 27 Jun 2014 08:41:30 +0200	[thread overview]
Message-ID: <53AD121A.5070404@tqsc.de> (raw)
In-Reply-To: <1403198667-32530-1-git-send-email-list-09_ptxdist@tqsc.de>

Hello,

Am 19.06.2014 19:24, wrote Markus Niebel:
> From: Markus Niebel <Markus.Niebel@tq-group.com>
> 
> Cores like cortex a9 have L1 and L2 cache. Sizes of
> caches may vary between cores and SOCs. So it is good to
> have the sizes configurable and let the user decide.
> 
> While at it, remove some compiler warnings.

any comments or should I split the patches from the discussion?

> 
> Signed-off-by: Markus Niebel <Markus.Niebel@tq-group.com>
> ---
> I'm not 100% sure about the following things:
> 
> 1) with HF toolchains (tested cortexa8 and v7a versions of OSELAS.Toolchain 2013.12.2)
>    there is a segfault when enable to run the cached tests - even with the unpatched
>    version. The same toolchains without HF the program runs without error.
> 2) The timing code looks strange. Wouldn't it be better to use clock_gettime with
>    CLOCK_MONOTONIC on systems with tickless kernels?
> 

Is the some expert (toolchain and / or ARM assembler) hearing my qustion?

> 
>  patches/arm-memspeed-1.0/0001-fix-cache-size.patch |   58 ++++++++++++++
>  patches/arm-memspeed-1.0/0002-use-getopt.patch     |   82 ++++++++++++++++++++
>  .../0003-remove-compiler-warnings.patch            |   14 ++++
>  patches/arm-memspeed-1.0/series                    |    4 +
>  4 files changed, 158 insertions(+)
>  create mode 100644 patches/arm-memspeed-1.0/0001-fix-cache-size.patch
>  create mode 100644 patches/arm-memspeed-1.0/0002-use-getopt.patch
>  create mode 100644 patches/arm-memspeed-1.0/0003-remove-compiler-warnings.patch
>  create mode 100644 patches/arm-memspeed-1.0/series
> 
> diff --git a/patches/arm-memspeed-1.0/0001-fix-cache-size.patch b/patches/arm-memspeed-1.0/0001-fix-cache-size.patch
> new file mode 100644
> index 0000000..4ac8a36
> --- /dev/null
> +++ b/patches/arm-memspeed-1.0/0001-fix-cache-size.patch
> @@ -0,0 +1,58 @@
> +Index: arm-memspeed-1.1/memspeed.c
> +===================================================================
> +--- arm-memspeed-1.1.orig/memspeed.c	2011-10-14 19:57:47.000000000 +0200
> ++++ arm-memspeed-1.1/memspeed.c	2014-05-12 13:51:23.000000000 +0200
> +@@ -25,7 +25,12 @@
> +  * than half the actual data cache size but not smaller than 4096.
> +  * (4096 is the largest preload size)
> +  */
> +-#define CACHED_BUF_SIZE         4*1024
> ++#define CACHED_BUF_SIZE_MIN     4*1024
> ++
> ++static size_t large_buf_size = BUF_SIZE;
> ++static size_t cached_buf_size = CACHED_BUF_SIZE_MIN;
> ++
> ++
> + 
> + typedef void (test_fn)(void *src, void *dst, long size);
> + 
> +@@ -101,7 +106,7 @@
> + 	long long t1, t2, tod_usecs, ck_usecs;
> + 	int i, loops, tries;
> + 	float x;
> +-	int buf_size = in_cache ? CACHED_BUF_SIZE : BUF_SIZE;
> ++	int buf_size = in_cache ? cached_buf_size : large_buf_size;
> + 	void *buf1 = test_buf;
> + 	void *buf2 = test_buf + buf_size;
> + 
> +@@ -122,8 +127,8 @@
> + 
> + 		/* first a single pass to warm caches and page memory in */
> + 		if (in_cache) {
> +-			test_ldm_32_p8(buf1, NULL, CACHED_BUF_SIZE);
> +-			test_ldm_32_p8(buf2, NULL, CACHED_BUF_SIZE);
> ++			test_ldm_32_p8(buf1, NULL, cached_buf_size);
> ++			test_ldm_32_p8(buf2, NULL, cached_buf_size);
> + 		}
> + 		fn(buf2, buf1, buf_size);
> + 
> +@@ -146,8 +151,8 @@
> + 		/* now the real test */
> + 		usleep(10000);
> + 		if (in_cache) {
> +-			test_ldm_32_p8(buf1, NULL, CACHED_BUF_SIZE);
> +-			test_ldm_32_p8(buf2, NULL, CACHED_BUF_SIZE);
> ++			test_ldm_32_p8(buf1, NULL, cached_buf_size);
> ++			test_ldm_32_p8(buf2, NULL, cached_buf_size);
> + 		}
> + 		fn(buf2, buf1, buf_size);
> + 		i = loops;
> +@@ -229,7 +234,7 @@
> + 		}
> + 	}
> + 
> +-	test_buf_ = malloc(2*BUF_SIZE + CACHED_BUF_SIZE + 4096);
> ++	test_buf_ = malloc(2*large_buf_size + cached_buf_size + 4096);
> + 	
> + 	/* page align */
> + 	test_buf = (char *)((long)(test_buf_ + 4095) & ~4095L);
> diff --git a/patches/arm-memspeed-1.0/0002-use-getopt.patch b/patches/arm-memspeed-1.0/0002-use-getopt.patch
> new file mode 100644
> index 0000000..a587713
> --- /dev/null
> +++ b/patches/arm-memspeed-1.0/0002-use-getopt.patch
> @@ -0,0 +1,82 @@
> +Index: arm-memspeed-1.0/memspeed.c
> +===================================================================
> +--- arm-memspeed-1.0.orig/memspeed.c	2014-06-18 20:19:15.000000000 +0200
> ++++ arm-memspeed-1.0/memspeed.c	2014-06-18 20:20:03.000000000 +0200
> +@@ -10,6 +10,7 @@
> + #include <unistd.h>
> + #include <string.h>
> + #include <sched.h>
> ++#include <errno.h>
> + #include <sys/time.h>
> + #include <sys/times.h>
> + 
> +@@ -218,23 +219,63 @@
> + 		perror("Warning: unable to set scheduling priority, ");
> + }
> + 
> ++static void usage(int argc, char *argv[])
> ++{
> ++	fprintf(stderr, "Usage: %s [-c] -l <uncached size> -s <cached size>\n"
> ++                        "   -c\tinclude cached memory results\n"
> ++                        "   -l\t mem size for the uncached tests in kiBytes, must be larger than L2 cache\n"
> ++                        "   -s\t mem size for the cached tests in kiBytes\n",
> ++                argv[0]);
> ++}
> ++
> + int main(int argc, char *argv[])
> + {
> + 	void *test_buf_;
> + 	int i, j, include_cached = 0;
> ++	int c;
> + 
> +-	for (i = 1; i < argc; i++) {
> +-		if (strcmp(argv[i], "-c") == 0) {
> ++	while (-1 != (c = getopt(argc, argv, "cl:s:"))) {
> ++		switch(c) {
> ++		case  'c':
> + 			include_cached = 1;
> +-		} else {
> +-			fprintf(stderr, "Usage: %s [-c]\n"
> +-					"   -c\tinclude cached memory results\n",
> +-					argv[0]);
> ++			break;
> ++		case 'l':
> ++			errno = 0;
> ++			large_buf_size = strtoul(optarg, 0, 10) * 1024;
> ++			if (errno || (0 == large_buf_size)) {
> ++				fprintf(stderr, "%s: -n needs positive non zero val\n", argv[0]);
> ++				usage(argc, argv);
> ++				exit(1);
> ++			}
> ++			break;
> ++		case 's':
> ++                        errno = 0;
> ++                        cached_buf_size = strtoul(optarg, 0, 10) * 1024;
> ++                        if (errno || (0 == large_buf_size)) {
> ++                                fprintf(stderr, "%s: -s needs positive non zero val\n", argv[0]);
> ++                                usage(argc, argv);
> ++                                exit(1);
> ++                        }
> ++                        break;
> ++
> ++		default:
> ++			usage(argc, argv);
> + 			exit(1);
> + 		}
> + 	}
> + 
> ++	if (large_buf_size <= cached_buf_size * 4) {
> ++	        fprintf(stderr, "%s: uncached buffer needs at least quad size of chached\n", argv[0]);
> ++                usage(argc, argv);
> ++		exit(1);
> ++	}
> ++
> + 	test_buf_ = malloc(2*large_buf_size + cached_buf_size + 4096);
> ++	if (!test_buf_) {
> ++	        fprintf(stderr, "%s: uncached buffer needs at least quad size of chached\n", argv[0]);
> ++                usage(argc, argv);
> ++		exit(1);
> ++	}
> + 	
> + 	/* page align */
> + 	test_buf = (char *)((long)(test_buf_ + 4095) & ~4095L);
> diff --git a/patches/arm-memspeed-1.0/0003-remove-compiler-warnings.patch b/patches/arm-memspeed-1.0/0003-remove-compiler-warnings.patch
> new file mode 100644
> index 0000000..d3e255c
> --- /dev/null
> +++ b/patches/arm-memspeed-1.0/0003-remove-compiler-warnings.patch
> @@ -0,0 +1,14 @@
> +Index: arm-memspeed-1.0/memspeed.c
> +===================================================================
> +--- arm-memspeed-1.0.orig/memspeed.c	2014-06-18 11:25:46.000000000 +0200
> ++++ arm-memspeed-1.0/memspeed.c	2014-06-18 11:29:22.000000000 +0200
> +@@ -231,7 +231,8 @@
> + int main(int argc, char *argv[])
> + {
> + 	void *test_buf_;
> +-	int i, j, include_cached = 0;
> ++	size_t i, j;
> ++	int include_cached = 0;
> + 	int c;
> + 
> + 	while (-1 != (c = getopt(argc, argv, "cl:s:"))) {
> diff --git a/patches/arm-memspeed-1.0/series b/patches/arm-memspeed-1.0/series
> new file mode 100644
> index 0000000..b9d002e
> --- /dev/null
> +++ b/patches/arm-memspeed-1.0/series
> @@ -0,0 +1,4 @@
> +0001-fix-cache-size.patch
> +0002-use-getopt.patch
> +0003-remove-compiler-warnings.patch
> +# 0004-debug
> 
Greetings

Markus

-- 
ptxdist mailing list
ptxdist@pengutronix.de

  reply	other threads:[~2014-06-27  6:41 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-19 17:24 Markus Niebel
2014-06-27  6:41 ` Markus Niebel [this message]
2014-06-27  7:49 ` Juergen Borleis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53AD121A.5070404@tqsc.de \
    --to=list-09@tqsc.de \
    --cc=m.olbrich@pengutronix.de \
    --cc=ptxdist@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox