annotate fft/fftw/fftw-3.3.4/support/addchain.c @ 40:223f770b5341 kissfft-double tip

Try a double-precision kissfft
author Chris Cannam
date Wed, 07 Sep 2016 10:40:32 +0100
parents 26056e866c29
children
rev   line source
Chris@19 1 /* addition-chain optimizer */
Chris@19 2 #include <stdio.h>
Chris@19 3 #include <stdlib.h>
Chris@19 4 #include <unistd.h>
Chris@19 5
Chris@19 6 static int verbose;
Chris@19 7 static int mulcost = 18;
Chris@19 8 static int ldcost = 2;
Chris@19 9 static int sqcost = 10;
Chris@19 10 static int reflcost = 8;
Chris@19 11 #define INFTY 100000
Chris@19 12
Chris@19 13 static int *answer;
Chris@19 14 static int best_so_far;
Chris@19 15
Chris@19 16 static void print_answer(int n, int t)
Chris@19 17 {
Chris@19 18 int i;
Chris@19 19 printf("| (%d, %d) -> [", n, t);
Chris@19 20 for (i = 0; i < t; ++i)
Chris@19 21 printf("%d;", answer[i]);
Chris@19 22 printf("] (* %d *)\n", best_so_far);
Chris@19 23 }
Chris@19 24
Chris@19 25 #define DO(i, j, k, cst) \
Chris@19 26 if (k < n) { \
Chris@19 27 int c = A[i] + A[j] + cst; \
Chris@19 28 if (c < A[k]) { \
Chris@19 29 A[k] = c; \
Chris@19 30 changed = 1; \
Chris@19 31 } \
Chris@19 32 }
Chris@19 33
Chris@19 34 #define DO3(i, j, l, k, cst) \
Chris@19 35 if (k < n) { \
Chris@19 36 int c = A[i] + A[j] + A[l] + cst; \
Chris@19 37 if (c < A[k]) { \
Chris@19 38 A[k] = c; \
Chris@19 39 changed = 1; \
Chris@19 40 } \
Chris@19 41 }
Chris@19 42
Chris@19 43 static int optimize(int n, int *A)
Chris@19 44 {
Chris@19 45 int i, j, k, changed, cst, cstmax;
Chris@19 46
Chris@19 47 do {
Chris@19 48 changed = 0;
Chris@19 49 for (i = 0; i < n; ++i) {
Chris@19 50 k = i + i;
Chris@19 51 DO(i, i, k, sqcost);
Chris@19 52 }
Chris@19 53
Chris@19 54 for (i = 0; i < n; ++i) {
Chris@19 55 for (j = 0; j <= i; ++j) {
Chris@19 56 k = i + j;
Chris@19 57 DO(i, j, k, mulcost);
Chris@19 58 k = i - j;
Chris@19 59 DO(i, j, k, mulcost);
Chris@19 60
Chris@19 61 k = i + j;
Chris@19 62 DO3(i, j, i - j, k, reflcost);
Chris@19 63 }
Chris@19 64 }
Chris@19 65
Chris@19 66 } while (changed);
Chris@19 67
Chris@19 68 cst = cstmax = 0;
Chris@19 69 for (i = 0; i < n; ++i) {
Chris@19 70 cst += A[i];
Chris@19 71 if (A[i] > cstmax) cstmax = A[i];
Chris@19 72 }
Chris@19 73 /* return cstmax; */
Chris@19 74 return cst;
Chris@19 75 }
Chris@19 76
Chris@19 77 static void search(int n, int t, int *A, int *B, int depth)
Chris@19 78 {
Chris@19 79 if (depth == 0) {
Chris@19 80 int i, tc;
Chris@19 81 for (i = 0; i < n; ++i)
Chris@19 82 A[i] = INFTY;
Chris@19 83 A[0] = 0; /* always free */
Chris@19 84 for (i = 1; i <= t; ++i)
Chris@19 85 A[B[-i]] = ldcost;
Chris@19 86
Chris@19 87 tc = optimize(n, A);
Chris@19 88 if (tc < best_so_far) {
Chris@19 89 best_so_far = tc;
Chris@19 90 for (i = 1; i <= t; ++i)
Chris@19 91 answer[t - i] = B[-i];
Chris@19 92 if (verbose)
Chris@19 93 print_answer(n, t);
Chris@19 94 }
Chris@19 95 } else {
Chris@19 96 for (B[0] = B[-1] + 1; B[0] < n; ++B[0])
Chris@19 97 search(n, t, A, B + 1, depth - 1);
Chris@19 98 }
Chris@19 99 }
Chris@19 100
Chris@19 101 static void doit(int n, int t)
Chris@19 102 {
Chris@19 103 int *A;
Chris@19 104 int *B;
Chris@19 105
Chris@19 106 A = malloc(n * sizeof(int));
Chris@19 107 B = malloc((t + 1) * sizeof(int));
Chris@19 108 answer = malloc(t * sizeof(int));
Chris@19 109
Chris@19 110 B[0] = 0;
Chris@19 111 best_so_far = INFTY;
Chris@19 112 search(n, t, A, B + 1, t);
Chris@19 113
Chris@19 114 print_answer(n, t);
Chris@19 115
Chris@19 116 free(A); free(B); free(answer);
Chris@19 117 }
Chris@19 118
Chris@19 119 int main(int argc, char *argv[])
Chris@19 120 {
Chris@19 121 int n = 32;
Chris@19 122 int t = 3;
Chris@19 123 int all;
Chris@19 124 int ch;
Chris@19 125
Chris@19 126 verbose = 0;
Chris@19 127 all = 0;
Chris@19 128 while ((ch = getopt(argc, argv, "n:t:m:l:r:s:va")) != -1) {
Chris@19 129 switch (ch) {
Chris@19 130 case 'n':
Chris@19 131 n = atoi(optarg);
Chris@19 132 break;
Chris@19 133 case 't':
Chris@19 134 t = atoi(optarg);
Chris@19 135 break;
Chris@19 136 case 'm':
Chris@19 137 mulcost = atoi(optarg);
Chris@19 138 break;
Chris@19 139 case 'l':
Chris@19 140 ldcost = atoi(optarg);
Chris@19 141 break;
Chris@19 142 case 's':
Chris@19 143 sqcost = atoi(optarg);
Chris@19 144 break;
Chris@19 145 case 'r':
Chris@19 146 reflcost = atoi(optarg);
Chris@19 147 break;
Chris@19 148 case 'v':
Chris@19 149 ++verbose;
Chris@19 150 break;
Chris@19 151 case 'a':
Chris@19 152 ++all;
Chris@19 153 break;
Chris@19 154 case '?':
Chris@19 155 fprintf(stderr, "use the source\n");
Chris@19 156 exit(1);
Chris@19 157 }
Chris@19 158 }
Chris@19 159
Chris@19 160 if (all) {
Chris@19 161 for (n = 4; n <= 64; n *= 2) {
Chris@19 162 int n1 = n - 1; if (n1 > 7) n1 = 7;
Chris@19 163 for (t = 1; t <= n1; ++t)
Chris@19 164 doit(n, t);
Chris@19 165 }
Chris@19 166 } else {
Chris@19 167 doit(n, t);
Chris@19 168 }
Chris@19 169
Chris@19 170 return 0;
Chris@19 171 }