diff options
| author | Derick Huth <derickhuth@gmail.com> | 2016-02-10 11:13:08 -0700 | 
|---|---|---|
| committer | Derick Huth <derickhuth@gmail.com> | 2016-02-10 11:13:08 -0700 | 
| commit | 1dd03ee01bff2a70e758ce984476527f3ff42c68 (patch) | |
| tree | 9731867c7019ec9b6ee111c8fa9f92a92119b5ec /test-chill/unit-tests/cpp_validate_prog | |
| parent | 4631ad76927d433da5d55c3c373a1dfd0f74c9d4 (diff) | |
| parent | d68532f2f3ba332199f84818cb047d69a3f33588 (diff) | |
| download | chill-1dd03ee01bff2a70e758ce984476527f3ff42c68.tar.gz chill-1dd03ee01bff2a70e758ce984476527f3ff42c68.tar.bz2 chill-1dd03ee01bff2a70e758ce984476527f3ff42c68.zip | |
Merge pull request #8 from dhuth/master
w/ python test suite
Diffstat (limited to 'test-chill/unit-tests/cpp_validate_prog')
15 files changed, 546 insertions, 0 deletions
| diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_in.py b/test-chill/unit-tests/cpp_validate_prog/mm_in.py new file mode 100755 index 0000000..93eb080 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_in.py @@ -0,0 +1,9 @@ +#!/usr/bin/python + +import struct + +data = list(range(15)) + list(range(10)) + [0]*6 +bindata = ''.join([struct.pack('f',n) for n in data]) +with open('mm.in.data','wb') as f: +    f.write(bindata) + diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one.cc b/test-chill/unit-tests/cpp_validate_prog/mm_one.cc new file mode 100644 index 0000000..6131ae1 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one.cc @@ -0,0 +1,29 @@ +#define AN 3 +#define BM 2 +#define AMBN 5 + +/* + +<test name='mm_small'> + +procedure void mm( +    in  float[3][5] A = matrix([*,*],lambda i,j: random(-8,8)), +    in  float[5][2] B = matrix([*,*],lambda i,j: random(-8,8)), +    out float[3][2] C = matrix([*,*],lambda i,j: 0)) + +</test> + +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    int i; +    int j; +    int k; +    for(i = 0; i < AN; i++) { +        for(j = 0; j < BM; j++) { +            for(k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] * B[k][j]; +            } +        } +    } +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one.testproc b/test-chill/unit-tests/cpp_validate_prog/mm_one.testproc new file mode 100644 index 0000000..a12a963 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one.testproc @@ -0,0 +1,6 @@ + +procedure void mm( +    in  float[3][5] A = matrix([*,*],lambda i,j: random(-8,8)), +    in  float[5][2] B = matrix([*,*],lambda i,j: random(-8,8)), +    out float[3][2] C = matrix([*,*],lambda i,j: 0)) + diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one_defines.cc b/test-chill/unit-tests/cpp_validate_prog/mm_one_defines.cc new file mode 100644 index 0000000..e35f189 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one_defines.cc @@ -0,0 +1,25 @@ + +/* +<test name='mm_small' define="{'AN':3, 'BM':2, 'AMBN':5}"> + +procedure void mm( +    in  float[AN][AMBN] A = matrix([*,*],lambda i,j: random(-8,8)), +    in  float[AMBN][BM] B = matrix([*,*],lambda i,j: random(-8,8)), +    out float[AN][BM]   C = matrix([*,*],lambda i,j: 0)) + +</test> + +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    int i; +    int j; +    int k; +    for(i = 0; i < AN; i++) { +        for(j = 0; j < BM; j++) { +            for(k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] * B[k][j]; +            } +        } +    } +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one_longer_main.cc b/test-chill/unit-tests/cpp_validate_prog/mm_one_longer_main.cc new file mode 100644 index 0000000..5b7e6c1 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one_longer_main.cc @@ -0,0 +1,93 @@ +#define AN 3 +#define BM 2 +#define AMBN 5 +//#define PRINT + +#include <time.h> +#include <fstream> +#include <cstdio> + +/* + +<test name='mm_small'> + +procedure void mm( +    in  float[3][5] A = matrix([*,*],lambda i,j: random(-8,8)), +    in  float[5][2] B = matrix([*,*],lambda i,j: random(-8,8)), +    out float[3][2] C = matrix([*,*],lambda i,j: 0)) + +</test> + +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    int i; +    int j; +    int k; +    for(i = 0; i < AN; i++) { +        for(j = 0; j < BM; j++) { +            C[i][j] = 0; +            for(k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] * B[k][j]; +            } +        } +    } +} + +int main(int argc, char** argv) { +    float A[3][5] = {{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14}}; +    float B[5][2] = {{0,1},{2,3},{4,5},{6,7},{8,9}}; +    float C[3][2] = {{0,0},{0,0},{0,0}}; +    timespec start_time; +    timespec end_time; +     +    if (argc == 3) { +        std::ifstream is(argv[1], std::ifstream::in | std::ifstream::binary); +        is.read((char*)A, 15*sizeof(float)); +        is.read((char*)B, 10*sizeof(float)); +        is.close(); +    } +     +    clock_gettime(CLOCK_REALTIME, &start_time); +    for(int i = 0; i < 10000; i++) { +        mm(A,B,C); +    } +    clock_gettime(CLOCK_REALTIME, &end_time); +     +    if (argc == 3) { +        std::ofstream os(argv[2], std::ofstream::out | std::ofstream::binary); +        os.write((char*)C, 6*sizeof(float)); +        os.close(); +    } +     +    #ifdef PRINT +    std::printf("A:\n"); +    for(int i = 0; i < 3; i++) { +        std::printf("["); +        for(int j = 0; j < 5; j++) { +            std::printf("%f,",A[i][j]); +        } +        std::printf("]\n"); +    } +    std::printf("B:\n"); +    for(int i = 0; i < 5; i++) { +        std::printf("["); +        for(int j = 0; j < 2; j++) { +            std::printf("%f,",B[i][j]); +        } +        std::printf("]\n"); +    } +    std::printf("C:\n"); +    for(int i = 0; i < 3; i++) { +        std::printf("["); +        for(int j = 0; j < 2; j++) { +            std::printf("%f,",C[i][j]); +        } +        std::printf("]\n"); +    } +    #else +    double time_diff = (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec - start_time.tv_nsec)/1000000000.0; +    std::printf("(%f,)", time_diff); +    #endif +    return 0; +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one_longer_wrong_main.cc b/test-chill/unit-tests/cpp_validate_prog/mm_one_longer_wrong_main.cc new file mode 100644 index 0000000..7d96248 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one_longer_wrong_main.cc @@ -0,0 +1,93 @@ +#define AN 3 +#define BM 2 +#define AMBN 5 +//#define PRINT + +#include <time.h> +#include <fstream> +#include <cstdio> + +/* + +<test name='mm_small'> + +procedure void mm( +    in  float[3][5] A = matrix([*,*],lambda i,j: random(-8,8)), +    in  float[5][2] B = matrix([*,*],lambda i,j: random(-8,8)), +    out float[3][2] C = matrix([*,*],lambda i,j: 0)) + +</test> + +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    int i; +    int j; +    int k; +    for(i = 0; i < AN; i++) { +        for(j = 0; j < BM; j++) { +            C[i][j] = 0; +            for(k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] + B[k][j]; +            } +        } +    } +} + +int main(int argc, char** argv) { +    float A[3][5] = {{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14}}; +    float B[5][2] = {{0,1},{2,3},{4,5},{6,7},{8,9}}; +    float C[3][2] = {{0,0},{0,0},{0,0}}; +    timespec start_time; +    timespec end_time; +     +    if (argc == 3) { +        std::ifstream is(argv[1], std::ifstream::in | std::ifstream::binary); +        is.read((char*)A, 15*sizeof(float)); +        is.read((char*)B, 10*sizeof(float)); +        is.close(); +    } +     +    clock_gettime(CLOCK_REALTIME, &start_time); +    for(int i = 0; i < 1000000; i++) { +        mm(A,B,C); +    } +    clock_gettime(CLOCK_REALTIME, &end_time); +     +    if (argc == 3) { +        std::ofstream os(argv[2], std::ofstream::out | std::ofstream::binary); +        os.write((char*)C, 6*sizeof(float)); +        os.close(); +    } +     +    #ifdef PRINT +    std::printf("A:\n"); +    for(int i = 0; i < 3; i++) { +        std::printf("["); +        for(int j = 0; j < 5; j++) { +            std::printf("%f,",A[i][j]); +        } +        std::printf("]\n"); +    } +    std::printf("B:\n"); +    for(int i = 0; i < 5; i++) { +        std::printf("["); +        for(int j = 0; j < 2; j++) { +            std::printf("%f,",B[i][j]); +        } +        std::printf("]\n"); +    } +    std::printf("C:\n"); +    for(int i = 0; i < 3; i++) { +        std::printf("["); +        for(int j = 0; j < 2; j++) { +            std::printf("%f,",C[i][j]); +        } +        std::printf("]\n"); +    } +    #else +    double time_diff = (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec - start_time.tv_nsec)/1000000000.0; +    std::printf("(%f,)", time_diff); +    #endif +    return 0; +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one_main.cc b/test-chill/unit-tests/cpp_validate_prog/mm_one_main.cc new file mode 100644 index 0000000..a03b505 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one_main.cc @@ -0,0 +1,91 @@ +#define AN 3 +#define BM 2 +#define AMBN 5 +//#define PRINT + +#include <time.h> +#include <fstream> +#include <cstdio> + +/* + +<test name='mm_small'> + +procedure void mm( +    in  float[3][5] A = matrix([*,*],lambda i,j: random(-8,8)), +    in  float[5][2] B = matrix([*,*],lambda i,j: random(-8,8)), +    out float[3][2] C = matrix([*,*],lambda i,j: 0)) + +</test> + +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    int i; +    int j; +    int k; +    for(i = 0; i < AN; i++) { +        for(j = 0; j < BM; j++) { +            C[i][j] = 0; +            for(k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] * B[k][j]; +            } +        } +    } +} + +int main(int argc, char** argv) { +    float A[3][5] = {{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14}}; +    float B[5][2] = {{0,1},{2,3},{4,5},{6,7},{8,9}}; +    float C[3][2] = {{0,0},{0,0},{0,0}}; +    timespec start_time; +    timespec end_time; +     +    if (argc == 3) { +        std::ifstream is(argv[1], std::ifstream::in | std::ifstream::binary); +        is.read((char*)A, 15*sizeof(float)); +        is.read((char*)B, 10*sizeof(float)); +        is.close(); +    } +     +    clock_gettime(CLOCK_REALTIME, &start_time); +    mm(A,B,C); +    clock_gettime(CLOCK_REALTIME, &end_time); +     +    if (argc == 3) { +        std::ofstream os(argv[2], std::ofstream::out | std::ofstream::binary); +        os.write((char*)C, 6*sizeof(float)); +        os.close(); +    } +     +    #ifdef PRINT +    std::printf("A:\n"); +    for(int i = 0; i < 3; i++) { +        std::printf("["); +        for(int j = 0; j < 5; j++) { +            std::printf("%f,",A[i][j]); +        } +        std::printf("]\n"); +    } +    std::printf("B:\n"); +    for(int i = 0; i < 5; i++) { +        std::printf("["); +        for(int j = 0; j < 2; j++) { +            std::printf("%f,",B[i][j]); +        } +        std::printf("]\n"); +    } +    std::printf("C:\n"); +    for(int i = 0; i < 3; i++) { +        std::printf("["); +        for(int j = 0; j < 2; j++) { +            std::printf("%f,",C[i][j]); +        } +        std::printf("]\n"); +    } +    #else +    double time_diff = (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec - start_time.tv_nsec)/1000000000.0; +    std::printf("(%f,)", time_diff); +    #endif +    return 0; +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one_out.cc b/test-chill/unit-tests/cpp_validate_prog/mm_one_out.cc new file mode 100644 index 0000000..6151301 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one_out.cc @@ -0,0 +1,60 @@ +#include <time.h> +#include <fstream> +#include <cstdio> + + +#define AN 3 +#define BM 2 +#define AMBN 5 + +/* + +<test name='mm_small'> + +procedure void mm( +    in  float[3][5] A = matrix([*,*],lambda i,j: random(-8,8)), +    in  float[5][2] B = matrix([*,*],lambda i,j: random(-8,8)), +    out float[3][2] C = matrix([*,*],lambda i,j: 0)) + +</test> + +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    int i; +    int j; +    int k; +    for(i = 0; i < AN; i++) { +        for(j = 0; j < BM; j++) { +            for(k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] * B[k][j]; +            } +        } +    } +} + +int main(int argc, char** argv) { +    float A[3][5]; +    float B[5][2]; +    float C[3][2]; +    timespec start_time; +    timespec end_time; +     +    std::ifstream datafile_initialize(argv[1]); +    datafile_initialize.read((char*)A, 15*sizeof(float)); +    datafile_initialize.read((char*)B, 10*sizeof(float)); +    datafile_initialize.read((char*)C, 6*sizeof(float)); +    datafile_initialize.close(); +     +    clock_gettime(CLOCK_REALTIME, &start_time); +    mm(A,B,C); +    clock_gettime(CLOCK_REALTIME, &end_time); +     +    std::ofstream datafile_out(argv[2]); +    datafile_out.write((char*)C, 6*sizeof(float)); +    datafile_out.close(); +     +    double time_diff = (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec - start_time.tv_nsec)/1000000000.0; +    std::printf("(%f,)", time_diff); +    return 0; +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one_with.cc b/test-chill/unit-tests/cpp_validate_prog/mm_one_with.cc new file mode 100644 index 0000000..9cb0ae4 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one_with.cc @@ -0,0 +1,30 @@ +#define AN 3 +#define BM 2 +#define AMBN 5 + +/* + +<test name='mm_small'> + +with {evendist2:lambda i,j: random(-8,8), zero2:lambda i,j: 0} +procedure void mm( +    in  float[3][5] A = matrix([*,*],evendist2), +    in  float[5][2] B = matrix([*,*],evendist2), +    out float[3][2] C = matrix([*,*],zero2)) + +</test> + +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    int i; +    int j; +    int k; +    for(i = 0; i < AN; i++) { +        for(j = 0; j < BM; j++) { +            for(k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] * B[k][j]; +            } +        } +    } +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one_with.testproc b/test-chill/unit-tests/cpp_validate_prog/mm_one_with.testproc new file mode 100644 index 0000000..80bc841 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one_with.testproc @@ -0,0 +1,7 @@ + +with {evendist2:lambda i,j: random(-8,8), zero2:lambda i,j: 0} +procedure void mm( +    in  float[3][5] A = matrix([*,*],evendist2), +    in  float[5][2] B = matrix([*,*],evendist2), +    out float[3][2] C = matrix([*,*],zero2)) + diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_one_with_defines.cc b/test-chill/unit-tests/cpp_validate_prog/mm_one_with_defines.cc new file mode 100644 index 0000000..77ce673 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_one_with_defines.cc @@ -0,0 +1,25 @@ + +/* +<test name='mm_small' define="{'AN':3, 'BM':2, 'AMBN':5}"> + +with {evendist2:lambda i,j: random(-8,8), zero2:lambda i,j: 0} +procedure void mm( +    in  float[AN][AMBN] A = matrix([*,*],evendist2), +    in  float[AMBN][BM] B = matrix([*,*],evendist2), +    out float[AN][BM]   C = matrix([*,*],zero2)) + +</test> +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    int i; +    int j; +    int k; +    for(i = 0; i < AN; i++) { +        for(j = 0; j < BM; j++) { +            for(k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] * B[k][j]; +            } +        } +    } +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_three_basic.cc b/test-chill/unit-tests/cpp_validate_prog/mm_three_basic.cc new file mode 100644 index 0000000..49df049 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_three_basic.cc @@ -0,0 +1,33 @@ +/* +<test name=small define="{'AN':2, 'AMBN':5, 'BM':3}"> +    procedure void mm( +        in  float[AN][AMBN] A = matrix([,],lambda i,j: i*AMBN + j), +        in  float[AMBN][BM] B = matrix([,],lambda i,j: i*BM + j), +        out float[AN][BM]   C = matrix([,],lambda i,j: 0)) +</test> + +<test name=medium define="{'AN':20, 'AMBN':50, 'BM':30}"> +    procedure void mm( +        in  float[AN][AMBN] A = matrix([,],lambda i,j: i*AMBN + j), +        in  float[AMBN][BM] B = matrix([,],lambda i,j: i*BM + j), +        out float[AN][BM]   C = matrix([,],lambda i,j: 0)) +</test> + +<test name=big define="{'AN':200, 'AMBN':500, 'BM':300}"> +    procedure void mm( +        in  float[AN][AMBN] A = matrix([,],lambda i,j: i*AMBN + j), +        in  float[AMBN][BM] B = matrix([,],lambda i,j: i*BM + j), +        out float[AN][BM]   C = matrix([,],lambda i,j: 0)) +</test> +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    for(int i = 0; i < AN; i++) { +        for(int j = 0; j < BM; j++) { +            C[i][j] = 0; +            for(int k = 0; k < AMBN; k++) { +                C[i][j] += A[i][k] * B[k][j]; +            } +        } +    } +} diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_three_basic.cc.data b/test-chill/unit-tests/cpp_validate_prog/mm_three_basic.cc.dataBinary files differ new file mode 100644 index 0000000..82c5ce6 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_three_basic.cc.data diff --git a/test-chill/unit-tests/cpp_validate_prog/mm_three_slow.cc b/test-chill/unit-tests/cpp_validate_prog/mm_three_slow.cc new file mode 100644 index 0000000..dd8c7e7 --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/mm_three_slow.cc @@ -0,0 +1,35 @@ +/* +<test name=small define="{'AN':2, 'AMBN':5, 'BM':3}"> +    procedure void mm( +        in  float[AN][AMBN] A = matrix([,],lambda i,j: i*AMBN + j), +        in  float[AMBN][BM] B = matrix([,],lambda i,j: i*BM + j), +        out float[AN][BM]   C = matrix([,],lambda i,j: 0)) +</test> + +<test name=medium define="{'AN':20, 'AMBN':50, 'BM':30}"> +    procedure void mm( +        in  float[AN][AMBN] A = matrix([,],lambda i,j: i*AMBN + j), +        in  float[AMBN][BM] B = matrix([,],lambda i,j: i*BM + j), +        out float[AN][BM]   C = matrix([,],lambda i,j: 0)) +</test> + +<test name=big define="{'AN':200, 'AMBN':500, 'BM':300}"> +    procedure void mm( +        in  float[AN][AMBN] A = matrix([,],lambda i,j: i*AMBN + j), +        in  float[AMBN][BM] B = matrix([,],lambda i,j: i*BM + j), +        out float[AN][BM]   C = matrix([,],lambda i,j: 0)) +</test> +*/ + +void mm(float A[AN][AMBN], float B[AMBN][BM], float C[AN][BM]) { +    for(int w = 0; w < 100; w++) { +        for(int i = 0; i < AN; i++) { +            for(int j = 0; j < BM; j++) { +                C[i][j] = 0; +                for(int k = 0; k < AMBN; k++) { +                    C[i][j] += A[i][k] * B[k][j]; +                } +            } +        } +    } +} diff --git a/test-chill/unit-tests/cpp_validate_prog/print_mm_out.py b/test-chill/unit-tests/cpp_validate_prog/print_mm_out.py new file mode 100755 index 0000000..fefbd2a --- /dev/null +++ b/test-chill/unit-tests/cpp_validate_prog/print_mm_out.py @@ -0,0 +1,10 @@ +#!/usr/bin/python + +import struct +import numpy as np + +with open('mm.out.data','rb') as f: +    data = f.read() + +mat = np.array([struct.unpack_from('f',data,n*4) for n in range(len(data)/4)]).reshape((3,2)) +print(mat) | 
