int main(int argc, char **argv) { int k, w, i, m, iterations, bufsize; int *matrix; char **data, **coding, **old_values; int *erasures, *erased; uint32_t seed; double t = 0, total_time = 0; gf_t *gf = NULL; if (argc < 8) usage(NULL); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m"); if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); if (sscanf(argv[4], "%d", &seed) == 0) usage("Bad seed"); if (sscanf(argv[5], "%d", &iterations) == 0) usage("Bad iterations"); if (sscanf(argv[6], "%d", &bufsize) == 0) usage("Bad bufsize"); if (w <= 16 && k + m > (1 << w)) usage("k + m is too big"); MOA_Seed(seed); gf = get_gf(w, argc, argv, 7); if (gf == NULL) { usage("Invalid arguments given for GF!\n"); } galois_change_technique(gf, w); matrix = reed_sol_vandermonde_coding_matrix(k, m, w); printf("<HTML><TITLE>reed_sol_time_gf"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</TITLE>\n"); printf("<h3>reed_sol_time_gf"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</h3>\n"); printf("<pre>\n"); printf("Last m rows of the generator matrix (G^T):\n\n"); jerasure_print_matrix(matrix, m, k, w,NULL); printf("\n"); data = talloc(char *, k); for (i = 0; i < k; i++) { data[i] = talloc(char, bufsize); MOA_Fill_Random_Region(data[i], bufsize); } coding = talloc(char *, m); old_values = talloc(char *, m); for (i = 0; i < m; i++) { coding[i] = talloc(char, bufsize); old_values[i] = talloc(char, bufsize); } for (i = 0; i < iterations; i++) { t = timing_now(); jerasure_matrix_encode(k, m, w, matrix, data, coding, bufsize); total_time += timing_now() - t; } printf("Encode throughput for %d iterations: %.2f MB/s (%.2f sec)\n", iterations, (double)(k*iterations*bufsize/1024/1024) / total_time, total_time); erasures = talloc(int, (m+1)); erased = talloc(int, (k+m)); for (i = 0; i < m+k; i++) erased[i] = 0; for (i = 0; i < m; ) { erasures[i] = ((unsigned int)MOA_Random_W(w, 1))%(k+m); if (erased[erasures[i]] == 0) { erased[erasures[i]] = 1; memcpy(old_values[i], (erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], bufsize); bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], bufsize); i++; } } erasures[i] = -1; for (i = 0; i < iterations; i++) { t = timing_now(); jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, bufsize); total_time += timing_now() - t; } printf("Decode throughput for %d iterations: %.2f MB/s (%.2f sec)\n", iterations, (double)(k*iterations*bufsize/1024/1024) / total_time, total_time); for (i = 0; i < m; i++) { if (erasures[i] < k) { if (memcmp(data[erasures[i]], old_values[i], bufsize)) { fprintf(stderr, "Decoding failed for %d!\n", erasures[i]); exit(1); } } else { if (memcmp(coding[erasures[i]-k], old_values[i], bufsize)) { fprintf(stderr, "Decoding failed for %d!\n", erasures[i]); exit(1); } } } return 0; }
int main(int argc, char **argv) { long l; int k, w, i, j, m; int *matrix; char **data, **coding, **old_values; int *erasures, *erased; int *decoding_matrix, *dm_ids; gf_t *gf = NULL; uint32_t seed; if (argc < 6) usage("Not enough command line arguments"); if (sscanf(argv[1], "%d", &k) == 0 || k <= 0) usage("Bad k"); if (sscanf(argv[2], "%d", &m) == 0 || m <= 0) usage("Bad m"); if (sscanf(argv[3], "%d", &w) == 0 || (w != 8 && w != 16 && w != 32)) usage("Bad w"); if (sscanf(argv[4], "%d", &seed) == 0) usage("Bad seed"); if (w <= 16 && k + m > (1 << w)) usage("k + m is too big"); MOA_Seed(seed); gf = get_gf(w, argc, argv, 5); if (gf == NULL) { usage("Invalid arguments given for GF!\n"); } galois_change_technique(gf, w); matrix = reed_sol_vandermonde_coding_matrix(k, m, w); printf("<HTML><TITLE>reed_sol_test_gf"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</TITLE>\n"); printf("<h3>reed_sol_test_gf"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</h3>\n"); printf("<pre>\n"); printf("Last m rows of the generator matrix (G^T):\n\n"); jerasure_print_matrix(matrix, m, k, w); printf("\n"); data = talloc(char *, k); for (i = 0; i < k; i++) { data[i] = talloc(char, BUFSIZE); MOA_Fill_Random_Region(data[i], BUFSIZE); } coding = talloc(char *, m); old_values = talloc(char *, m); for (i = 0; i < m; i++) { coding[i] = talloc(char, BUFSIZE); old_values[i] = talloc(char, BUFSIZE); } jerasure_matrix_encode(k, m, w, matrix, data, coding, BUFSIZE); erasures = talloc(int, (m+1)); erased = talloc(int, (k+m)); for (i = 0; i < m+k; i++) erased[i] = 0; l = 0; for (i = 0; i < m; ) { erasures[i] = ((unsigned int)MOA_Random_W(w,1))%(k+m); if (erased[erasures[i]] == 0) { erased[erasures[i]] = 1; memcpy(old_values[i], (erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], BUFSIZE); bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], BUFSIZE); i++; } } erasures[i] = -1; i = jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, BUFSIZE); for (i = 0; i < m; i++) { if (erasures[i] < k) { if (memcmp(data[erasures[i]], old_values[i], BUFSIZE)) { fprintf(stderr, "Decoding failed for %d!\n", erasures[i]); exit(1); } } else { if (memcmp(coding[erasures[i]-k], old_values[i], BUFSIZE)) { fprintf(stderr, "Decoding failed for %d!\n", erasures[i]); exit(1); } } } printf("Encoding and decoding were both successful.\n"); return 0; }