generate_automake_test_programs.py 6.61 KB
Newer Older
1 2 3 4
#!/usr/bin/env python
from __future__ import print_function
from itertools import product

5 6 7
language_flag = {
    "Fortran": "",
    "C": "_c_version",
Andreas Marek's avatar
Andreas Marek committed
8 9
}

10
domain_flag = {
11 12
    "real":    "-DTEST_REAL",
    "complex": "-DTEST_COMPLEX",
13 14
}
prec_flag = {
15 16
    "double": "-DTEST_DOUBLE",
    "single": "-DTEST_SINGLE",
17 18
}
solver_flag = {
19 20 21 22
    "1stage":         "-DTEST_SOLVER_1STAGE",
    "2stage":         "-DTEST_SOLVER_2STAGE",
    "scalapack_all":  "-DTEST_SCALAPACK_ALL",
    "scalapack_part": "-DTEST_SCALAPACK_PART",
23 24
}
gpu_flag = {
25 26
    0: "-DTEST_GPU=0",
    1: "-DTEST_GPU=1",
27
}
28

Pavel Kus's avatar
Pavel Kus committed
29
matrix_flag = {
30 31 32 33
    "random":   "-DTEST_MATRIX_RANDOM",
    "analytic": "-DTEST_MATRIX_ANALYTIC",
    "toeplitz": "-DTEST_MATRIX_TOEPLITZ",
    "frank":    "-DTEST_MATRIX_FRANK",
Andreas Marek's avatar
Andreas Marek committed
34 35 36
}

qr_flag = {
37 38
    0: "-DTEST_QR_DECOMPOSITION=0",
    1: "-DTEST_QR_DECOMPOSITION=1",
Pavel Kus's avatar
Pavel Kus committed
39
}
40

41
test_type_flag = {
42 43 44 45 46
    "eigenvectors":       "-DTEST_EIGENVECTORS",
    "eigenvalues":        "-DTEST_EIGENVALUES",
    "solve_tridiagonal":  "-DTEST_SOLVE_TRIDIAGONAL",
    "cholesky":           "-DTEST_CHOLESKY",
    "hermitian_multiply": "-DTEST_HERMITIAN_MULTIPLY",
47 48
}

49
layout_flag = {
50 51
    "all_layouts": "-DTEST_ALL_LAYOUTS",
    "square": ""
52 53
}

54 55 56 57 58 59 60 61 62 63 64
for lang, m, g, q, t, p, d, s, lay in product(sorted(language_flag.keys()),
                                              sorted(matrix_flag.keys()),
                                              sorted(gpu_flag.keys()),
                                              sorted(qr_flag.keys()),
                                              sorted(test_type_flag.keys()),
                                              sorted(prec_flag.keys()),
                                              sorted(domain_flag.keys()),
                                              sorted(solver_flag.keys()),
                                              sorted(layout_flag.keys())):

    if lang == "C" and (m == "analytic" or lay == "all_layouts"):
Andreas Marek's avatar
Andreas Marek committed
65 66
        continue

Andreas Marek's avatar
Andreas Marek committed
67 68 69
    # exclude some test combinations

    # analytic tests only for "eigenvectors" and not on GPU
Pavel Kus's avatar
Pavel Kus committed
70
    if(m == "analytic" and (g == 1 or t != "eigenvectors")):
Pavel Kus's avatar
Pavel Kus committed
71 72
        continue

Andreas Marek's avatar
Andreas Marek committed
73
    # Frank tests only for "eigenvectors" and eigenvalues and real double precision case
74
    if(m == "frank" and ((t != "eigenvectors" or t != "eigenvalues") and (d != "real" or p != "double"))):
Andreas Marek's avatar
Andreas Marek committed
75 76
        continue

77
    if(s in ["scalapack_all", "scalapack_part"] and (g == 1 or t != "eigenvectors" or m != "analytic")):
Pavel Kus's avatar
Pavel Kus committed
78 79
        continue

Andreas Marek's avatar
Andreas Marek committed
80
    # solve tridiagonal only for real toeplitz matrix in 1stage
81
    if (t == "solve_tridiagonal" and (s != "1stage" or d != "real" or m != "toeplitz")):
82 83
        continue

Andreas Marek's avatar
Andreas Marek committed
84 85 86 87 88
    # cholesky tests only 1stage and teoplitz matrix
    if (t == "cholesky" and (m != "toeplitz" or s == "2stage")):
        continue

    if (t == "eigenvalues" and (m == "random")):
89 90
        continue

91 92 93
    if (t == "hermitian_multiply" and (s == "2stage")):
        continue

Andreas Marek's avatar
Andreas Marek committed
94 95 96 97 98
    if (t == "hermitian_multiply" and (m == "toeplitz")):
        continue

    # qr only for 2stage real
    if (q == 1 and (s != "2stage" or d != "real" or t != "eigenvectors" or g == 1 or m != "random")):
99 100
        continue

101 102 103
    for kernel in ["all_kernels", "default_kernel"] if s == "2stage" else ["nokernel"]:
        endifs = 0
        extra_flags = []
104 105

        if (t == "eigenvalues" and kernel == "all_kernels"):
106
            continue
107

108 109 110
        if (g == 1):
            print("if WITH_GPU_VERSION")
            endifs += 1
111

112
        if (lay == "all_layouts"):
113 114 115
            print("if WITH_MPI")
            endifs += 1

116
        if (s in ["scalapack_all", "scalapack_part"]):
117 118 119
            print("if WITH_SCALAPACK_TESTS")
            endifs += 1

120 121 122 123
        if kernel == "default_kernel":
            extra_flags.append("-DTEST_KERNEL=ELPA_2STAGE_{0}_DEFAULT".format(d.upper()))
        elif kernel == "all_kernels":
            extra_flags.append("-DTEST_ALL_KERNELS")
124

125 126
        if layout_flag[lay]:
            extra_flags.append(layout_flag[lay])
127

128 129 130 131 132 133 134 135 136
        if (p == "single"):
            if (d == "real"):
                print("if WANT_SINGLE_PRECISION_REAL")
            elif (d == "complex"):
                print("if WANT_SINGLE_PRECISION_COMPLEX")
            else:
                raise Exception("Oh no!")
            endifs += 1

137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
        name = "test{langsuffix}_{d}_{p}_{t}_{s}{kernelsuffix}_{gpusuffix}{qrsuffix}{m}{layoutsuffix}".format(
            langsuffix=language_flag[lang],
            d=d, p=p, t=t, s=s,
            kernelsuffix="" if kernel == "nokernel" else "_" + kernel,
            gpusuffix="gpu_" if g else "",
            qrsuffix="qr_" if q else "",
            m=m,
            layoutsuffix="_all_layouts" if lay == "all_layouts" else "")

        print("if BUILD_KCOMPUTER")
        print("bin_PROGRAMS += " + name)
        print("else")
        print("noinst_PROGRAMS += " + name)
        print("endif")

        print("check_SCRIPTS += " + name + ".sh")

        if lang == "Fortran":
Andreas Marek's avatar
Andreas Marek committed
155 156 157
            print(name + "_SOURCES = test/Fortran/test.F90")
            print(name + "_LDADD = $(test_program_ldadd)")
            print(name + "_FCFLAGS = $(test_program_fcflags) \\")
158 159

        elif lang == "C":
Andreas Marek's avatar
Andreas Marek committed
160 161 162
            print(name + "_SOURCES = test/C/test.c")
            print(name + "_LDADD = $(test_program_ldadd) $(FCLIBS)")
            print(name + "_CFLAGS = $(test_program_fcflags) \\")
163 164 165 166 167 168 169 170 171 172 173 174

        print("  -DTEST_CASE=\\\"{0}\\\" \\".format(name))
        print("  " + " \\\n  ".join([
            domain_flag[d],
            prec_flag[p],
            test_type_flag[t],
            solver_flag[s],
            gpu_flag[g],
            qr_flag[q],
            matrix_flag[m]] + extra_flags))

        print("endif\n" * endifs)
175

Andreas Marek's avatar
Andreas Marek committed
176
for lang, p, d in product(sorted(language_flag.keys()), sorted(prec_flag.keys()), sorted(domain_flag.keys())):
177 178 179 180 181 182 183 184 185 186
    endifs = 0
    if (p == "single"):
        if (d == "real"):
            print("if WANT_SINGLE_PRECISION_REAL")
        elif (d == "complex"):
            print("if WANT_SINGLE_PRECISION_COMPLEX")
        else:
            raise Exception("Oh no!")
        endifs += 1

Andreas Marek's avatar
Andreas Marek committed
187
    name = "test_autotune{langsuffix}_{d}_{p}".format(langsuffix=language_flag[lang], d=d, p=p)
188

Andreas Marek's avatar
Andreas Marek committed
189
    print("check_SCRIPTS += " + name + ".sh")
190
    print("noinst_PROGRAMS += " + name)
Andreas Marek's avatar
Andreas Marek committed
191 192 193 194 195 196 197 198 199 200
    if lang == "Fortran":    
        print(name + "_SOURCES = test/Fortran/test_autotune.F90")
        print(name + "_LDADD = $(test_program_ldadd)")
        print(name + "_FCFLAGS = $(test_program_fcflags) \\")

    elif lang == "C":
        print(name + "_SOURCES = test/C/test_autotune.c")
        print(name + "_LDADD = $(test_program_ldadd) $(FCLIBS)")
        print(name + "_CFLAGS = $(test_program_fcflags) \\")

201
    print("  " + " \\\n  ".join([
202 203
        domain_flag[d],
        prec_flag[p]]))
204
    print("endif\n" * endifs)