This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 0edb21056 benchmarks: support test-tlb
0edb21056 is described below
commit 0edb21056134e16161825dd63acef5a67971413a
Author: ouyangxiangzhen <[email protected]>
AuthorDate: Wed Oct 30 14:56:04 2024 +0800
benchmarks: support test-tlb
This commit added support for test-tlb, a memory latency micro-benchmark.
Signed-off-by: ouyangxiangzhen <[email protected]>
---
.../test-tlb/0001-test-tlb-port-for-NuttX.patch | 139 +++++++++++++++++++++
benchmarks/test-tlb/CMakeLists.txt | 56 +++++++++
benchmarks/test-tlb/Kconfig | 34 +++++
benchmarks/test-tlb/Make.defs | 19 +++
benchmarks/test-tlb/Makefile | 53 ++++++++
5 files changed, 301 insertions(+)
diff --git a/benchmarks/test-tlb/0001-test-tlb-port-for-NuttX.patch
b/benchmarks/test-tlb/0001-test-tlb-port-for-NuttX.patch
new file mode 100644
index 000000000..1a355cef6
--- /dev/null
+++ b/benchmarks/test-tlb/0001-test-tlb-port-for-NuttX.patch
@@ -0,0 +1,139 @@
+From fe4108f726a0e30d429f031a6006f030c5eda113 Mon Sep 17 00:00:00 2001
+From: ouyangxiangzhen <[email protected]>
+Date: Thu, 6 Jun 2024 19:53:37 +0800
+Subject: [PATCH] test-tlb: port for NuttX
+
+VELAPLATFO-25227
+
+This commit ports the test-tlb test program to the NuttX. Additionally, it
implements dynamic CPU frequency calculation.
+
+Change-Id: If1c15f36742d7ee5a7d13147b41b3372047dad08
+Signed-off-by: ouyangxiangzhen <[email protected]>
+---
+ test-tlb.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 63 insertions(+), 5 deletions(-)
+
+diff --git a/test-tlb.c b/test-tlb.c
+index 5c8aaa5..767794a 100644
+--- a/test-tlb.c
++++ b/test-tlb.c
+@@ -14,13 +14,58 @@
+ #include <math.h>
+ #include <time.h>
+
+-#define PAGE_SIZE 4096
+-
+-#define FREQ 3.9
+
+ static int test_hugepage = 0;
+ static int random_list = 0;
+
++/* Fix definition conflict */
++#ifndef PAGE_SIZE
++#define PAGE_SIZE 4096
++#endif
++
++/* dynamic calculate freq */
++#define MEASURE_GAP 500000
++
++#ifdef __x86_64__
++static inline unsigned long rdcnt_relax(void)
++{
++ unsigned int lo,hi;
++ asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
++ return ((unsigned long)hi << 32) | (unsigned long)lo;
++}
++#elif defined(__aarch64__)
++static inline unsigned long rdcnt_relax(void)
++{
++ unsigned long time;
++ asm volatile("mrs %0, cntvct_el0" : "=r"(time));
++ return time;
++}
++#else
++#error "Unsupported architecture for dynamic frequencies measuring"
++#endif
++
++static inline unsigned long rdcnt(void)
++{
++ return rdcnt_relax();
++}
++
++static unsigned long measure_freq(void)
++{
++ unsigned long cycles_per_useconds;
++ unsigned long start;
++ unsigned long end;
++
++ start = rdcnt();
++ usleep(MEASURE_GAP);
++ end = rdcnt();
++
++ cycles_per_useconds = (end - start) / MEASURE_GAP;
++
++ printf("cycles_per_microseconds: %lu\n", cycles_per_useconds);
++
++ return cycles_per_useconds;
++}
++
+ static void die(const char *fmt, ...)
+ {
+ va_list argp;
+@@ -69,7 +114,7 @@ static unsigned long warmup(void *map)
+
+ static double do_test(void *map)
+ {
+- unsigned long count = 0, offset = 0, usec;
++ unsigned long volatile count = 0, offset = 0, usec;
+ struct timeval start, end;
+ struct itimerval itval = {
+ .it_interval = { 0, 0 },
+@@ -190,7 +235,14 @@ static void *create_map(void *map, unsigned long size,
unsigned long stride)
+ if (map) {
+ if (test_hugepage)
+ return map;
++
++#ifdef __NuttX__
++ if (munmap(map, size) != 0)
++ die("munmap failed\n");
++ map = NULL;
++#else
+ flags |= MAP_FIXED;
++#endif
+ }
+
+ mapsize = size;
+@@ -237,9 +289,14 @@ int main(int argc, char **argv)
+ const char *arg;
+ void *map;
+ double cycles;
++ unsigned long freq;
+
+ srandom(time(NULL));
+
++ /* Fix segmentation fault when execution without any arguments in NuttX
*/
++ if (argc < 3)
++ die("bad arguments: test-tlb [-H] <size> <stride>");
++
+ while ((arg = argv[1]) != NULL) {
+ if (*arg != '-')
+ break;
+@@ -261,6 +318,7 @@ int main(int argc, char **argv)
+ argv++;
+ }
+
++ freq = measure_freq();
+ size = get_num(argv[1]);
+ stride = get_num(argv[2]);
+ if (stride < 4 || size < stride)
+@@ -281,6 +339,6 @@ int main(int argc, char **argv)
+ }
+
+ printf("%6.2fns (~%.1f cycles)\n",
+- cycles, cycles*FREQ);
++ cycles, cycles * freq);
+ return 0;
+ }
+--
+2.34.1
+
diff --git a/benchmarks/test-tlb/CMakeLists.txt
b/benchmarks/test-tlb/CMakeLists.txt
new file mode 100644
index 000000000..dfaa23c26
--- /dev/null
+++ b/benchmarks/test-tlb/CMakeLists.txt
@@ -0,0 +1,56 @@
+#
+# Copyright (C) 2024 Xiaomi Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+#
+
+if(CONFIG_BENCHMARK_TESTTLB)
+
+ set(SRCS test-tlb/test-tlb.c)
+
+ set(TESTTLB_UNPACK ${CMAKE_CURRENT_LIST_DIR}/test-tlb)
+ set(TESTTLB_URL https://github.com/torvalds/test-tlb/archive)
+ set(TESTTLB_ZIP master.zip)
+
+ if(NOT EXISTS ${TESTTLB_UNPACK})
+
+ FetchContent_Declare(
+ testtlb_fetch
+ URL ${TESTTLB_URL}/${TESTTLB_ZIP} SOURCE_DIR ${TESTTLB_UNPACK} BINARY_DIR
+ ${CMAKE_BINARY_DIR}/apps/benchmarks/test-tlb/test-tlb
+ PATCH_COMMAND patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
+
${CMAKE_CURRENT_LIST_DIR}/0001-test-tlb-port-for-NuttX.patch
+ DOWNLOAD_NO_PROGRESS true
+ TIMEOUT 30)
+
+ FetchContent_GetProperties(testtlb_fetch)
+ if(NOT testtlb_fetch_POPULATED)
+ FetchContent_Populate(testtlb_fetch)
+ endif()
+
+ endif()
+
+ nuttx_add_application(
+ NAME
+ testtlb
+ PRIORITY
+ ${CONFIG_BENCHMARK_TESTTLB_PRIORITY}
+ STACKSIZE
+ ${CONFIG_BENCHMARK_TESTTLB_STACKSIZE}
+ MODULE
+ ${CONFIG_BENCHMARK_TESTTLB}
+ COMPILE_FLAGS
+ ${CFLAGS}
+ SRCS
+ ${SRCS})
+endif()
diff --git a/benchmarks/test-tlb/Kconfig b/benchmarks/test-tlb/Kconfig
new file mode 100644
index 000000000..806ca4865
--- /dev/null
+++ b/benchmarks/test-tlb/Kconfig
@@ -0,0 +1,34 @@
+#
+# Copyright (C) 2024 Xiaomi Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+config BENCHMARK_TESTTLB
+ tristate "Memory Latency profiling"
+ depends on ALLOW_GPL_COMPONENTS
+ default n
+ ---help---
+ Measure the memory latency
+
+if BENCHMARK_TESTTLB
+
+config BENCHMARK_TESTTLB_PRIORITY
+ int "TestTLB task priority"
+ default 100
+
+config BENCHMARK_TESTTLB_STACKSIZE
+ int "TestTLB stack size"
+ default DEFAULT_TASK_STACKSIZE
+
+endif
diff --git a/benchmarks/test-tlb/Make.defs b/benchmarks/test-tlb/Make.defs
new file mode 100644
index 000000000..7a946c568
--- /dev/null
+++ b/benchmarks/test-tlb/Make.defs
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2024 Xiaomi Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+ifneq ($(CONFIG_BENCHMARK_TESTTLB),)
+CONFIGURED_APPS += $(APPDIR)/benchmarks/test-tlb
+endif
diff --git a/benchmarks/test-tlb/Makefile b/benchmarks/test-tlb/Makefile
new file mode 100644
index 000000000..10ef391e8
--- /dev/null
+++ b/benchmarks/test-tlb/Makefile
@@ -0,0 +1,53 @@
+#
+# Copyright (C) 2024 Xiaomi Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+include $(APPDIR)/Make.defs
+
+PROGNAME = testtlb
+PRIORITY = $(CONFIG_BENCHMARK_TESTTLB_PRIORITY)
+STACKSIZE = $(CONFIG_BENCHMARK_TESTTLB_STACKSIZE)
+MODULE = $(CONFIG_BENCHMARK_TESTTLB)
+
+TESTTLB_UNPACK = test-tlb
+TESTTLB_GIT = github.com/torvalds/test-tlb
+TESTTLB_URL = https://github.com/torvalds/test-tlb/archive
+TESTTLB_VERSION = master
+TESTTLB_ZIP = $(TESTTLB_UNPACK)-$(TESTTLB_VERSION).zip
+UNPACK ?= unzip -q -o
+
+$(TESTTLB_ZIP):
+ @echo "Downloading: $(TESTTLB_URL)"
+ $(Q) curl -L $(TESTTLB_URL)/$(TESTTLB_VERSION).zip -o
$(TESTTLB_UNPACK)-$(TESTTLB_VERSION).zip
+
+$(TESTTLB_UNPACK): $(TESTTLB_ZIP)
+ @echo "Unpacking: $(TESTTLB_ZIP) -> $(TESTTLB_UNPACK)"
+ $(Q) $(UNPACK) $(TESTTLB_ZIP)
+ $(Q) mv test-tlb-$(TESTTLB_VERSION) $(TESTTLB_UNPACK)
+ $(Q) touch $(TESTTLB_UNPACK)
+ @echo "Patching: Applying patch"
+ $(Q) cd test-tlb && patch -p1 < ../0001-test-tlb-port-for-NuttX.patch
+
+ifeq ($(wildcard $(TESTTLB_UNPACK)/.git),)
+context:: $(TESTTLB_UNPACK)
+
+distclean::
+ $(call DELDIR, $(TESTTLB_UNPACK))
+ $(call DELFILE, $(TESTTLB_ZIP))
+endif
+
+MAINSRC = test-tlb/test-tlb.c
+
+include $(APPDIR)/Application.mk