static int applicable(const S *ego, const problem *p_, const planner *plnr) { const problem_mpi_transpose *p = (const problem_mpi_transpose *) p_; /* Note: this is *not* UGLY for out-of-place, destroy-input plans; the planner often prefers transpose-pairwise to transpose-alltoall, at least with LAM MPI on my machine. */ return (1 && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) && p->I != p->O)) && ONLY_TRANSPOSEDP(p->flags)); }
static int applicable(const S *ego, const problem *p_, const planner *plnr) { const problem_mpi_transpose *p = (const problem_mpi_transpose *) p_; return (1 && p->I != p->O && (!NO_DESTROY_INPUTP(plnr) || ((p->flags & TRANSPOSED_IN) && !ego->copy_transposed_in)) && ((p->flags & TRANSPOSED_IN) || !ego->copy_transposed_in) && ONLY_TRANSPOSEDP(p->flags) ); }
static int applicable(const S *ego, const problem *p_, const planner *plnr, int *r) { const problem_mpi_transpose *p = (const problem_mpi_transpose *) p_; int n_pes; MPI_Comm_size(p->comm, &n_pes); return (1 && p->tblock * n_pes == p->ny && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) && p->I != p->O)) && (*r = ego->radix(n_pes)) && *r < n_pes && *r > 1 && enough_space(p->nx, p->ny, p->block, p->tblock, *r, n_pes) && (!CONSERVE_MEMORYP(plnr) || *r > 8 || !X(toobig)((p->nx * (p->ny / n_pes) * p->vn) / *r)) && (!NO_SLOWP(plnr) || (p->nx * (p->ny / n_pes) * p->vn) / n_pes <= SMALL_MESSAGE) && ONLY_TRANSPOSEDP(p->flags) ); }