-
Notifications
You must be signed in to change notification settings - Fork 132
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[cheshire] Back-ref sw compilation flow for fmatmul
- Loading branch information
Showing
11 changed files
with
184 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,11 @@ | ||
# Build software for Cheshire Ara | ||
|
||
Compile the `.c` programs in this folder with: | ||
## Compile the vector code for Cheshire | ||
|
||
Compile the source files with the vector extension support enable: | ||
|
||
```bash | ||
make chs-sw-all | ||
``` | ||
|
||
This command will copy the necessary source files into Cheshire's `sw/tests` directory and compile them with the support for vector extension. | ||
This command will also copy the necessary dependencies to `sw/tests` and enable the vector extension at compile time. |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../../apps/common/encoding.h |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../../apps/fmatmul/kernel/fmatmul.c |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../../apps/fmatmul/kernel/fmatmul.h |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
// Copyright 2024 ETH Zurich and University of Bologna. | ||
// Licensed under the Apache License, Version 2.0, see LICENSE for details. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
// Matteo Perotti <[email protected]> | ||
// | ||
// fmatmul wrapper for Cheshire | ||
|
||
#include "regs/cheshire.h" | ||
#include "dif/clint.h" | ||
#include "dif/uart.h" | ||
#include "params.h" | ||
#include "util.h" | ||
|
||
#include "cheshire_util.h" | ||
#include "vector_util.h" | ||
|
||
#include "fmatmul.c.h" | ||
|
||
#ifndef _MM_SIZE_ | ||
#define _MM_SIZE_ 32 | ||
#endif | ||
|
||
// Define Matrix dimensions: | ||
// C = AB with A=[MxN], B=[NxP], C=[MxP] | ||
uint64_t M = _MM_SIZE_; | ||
uint64_t N = _MM_SIZE_; | ||
uint64_t P = _MM_SIZE_; | ||
|
||
// Max matrix size: 256x256 | ||
double a[_MM_SIZE_*_MM_SIZE_] __attribute__((aligned(32 * NR_LANES))); | ||
double b[_MM_SIZE_*_MM_SIZE_] __attribute__((aligned(32 * NR_LANES))); | ||
double c[_MM_SIZE_*_MM_SIZE_] __attribute__((aligned(32 * NR_LANES))); | ||
// Gold results | ||
double g[_MM_SIZE_*_MM_SIZE_] __attribute__((aligned(32 * NR_LANES))); | ||
|
||
#define THRESHOLD 0.001 | ||
|
||
// Verify the matrix | ||
int verify_matrix(double *result, double *gold, size_t R, size_t C, | ||
double threshold) { | ||
for (uint64_t i = 0; i < R; ++i) { | ||
for (uint64_t j = 0; j < C; ++j) { | ||
int idx = i * C + j; | ||
if (!similarity_check(result[idx], gold[idx], threshold)) { | ||
return (i + j) == 0 ? -1 : idx; | ||
} | ||
} | ||
} | ||
return 0; | ||
} | ||
|
||
int main() { | ||
printf("\n"); | ||
printf("=============\n"); | ||
printf("= FMATMUL =\n"); | ||
printf("=============\n"); | ||
printf("\n"); | ||
printf("------------------------------------------------------------\n"); | ||
printf("Calculating a (%d x %d) x (%d x %d) matrix multiplication...\n", M, | ||
N, N, P); | ||
printf("------------------------------------------------------------\n"); | ||
printf("\n"); | ||
|
||
cheshire_start(); | ||
enable_rvv(); | ||
|
||
unsigned int s = M; | ||
|
||
// Initialize matrices | ||
for (unsigned int i = 0; i < s; ++i) { | ||
for (unsigned int k = 0; k < s; ++k) { | ||
a[k + i*s] = (double) (i + k); | ||
} | ||
} | ||
for (unsigned int k = 0; k < s; ++k) { | ||
for (unsigned int j = 0; j < s; ++j) { | ||
b[j + k*s] = (double) (k - j); | ||
} | ||
} | ||
|
||
// Run scalar check | ||
printf("Calculating fmatmul on scalar core...\n"); | ||
for (unsigned int i = 0; i < s; ++i) { | ||
for (unsigned int j = 0; j < s; ++j) { | ||
double sum = 0; | ||
for (unsigned int k = 0; k < s; ++k) { | ||
sum += a[k + i * s] * b[j + k * s]; | ||
} | ||
g[i + j*s] = sum; | ||
} | ||
} | ||
|
||
// Run vector kernel | ||
printf("Calculating fmatmul on vector core...\n"); | ||
start_timer(); | ||
fmatmul(c, a, b, s, s, s); | ||
stop_timer(); | ||
|
||
// Metrics | ||
int64_t runtime = get_timer(); | ||
float performance = 2.0 * s * s * s / runtime; | ||
float utilization = 100 * performance / (2.0 * NR_LANES); | ||
|
||
printf("The execution took %d cycles.\n", runtime); | ||
printf("The performance is %f FLOP/cycle (%f%% utilization).\n", | ||
performance, utilization); | ||
|
||
// Verify the result only for s == M (to keep it simple) | ||
if (s == M) { | ||
printf("Verifying result...\n"); | ||
int error = verify_matrix(c, g, s, s, THRESHOLD); | ||
if (error != 0) { | ||
printf("Error code %d\n", error); | ||
printf("c[%d]=%d\n", error, c[error]); | ||
return error; | ||
} else { | ||
printf("Passed.\n"); | ||
} | ||
} | ||
|
||
|
||
cheshire_end(); | ||
|
||
return 0; | ||
} |
File renamed without changes.