1
Fork 0
mirror of https://github.com/Steffo99/unimore-hpc-assignments.git synced 2024-11-25 09:34:23 +00:00

HLS lab 1

This commit is contained in:
Gianluca Brilli 2021-05-13 21:40:40 +02:00
parent 32d3b1ebe0
commit 3c3ddf4bec
10 changed files with 302 additions and 0 deletions

View file

@ -0,0 +1,17 @@
#define TEST_DATA_SIZE 4194304 // 2^22
const unsigned int c_dim = TEST_DATA_SIZE;
void vadd(int *a, int *b, int *c, const int len)
{
#pragma HLS INTERFACE m_axi port=a offset=slave bundle=mem
#pragma HLS INTERFACE m_axi port=b offset=slave bundle=mem
#pragma HLS INTERFACE m_axi port=c offset=slave bundle=mem
#pragma HLS INTERFACE s_axilite port=len bundle=params
#pragma HLS INTERFACE s_axilite port=return bundle=params
loop: for(int i = 0; i < len; i++) {
#pragma HLS LOOP_TRIPCOUNT min=c_dim max=c_dim
c[i] = a[i] + b[i];
}
}

19
hls/lab1/exercise_1.cpp Executable file
View file

@ -0,0 +1,19 @@
#define TEST_DATA_SIZE 4194304 // 2^22
const unsigned int c_dim = TEST_DATA_SIZE;
void vadd(int *a, int *b, int *c, const int len)
{
//TODO: split bundles on three different AXI4 bus
#pragma HLS INTERFACE m_axi port=a offset=slave bundle=mem
#pragma HLS INTERFACE m_axi port=b offset=slave bundle=mem
#pragma HLS INTERFACE m_axi port=c offset=slave bundle=mem
#pragma HLS INTERFACE s_axilite port=len bundle=params
#pragma HLS INTERFACE s_axilite port=return bundle=params
loop: for(int i = 0; i < len; i++) {
//TODO: insert pipeline directive
#pragma HLS LOOP_TRIPCOUNT min=c_dim max=c_dim
c[i] = a[i] + b[i];
}
}

54
hls/lab1/exercise_2.cpp Executable file
View file

@ -0,0 +1,54 @@
#include <string.h>
#include <limits.h>
#define NUM_DIMS 5
#define NUM_POINTS 512
const unsigned int num_dims = NUM_DIMS;
const unsigned int num_points = NUM_POINTS;
void nearest_neighbor(int *out, const int *points,
const int *search_point, const int len,
const int dim){
#pragma HLS INTERFACE m_axi port=out offset=slave bundle=out_mem
#pragma HLS INTERFACE m_axi port=points offset=slave bundle=points_mem
#pragma HLS INTERFACE m_axi port=search_point offset=slave bundle=search_point_mem
#pragma HLS INTERFACE s_axilite port=len bundle=param
#pragma HLS INTERFACE s_axilite port=dim bundle=param
#pragma HLS INTERFACE s_axilite port=return bundle=param
int best_i = 0;
int best_dist = INT_MAX;
int s_point[NUM_DIMS];
memcpy(s_point, search_point, NUM_DIMS*sizeof(int));
// TODO: merge upper_loop and lower loop
// TODO: insert pipeline directive
upper_loop:for(int p = 0 ; p < len; ++p){
#pragma HLS LOOP_TRIPCOUNT max=num_points min=num_points
int dist = 0;
lower_loop:for(int c = 0 ; c < dim ; c++){
#pragma HLS LOOP_TRIPCOUNT max=num_dims min=num_dims
int dx = points[dim*p + c] - s_point[c];
dist += dx * dx;
}
if (dist < best_dist){
best_i = p;
best_dist = dist;
}
}
//TODO: insert pipeline directive
write_best: for (int c = 0; c < dim; ++c) {
#pragma HLS LOOP_TRIPCOUNT max=num_dims min=num_dims
out[c] = points[best_i * dim + c];
}
}

View file

@ -0,0 +1,59 @@
#include <string.h>
#include <limits.h>
#define NUM_DIMS 5
#define NUM_POINTS 512
const unsigned int num_dims = NUM_DIMS;
const unsigned int num_points = NUM_POINTS;
const unsigned int max_iterations = num_dims * num_points;
void nearest_neighbor(int *out, const int *points,
const int *search_point, const int len,
const int dim){
#pragma HLS INTERFACE m_axi port=out offset=slave bundle=out_mem
#pragma HLS INTERFACE m_axi port=points offset=slave bundle=points_mem
#pragma HLS INTERFACE m_axi port=search_point offset=slave bundle=search_point_mem
#pragma HLS INTERFACE s_axilite port=len bundle=param
#pragma HLS INTERFACE s_axilite port=dim bundle=param
#pragma HLS INTERFACE s_axilite port=return bundle=param
int best_i = 0;
int best_dist = INT_MAX;
int s_point[NUM_DIMS];
memcpy(s_point, search_point, NUM_DIMS*sizeof(int));
int dist = 0;
int iterations = len * dim;
find_best: for (int p = 0, c = 0, itr = 0; itr < iterations; itr++) {
#pragma HLS PIPELINE
#pragma HLS LOOP_TRIPCOUNT max=max_iterations min=max_iterations
int dx = points[dim * p + c] - s_point[c];
dist += dx * dx;
if (c == dim - 1) {
if (dist < best_dist) {
best_i = p;
best_dist = dist;
}
c = 0;
dist = 0;
p++;
} else {
c++;
}
}
write_best:
for (int c = 0; c < dim; ++c) {
#pragma HLS PIPELINE
#pragma HLS LOOP_TRIPCOUNT max=num_dims min=num_dims
out[c] = points[best_i * dim + c];
}
}

29
hls/lab1/exercise_3.cpp Executable file
View file

@ -0,0 +1,29 @@
#define MAX_SIZE 64
const unsigned int max_size = MAX_SIZE;
void mmult( int *in1,
int *in2,
int *out,
int dim
)
{
#pragma HLS INTERFACE m_axi port=in1 offset=slave bundle=in1_mem
#pragma HLS INTERFACE m_axi port=in2 offset=slave bundle=in2_mem
#pragma HLS INTERFACE m_axi port=out offset=slave bundle=out_mem
#pragma HLS INTERFACE s_axilite port=dim bundle=params
#pragma HLS INTERFACE s_axilite port=return bundle=params
for (int i = 0; i < dim; i++){
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
for (int j = 0; j < dim; j++){
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
for (int k = 0; k < dim; k++){
//TODO: insert pipeline directive
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
out[i * dim + j] += in1[i * dim + k] * in2[k * dim + j];
}
}
}
}

33
hls/lab1/exercise_4.cpp Executable file
View file

@ -0,0 +1,33 @@
#define MAX_SIZE 64
const unsigned int max_size = MAX_SIZE;
void mmult( int *in1,
int *in2,
int *out,
int dim
)
{
#pragma HLS INTERFACE m_axi port=in1 offset=slave bundle=in1_mem
#pragma HLS INTERFACE m_axi port=in2 offset=slave bundle=in2_mem
#pragma HLS INTERFACE m_axi port=out offset=slave bundle=out_mem
#pragma HLS INTERFACE s_axilite port=dim bundle=params
#pragma HLS INTERFACE s_axilite port=return bundle=params
//TODO: create three Blocked RAM
//TODO: copy data from DRAM to BRAM
for (int i = 0; i < dim; i++){
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
for (int j = 0; j < dim; j++){
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
for (int k = 0; k < dim; k++){
//TODO: insert pipeline directive
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
out[i * dim + j] += in1[i * dim + k] * in2[k * dim + j];
}
}
}
//TODO: copy data back from BRAM to DRAM
}

36
hls/lab1/exercise_5.cpp Executable file
View file

@ -0,0 +1,36 @@
#define MAX_SIZE 64
const unsigned int max_size = MAX_SIZE;
void mmult( int *in1,
int *in2,
int *out,
int dim
)
{
#pragma HLS INTERFACE m_axi port=in1 offset=slave bundle=in1_mem
#pragma HLS INTERFACE m_axi port=in2 offset=slave bundle=in2_mem
#pragma HLS INTERFACE m_axi port=out offset=slave bundle=out_mem
#pragma HLS INTERFACE s_axilite port=dim bundle=params
#pragma HLS INTERFACE s_axilite port=return bundle=params
//TODO: create three Blocked RAM
//TODO: copy data from DRAM to BRAM
//TODO: insert array partition directives
for (int i = 0; i < dim; i++){
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
for (int j = 0; j < dim; j++){
//TODO: insert pipeline directive
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
for (int k = 0; k < dim; k++){
//TODO: insert loop unrolling directive
#pragma HLS LOOP_TRIPCOUNT max=max_size min=max_size
out[i * dim + j] += in1[i * dim + k] * in2[k * dim + j];
}
}
}
//TODO: copy data back from BRAM to DRAM
}

21
hls/lab1/exercise_6.cpp Executable file
View file

@ -0,0 +1,21 @@
#define SIZE 128
#define N 10
void fir(int * input, int * output) {
#pragma HLS INTERFACE m_axi port=input offset=slave bundle=input_mem
#pragma HLS INTERFACE m_axi port=output offset=slave bundle=output_mem
#pragma HLS INTERFACE s_axilite port=return bundle=params
int coeff[N] = {13, -2, 9, 11, 26, 18, 95, -43, 6, 74};
for (int n = 0; n < SIZE; n++) {
int acc = 0;
for (int i= 0; i< N; i++ ) {
if (n - i >= 0)
acc += coeff[i] * input[n-i];
}
output[n] = acc;
}
}

34
hls/lab1/exercise_7.cpp Executable file
View file

@ -0,0 +1,34 @@
#define SIZE 128
#define N 10
void fir(int * input, int * output) {
#pragma HLS INTERFACE m_axi port=input offset=slave bundle=input_mem
#pragma HLS INTERFACE m_axi port=output offset=slave bundle=output_mem
#pragma HLS INTERFACE s_axilite port=return bundle=params
int coeff[N] = {13, -2, 9, 11, 26, 18, 95, -43, 6, 74};
int shift_reg[N] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//TODO: insert array partition directive
for (int n = 0; n < SIZE; n++) {
//TODO: insert pipeline directive
int acc = 0;
for(int j = N-1; j > 0; j--) {
//TODO: insert unroll directive
shift_reg[j] = shift_reg[j-1];
}
shift_reg[0] = input[n];
for (int j= 0; j< N; j++ ) {
//TODO: insert unroll directive
acc += shift_reg[j]*coeff[j];
}
output[n] = acc;
}
}

0
hls/lab2/TODO Normal file
View file