From: Joerg Vehlow <lkml@jv-coder.de>
To: ltp@lists.linux.it, bogdan.lezhepekov@suse.com, chrubis@suse.cz
Cc: Joerg Vehlow <joerg.vehlow@aox-tech.de>
Subject: [LTP] [PATCH v2 2/2] realtime/matrix_mult: Fix test optimization
Date: Mon, 15 Nov 2021 16:45:49 +0100 [thread overview]
Message-ID: <20211115154549.514588-2-lkml@jv-coder.de> (raw)
In-Reply-To: <20211115154549.514588-1-lkml@jv-coder.de>
From: Joerg Vehlow <joerg.vehlow@aox-tech.de>
The actual load of the test was optimized away,
because there was no way to reach the memory
used for calculation from the outside of the function.
To fix this, the memory used for the matrices is now
allocated in the main thread and passed to the workload
function as a pointer. This should prevent optimization and
also allows for the matrices to be bigger, without overflowing
the stack.
Signed-off-by: Joerg Vehlow <joerg.vehlow@aox-tech.de>
---
.../realtime/func/matrix_mult/matrix_mult.c | 45 ++++++++++++-------
1 file changed, 28 insertions(+), 17 deletions(-)
diff --git a/testcases/realtime/func/matrix_mult/matrix_mult.c b/testcases/realtime/func/matrix_mult/matrix_mult.c
index be1e1321b..1a4e8e80d 100644
--- a/testcases/realtime/func/matrix_mult/matrix_mult.c
+++ b/testcases/realtime/func/matrix_mult/matrix_mult.c
@@ -47,6 +47,12 @@ stats_container_t sdat, cdat, *curdat;
stats_container_t shist, chist;
static pthread_barrier_t mult_start;
+struct matrices {
+ double A[MATRIX_SIZE][MATRIX_SIZE];
+ double B[MATRIX_SIZE][MATRIX_SIZE];
+ double C[MATRIX_SIZE][MATRIX_SIZE];
+};
+
static void usage(void)
{
rt_help();
@@ -88,33 +94,30 @@ static void matrix_init(double A[MATRIX_SIZE][MATRIX_SIZE],
}
}
-static void matrix_mult(int m_size)
+static void matrix_mult(struct matrices *matrices)
{
- double A[m_size][m_size];
- double B[m_size][m_size];
- double C[m_size][m_size];
int i, j, k;
- matrix_init(A, B);
- for (i = 0; i < m_size; i++) {
- int i_m = m_size - i;
- for (j = 0; j < m_size; j++) {
- double sum = A[i_m][j] * B[j][i];
- for (k = 0; k < m_size; k++)
- sum += A[i_m][k] * B[k][j];
- C[i][j] = sum;
+ matrix_init(matrices->A, matrices->B);
+ for (i = 0; i < MATRIX_SIZE; i++) {
+ int i_m = MATRIX_SIZE - i;
+ for (j = 0; j < MATRIX_SIZE; j++) {
+ double sum = matrices->A[i_m][j] * matrices->B[j][i];
+ for (k = 0; k < MATRIX_SIZE; k++)
+ sum += matrices->A[i_m][k] * matrices->B[k][j];
+ matrices->C[i][j] = sum;
}
}
}
-static void matrix_mult_record(int m_size, int index)
+static void matrix_mult_record(struct matrices *matrices, int index)
{
nsec_t start, end, delta;
int i;
start = rt_gettime();
for (i = 0; i < ops; i++)
- matrix_mult(MATRIX_SIZE);
+ matrix_mult(matrices);
end = rt_gettime();
delta = (long)((end - start) / NS_PER_US);
curdat->records[index].x = index;
@@ -146,6 +149,7 @@ static int set_affinity(void)
static void *concurrent_thread(void *thread)
{
struct thread *t = (struct thread *)thread;
+ struct matrices *matrices = (struct matrices *) t->arg;
int thread_id = (intptr_t) t->id;
int cpuid;
int i;
@@ -160,7 +164,7 @@ static void *concurrent_thread(void *thread)
index = iterations_percpu * thread_id; /* To avoid stats overlapping */
pthread_barrier_wait(&mult_start);
for (i = 0; i < iterations_percpu; i++)
- matrix_mult_record(MATRIX_SIZE, index++);
+ matrix_mult_record(matrices, index++);
return NULL;
}
@@ -172,6 +176,10 @@ static int main_thread(void)
long smin = 0, smax = 0, cmin = 0, cmax = 0, delta = 0;
float savg, cavg;
int cpuid;
+ struct matrices *matrices[numcpus];
+
+ for (i = 0; i < numcpus; ++i)
+ matrices[i] = malloc(sizeof(struct matrices));
if (stats_container_init(&sdat, iterations) ||
stats_container_init(&shist, HIST_BUCKETS) ||
@@ -200,7 +208,7 @@ static int main_thread(void)
printf("\nRunning sequential operations\n");
start = rt_gettime();
for (i = 0; i < iterations; i++)
- matrix_mult_record(MATRIX_SIZE, i);
+ matrix_mult_record(matrices[0], i);
end = rt_gettime();
delta = (long)((end - start) / NS_PER_US);
@@ -232,7 +240,7 @@ static int main_thread(void)
online_cpu_id = -1; /* Redispatch cpus */
/* Create numcpus-1 concurrent threads */
for (j = 0; j < numcpus; j++) {
- tids[j] = create_fifo_thread(concurrent_thread, NULL, PRIO);
+ tids[j] = create_fifo_thread(concurrent_thread, matrices[j], PRIO);
if (tids[j] == -1) {
printf
("Thread creation failed (max threads exceeded?)\n");
@@ -284,6 +292,9 @@ static int main_thread(void)
criteria);
printf("Result: %s\n", ret ? "FAIL" : "PASS");
+ for (i = 0; i < numcpus; i++)
+ free(matrices[i]);
+
return ret;
}
--
2.25.1
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2021-11-15 15:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-15 15:45 [LTP] [PATCH v2 1/2] realtime/matrix_mult: Cleanup code Joerg Vehlow
2021-11-15 15:45 ` Joerg Vehlow [this message]
2021-11-15 18:52 ` [LTP] [PATCH v2 2/2] realtime/matrix_mult: Fix test optimization Petr Vorel
2021-11-15 19:37 ` Petr Vorel
2021-11-15 18:51 ` [LTP] [PATCH v2 1/2] realtime/matrix_mult: Cleanup code Petr Vorel
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=20211115154549.514588-2-lkml@jv-coder.de \
--to=lkml@jv-coder.de \
--cc=bogdan.lezhepekov@suse.com \
--cc=chrubis@suse.cz \
--cc=joerg.vehlow@aox-tech.de \
--cc=ltp@lists.linux.it \
/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