diff --git a/examples/mpi/bbp.c b/examples/mpi/bbp.c index 7cf31480..e446d258 100644 --- a/examples/mpi/bbp.c +++ b/examples/mpi/bbp.c @@ -28,37 +28,45 @@ factor2[] = { int main(int argc, const char *argv[]) { - bfdev_mpi_t vq, vv[4]; + bfdev_mpi_t *vv[4]; unsigned int k, i, v; int retval; - bfdev_mpi_init(&vq, NULL); - bfdev_mpi_init(&vv[0], NULL); - bfdev_mpi_init(&vv[1], NULL); - bfdev_mpi_init(&vv[2], NULL); - bfdev_mpi_init(&vv[3], NULL); + BFDEV_CLASS(bfdev_mpi, vq)(NULL); + BFDEV_CLASS(bfdev_mpi, vv1)(NULL); + BFDEV_CLASS(bfdev_mpi, vv2)(NULL); + BFDEV_CLASS(bfdev_mpi, vv3)(NULL); + BFDEV_CLASS(bfdev_mpi, vv4)(NULL); + + if (!vq || !vv1 || !vv2 || !vv3 || !vv4) + return 1; + + vv[0] = vv1; + vv[1] = vv2; + vv[2] = vv3; + vv[3] = vv4; bfdev_log_info("Convergence BBP %d:\n", TEST_LEN); EXAMPLE_TIME_STATISTICAL( for (i = 0; i < 4; ++i) { - retval = bfdev_mpi_seti(&vv[i], 0); + retval = bfdev_mpi_seti(vv[i], 0); if (retval) return retval; v = factor1[i] + (TEST_LEN << 2); - retval = bfdev_mpi_bseti(&vv[i], v); + retval = bfdev_mpi_bseti(vv[i], v); if (retval) return retval; v = factor2[i]; - retval = bfdev_mpi_divi(&vv[i], &vv[i], &vv[i], v); + retval = bfdev_mpi_divi(vv[i], vv[i], vv[i], v); if (retval) return retval; if (i) - retval = bfdev_mpi_sub(&vq, &vq, &vv[i]); + retval = bfdev_mpi_sub(vq, vq, vv[i]); else - retval = bfdev_mpi_add(&vq, &vq, vv); + retval = bfdev_mpi_add(vq, vq, vv[0]); if (retval) return retval; @@ -66,26 +74,26 @@ main(int argc, const char *argv[]) for (k = 1; k < TEST_LEN; ++k) { for (i = 0; i < 4; ++i) { - retval = bfdev_mpi_seti(&vv[i], 0); + retval = bfdev_mpi_seti(vv[i], 0); if (retval) return retval; v = factor1[i] + ((TEST_LEN - k) << 2); - retval = bfdev_mpi_bseti(&vv[i], v); + retval = bfdev_mpi_bseti(vv[i], v); if (retval) return retval; v = factor2[i] | (k << 3); - retval = bfdev_mpi_divi(&vv[i], &vv[i], &vv[i], v); + retval = bfdev_mpi_divi(vv[i], vv[i], vv[i], v); if (retval) return retval; if (i) { - retval = bfdev_mpi_sub(&vq, &vq, &vv[i]); + retval = bfdev_mpi_sub(vq, vq, vv[i]); if (retval) return retval; } else { - retval = bfdev_mpi_add(&vq, &vq, vv); + retval = bfdev_mpi_add(vq, vq, vv[0]); if (retval) return retval; } @@ -97,7 +105,7 @@ main(int argc, const char *argv[]) #if PRINT_RESULT char *result; - result = print_num(&vq, 16); + result = print_num(vq, 16); if (!result) return 1; @@ -106,11 +114,5 @@ main(int argc, const char *argv[]) free(result); #endif - bfdev_mpi_release(&vv[0]); - bfdev_mpi_release(&vv[1]); - bfdev_mpi_release(&vv[2]); - bfdev_mpi_release(&vv[3]); - bfdev_mpi_release(&vq); - return 0; } diff --git a/examples/mpi/fibonacci.c b/examples/mpi/fibonacci.c index 1429aff1..f7233296 100644 --- a/examples/mpi/fibonacci.c +++ b/examples/mpi/fibonacci.c @@ -18,27 +18,30 @@ main(int argc, const char *argv[]) char *result; int retval; - BFDEV_DEFINE_MPI(va, NULL); - BFDEV_DEFINE_MPI(vb, NULL); - BFDEV_DEFINE_MPI(vc, NULL); + BFDEV_CLASS(bfdev_mpi, va)(NULL); + BFDEV_CLASS(bfdev_mpi, vb)(NULL); + BFDEV_CLASS(bfdev_mpi, vc)(NULL); - if ((retval = bfdev_mpi_seti(&va, 1)) || - (retval = bfdev_mpi_seti(&vb, 0)) || - (retval = bfdev_mpi_seti(&vc, 0))) + if (!va || !vb || !vc) + return 1; + + if ((retval = bfdev_mpi_seti(va, 1)) || + (retval = bfdev_mpi_seti(vb, 0)) || + (retval = bfdev_mpi_seti(vc, 0))) return retval; EXAMPLE_TIME_STATISTICAL( for (count = 0; count < TEST_LOOP - 1; ++count) { - if ((retval = bfdev_mpi_add(&vc, &va, &vb)) || - (retval = bfdev_mpi_set(&vb, &va)) || - (retval = bfdev_mpi_set(&va, &vc))) + if ((retval = bfdev_mpi_add(vc, va, vb)) || + (retval = bfdev_mpi_set(vb, va)) || + (retval = bfdev_mpi_set(va, vc))) return retval; } 0; ); #if PRINT_RESULT - result = print_num(&va, 10); + result = print_num(va, 10); if (!result) return 1; @@ -46,9 +49,5 @@ main(int argc, const char *argv[]) free(result); #endif - bfdev_mpi_release(&va); - bfdev_mpi_release(&vb); - bfdev_mpi_release(&vc); - return 0; } diff --git a/examples/mpi/machin.c b/examples/mpi/machin.c index 6d488ea2..2b0495cd 100644 --- a/examples/mpi/machin.c +++ b/examples/mpi/machin.c @@ -20,14 +20,16 @@ int main(int argc, const char *argv[]) { - bfdev_mpi_t vw, vs, vv, vq; unsigned int k; int retval; - bfdev_mpi_init(&vw, NULL); - bfdev_mpi_init(&vs, NULL); - bfdev_mpi_init(&vv, NULL); - bfdev_mpi_init(&vq, NULL); + BFDEV_CLASS(bfdev_mpi, vw)(NULL); + BFDEV_CLASS(bfdev_mpi, vs)(NULL); + BFDEV_CLASS(bfdev_mpi, vv)(NULL); + BFDEV_CLASS(bfdev_mpi, vq)(NULL); + + if (!vw || !vs || !vv || !vq) + return 1; /** * Machin-like formula: @@ -38,30 +40,30 @@ main(int argc, const char *argv[]) * arctan(x) = x - (x^3)/3 + (x^5)/5 - (x^7)/7 + ... */ - if ((retval = bfdev_mpi_seti(&vw, 16 * 5)) || - (retval = bfdev_mpi_seti(&vv, 4 * 239)) || - (retval = bfdev_mpi_seti(&vq, 10000))) + if ((retval = bfdev_mpi_seti(vw, 16 * 5)) || + (retval = bfdev_mpi_seti(vv, 4 * 239)) || + (retval = bfdev_mpi_seti(vq, 10000))) return retval; for (k = 0; k < TEST_SIZE; ++k) { - if ((retval = bfdev_mpi_mul(&vw, &vw, &vq)) || - (retval = bfdev_mpi_mul(&vv, &vv, &vq))) + if ((retval = bfdev_mpi_mul(vw, vw, vq)) || + (retval = bfdev_mpi_mul(vv, vv, vq))) return retval; } bfdev_log_info("Convergence Machin %d:\n", TEST_LEN); EXAMPLE_TIME_STATISTICAL( for (k = 1; k <= TEST_LOOP; ++k) { - if ((retval = bfdev_mpi_divi(&vw, &vw, &vw, 5 * 5)) || - (retval = bfdev_mpi_divi(&vv, &vv, &vv, 239 * 239)) || - (retval = bfdev_mpi_sub(&vq, &vw, &vv)) || - (retval = bfdev_mpi_divi(&vq, &vq, &vq, 2 * k - 1))) + if ((retval = bfdev_mpi_divi(vw, vw, vw, 5 * 5)) || + (retval = bfdev_mpi_divi(vv, vv, vv, 239 * 239)) || + (retval = bfdev_mpi_sub(vq, vw, vv)) || + (retval = bfdev_mpi_divi(vq, vq, vq, 2 * k - 1))) return retval; if (k & 1) - retval = bfdev_mpi_add(&vs, &vs, &vq); + retval = bfdev_mpi_add(vs, vs, vq); else - retval = bfdev_mpi_sub(&vs, &vs, &vq); + retval = bfdev_mpi_sub(vs, vs, vq); if (retval) return retval; @@ -72,7 +74,7 @@ main(int argc, const char *argv[]) #if PRINT_RESULT char *result; - result = print_num(&vs, 10); + result = print_num(vs, 10); if (!result) return 1; @@ -81,10 +83,5 @@ main(int argc, const char *argv[]) free(result); #endif - bfdev_mpi_release(&vw); - bfdev_mpi_release(&vs); - bfdev_mpi_release(&vv); - bfdev_mpi_release(&vq); - return 0; } diff --git a/include/bfdev/mpi.h b/include/bfdev/mpi.h index f4ddfab0..15b6987c 100644 --- a/include/bfdev/mpi.h +++ b/include/bfdev/mpi.h @@ -39,7 +39,7 @@ struct bfdev_mpi { bfdev_mpi_t name = BFDEV_MPI_INIT(alloc) static inline void -bfdev_mpi_init(bfdev_mpi_t *mpi, bfdev_alloc_t *alloc) +bfdev_mpi_init(bfdev_mpi_t *mpi, const bfdev_alloc_t *alloc) { *mpi = BFDEV_MPI_INIT(alloc); } @@ -147,6 +147,32 @@ bfdev_mpi_data(const bfdev_mpi_t *var, bfdev_bool *sign); extern void bfdev_mpi_release(bfdev_mpi_t *var); +static inline bfdev_mpi_t * +bfdev_mpi_create(const bfdev_alloc_t *alloc) +{ + bfdev_mpi_t *var; + + var = bfdev_malloc(alloc, sizeof(*var)); + if (bfdev_unlikely(!var)) + return BFDEV_NULL; + bfdev_mpi_init(var, alloc); + + return var; +} + +static inline void +bfdev_mpi_destroy(bfdev_mpi_t *var) +{ + bfdev_mpi_release(var); + bfdev_free(var->alloc, var); +} + +BFDEV_DEFINE_CLASS(bfdev_mpi, bfdev_mpi_t *, + bfdev_mpi_create(alloc), + bfdev_mpi_destroy(_T), + const bfdev_alloc_t *alloc +) + BFDEV_END_DECLS #endif /* _BFDEV_MPI_H_ */