]> git.proxmox.com Git - ceph.git/blob - ceph/src/erasure-code/jerasure/gf-complete/tools/gf_methods.c
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / erasure-code / jerasure / gf-complete / tools / gf_methods.c
1 /*
2 * GF-Complete: A Comprehensive Open Source Library for Galois Field Arithmetic
3 * James S. Plank, Ethan L. Miller, Kevin M. Greenan,
4 * Benjamin A. Arnold, John A. Burnum, Adam W. Disney, Allen C. McBride.
5 *
6 * gf_methods.c
7 *
8 * Lists supported methods (incomplete w.r.t. GROUP and COMPOSITE)
9 */
10
11 #include <stdio.h>
12 #include <stdint.h>
13 #include <string.h>
14 #include <stdlib.h>
15
16 #include "gf_complete.h"
17 #include "gf_method.h"
18 #include "gf_int.h"
19
20 #define BNMULTS (8)
21 static char *BMULTS[BNMULTS] = { "CARRY_FREE", "GROUP48",
22 "TABLE", "LOG", "SPLIT4", "SPLIT8", "SPLIT88", "COMPOSITE" };
23 #define NMULTS (17)
24 static char *MULTS[NMULTS] = { "SHIFT", "CARRY_FREE", "CARRY_FREE_GK", "GROUP44", "GROUP48", "BYTWO_p", "BYTWO_b",
25 "TABLE", "LOG", "LOG_ZERO", "LOG_ZERO_EXT", "SPLIT2",
26 "SPLIT4", "SPLIT8", "SPLIT16", "SPLIT88", "COMPOSITE" };
27
28 /* Make sure CAUCHY is last */
29
30 #define NREGIONS (7)
31 static char *REGIONS[NREGIONS] = { "DOUBLE", "QUAD", "LAZY", "SIMD", "NOSIMD",
32 "ALTMAP", "CAUCHY" };
33
34 #define BNREGIONS (4)
35 static char *BREGIONS[BNREGIONS] = { "DOUBLE", "QUAD", "ALTMAP", "CAUCHY" };
36
37 #define NDIVS (2)
38 static char *divides[NDIVS] = { "MATRIX", "EUCLID" };
39
40 void usage(char *s)
41 {
42 fprintf(stderr, "usage: gf_methods w -BADC -LXUMDRB\n");
43 fprintf(stderr, "\n");
44 fprintf(stderr, " w can be 1-32, 64, 128\n");
45 fprintf(stderr, "\n");
46 fprintf(stderr, " -B lists basic methods that are useful\n");
47 fprintf(stderr, " -A does a nearly exhaustive listing\n");
48 fprintf(stderr, " -D adds EUCLID and MATRIX division\n");
49 fprintf(stderr, " -C adds CAUCHY when possible\n");
50 fprintf(stderr, " Combinations are fine.\n");
51 fprintf(stderr, "\n");
52 fprintf(stderr, " -L Simply lists methods\n");
53 fprintf(stderr, " -X List methods and functions selected (compile with DEBUG_FUNCTIONS)\n");
54 fprintf(stderr, " -U Produces calls to gf_unit\n");
55 fprintf(stderr, " -M Produces calls to time_tool.sh for single multiplications\n");
56 fprintf(stderr, " -D Produces calls to time_tool.sh for single divisions\n");
57 fprintf(stderr, " -R Produces calls to time_tool.sh for region multiplications\n");
58 fprintf(stderr, " -B Produces calls to time_tool.sh for the fastest region multiplications\n");
59 fprintf(stderr, " Cannot combine L, U, T.\n");
60 if (s != NULL) {
61 fprintf(stderr, "\n");
62 fprintf(stderr, "%s\n", s);
63 }
64 exit(1);
65 }
66
67 void print_methods(gf_t *gf)
68 {
69 #ifdef DEBUG_FUNCTIONS
70 gf_internal_t *h = (gf_internal_t*) gf->scratch;
71
72 printf("multiply = %s\n", h->multiply);
73 printf("divide = %s\n", h->divide);
74 printf("inverse = %s\n", h->inverse);
75 printf("multiply_region = %s\n", h->multiply_region);
76 printf("extract_word = %s\n", h->extract_word);
77 #endif
78 }
79
80 int main(int argc, char *argv[])
81 {
82 int m, r, d, w, i, sa, j, k, reset, ok;
83 int nregions;
84 int nmults;
85 char **regions;
86 char **mults;
87 int exhaustive = 0;
88 int divide = 0;
89 int cauchy = 0;
90 int listing;
91 char *gf_argv[50], *x;
92 gf_t gf;
93 char ls[10];
94 char * w_str;
95
96 if (argc != 4) usage(NULL);
97 w = atoi(argv[1]);
98 ok = (w >= 1 && w <= 32);
99 if (w == 64) ok = 1;
100 if (w == 128) ok = 1;
101 if (!ok) usage("Bad w");
102
103 if (argv[2][0] != '-' || argv[3][0] != '-' || strlen(argv[2]) == 1 || strlen(argv[3]) != 2) {
104 usage(NULL);
105 }
106 for (i = 1; argv[2][i] != '\0'; i++) {
107 switch(argv[2][i]) {
108 case 'B': exhaustive = 0; break;
109 case 'A': exhaustive = 1; break;
110 case 'D': divide = 1; break;
111 case 'C': cauchy = 1; break;
112 default: usage("Bad -BADC");
113 }
114 }
115
116 if (strchr("LXUMDRB", argv[3][1]) == NULL) { usage("Bad -LXUMDRB"); }
117 listing = argv[3][1];
118
119 if (listing == 'U') {
120 w_str = "../test/gf_unit %d A -1";
121 } else if (listing == 'L' || listing == 'X') {
122 w_str = "w=%d:";
123 } else {
124 w_str = strdup("sh time_tool.sh X %d");
125 x = strchr(w_str, 'X');
126 *x = listing;
127 }
128
129 gf_argv[0] = "-";
130 if (create_gf_from_argv(&gf, w, 1, gf_argv, 0) > 0) {
131 printf(w_str, w);
132 printf(" - \n");
133 gf_free(&gf, 1);
134 } else if (_gf_errno == GF_E_DEFAULT) {
135 fprintf(stderr, "Unlabeled failed method: w=%d: -\n", 2);
136 exit(1);
137 }
138
139 nregions = (exhaustive) ? NREGIONS : BNREGIONS;
140 if (!cauchy) nregions--;
141 regions = (exhaustive) ? REGIONS : BREGIONS;
142 mults = (exhaustive) ? MULTS : BMULTS;
143 nmults = (exhaustive) ? NMULTS : BNMULTS;
144
145
146 for (m = 0; m < nmults; m++) {
147 sa = 0;
148 gf_argv[sa++] = "-m";
149 if (strcmp(mults[m], "GROUP44") == 0) {
150 gf_argv[sa++] = "GROUP";
151 gf_argv[sa++] = "4";
152 gf_argv[sa++] = "4";
153 } else if (strcmp(mults[m], "GROUP48") == 0) {
154 gf_argv[sa++] = "GROUP";
155 gf_argv[sa++] = "4";
156 gf_argv[sa++] = "8";
157 } else if (strcmp(mults[m], "SPLIT2") == 0) {
158 gf_argv[sa++] = "SPLIT";
159 sprintf(ls, "%d", w);
160 gf_argv[sa++] = ls;
161 gf_argv[sa++] = "2";
162 } else if (strcmp(mults[m], "SPLIT4") == 0) {
163 gf_argv[sa++] = "SPLIT";
164 sprintf(ls, "%d", w);
165 gf_argv[sa++] = ls;
166 gf_argv[sa++] = "4";
167 } else if (strcmp(mults[m], "SPLIT8") == 0) {
168 gf_argv[sa++] = "SPLIT";
169 sprintf(ls, "%d", w);
170 gf_argv[sa++] = ls;
171 gf_argv[sa++] = "8";
172 } else if (strcmp(mults[m], "SPLIT16") == 0) {
173 gf_argv[sa++] = "SPLIT";
174 sprintf(ls, "%d", w);
175 gf_argv[sa++] = ls;
176 gf_argv[sa++] = "16";
177 } else if (strcmp(mults[m], "SPLIT88") == 0) {
178 gf_argv[sa++] = "SPLIT";
179 gf_argv[sa++] = "8";
180 gf_argv[sa++] = "8";
181 } else if (strcmp(mults[m], "COMPOSITE") == 0) {
182 gf_argv[sa++] = "COMPOSITE";
183 gf_argv[sa++] = "2";
184 gf_argv[sa++] = "-";
185 } else {
186 gf_argv[sa++] = mults[m];
187 }
188 reset = sa;
189
190
191 for (r = 0; r < (1 << nregions); r++) {
192 sa = reset;
193 for (k = 0; k < nregions; k++) {
194 if (r & (1 << k)) {
195 gf_argv[sa++] = "-r";
196 gf_argv[sa++] = regions[k];
197 }
198 }
199 gf_argv[sa++] = "-";
200
201 /* printf("Hmmmm. %s", gf_argv[0]);
202 for (j = 0; j < sa; j++) printf(" %s", gf_argv[j]);
203 printf("\n"); */
204
205 if (create_gf_from_argv(&gf, w, sa, gf_argv, 0) > 0) {
206 printf(w_str, w);
207 for (j = 0; j < sa; j++) printf(" %s", gf_argv[j]);
208 printf("\n");
209 if (listing == 'X')
210 print_methods(&gf);
211 gf_free(&gf, 1);
212 } else if (_gf_errno == GF_E_DEFAULT) {
213 fprintf(stderr, "Unlabeled failed method: w=%d:", w);
214 for (j = 0; j < sa; j++) fprintf(stderr, " %s", gf_argv[j]);
215 fprintf(stderr, "\n");
216 exit(1);
217 }
218 sa--;
219 if (divide) {
220 for (d = 0; d < NDIVS; d++) {
221 gf_argv[sa++] = "-d";
222 gf_argv[sa++] = divides[d];
223 /* printf("w=%d:", w);
224 for (j = 0; j < sa; j++) printf(" %s", gf_argv[j]);
225 printf("\n"); */
226 gf_argv[sa++] = "-";
227 if (create_gf_from_argv(&gf, w, sa, gf_argv, 0) > 0) {
228 printf(w_str, w);
229 for (j = 0; j < sa; j++) printf(" %s", gf_argv[j]);
230 printf("\n");
231 if (listing == 'X')
232 print_methods(&gf);
233 gf_free(&gf, 1);
234 } else if (_gf_errno == GF_E_DEFAULT) {
235 fprintf(stderr, "Unlabeled failed method: w=%d:", w);
236 for (j = 0; j < sa; j++) fprintf(stderr, " %s", gf_argv[j]);
237 fprintf(stderr, "\n");
238 exit(1);
239 }
240 sa-=3;
241 }
242 }
243 }
244 }
245 return 0;
246 }