/
vecadd.c
56 lines (45 loc) · 982 Bytes
/
vecadd.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// The first proof of concept
#include <stdio.h>
#include "common/test.h"
#include "common/timing.h"
#define N 1024
#ifndef TYPE
#define TYPE int64_t
#endif
struct Arguments {
TYPE a[N], b[N], c[N], ref[N];
} args_;
// Invoke host reference
void run_reference(struct Arguments *args) {
TYPE *a = args->a;
TYPE *b = args->b;
TYPE *ref = args->ref;
for (int i = 0; i < N; ++i) {
ref[i] = a[i] + b[i];
}
}
void vecadd(TYPE *a, TYPE *b, TYPE *c) {
#pragma ss config
{
#pragma ss stream
#pragma ss dfg dedicated unroll(4)
for (int i = 0; i < N; ++i) {
c[i] = a[i] + b[i];
}
}
}
// Invoke accelerator
void run_accelerator(struct Arguments *args) {
vecadd(args->a, args->b, args->c);
}
// compare the results
int sanity_check(struct Arguments *args) {
compare(args->c, args->ref, N, "%ld");
return 1;
}
struct Arguments *init_data() {
// data initialization
init_odd(args_.a, N);
init_even(args_.b, N);
return &args_;
}