int jfread(void *ptr, int size, int nmembers, FILE *stream) { if (stream != NULL) return fread(ptr, size, nmembers, stream); MOA_Fill_Random_Region(ptr, size); return size; }
void gf_general_set_up_single_timing_test(int w, void *ra, void *rb, int size) { void *top; gf_general_t g; uint8_t *r8, *r8a; uint16_t *r16; uint32_t *r32; uint64_t *r64; int i; top = rb+size; /* If w is 8, 16, 32, 64 or 128, fill the regions with random bytes. However, don't allow for zeros in rb, because that will screw up division. When w is 4, you fill the regions with random 4-bit words in each byte. Otherwise, treat every four bytes as an uint32_t and fill it with a random value mod (1 << w). */ if (w == 8 || w == 16 || w == 32 || w == 64 || w == 128) { MOA_Fill_Random_Region (ra, size); while (rb < top) { gf_general_set_random(&g, w, 0); switch (w) { case 8: r8 = (uint8_t *) rb; *r8 = g.w32; break; case 16: r16 = (uint16_t *) rb; *r16 = g.w32; break; case 32: r32 = (uint32_t *) rb; *r32 = g.w32; break; case 64: r64 = (uint64_t *) rb; *r64 = g.w64; break; case 128: r64 = (uint64_t *) rb; r64[0] = g.w128[0]; r64[1] = g.w128[1]; break; } rb += (w/8); } } else if (w == 4) { r8a = (uint8_t *) ra; r8 = (uint8_t *) rb; while (r8 < (uint8_t *) top) { gf_general_set_random(&g, w, 1); *r8a = g.w32; gf_general_set_random(&g, w, 0); *r8 = g.w32; r8a++; r8++; } } else { r32 = (uint32_t *) ra; for (i = 0; i < size/4; i++) r32[i] = MOA_Random_W(w, 1); r32 = (uint32_t *) rb; for (i = 0; i < size/4; i++) r32[i] = MOA_Random_W(w, 0); } }
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; }
int main(int argc, char **argv) { int k, m, w, size; int i, j; int *matrix; char **data, **coding; int *erasures, *erased; int *decoding_matrix, *dm_ids; uint32_t seed; if (argc != 6) 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 (w < 32 && k + m > (1 << w)) usage("k + m must be <= 2 ^ w"); if (sscanf(argv[4], "%d", &size) == 0 || size % sizeof(long) != 0) usage("size must be multiple of sizeof(long)"); if (sscanf(argv[5], "%d", &seed) == 0) usage("Bad seed"); matrix = talloc(int, m*k); for (i = 0; i < m; i++) { for (j = 0; j < k; j++) { matrix[i*k+j] = galois_single_divide(1, i ^ (m + j), w); } } printf("<HTML><TITLE>jerasure_05"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</TITLE>\n"); printf("<h3>jerasure_05"); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("</h3>\n"); printf("<pre>\n"); printf("The Coding Matrix (the last m rows of the Generator Matrix G^T):\n\n"); jerasure_print_matrix(matrix, m, k, w); printf("\n"); MOA_Seed(seed); data = talloc(char *, k); for (i = 0; i < k; i++) { data[i] = talloc(char, size); MOA_Fill_Random_Region(data[i], size); } coding = talloc(char *, m); for (i = 0; i < m; i++) { coding[i] = talloc(char, size); } jerasure_matrix_encode(k, m, w, matrix, data, coding, size); printf("Encoding Complete:\n\n"); print_data_and_coding(k, m, w, size, data, coding); 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] = (MOA_Random_W(w, 1))%(k+m); if (erased[erasures[i]] == 0) { erased[erasures[i]] = 1; bzero((erasures[i] < k) ? data[erasures[i]] : coding[erasures[i]-k], size); i++; } } erasures[i] = -1; printf("Erased %d random devices:\n\n", m); print_data_and_coding(k, m, w, size, data, coding); i = jerasure_matrix_decode(k, m, w, matrix, 0, erasures, data, coding, size); printf("State of the system after decoding:\n\n"); print_data_and_coding(k, m, w, size, data, coding); decoding_matrix = talloc(int, k*k); dm_ids = talloc(int, k); for (i = 0; i < m; i++) erased[i] = 1; for (; i < k+m; i++) erased[i] = 0; jerasure_make_decoding_matrix(k, m, w, matrix, erased, decoding_matrix, dm_ids); printf("Suppose we erase the first %d devices. Here is the decoding matrix:\n\n", m); jerasure_print_matrix(decoding_matrix, k, k, w); printf("\n"); printf("And dm_ids:\n\n"); jerasure_print_matrix(dm_ids, 1, k, w); bzero(data[0], size); jerasure_matrix_dotprod(k, w, decoding_matrix, dm_ids, 0, data, coding, size); printf("\nAfter calling jerasure_matrix_dotprod, we calculate the value of device #0 to be:\n\n"); printf("D0 :"); for(i=0;i< size; i+=(w/8)) { printf(" "); for(j=0;j < w/8;j++){ printf("%02x", (unsigned char)data[0][i+j]); } } printf("\n\n"); return 0; }