Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 25 additions & 23 deletions examples/mpi/bbp.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,64 +28,72 @@ 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;
}

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;
}
Expand All @@ -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;

Expand All @@ -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;
}
27 changes: 13 additions & 14 deletions examples/mpi/fibonacci.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,37 +18,36 @@ 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;

puts(result);
free(result);
#endif

bfdev_mpi_release(&va);
bfdev_mpi_release(&vb);
bfdev_mpi_release(&vc);

return 0;
}
41 changes: 19 additions & 22 deletions examples/mpi/machin.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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;
Expand All @@ -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;

Expand All @@ -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;
}
28 changes: 27 additions & 1 deletion include/bfdev/mpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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_ */
Loading