1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
|
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2021 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2007-2008 UT-Battelle, LLC
* Copyright (c) 2010-2012 Oak Rigde National Laboratory. All rights reserved.
* Copyright (c) 2013-2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2014-2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
* Copyright (c) 2020 BULL S.A.S. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
*
* Collective Communication Interface
*
* Interface for implementing the collective communication interface
* of MPI. The MPI interface provides error checking and error
* handler invocation, but the collective components provide all other
* functionality.
*
* Component selection is done per commuicator, at Communicator
* construction time. mca_coll_base_comm_select() is used to
* create the list of components available to the componenent
* collm_comm_query function, instantiating a module for each
* component that is usable, and sets the module collective function pointers.
* mca_coll_base_comm_select() then loops through the list of available
* components (via the instantiated module), and uses the
* module's coll_module_enable() function to enable the modules, and
* if successful, sets the communicator collective functions to
* those supplied by the given module, keeping track of which module it
* is associated with.
*
* The module destructors are called for each module used by the
* communicator, at communicator destruction time.
*
* This can result in up to N different components being used for a
* single communicator, one per needed collective function.
*
* The interface is the same for inter- or intra-communicators, and
* components should be able to handle either style of communicator
* during initialization (although handling may include indicating the
* component is not available).
*/
#ifndef OMPI_MCA_COLL_COLL_H
#define OMPI_MCA_COLL_COLL_H
#include "ompi_config.h"
#include "mpi.h"
#include "ompi/mca/mca.h"
#include "opal/mca/base/base.h"
#include "ompi/request/request.h"
BEGIN_C_DECLS
/* ******************************************************************** */
struct ompi_communicator_t;
struct ompi_datatype_t;
struct ompi_op_t;
#if OPAL_ENABLE_FT_MPI
struct ompi_group_t;
#endif /* OPAL_ENABLE_FT_MPI */
/* ******************************************************************** */
/**
* Collective component initialization
*
* Initialize the given collective component. This function should
* initialize any component-level. data. It will be called exactly
* once during MPI_INIT.
*
* @note The component framework is not lazily opened, so attempts
* should be made to minimize the amount of memory allocated during
* this function.
*
* @param[in] enable_progress_threads True if the component needs to
* support progress threads
* @param[in] enable_mpi_threads True if the component needs to
* support MPI_THREAD_MULTIPLE
*
* @retval OMPI_SUCCESS Component successfully initialized
* @retval OMPI_ERROR An unspecified error occurred
*/
typedef int (*mca_coll_base_component_init_query_fn_t)
(bool enable_progress_threads, bool enable_mpi_threads);
struct mca_coll_base_module_2_4_0_t;
/**
* Query whether a component is available for the given communicator
*
* Query whether the component is available for the given
* communicator. If the component is available, an object should be
* allocated and returned (with refcount at 1). The module will not
* be used for collective operations until module_enable() is called
* on the module, but may be destroyed (via OBJ_RELEASE) either before
* or after module_enable() is called. If the module needs to release
* resources obtained during query(), it should do so in the module
* destructor.
*
* A component may provide NULL to this function to indicate it does
* not wish to run or return an error during module_enable().
*
* @note The communicator is available for point-to-point
* communication, but other functionality is not available during this
* phase of initialization.
*
* @param[in] comm The communicator being created
* @param[out] priority Priority setting for component on
* this communicator
*
* @returns An initialized module structure if the component can
* provide a module with the requested functionality or NULL if the
* component should not be used on the given communicator.
*/
typedef struct mca_coll_base_module_2_4_0_t *
(*mca_coll_base_component_comm_query_2_4_0_fn_t)
(struct ompi_communicator_t *comm, int *priority);
/* ******************************************************************** */
/**
* Enable module for collective communication
*
* Enable the module for collective communication. Modules are enabled
* in order from lowest to highest priority. At each component,
* collective functions with priority higher than the existing
* function are copied into the communicator's function table and the
* module's reference count is incremented. Replaced functions have
* their module's reference count decremented, so a component will go
* out of scope when it has been examined and is no longer used in any
* collective functions.
*
* Because the function list is built on increasing priority, a
* component that needs functions from a lower priority component
* (say, a multi-cast barrier that might need a point-to-point barrier
* for resource exhaustion issues) can keep the function pointer and
* module pointer and increase the reference count of the module and
* use the module during execution.
*
* When a module is not used for any interface functions and no
* higher-priority module has increased its refcount, it will have
* it's destructor triggered and the module will be destroyed.
*
* @note The collective component should not modify the communicator
* during this operation. The communicator will be updated with the
* collective algorithm's function pointers and module (and the ref
* count increased on the module) by the base selection functionality.
*
* @param[in/out] module Module created during comm_query()
* @param[in] comm Communicator being created
*/
typedef int
(*mca_coll_base_module_enable_1_1_0_fn_t)(struct mca_coll_base_module_2_4_0_t* module,
struct ompi_communicator_t *comm);
/* not #if conditional on OPAL_ENABLE_FT_MPI for ABI */
/* Fault Tolerant Agreement - Consensus Protocol */
/**
* @param comm: communicator on which to run the agreement
* @param failgroup:
* as input: group of locally acknowledged dead processes
* as output: group of globally acknowledged dead processes
* NOTE: iagree does not need to update group
* as only the blocking agreement function is used
* in shrink, and only in that case we need the group
* to be global at output.
* @param op: the operand to apply on contrib
* @param dt: the datatype of contrib
* @param dt_count: the number of dt in contrib
* @param contrib: a pointer to the contribution / output
* @param module: the MCA module that defines this agreement.
*/
typedef int (*mca_coll_base_module_agree_fn_t)
(void *contrib, int dt_count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_group_t **failedgroup, bool update_failedgroup,
struct ompi_communicator_t *comm,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_iagree_fn_t)
(void *contrib, int dt_count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_group_t **failedgroup, bool update_failedgroup,
struct ompi_communicator_t *comm, ompi_request_t **request,
struct mca_coll_base_module_2_4_0_t *module);
/**
* Disable module for collective communication
*
* Disable the module for collective communication. This callback is
* meant to avoid unused modules referencing unused modules
* (and hence avoid memory leaks).
*
* @param[in/out] module Module disabled during mca_coll_base_comm_unselect
* @param[in] comm Communicator being disabled
*/
typedef int
(*mca_coll_base_module_disable_1_2_0_fn_t)(struct mca_coll_base_module_2_4_0_t* module,
struct ompi_communicator_t *comm);
/* blocking collectives */
typedef int (*mca_coll_base_module_allgather_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_allgatherv_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void * rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_allreduce_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_alltoall_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_alltoallv_fn_t)
(const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t *sdtype,
void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_alltoallw_fn_t)
(const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t * const *sdtypes,
void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t * const *rdtypes,
struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_barrier_fn_t)
(struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_bcast_fn_t)
(void *buff, int count, struct ompi_datatype_t *datatype, int root,
struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_exscan_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_gather_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_gatherv_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_reduce_fn_t)
(const void *sbuf, void* rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_reduce_scatter_fn_t)
(const void *sbuf, void *rbuf, const int *rcounts, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_reduce_scatter_block_fn_t)
(const void *sbuf, void *rbuf, int rcount, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_scan_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_scatter_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_scatterv_fn_t)
(const void *sbuf, const int *scounts, const int *disps, struct ompi_datatype_t *sdtype,
void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
/* nonblocking collectives */
typedef int (*mca_coll_base_module_iallgather_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_iallgatherv_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void * rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_iallreduce_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm,
ompi_request_t ** request, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ialltoall_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ialltoallv_fn_t)
(const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t *sdtype,
void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ialltoallw_fn_t)
(const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t * const *sdtypes,
void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t * const *rdtypes,
struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ibarrier_fn_t)
(struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ibcast_fn_t)
(void *buff, int count, struct ompi_datatype_t *datatype, int root,
struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_iexscan_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_igather_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_igatherv_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ireduce_fn_t)
(const void *sbuf, void* rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ireduce_scatter_fn_t)
(const void *sbuf, void *rbuf, const int *rcounts, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ireduce_scatter_block_fn_t)
(const void *sbuf, void *rbuf, int rcount, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_iscan_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_iscatter_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_iscatterv_fn_t)
(const void *sbuf, const int *scounts, const int *disps, struct ompi_datatype_t *sdtype,
void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
/* persistent collectives */
typedef int (*mca_coll_base_module_allgather_init_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_allgatherv_init_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void * rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_allreduce_init_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info,
ompi_request_t ** request, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_alltoall_init_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_alltoallv_init_fn_t)
(const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t *sdtype,
void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_alltoallw_init_fn_t)
(const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t * const *sdtypes,
void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t * const *rdtypes,
struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_barrier_init_fn_t)
(struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_bcast_init_fn_t)
(void *buff, int count, struct ompi_datatype_t *datatype, int root,
struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_exscan_init_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_gather_init_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_gatherv_init_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_reduce_init_fn_t)
(const void *sbuf, void* rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_reduce_scatter_init_fn_t)
(const void *sbuf, void *rbuf, const int *rcounts, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_reduce_scatter_block_init_fn_t)
(const void *sbuf, void *rbuf, int rcount, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_scan_init_fn_t)
(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_scatter_init_fn_t)
(const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_scatterv_init_fn_t)
(const void *sbuf, const int *scounts, const int *disps, struct ompi_datatype_t *sdtype,
void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
/*
* The signature of the neighborhood alltoallw differs from alltoallw
*/
typedef int (*mca_coll_base_module_neighbor_alltoallw_fn_t)
(const void *sbuf, const int *scounts, const MPI_Aint *sdisps, struct ompi_datatype_t * const *sdtypes,
void *rbuf, const int *rcounts, const MPI_Aint *rdisps, struct ompi_datatype_t * const *rdtypes,
struct ompi_communicator_t *comm, struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_ineighbor_alltoallw_fn_t)
(const void *sbuf, const int *scounts, const MPI_Aint *sdisps, struct ompi_datatype_t * const *sdtypes,
void *rbuf, const int *rcounts, const MPI_Aint *rdisps, struct ompi_datatype_t * const *rdtypes,
struct ompi_communicator_t *comm, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
typedef int (*mca_coll_base_module_neighbor_alltoallw_init_fn_t)
(const void *sbuf, const int *scounts, const MPI_Aint *sdisps, struct ompi_datatype_t * const *sdtypes,
void *rbuf, const int *rcounts, const MPI_Aint *rdisps, struct ompi_datatype_t * const *rdtypes,
struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
struct mca_coll_base_module_2_4_0_t *module);
/*
* reduce_local
* Even though this is not a collective operation, it is related to the
* collectives. Adding to the framework allows a collective component the
* option of intercepting it, if desired.
*/
typedef int (*mca_coll_base_module_reduce_local_fn_t)
(const void *inbuf, void *inoutbuf, int count,
struct ompi_datatype_t * dtype, struct ompi_op_t * op,
struct mca_coll_base_module_2_4_0_t *module);
/* ******************************************************************** */
/**
* Collective component interface
*
* Component interface for the collective framework. A public
* instance of this structure, called
* mca_coll_[component_name]_component, must exist in any collective
* component.
*/
struct mca_coll_base_component_2_4_0_t {
/** Base component description */
mca_base_component_t collm_version;
/** Base component data block */
mca_base_component_data_t collm_data;
/** Component initialization function */
mca_coll_base_component_init_query_fn_t collm_init_query;
/** Query whether component is usable for given communicator */
mca_coll_base_component_comm_query_2_4_0_fn_t collm_comm_query;
};
typedef struct mca_coll_base_component_2_4_0_t mca_coll_base_component_2_4_0_t;
/** Per guidance in mca.h, use the unversioned struct name if you just
want to always keep up with the most recent version of the
interface. */
typedef struct mca_coll_base_component_2_4_0_t mca_coll_base_component_t;
/**
* Collective module interface
*
* Module interface to the Collective framework. Modules are
* reference counted based on the number of functions from the module
* used on the commuicator. There is at most one module per component
* on a given communicator, and there can be many component modules on
* a given communicator.
*
* @note The collective framework and the
* communicator functionality only stores a pointer to the module
* function, so the component is free to create a structure that
* inherits from this one for use as the module structure.
*/
struct mca_coll_base_module_2_4_0_t {
/** Collective modules all inherit from opal_object */
opal_object_t super;
/** Enable function called when a collective module is (possibly)
going to be used for the given communicator */
mca_coll_base_module_enable_1_1_0_fn_t coll_module_enable;
/* Collective function pointers */
/* blocking functions */
mca_coll_base_module_allgather_fn_t coll_allgather;
mca_coll_base_module_allgatherv_fn_t coll_allgatherv;
mca_coll_base_module_allreduce_fn_t coll_allreduce;
mca_coll_base_module_alltoall_fn_t coll_alltoall;
mca_coll_base_module_alltoallv_fn_t coll_alltoallv;
mca_coll_base_module_alltoallw_fn_t coll_alltoallw;
mca_coll_base_module_barrier_fn_t coll_barrier;
mca_coll_base_module_bcast_fn_t coll_bcast;
mca_coll_base_module_exscan_fn_t coll_exscan;
mca_coll_base_module_gather_fn_t coll_gather;
mca_coll_base_module_gatherv_fn_t coll_gatherv;
mca_coll_base_module_reduce_fn_t coll_reduce;
mca_coll_base_module_reduce_scatter_fn_t coll_reduce_scatter;
mca_coll_base_module_reduce_scatter_block_fn_t coll_reduce_scatter_block;
mca_coll_base_module_scan_fn_t coll_scan;
mca_coll_base_module_scatter_fn_t coll_scatter;
mca_coll_base_module_scatterv_fn_t coll_scatterv;
/* nonblocking functions */
mca_coll_base_module_iallgather_fn_t coll_iallgather;
mca_coll_base_module_iallgatherv_fn_t coll_iallgatherv;
mca_coll_base_module_iallreduce_fn_t coll_iallreduce;
mca_coll_base_module_ialltoall_fn_t coll_ialltoall;
mca_coll_base_module_ialltoallv_fn_t coll_ialltoallv;
mca_coll_base_module_ialltoallw_fn_t coll_ialltoallw;
mca_coll_base_module_ibarrier_fn_t coll_ibarrier;
mca_coll_base_module_ibcast_fn_t coll_ibcast;
mca_coll_base_module_iexscan_fn_t coll_iexscan;
mca_coll_base_module_igather_fn_t coll_igather;
mca_coll_base_module_igatherv_fn_t coll_igatherv;
mca_coll_base_module_ireduce_fn_t coll_ireduce;
mca_coll_base_module_ireduce_scatter_fn_t coll_ireduce_scatter;
mca_coll_base_module_ireduce_scatter_block_fn_t coll_ireduce_scatter_block;
mca_coll_base_module_iscan_fn_t coll_iscan;
mca_coll_base_module_iscatter_fn_t coll_iscatter;
mca_coll_base_module_iscatterv_fn_t coll_iscatterv;
/* persistent functions */
mca_coll_base_module_allgather_init_fn_t coll_allgather_init;
mca_coll_base_module_allgatherv_init_fn_t coll_allgatherv_init;
mca_coll_base_module_allreduce_init_fn_t coll_allreduce_init;
mca_coll_base_module_alltoall_init_fn_t coll_alltoall_init;
mca_coll_base_module_alltoallv_init_fn_t coll_alltoallv_init;
mca_coll_base_module_alltoallw_init_fn_t coll_alltoallw_init;
mca_coll_base_module_barrier_init_fn_t coll_barrier_init;
mca_coll_base_module_bcast_init_fn_t coll_bcast_init;
mca_coll_base_module_exscan_init_fn_t coll_exscan_init;
mca_coll_base_module_gather_init_fn_t coll_gather_init;
mca_coll_base_module_gatherv_init_fn_t coll_gatherv_init;
mca_coll_base_module_reduce_init_fn_t coll_reduce_init;
mca_coll_base_module_reduce_scatter_init_fn_t coll_reduce_scatter_init;
mca_coll_base_module_reduce_scatter_block_init_fn_t coll_reduce_scatter_block_init;
mca_coll_base_module_scan_init_fn_t coll_scan_init;
mca_coll_base_module_scatter_init_fn_t coll_scatter_init;
mca_coll_base_module_scatterv_init_fn_t coll_scatterv_init;
/* neighborhood functions */
mca_coll_base_module_allgather_fn_t coll_neighbor_allgather;
mca_coll_base_module_allgatherv_fn_t coll_neighbor_allgatherv;
mca_coll_base_module_alltoall_fn_t coll_neighbor_alltoall;
mca_coll_base_module_alltoallv_fn_t coll_neighbor_alltoallv;
mca_coll_base_module_neighbor_alltoallw_fn_t coll_neighbor_alltoallw;
/* nonblocking neighborhood functions */
mca_coll_base_module_iallgather_fn_t coll_ineighbor_allgather;
mca_coll_base_module_iallgatherv_fn_t coll_ineighbor_allgatherv;
mca_coll_base_module_ialltoall_fn_t coll_ineighbor_alltoall;
mca_coll_base_module_ialltoallv_fn_t coll_ineighbor_alltoallv;
mca_coll_base_module_ineighbor_alltoallw_fn_t coll_ineighbor_alltoallw;
/* persistent neighborhood functions */
mca_coll_base_module_allgather_init_fn_t coll_neighbor_allgather_init;
mca_coll_base_module_allgatherv_init_fn_t coll_neighbor_allgatherv_init;
mca_coll_base_module_alltoall_init_fn_t coll_neighbor_alltoall_init;
mca_coll_base_module_alltoallv_init_fn_t coll_neighbor_alltoallv_init;
mca_coll_base_module_neighbor_alltoallw_init_fn_t coll_neighbor_alltoallw_init;
/* fault tolerant collective functions */
mca_coll_base_module_agree_fn_t coll_agree;
mca_coll_base_module_iagree_fn_t coll_iagree;
/** Disable function called when a collective module will not
be used for the given communicator */
mca_coll_base_module_disable_1_2_0_fn_t coll_module_disable;
mca_coll_base_module_reduce_local_fn_t coll_reduce_local;
/** Data storage for all the algorithms defined in the base. Should
not be used by other modules */
struct mca_coll_base_comm_t* base_data;
};
typedef struct mca_coll_base_module_2_4_0_t mca_coll_base_module_2_4_0_t;
/** Per guidance in mca.h, use the unversioned struct name if you just
want to always keep up with the most recent version of the
interface. */
typedef struct mca_coll_base_module_2_4_0_t mca_coll_base_module_t;
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_coll_base_module_t);
/**
* Collectives communicator cache structure
*
* Collectives communicator cache structure, used to find functions to
* implement collective algorithms and their associated modules. This
* function may also be used internally by a module if it needs to
* keep a large number of "backing" functions, such as the demo
* component.
*/
struct mca_coll_base_comm_coll_t {
/* blocking collectives */
mca_coll_base_module_allgather_fn_t coll_allgather;
mca_coll_base_module_2_4_0_t *coll_allgather_module;
mca_coll_base_module_allgatherv_fn_t coll_allgatherv;
mca_coll_base_module_2_4_0_t *coll_allgatherv_module;
mca_coll_base_module_allreduce_fn_t coll_allreduce;
mca_coll_base_module_2_4_0_t *coll_allreduce_module;
mca_coll_base_module_alltoall_fn_t coll_alltoall;
mca_coll_base_module_2_4_0_t *coll_alltoall_module;
mca_coll_base_module_alltoallv_fn_t coll_alltoallv;
mca_coll_base_module_2_4_0_t *coll_alltoallv_module;
mca_coll_base_module_alltoallw_fn_t coll_alltoallw;
mca_coll_base_module_2_4_0_t *coll_alltoallw_module;
mca_coll_base_module_barrier_fn_t coll_barrier;
mca_coll_base_module_2_4_0_t *coll_barrier_module;
mca_coll_base_module_bcast_fn_t coll_bcast;
mca_coll_base_module_2_4_0_t *coll_bcast_module;
mca_coll_base_module_exscan_fn_t coll_exscan;
mca_coll_base_module_2_4_0_t *coll_exscan_module;
mca_coll_base_module_gather_fn_t coll_gather;
mca_coll_base_module_2_4_0_t *coll_gather_module;
mca_coll_base_module_gatherv_fn_t coll_gatherv;
mca_coll_base_module_2_4_0_t *coll_gatherv_module;
mca_coll_base_module_reduce_fn_t coll_reduce;
mca_coll_base_module_2_4_0_t *coll_reduce_module;
mca_coll_base_module_reduce_scatter_fn_t coll_reduce_scatter;
mca_coll_base_module_2_4_0_t *coll_reduce_scatter_module;
mca_coll_base_module_reduce_scatter_block_fn_t coll_reduce_scatter_block;
mca_coll_base_module_2_4_0_t *coll_reduce_scatter_block_module;
mca_coll_base_module_scan_fn_t coll_scan;
mca_coll_base_module_2_4_0_t *coll_scan_module;
mca_coll_base_module_scatter_fn_t coll_scatter;
mca_coll_base_module_2_4_0_t *coll_scatter_module;
mca_coll_base_module_scatterv_fn_t coll_scatterv;
mca_coll_base_module_2_4_0_t *coll_scatterv_module;
/* nonblocking collectives */
mca_coll_base_module_iallgather_fn_t coll_iallgather;
mca_coll_base_module_2_4_0_t *coll_iallgather_module;
mca_coll_base_module_iallgatherv_fn_t coll_iallgatherv;
mca_coll_base_module_2_4_0_t *coll_iallgatherv_module;
mca_coll_base_module_iallreduce_fn_t coll_iallreduce;
mca_coll_base_module_2_4_0_t *coll_iallreduce_module;
mca_coll_base_module_ialltoall_fn_t coll_ialltoall;
mca_coll_base_module_2_4_0_t *coll_ialltoall_module;
mca_coll_base_module_ialltoallv_fn_t coll_ialltoallv;
mca_coll_base_module_2_4_0_t *coll_ialltoallv_module;
mca_coll_base_module_ialltoallw_fn_t coll_ialltoallw;
mca_coll_base_module_2_4_0_t *coll_ialltoallw_module;
mca_coll_base_module_ibarrier_fn_t coll_ibarrier;
mca_coll_base_module_2_4_0_t *coll_ibarrier_module;
mca_coll_base_module_ibcast_fn_t coll_ibcast;
mca_coll_base_module_2_4_0_t *coll_ibcast_module;
mca_coll_base_module_iexscan_fn_t coll_iexscan;
mca_coll_base_module_2_4_0_t *coll_iexscan_module;
mca_coll_base_module_igather_fn_t coll_igather;
mca_coll_base_module_2_4_0_t *coll_igather_module;
mca_coll_base_module_igatherv_fn_t coll_igatherv;
mca_coll_base_module_2_4_0_t *coll_igatherv_module;
mca_coll_base_module_ireduce_fn_t coll_ireduce;
mca_coll_base_module_2_4_0_t *coll_ireduce_module;
mca_coll_base_module_ireduce_scatter_fn_t coll_ireduce_scatter;
mca_coll_base_module_2_4_0_t *coll_ireduce_scatter_module;
mca_coll_base_module_ireduce_scatter_block_fn_t coll_ireduce_scatter_block;
mca_coll_base_module_2_4_0_t *coll_ireduce_scatter_block_module;
mca_coll_base_module_iscan_fn_t coll_iscan;
mca_coll_base_module_2_4_0_t *coll_iscan_module;
mca_coll_base_module_iscatter_fn_t coll_iscatter;
mca_coll_base_module_2_4_0_t *coll_iscatter_module;
mca_coll_base_module_iscatterv_fn_t coll_iscatterv;
mca_coll_base_module_2_4_0_t *coll_iscatterv_module;
/* persistent collectives */
mca_coll_base_module_allgather_init_fn_t coll_allgather_init;
mca_coll_base_module_2_4_0_t *coll_allgather_init_module;
mca_coll_base_module_allgatherv_init_fn_t coll_allgatherv_init;
mca_coll_base_module_2_4_0_t *coll_allgatherv_init_module;
mca_coll_base_module_allreduce_init_fn_t coll_allreduce_init;
mca_coll_base_module_2_4_0_t *coll_allreduce_init_module;
mca_coll_base_module_alltoall_init_fn_t coll_alltoall_init;
mca_coll_base_module_2_4_0_t *coll_alltoall_init_module;
mca_coll_base_module_alltoallv_init_fn_t coll_alltoallv_init;
mca_coll_base_module_2_4_0_t *coll_alltoallv_init_module;
mca_coll_base_module_alltoallw_init_fn_t coll_alltoallw_init;
mca_coll_base_module_2_4_0_t *coll_alltoallw_init_module;
mca_coll_base_module_barrier_init_fn_t coll_barrier_init;
mca_coll_base_module_2_4_0_t *coll_barrier_init_module;
mca_coll_base_module_bcast_init_fn_t coll_bcast_init;
mca_coll_base_module_2_4_0_t *coll_bcast_init_module;
mca_coll_base_module_exscan_init_fn_t coll_exscan_init;
mca_coll_base_module_2_4_0_t *coll_exscan_init_module;
mca_coll_base_module_gather_init_fn_t coll_gather_init;
mca_coll_base_module_2_4_0_t *coll_gather_init_module;
mca_coll_base_module_gatherv_init_fn_t coll_gatherv_init;
mca_coll_base_module_2_4_0_t *coll_gatherv_init_module;
mca_coll_base_module_reduce_init_fn_t coll_reduce_init;
mca_coll_base_module_2_4_0_t *coll_reduce_init_module;
mca_coll_base_module_reduce_scatter_init_fn_t coll_reduce_scatter_init;
mca_coll_base_module_2_4_0_t *coll_reduce_scatter_init_module;
mca_coll_base_module_reduce_scatter_block_init_fn_t coll_reduce_scatter_block_init;
mca_coll_base_module_2_4_0_t *coll_reduce_scatter_block_init_module;
mca_coll_base_module_scan_init_fn_t coll_scan_init;
mca_coll_base_module_2_4_0_t *coll_scan_init_module;
mca_coll_base_module_scatter_init_fn_t coll_scatter_init;
mca_coll_base_module_2_4_0_t *coll_scatter_init_module;
mca_coll_base_module_scatterv_init_fn_t coll_scatterv_init;
mca_coll_base_module_2_4_0_t *coll_scatterv_init_module;
/* blocking neighborhood collectives */
mca_coll_base_module_allgather_fn_t coll_neighbor_allgather;
mca_coll_base_module_2_4_0_t *coll_neighbor_allgather_module;
mca_coll_base_module_allgatherv_fn_t coll_neighbor_allgatherv;
mca_coll_base_module_2_4_0_t *coll_neighbor_allgatherv_module;
mca_coll_base_module_alltoall_fn_t coll_neighbor_alltoall;
mca_coll_base_module_2_4_0_t *coll_neighbor_alltoall_module;
mca_coll_base_module_alltoallv_fn_t coll_neighbor_alltoallv;
mca_coll_base_module_2_4_0_t *coll_neighbor_alltoallv_module;
mca_coll_base_module_neighbor_alltoallw_fn_t coll_neighbor_alltoallw;
mca_coll_base_module_2_4_0_t *coll_neighbor_alltoallw_module;
/* nonblocking neighborhood collectives */
mca_coll_base_module_iallgather_fn_t coll_ineighbor_allgather;
mca_coll_base_module_2_4_0_t *coll_ineighbor_allgather_module;
mca_coll_base_module_iallgatherv_fn_t coll_ineighbor_allgatherv;
mca_coll_base_module_2_4_0_t *coll_ineighbor_allgatherv_module;
mca_coll_base_module_ialltoall_fn_t coll_ineighbor_alltoall;
mca_coll_base_module_2_4_0_t *coll_ineighbor_alltoall_module;
mca_coll_base_module_ialltoallv_fn_t coll_ineighbor_alltoallv;
mca_coll_base_module_2_4_0_t *coll_ineighbor_alltoallv_module;
mca_coll_base_module_ineighbor_alltoallw_fn_t coll_ineighbor_alltoallw;
mca_coll_base_module_2_4_0_t *coll_ineighbor_alltoallw_module;
/* persistent neighborhood collectives */
mca_coll_base_module_allgather_init_fn_t coll_neighbor_allgather_init;
mca_coll_base_module_2_4_0_t *coll_neighbor_allgather_init_module;
mca_coll_base_module_allgatherv_init_fn_t coll_neighbor_allgatherv_init;
mca_coll_base_module_2_4_0_t *coll_neighbor_allgatherv_init_module;
mca_coll_base_module_alltoall_init_fn_t coll_neighbor_alltoall_init;
mca_coll_base_module_2_4_0_t *coll_neighbor_alltoall_init_module;
mca_coll_base_module_alltoallv_init_fn_t coll_neighbor_alltoallv_init;
mca_coll_base_module_2_4_0_t *coll_neighbor_alltoallv_init_module;
mca_coll_base_module_neighbor_alltoallw_init_fn_t coll_neighbor_alltoallw_init;
mca_coll_base_module_2_4_0_t *coll_neighbor_alltoallw_init_module;
mca_coll_base_module_reduce_local_fn_t coll_reduce_local;
mca_coll_base_module_2_4_0_t *coll_reduce_local_module;
mca_coll_base_module_agree_fn_t coll_agree;
mca_coll_base_module_2_4_0_t *coll_agree_module;
mca_coll_base_module_iagree_fn_t coll_iagree;
mca_coll_base_module_2_4_0_t *coll_iagree_module;
/* List of modules initialized, queried and enabled */
opal_list_t *module_list;
};
typedef struct mca_coll_base_comm_coll_t mca_coll_base_comm_coll_t;
/* ******************************************************************** */
/*
* Macro for use in components that are of type coll
*/
#define MCA_COLL_BASE_VERSION_2_4_0 \
OMPI_MCA_BASE_VERSION_2_1_0("coll", 2, 4, 0)
/* ******************************************************************** */
END_C_DECLS
#endif /* MCA_COLL_H */
|