bones-compiler 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +117 -0
- data/LICENSE +9 -0
- data/README.rdoc +126 -0
- data/Rakefile +107 -0
- data/VERSION +1 -0
- data/bin/bones +20 -0
- data/examples/applications/ffos.c +552 -0
- data/examples/benchmarks/2mm.c +70 -0
- data/examples/benchmarks/3mm.c +81 -0
- data/examples/benchmarks/adi.c +81 -0
- data/examples/benchmarks/atax.c +65 -0
- data/examples/benchmarks/bicg.c +67 -0
- data/examples/benchmarks/cholesky.c +64 -0
- data/examples/benchmarks/common.h +168 -0
- data/examples/benchmarks/correlation.c +97 -0
- data/examples/benchmarks/covariance.c +77 -0
- data/examples/benchmarks/doitgen.c +63 -0
- data/examples/benchmarks/durbin.c +76 -0
- data/examples/benchmarks/dynprog.c +67 -0
- data/examples/benchmarks/fdtd-2d-apml.c +114 -0
- data/examples/benchmarks/fdtd-2d.c +74 -0
- data/examples/benchmarks/floyd-warshall.c +50 -0
- data/examples/benchmarks/gemm.c +69 -0
- data/examples/benchmarks/gemver.c +89 -0
- data/examples/benchmarks/gesummv.c +64 -0
- data/examples/benchmarks/gramschmidt.c +84 -0
- data/examples/benchmarks/jacobi-1d-imper.c +55 -0
- data/examples/benchmarks/jacobi-2d-imper.c +61 -0
- data/examples/benchmarks/lu.c +57 -0
- data/examples/benchmarks/ludcmp.c +91 -0
- data/examples/benchmarks/mvt.c +65 -0
- data/examples/benchmarks/overview.txt +38 -0
- data/examples/benchmarks/reg_detect.c +82 -0
- data/examples/benchmarks/saxpy.c +45 -0
- data/examples/benchmarks/seidel-2d.c +51 -0
- data/examples/benchmarks/symm.c +74 -0
- data/examples/benchmarks/syr2k.c +65 -0
- data/examples/benchmarks/syrk.c +62 -0
- data/examples/benchmarks/trisolv.c +57 -0
- data/examples/benchmarks/trmm.c +57 -0
- data/examples/chunk/example1.c +54 -0
- data/examples/chunk/example2.c +44 -0
- data/examples/chunk/example3.c +59 -0
- data/examples/chunk/example4.c +55 -0
- data/examples/chunk/example5.c +52 -0
- data/examples/element/example1.c +46 -0
- data/examples/element/example10.c +50 -0
- data/examples/element/example11.c +47 -0
- data/examples/element/example12.c +56 -0
- data/examples/element/example2.c +46 -0
- data/examples/element/example3.c +58 -0
- data/examples/element/example4.c +49 -0
- data/examples/element/example5.c +56 -0
- data/examples/element/example6.c +46 -0
- data/examples/element/example7.c +54 -0
- data/examples/element/example8.c +45 -0
- data/examples/element/example9.c +48 -0
- data/examples/neighbourhood/example1.c +54 -0
- data/examples/neighbourhood/example2.c +55 -0
- data/examples/neighbourhood/example3.c +82 -0
- data/examples/neighbourhood/example4.c +52 -0
- data/examples/shared/example1.c +45 -0
- data/examples/shared/example2.c +51 -0
- data/examples/shared/example3.c +55 -0
- data/examples/shared/example4.c +52 -0
- data/examples/shared/example5.c +48 -0
- data/lib/bones.rb +266 -0
- data/lib/bones/algorithm.rb +541 -0
- data/lib/bones/engine.rb +386 -0
- data/lib/bones/preprocessor.rb +161 -0
- data/lib/bones/species.rb +196 -0
- data/lib/bones/structure.rb +94 -0
- data/lib/bones/variable.rb +169 -0
- data/lib/bones/variablelist.rb +72 -0
- data/lib/castaddon.rb +27 -0
- data/lib/castaddon/index.rb +40 -0
- data/lib/castaddon/node.rb +753 -0
- data/lib/castaddon/type.rb +37 -0
- data/skeletons/CPU-C/common/epilogue.c +0 -0
- data/skeletons/CPU-C/common/globals.c +17 -0
- data/skeletons/CPU-C/common/globals_kernel.c +1 -0
- data/skeletons/CPU-C/common/header.c +0 -0
- data/skeletons/CPU-C/common/mem_copy_D2H.c +0 -0
- data/skeletons/CPU-C/common/mem_copy_H2D.c +0 -0
- data/skeletons/CPU-C/common/mem_epilogue.c +0 -0
- data/skeletons/CPU-C/common/mem_prologue.c +3 -0
- data/skeletons/CPU-C/common/prologue.c +0 -0
- data/skeletons/CPU-C/common/timer_1_start.c +0 -0
- data/skeletons/CPU-C/common/timer_1_stop.c +0 -0
- data/skeletons/CPU-C/common/timer_2_start.c +20 -0
- data/skeletons/CPU-C/common/timer_2_stop.c +8 -0
- data/skeletons/CPU-C/kernel/default.host.c +3 -0
- data/skeletons/CPU-C/kernel/default.kernel.c +15 -0
- data/skeletons/CPU-C/skeletons.txt +24 -0
- data/skeletons/CPU-OPENCL-AMD/common/epilogue.c +6 -0
- data/skeletons/CPU-OPENCL-AMD/common/globals.c +155 -0
- data/skeletons/CPU-OPENCL-AMD/common/globals_kernel.c +4 -0
- data/skeletons/CPU-OPENCL-AMD/common/header.c +0 -0
- data/skeletons/CPU-OPENCL-AMD/common/mem_copy_D2H.c +8 -0
- data/skeletons/CPU-OPENCL-AMD/common/mem_copy_H2D.c +4 -0
- data/skeletons/CPU-OPENCL-AMD/common/mem_epilogue.c +3 -0
- data/skeletons/CPU-OPENCL-AMD/common/mem_prologue.c +6 -0
- data/skeletons/CPU-OPENCL-AMD/common/prologue.c +24 -0
- data/skeletons/CPU-OPENCL-AMD/common/timer_1_start.c +5 -0
- data/skeletons/CPU-OPENCL-AMD/common/timer_1_stop.c +9 -0
- data/skeletons/CPU-OPENCL-AMD/common/timer_2_start.c +16 -0
- data/skeletons/CPU-OPENCL-AMD/common/timer_2_stop.c +11 -0
- data/skeletons/CPU-OPENCL-AMD/kernel/D-element-to-1-shared.host.c +67 -0
- data/skeletons/CPU-OPENCL-AMD/kernel/D-element-to-1-shared.kernel.cl +72 -0
- data/skeletons/CPU-OPENCL-AMD/kernel/default.host.c +14 -0
- data/skeletons/CPU-OPENCL-AMD/kernel/default.kernel.cl +13 -0
- data/skeletons/CPU-OPENCL-AMD/skeletons.txt +26 -0
- data/skeletons/CPU-OPENCL-INTEL/common/epilogue.c +3 -0
- data/skeletons/CPU-OPENCL-INTEL/common/globals.c +154 -0
- data/skeletons/CPU-OPENCL-INTEL/common/globals_kernel.c +4 -0
- data/skeletons/CPU-OPENCL-INTEL/common/header.c +31 -0
- data/skeletons/CPU-OPENCL-INTEL/common/mem_copy_D2H.c +5 -0
- data/skeletons/CPU-OPENCL-INTEL/common/mem_copy_H2D.c +3 -0
- data/skeletons/CPU-OPENCL-INTEL/common/mem_epilogue.c +3 -0
- data/skeletons/CPU-OPENCL-INTEL/common/mem_prologue.c +4 -0
- data/skeletons/CPU-OPENCL-INTEL/common/prologue.c +24 -0
- data/skeletons/CPU-OPENCL-INTEL/common/timer_1_start.c +5 -0
- data/skeletons/CPU-OPENCL-INTEL/common/timer_1_stop.c +9 -0
- data/skeletons/CPU-OPENCL-INTEL/common/timer_2_start.c +16 -0
- data/skeletons/CPU-OPENCL-INTEL/common/timer_2_stop.c +11 -0
- data/skeletons/CPU-OPENCL-INTEL/kernel/D-element-to-1-shared.host.c +67 -0
- data/skeletons/CPU-OPENCL-INTEL/kernel/D-element-to-1-shared.kernel.cl +72 -0
- data/skeletons/CPU-OPENCL-INTEL/kernel/default.host.c +14 -0
- data/skeletons/CPU-OPENCL-INTEL/kernel/default.kernel.cl +13 -0
- data/skeletons/CPU-OPENCL-INTEL/skeletons.txt +26 -0
- data/skeletons/CPU-OPENMP/common/epilogue.c +0 -0
- data/skeletons/CPU-OPENMP/common/globals.c +37 -0
- data/skeletons/CPU-OPENMP/common/globals_kernel.c +6 -0
- data/skeletons/CPU-OPENMP/common/header.c +0 -0
- data/skeletons/CPU-OPENMP/common/mem_copy_D2H.c +0 -0
- data/skeletons/CPU-OPENMP/common/mem_copy_H2D.c +0 -0
- data/skeletons/CPU-OPENMP/common/mem_epilogue.c +0 -0
- data/skeletons/CPU-OPENMP/common/mem_prologue.c +3 -0
- data/skeletons/CPU-OPENMP/common/prologue.c +0 -0
- data/skeletons/CPU-OPENMP/common/timer_1_start.c +12 -0
- data/skeletons/CPU-OPENMP/common/timer_1_stop.c +0 -0
- data/skeletons/CPU-OPENMP/common/timer_2_start.c +18 -0
- data/skeletons/CPU-OPENMP/common/timer_2_stop.c +8 -0
- data/skeletons/CPU-OPENMP/kernel/D-element-to-1-shared.host.c +27 -0
- data/skeletons/CPU-OPENMP/kernel/D-element-to-1-shared.kernel.c +46 -0
- data/skeletons/CPU-OPENMP/kernel/default.host.c +11 -0
- data/skeletons/CPU-OPENMP/kernel/default.kernel.c +18 -0
- data/skeletons/CPU-OPENMP/skeletons.txt +26 -0
- data/skeletons/GPU-CUDA/common/epilogue.c +0 -0
- data/skeletons/GPU-CUDA/common/globals.c +31 -0
- data/skeletons/GPU-CUDA/common/globals_kernel.c +4 -0
- data/skeletons/GPU-CUDA/common/header.c +0 -0
- data/skeletons/GPU-CUDA/common/mem_copy_D2H.c +3 -0
- data/skeletons/GPU-CUDA/common/mem_copy_H2D.c +3 -0
- data/skeletons/GPU-CUDA/common/mem_epilogue.c +3 -0
- data/skeletons/GPU-CUDA/common/mem_prologue.c +5 -0
- data/skeletons/GPU-CUDA/common/prologue.c +6 -0
- data/skeletons/GPU-CUDA/common/timer_1_start.c +6 -0
- data/skeletons/GPU-CUDA/common/timer_1_stop.c +10 -0
- data/skeletons/GPU-CUDA/common/timer_2_start.c +6 -0
- data/skeletons/GPU-CUDA/common/timer_2_stop.c +10 -0
- data/skeletons/GPU-CUDA/kernel/2xN-N-chunk-1-N-to-D-element.host.c +3 -0
- data/skeletons/GPU-CUDA/kernel/2xN-N-chunk-1-N-to-D-element.kernel.cu +105 -0
- data/skeletons/GPU-CUDA/kernel/D-element-to-1-shared.host.c +3 -0
- data/skeletons/GPU-CUDA/kernel/D-element-to-1-shared.kernel.cu +119 -0
- data/skeletons/GPU-CUDA/kernel/D-element-to-N-shared.host.c +3 -0
- data/skeletons/GPU-CUDA/kernel/D-element-to-N-shared.kernel.cu +166 -0
- data/skeletons/GPU-CUDA/kernel/N-N-chunk-1-N-to-D-element.host.c +3 -0
- data/skeletons/GPU-CUDA/kernel/N-N-chunk-1-N-to-D-element.kernel.cu +69 -0
- data/skeletons/GPU-CUDA/kernel/N-neighbourhood-N-to-N-element.host.c +3 -0
- data/skeletons/GPU-CUDA/kernel/N-neighbourhood-N-to-N-element.kernel.cu +42 -0
- data/skeletons/GPU-CUDA/kernel/default.host.c +3 -0
- data/skeletons/GPU-CUDA/kernel/default.kernel.cu +28 -0
- data/skeletons/GPU-CUDA/skeletons.txt +30 -0
- data/skeletons/GPU-OPENCL-AMD/common/epilogue.c +3 -0
- data/skeletons/GPU-OPENCL-AMD/common/globals.c +155 -0
- data/skeletons/GPU-OPENCL-AMD/common/globals_kernel.c +4 -0
- data/skeletons/GPU-OPENCL-AMD/common/header.c +0 -0
- data/skeletons/GPU-OPENCL-AMD/common/mem_copy_D2H.c +4 -0
- data/skeletons/GPU-OPENCL-AMD/common/mem_copy_H2D.c +4 -0
- data/skeletons/GPU-OPENCL-AMD/common/mem_epilogue.c +3 -0
- data/skeletons/GPU-OPENCL-AMD/common/mem_prologue.c +3 -0
- data/skeletons/GPU-OPENCL-AMD/common/prologue.c +24 -0
- data/skeletons/GPU-OPENCL-AMD/common/timer_1_start.c +5 -0
- data/skeletons/GPU-OPENCL-AMD/common/timer_1_stop.c +9 -0
- data/skeletons/GPU-OPENCL-AMD/common/timer_2_start.c +4 -0
- data/skeletons/GPU-OPENCL-AMD/common/timer_2_stop.c +11 -0
- data/skeletons/GPU-OPENCL-AMD/kernel/D-element-to-1-shared.host.c +67 -0
- data/skeletons/GPU-OPENCL-AMD/kernel/D-element-to-1-shared.kernel.cl +72 -0
- data/skeletons/GPU-OPENCL-AMD/kernel/default.host.c +14 -0
- data/skeletons/GPU-OPENCL-AMD/kernel/default.kernel.cl +13 -0
- data/skeletons/GPU-OPENCL-AMD/skeletons.txt +26 -0
- data/skeletons/verification/header.c +2 -0
- data/skeletons/verification/timer_start.c +4 -0
- data/skeletons/verification/timer_stop.c +6 -0
- data/skeletons/verification/verify_results.c +23 -0
- data/test/bones/test_algorithm.rb +40 -0
- data/test/bones/test_common.rb +54 -0
- data/test/bones/test_preprocessor.rb +46 -0
- data/test/bones/test_species.rb +21 -0
- data/test/bones/test_variable.rb +84 -0
- data/test/test_helper.rb +106 -0
- metadata +303 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
//
|
2
|
+
// This file is part of the Bones source-to-source compiler examples. This C-code
|
3
|
+
// example is meant to illustrate the use of Bones. For more information on Bones
|
4
|
+
// use the contact information below.
|
5
|
+
//
|
6
|
+
// == More information on Bones
|
7
|
+
// Contact............Cedric Nugteren <c.nugteren@tue.nl>
|
8
|
+
// Web address........http://parse.ele.tue.nl/bones/
|
9
|
+
//
|
10
|
+
// == File information
|
11
|
+
// Filename...........neighbourhood/example4.c
|
12
|
+
// Author.............Cedric Nugteren
|
13
|
+
// Last modified on...16-April-2012
|
14
|
+
//
|
15
|
+
|
16
|
+
#include <stdio.h>
|
17
|
+
|
18
|
+
// This is 'example4', demonstrating naming (optional) in the classification to distingish the two input arrays
|
19
|
+
int main(void) {
|
20
|
+
int i;
|
21
|
+
float factor;
|
22
|
+
int size = 512;
|
23
|
+
|
24
|
+
// Declare input/output arrays
|
25
|
+
float A[size];
|
26
|
+
float B[size];
|
27
|
+
float C[size];
|
28
|
+
|
29
|
+
// Set the input data
|
30
|
+
for(i=0;i<size;i++) {
|
31
|
+
A[i] = i*2.3;
|
32
|
+
B[i] = i+6.0;
|
33
|
+
}
|
34
|
+
|
35
|
+
// Perform the computation
|
36
|
+
#pragma species kernel B[0:size-1]|neighbourhood(-1:1) ^ A[0:size-1]|element -> C[0:size-1]|element
|
37
|
+
for(i=0;i<size;i++) {
|
38
|
+
factor = A[i]/100.0;
|
39
|
+
if ((i >= 1) && (i < size-1)) {
|
40
|
+
C[i] = factor*(B[i-1]+B[i]+B[i+1]);
|
41
|
+
}
|
42
|
+
else {
|
43
|
+
C[i] = B[i];
|
44
|
+
}
|
45
|
+
}
|
46
|
+
#pragma species endkernel example4
|
47
|
+
|
48
|
+
// Clean-up and exit the function
|
49
|
+
fflush(stdout);
|
50
|
+
return 0;
|
51
|
+
}
|
52
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
//
|
2
|
+
// This file is part of the Bones source-to-source compiler examples. This C-code
|
3
|
+
// example is meant to illustrate the use of Bones. For more information on Bones
|
4
|
+
// use the contact information below.
|
5
|
+
//
|
6
|
+
// == More information on Bones
|
7
|
+
// Contact............Cedric Nugteren <c.nugteren@tue.nl>
|
8
|
+
// Web address........http://parse.ele.tue.nl/bones/
|
9
|
+
//
|
10
|
+
// == File information
|
11
|
+
// Filename...........shared/example1.c
|
12
|
+
// Author.............Cedric Nugteren
|
13
|
+
// Last modified on...16-April-2012
|
14
|
+
//
|
15
|
+
|
16
|
+
#include <stdio.h>
|
17
|
+
#include <stdlib.h>
|
18
|
+
#define SIZE 512*1024
|
19
|
+
|
20
|
+
// This is 'example1', a basic associative and commutative reduction to scalar
|
21
|
+
int main(void) {
|
22
|
+
int i;
|
23
|
+
|
24
|
+
// Declare input/output arrays
|
25
|
+
int *A = (int *)malloc(SIZE*sizeof(int));
|
26
|
+
int B[1];
|
27
|
+
|
28
|
+
// Set the input data
|
29
|
+
for(i=0;i<SIZE;i++) {
|
30
|
+
A[i] = 1;
|
31
|
+
}
|
32
|
+
|
33
|
+
// Perform the computation
|
34
|
+
B[0] = 0;
|
35
|
+
#pragma species kernel 0:SIZE-1|element -> 0:0|shared
|
36
|
+
for(i=0;i<SIZE;i++) {
|
37
|
+
B[0] = B[0] + A[i];
|
38
|
+
}
|
39
|
+
#pragma species endkernel example1
|
40
|
+
|
41
|
+
// Clean-up and exit the function
|
42
|
+
fflush(stdout);
|
43
|
+
return 0;
|
44
|
+
}
|
45
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
//
|
2
|
+
// This file is part of the Bones source-to-source compiler examples. This C-code
|
3
|
+
// example is meant to illustrate the use of Bones. For more information on Bones
|
4
|
+
// use the contact information below.
|
5
|
+
//
|
6
|
+
// == More information on Bones
|
7
|
+
// Contact............Cedric Nugteren <c.nugteren@tue.nl>
|
8
|
+
// Web address........http://parse.ele.tue.nl/bones/
|
9
|
+
//
|
10
|
+
// == File information
|
11
|
+
// Filename...........shared/example2.c
|
12
|
+
// Author.............Cedric Nugteren
|
13
|
+
// Last modified on...09-May-2012
|
14
|
+
//
|
15
|
+
|
16
|
+
#include <stdio.h>
|
17
|
+
|
18
|
+
// This is 'example2', demonstrating a 3D input reduction to scalar
|
19
|
+
int main(void) {
|
20
|
+
int a,b,c;
|
21
|
+
|
22
|
+
// Declare input/output arrays
|
23
|
+
float in[8][16][32];
|
24
|
+
float out[1];
|
25
|
+
|
26
|
+
// Set the input data
|
27
|
+
for(a=0;a<8;a++) {
|
28
|
+
for(b=0;b<16;b++) {
|
29
|
+
for(c=0;c<32;c++) {
|
30
|
+
in[a][b][c] = 1;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
// Perform the computation
|
36
|
+
out[0] = 0;
|
37
|
+
#pragma species kernel 0:7,0:15,0:31|element -> 0:0|shared
|
38
|
+
for(a=0;a<8;a++) {
|
39
|
+
for(b=0;b<16;b++) {
|
40
|
+
for(c=0;c<32;c++) {
|
41
|
+
out[0] = out[0] + in[a][b][c];
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
#pragma species endkernel example2
|
46
|
+
|
47
|
+
// Clean-up and exit the function
|
48
|
+
fflush(stdout);
|
49
|
+
return 0;
|
50
|
+
}
|
51
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
//
|
2
|
+
// This file is part of the Bones source-to-source compiler examples. This C-code
|
3
|
+
// example is meant to illustrate the use of Bones. For more information on Bones
|
4
|
+
// use the contact information below.
|
5
|
+
//
|
6
|
+
// == More information on Bones
|
7
|
+
// Contact............Cedric Nugteren <c.nugteren@tue.nl>
|
8
|
+
// Web address........http://parse.ele.tue.nl/bones/
|
9
|
+
//
|
10
|
+
// == File information
|
11
|
+
// Filename...........shared/example3.c
|
12
|
+
// Author.............Cedric Nugteren
|
13
|
+
// Last modified on...16-April-2012
|
14
|
+
//
|
15
|
+
|
16
|
+
#include <stdio.h>
|
17
|
+
#include <stdlib.h>
|
18
|
+
#define SIZE 1024
|
19
|
+
|
20
|
+
// This is 'example3', demonstrating a reduction to a 2D array
|
21
|
+
int main(void) {
|
22
|
+
int i,p,q;
|
23
|
+
int index1,index2;
|
24
|
+
|
25
|
+
// Declare input/output arrays
|
26
|
+
int *in = (int *)malloc(SIZE*sizeof(int));
|
27
|
+
int B[20][10];
|
28
|
+
|
29
|
+
// Set the input data
|
30
|
+
for(i=0;i<SIZE;i++) {
|
31
|
+
in[i] = (SIZE-i);
|
32
|
+
}
|
33
|
+
|
34
|
+
// Set the output to zero before starting
|
35
|
+
for(p=0;p<20;p++) {
|
36
|
+
for(q=0;q<10;q++) {
|
37
|
+
B[p][q] = 0;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
// Perform the computation
|
42
|
+
#pragma species kernel 0:SIZE-1|element -> 0:19,0:9|shared
|
43
|
+
for(i=0;i<SIZE;i++) {
|
44
|
+
index1 = in[i]%20;
|
45
|
+
index2 = in[i]%10;
|
46
|
+
B[index1][index2] = B[index1][index2] + 1;
|
47
|
+
}
|
48
|
+
#pragma species endkernel example3
|
49
|
+
|
50
|
+
// Clean-up and exit the function
|
51
|
+
free(in);
|
52
|
+
fflush(stdout);
|
53
|
+
return 0;
|
54
|
+
}
|
55
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
//
|
2
|
+
// This file is part of the Bones source-to-source compiler examples. This C-code
|
3
|
+
// example is meant to illustrate the use of Bones. For more information on Bones
|
4
|
+
// use the contact information below.
|
5
|
+
//
|
6
|
+
// == More information on Bones
|
7
|
+
// Contact............Cedric Nugteren <c.nugteren@tue.nl>
|
8
|
+
// Web address........http://parse.ele.tue.nl/bones/
|
9
|
+
//
|
10
|
+
// == File information
|
11
|
+
// Filename...........shared/example4.c
|
12
|
+
// Author.............Cedric Nugteren
|
13
|
+
// Last modified on...16-April-2012
|
14
|
+
//
|
15
|
+
|
16
|
+
#include <stdio.h>
|
17
|
+
#include <stdlib.h>
|
18
|
+
#define SIZE 1024*1024
|
19
|
+
|
20
|
+
// This is 'example4', demonstrating a basic 256-bin histogram computation
|
21
|
+
int main(void) {
|
22
|
+
int i;
|
23
|
+
unsigned char index;
|
24
|
+
|
25
|
+
// Declare input/output arrays
|
26
|
+
unsigned char *A = (unsigned char *)malloc(SIZE*sizeof(unsigned char));
|
27
|
+
int B[256];
|
28
|
+
|
29
|
+
// Set the input data
|
30
|
+
for(i=0;i<SIZE;i++) {
|
31
|
+
A[i] = i%256;
|
32
|
+
}
|
33
|
+
|
34
|
+
// Set the output to zero before starting
|
35
|
+
for (i=0;i<256;i++) {
|
36
|
+
B[i] = 0;
|
37
|
+
}
|
38
|
+
|
39
|
+
// Perform the computation
|
40
|
+
#pragma species kernel 0:SIZE-1|element -> 0:255|shared
|
41
|
+
for(i=0;i<SIZE;i++) {
|
42
|
+
index = A[i];
|
43
|
+
B[index]++;
|
44
|
+
}
|
45
|
+
#pragma species endkernel example4
|
46
|
+
|
47
|
+
// Clean-up and exit the function
|
48
|
+
free(A);
|
49
|
+
fflush(stdout);
|
50
|
+
return 0;
|
51
|
+
}
|
52
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
//
|
2
|
+
// This file is part of the Bones source-to-source compiler examples. This C-code
|
3
|
+
// example is meant to illustrate the use of Bones. For more information on Bones
|
4
|
+
// use the contact information below.
|
5
|
+
//
|
6
|
+
// == More information on Bones
|
7
|
+
// Contact............Cedric Nugteren <c.nugteren@tue.nl>
|
8
|
+
// Web address........http://parse.ele.tue.nl/bones/
|
9
|
+
//
|
10
|
+
// == File information
|
11
|
+
// Filename...........shared/example5.c
|
12
|
+
// Author.............Cedric Nugteren
|
13
|
+
// Last modified on...07-May-2012
|
14
|
+
//
|
15
|
+
|
16
|
+
#include <stdio.h>
|
17
|
+
|
18
|
+
// This is 'example5', demonstrating an inner-loop only classification of a reduction to scalar
|
19
|
+
int main(void) {
|
20
|
+
int a,b,c;
|
21
|
+
|
22
|
+
// Declare input/output arrays
|
23
|
+
float in[16][16];
|
24
|
+
float out[1];
|
25
|
+
|
26
|
+
// Set the input data
|
27
|
+
out[0] = -1;
|
28
|
+
for(a=0;a<16;a++) {
|
29
|
+
for(b=0;b<16;b++) {
|
30
|
+
in[a][b] = 1.001;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
// Perform the computation
|
35
|
+
for(a=0;a<16;a++) {
|
36
|
+
#pragma species kernel a:a,0:a|element -> 0:0|shared
|
37
|
+
for(b=0;b<=a;b++) {
|
38
|
+
out[0] = out[0] - in[a][b]*in[a][b];
|
39
|
+
}
|
40
|
+
#pragma species endkernel example5
|
41
|
+
out[0] = 1.002;
|
42
|
+
}
|
43
|
+
|
44
|
+
// Clean-up and exit the function
|
45
|
+
fflush(stdout);
|
46
|
+
return 0;
|
47
|
+
}
|
48
|
+
|
data/lib/bones.rb
ADDED
@@ -0,0 +1,266 @@
|
|
1
|
+
|
2
|
+
# Bones requires 'fileutils' from the Ruby standard library.
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
# Bones uses the 'trollop' gem to parse command line options.
|
6
|
+
require 'rubygems'
|
7
|
+
require 'trollop'
|
8
|
+
|
9
|
+
# We define a custom error class for code generation related
|
10
|
+
# errors (any error raised by Bones).
|
11
|
+
class CodeGenError < StandardError #:nodoc:
|
12
|
+
end
|
13
|
+
def raise_error(message) #:nodoc:
|
14
|
+
puts Bones::ERROR+message
|
15
|
+
raise CodeGenError, 'Error encountered, stopping execution of Bones'
|
16
|
+
end
|
17
|
+
|
18
|
+
# Extending the Ruby standard string class to support some
|
19
|
+
# addition methods. They include a hack of the gsub! command,
|
20
|
+
# and two methods related to comma removal.
|
21
|
+
class String #:nodoc:
|
22
|
+
|
23
|
+
# Extend the Ruby string class to be able to chain 'gsub!'
|
24
|
+
#-commands. This code is taken from the web.
|
25
|
+
meth = 'gsub!'
|
26
|
+
orig_meth = "orig_#{meth}"
|
27
|
+
alias_method orig_meth, meth
|
28
|
+
define_method(meth) do |*args|
|
29
|
+
self.send(orig_meth, *args)
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
# Replace double comma's in a string with a single comma.
|
34
|
+
# This method is useful for function-argument lists.
|
35
|
+
def remove_double_commas
|
36
|
+
return self.gsub!(/(,\s*){2,}/,',')
|
37
|
+
end
|
38
|
+
|
39
|
+
# Remove a comma before a closing bracket in a string, for
|
40
|
+
# example: ',)'. This method is useful for function-argument
|
41
|
+
# lists.
|
42
|
+
def remove_extra_commas
|
43
|
+
return self.gsub!(/,\s*\)/,')')
|
44
|
+
end
|
45
|
+
|
46
|
+
# This function repeatedly applies the remove double commas
|
47
|
+
# and remove extra commas functions
|
48
|
+
def remove_extras
|
49
|
+
return self.remove_double_commas.remove_extra_commas.remove_double_commas.remove_extra_commas
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
# The Bones module keeps all the Bones classes and constants
|
55
|
+
# together. It contains the classes:
|
56
|
+
# * Engine The main component of the Bones tool, providing the high-level tool flow.
|
57
|
+
# * Preprocessor A C-preprocessor, extracting class information from source code.
|
58
|
+
# * Algorithm An individual algorithm, containing an algorithm classification, code and more.
|
59
|
+
# * Species A class representing an algorithm class (or: species).
|
60
|
+
# * Variable A class for individual variables (not related to CAST).
|
61
|
+
# * Structure A class inheriting from the String class, representing parts of the algorithm classification.
|
62
|
+
#
|
63
|
+
# The module also contains a list of inter-class constants.
|
64
|
+
module Bones
|
65
|
+
|
66
|
+
# Set the newline character
|
67
|
+
NL = "\n"
|
68
|
+
# Set the tab size (currently: 2 spaces)
|
69
|
+
INDENT = ' '
|
70
|
+
|
71
|
+
# A string given as a start of an informative message. See also ERROR and WARNING.
|
72
|
+
MESSAGE = '[Bones] ### Info : '
|
73
|
+
# A string given as a start of an warning message. See also ERROR and MESSAGE.
|
74
|
+
WARNING = '[Bones] ### Warning: '
|
75
|
+
# A string given as a start of an error message. See also MESSAGE and WARNING.
|
76
|
+
ERROR = '[Bones] ### Error : '
|
77
|
+
|
78
|
+
# Gives a string representing an read-only variable. See also OUTPUT, INOUT and DIRECTIONS.
|
79
|
+
INPUT = 'in'
|
80
|
+
# Gives a string representing an write-only variable. See also INPUT, INOUT and DIRECTIONS.
|
81
|
+
OUTPUT = 'out'
|
82
|
+
# Gives a string representing an read/write variable. See also INPUT, OUTPUT and DIRECTIONS.
|
83
|
+
INOUT = 'inout'
|
84
|
+
# Gives a list of all directions considered. Makes use of the INPUT and OUTPUT constants.
|
85
|
+
DIRECTIONS = [INPUT,OUTPUT]
|
86
|
+
|
87
|
+
# A string representing the combination character ('^') of a species. See also ARROW and PIPE.
|
88
|
+
WEDGE = '^'
|
89
|
+
# A string representing the production character ('->') of a species. See also WEDGE and PIPE.
|
90
|
+
ARROW = '->'
|
91
|
+
# A string representing the pipe character ('|') of a species. See also WEDGE and ARROW.
|
92
|
+
PIPE = '|'
|
93
|
+
# A string representing the colon character (':') to separate ranges in dimensions.
|
94
|
+
RANGE_SEP = ':'
|
95
|
+
# A string representing the comma character (',') to separate different ranges.
|
96
|
+
DIM_SEP = ','
|
97
|
+
|
98
|
+
# Sets the prefix used by variables in the skeleton library. This is used in LOCAL_MEMORY, GLOBAL_ID, LOCAL_ID, GLOBAL_SIZE and LOCAL_SIZE.
|
99
|
+
VARIABLE_PREFIX = 'bones_'
|
100
|
+
# Sets the variable name for the local memory variable in the skeleton library.
|
101
|
+
LOCAL_MEMORY = VARIABLE_PREFIX+'local_memory'
|
102
|
+
# Sets the variable name for the thread private (i.e. register) memory variable in the skeleton library.
|
103
|
+
PRIVATE_MEMORY = VARIABLE_PREFIX+'private_memory'
|
104
|
+
# Sets the variable name for the global memory thread index in the skeleton library.
|
105
|
+
GLOBAL_ID = VARIABLE_PREFIX+'global_id'
|
106
|
+
# Sets the variable name for the local memory thread index in the skeleton library.
|
107
|
+
LOCAL_ID = VARIABLE_PREFIX+'local_id'
|
108
|
+
# Sets the variable name for the global memory size as used in the skeleton library.
|
109
|
+
GLOBAL_SIZE = VARIABLE_PREFIX+'global_size'
|
110
|
+
# Sets the variable name for the local memory size as used in the skeleton library.
|
111
|
+
LOCAL_SIZE = VARIABLE_PREFIX+'local_size'
|
112
|
+
# Provide a function definition for the initialization C-code (if present). See als INITIALIZATION_CODE.
|
113
|
+
INITIALIZATION_DEFINITION = 'void '+VARIABLE_PREFIX+'initialize_target(void);'
|
114
|
+
# Provide a function call to the initialization C-code (if present). See als INITIALIZATION_DEFINITION.
|
115
|
+
INITIALIZATION_CODE = VARIABLE_PREFIX+'initialize_target();'
|
116
|
+
# Sets the name for the 'golden' output, required for verification purposes.
|
117
|
+
GOLDEN = VARIABLE_PREFIX+'golden'
|
118
|
+
# Sets the loop variable name for the 'golden' output, required for verification purposes.
|
119
|
+
LOOP = VARIABLE_PREFIX+'loop'
|
120
|
+
# Constant to set the device variable name
|
121
|
+
DEVICE = 'device_'
|
122
|
+
|
123
|
+
# Provides the starting marker for a search-and-replace variable. See also SAR_MARKER2.
|
124
|
+
SAR_MARKER1 = '<'
|
125
|
+
# Provides the ending marker for a search-and-replace variable. See also SAR_MARKER1.
|
126
|
+
SAR_MARKER2 = '>'
|
127
|
+
|
128
|
+
# Set the start of a function definition, used in the skeleton library files. See also END_DEFINITION.
|
129
|
+
START_DEFINITION = '\/\* STARTDEF'
|
130
|
+
# Set the end of a function definition, used in the skeleton library files. See also START_DEFINITION.
|
131
|
+
END_DEFINITION = 'ENDDEF \*\/'
|
132
|
+
|
133
|
+
# This class is created to be a parent class of the Bones
|
134
|
+
# engine, the Bones species and the Bones algorithm class.
|
135
|
+
class Common
|
136
|
+
|
137
|
+
# Helper to obtain the 'from' part from a range. For example,
|
138
|
+
# the method will yield '1' if applied to '1:N-1'.
|
139
|
+
def from(range)
|
140
|
+
return '('+simplify(range.split(RANGE_SEP)[0])+')'
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
# Helper to obtain the 'to' part from a range. For example,
|
145
|
+
# the method will yield 'N-1' if applied to '1:N-1'.
|
146
|
+
def to(range)
|
147
|
+
return '('+simplify(range.split(RANGE_SEP)[1])+')'
|
148
|
+
end
|
149
|
+
|
150
|
+
# Helper to obtain the sum of a range. For example, the method
|
151
|
+
# will yield 'N-2' if applied to '1:N-1'. There is a check to
|
152
|
+
# ensure that the range is correct.
|
153
|
+
def sum(range)
|
154
|
+
raise_error('Incorrect range given: "'+range+'"') if range.split(RANGE_SEP).length != 2
|
155
|
+
return '('+simplify("(#{to(range)}-#{from(range)}+1)")+')'
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
# Helper to obtain the sum and 'from' part of a range. For
|
160
|
+
# example, the method will yield '((N-2)+1)' if applied to '1:N-1'.
|
161
|
+
def sum_and_from(range)
|
162
|
+
return '('+simplify(sum(range)+'+'+from(range))+')'
|
163
|
+
end
|
164
|
+
|
165
|
+
# This method flattens a multidimensional hash into a one
|
166
|
+
# dimensional hash. This method is called recursively.
|
167
|
+
def flatten_hash(hash,flat_hash={},prefix='')
|
168
|
+
hash.each do |key,value|
|
169
|
+
if value.is_a?(Hash)
|
170
|
+
flatten_hash(value,flat_hash,prefix+key.to_s+'_')
|
171
|
+
else
|
172
|
+
flat_hash[(prefix+key.to_s).to_sym] = value
|
173
|
+
end
|
174
|
+
end
|
175
|
+
return flat_hash
|
176
|
+
end
|
177
|
+
|
178
|
+
# This method performs a search-and-replace. It searches
|
179
|
+
# for the <index> of the input hash and replaces it with
|
180
|
+
# the corresponding key. It searches for to-be-replaced
|
181
|
+
# variables of the form '<name>'. If such patterns still
|
182
|
+
# occur after searching and replacing, the method raises
|
183
|
+
# an error.
|
184
|
+
def search_and_replace!(hash,code)
|
185
|
+
flat_hash = flatten_hash(hash)
|
186
|
+
2.times do
|
187
|
+
flat_hash.each { |search,replace| code.gsub!(SAR_MARKER1+search.to_s+SAR_MARKER2,replace) }
|
188
|
+
end
|
189
|
+
raise_error('Unrecognized replace variable "'+($~).to_s+'" in the skeleton library') if code =~ /<[a-zA-Z]+\w*>/
|
190
|
+
end
|
191
|
+
|
192
|
+
# This method calls search_and_replace! to replaces markers
|
193
|
+
# in code with a hash of search-and-replace values. Before,
|
194
|
+
# it clones the existing code so that the original copy is
|
195
|
+
# maintained.
|
196
|
+
def search_and_replace(hash,code)
|
197
|
+
new_code = code.clone
|
198
|
+
search_and_replace!(hash,new_code)
|
199
|
+
return new_code
|
200
|
+
end
|
201
|
+
|
202
|
+
# Method to process the defines in a piece of code. The code
|
203
|
+
# must be formatted as a string. It returns a copy of the code
|
204
|
+
# with all defines replaced.
|
205
|
+
def replace_defines(original_code,defines)
|
206
|
+
code = original_code.clone
|
207
|
+
list = defines.sort_by { |key,value| key.to_s.length }
|
208
|
+
list.reverse.each do |pair|
|
209
|
+
search = pair[0].to_s
|
210
|
+
replace = pair[1]
|
211
|
+
code.gsub!(search,replace)
|
212
|
+
end
|
213
|
+
return code
|
214
|
+
end
|
215
|
+
|
216
|
+
# Helper method to evaluate mathematical expressions, possibly containing
|
217
|
+
# symbols. This method is only used for readability, without it the code
|
218
|
+
# is functionally correct, but expressions might be larger than needed.
|
219
|
+
# This method is only tested on integers.
|
220
|
+
def simplify(expr)
|
221
|
+
raise_error('Invalid expression to simplify') if !expr
|
222
|
+
done = false
|
223
|
+
while !done do
|
224
|
+
old_expr = expr
|
225
|
+
case expr
|
226
|
+
when /^\(([^\(\)]*)\)$/ then expr = $1 # Remove outer brackets
|
227
|
+
when /(.*)\((-?\w*)\)(.*)/ then expr = $1+$2+$3 # Remove brackets with one constant or variable inside
|
228
|
+
when /(.*)\(\(([^\(\)]*)\)\)(.*)/ then expr = $1+'('+$2+')'+$3 # Substitute double brackets into single brackets
|
229
|
+
when /(.*)(\-\d+)\*(\d+)\b(.*)/ then expr = $1+'+'+(($2.to_i)*($3.to_i)).to_s+$4 # Perform multiplications on constants (starting with a '-')
|
230
|
+
when /(.*)(\-\d+)\+(\d+)\b(.*)/ then expr = $1+'+'+(($2.to_i)+($3.to_i)).to_s+$4 # Perform additions on constants (starting with a '-')
|
231
|
+
when /(.*)(\-\d+)\-(\d+)\b(.*)/ then expr = $1+'+'+(($2.to_i)-($3.to_i)).to_s+$4 # Perform subtractions on constants (starting with a '-')
|
232
|
+
when /(.*)\b(\d+)\*(\d+)\b(.*)/ then expr = $1+(($2.to_i)*($3.to_i)).to_s+$4 # Perform multiplications on constants
|
233
|
+
when /(.*)\b(\d+)\+(\d+)\b(.*)/ then expr = $1+(($2.to_i)+($3.to_i)).to_s+$4 # Perform additions on constants
|
234
|
+
when /(.*)\b(\d+)\-(\d+)\b(.*)/ then expr = $1+(($2.to_i)-($3.to_i)).to_s+$4 # Perform subtractions on constants
|
235
|
+
when /(.*)\b(\w+)\-(\2)\b(.*)/ then expr = $1+'0'+$4 # Perform subtractions of variables to zero (e.g. 'a-a=0')
|
236
|
+
when /(.*)\/1\b(.*)/ then expr = $1+$2 # Remove divisions by 1
|
237
|
+
when /(.*)(\+0\b|\b0\+)(.*)/ then expr = $1+$3 # Remove additions with 0
|
238
|
+
when /(.*[\+\(])\(([^\(\)\*\/\%]+)\)([\+\-\)].*)/ then expr = $1+$2+$3 # Remove brackets that are not needed (e.g. '(a+b)+c')
|
239
|
+
end
|
240
|
+
expr.gsub!(/\s/,'') # Remove whitespaces
|
241
|
+
expr.gsub!(/\-\-/,'+') # Substitute double minusses for a plus
|
242
|
+
expr.gsub!(/\+\-/,'-') # Substitute plus-minus for a minus
|
243
|
+
expr.gsub!(/(^|\()\+/,'') # Remove plus signs at the start of a line or after an opening bracket
|
244
|
+
if expr =~ /(.*)\b(\d+)\/(\d+)\b(.*)/ # Perform divisions on constants...
|
245
|
+
division = ($2.to_i)/($3.to_i) # ...but first check whether the result will be correct (integer division)
|
246
|
+
expr = $1+division.to_s+$4 if division*$3.to_i == $2.to_i
|
247
|
+
end
|
248
|
+
done = true if old_expr == expr
|
249
|
+
end
|
250
|
+
return expr
|
251
|
+
end
|
252
|
+
|
253
|
+
end
|
254
|
+
|
255
|
+
end
|
256
|
+
|
257
|
+
# This list of require's makes sure all Bones classes are
|
258
|
+
# included. The order is not important here.
|
259
|
+
require 'bones/structure.rb'
|
260
|
+
require 'bones/species.rb'
|
261
|
+
require 'bones/algorithm.rb'
|
262
|
+
require 'bones/variablelist.rb'
|
263
|
+
require 'bones/variable.rb'
|
264
|
+
require 'bones/preprocessor.rb'
|
265
|
+
require 'bones/engine.rb'
|
266
|
+
|