You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.4 KiB
C
150 lines
4.4 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: ParaView
|
||
|
Module: vtkSubGroup.h
|
||
|
|
||
|
Copyright (c) Kitware, Inc.
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/*----------------------------------------------------------------------------
|
||
|
Copyright (c) Sandia Corporation
|
||
|
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
/**
|
||
|
* @class vtkSubGroup
|
||
|
* @brief scalable collective communication for a
|
||
|
* subset of members of a parallel VTK application
|
||
|
*
|
||
|
*
|
||
|
* This class provides scalable broadcast, reduce, etc. using
|
||
|
* only a vtkMultiProcessController. It does not require MPI.
|
||
|
* Users are vtkPKdTree and vtkDistributedDataFilter.
|
||
|
*
|
||
|
* @attention
|
||
|
* This class will be deprecated soon. Instead of using this class, use the
|
||
|
* collective and subgrouping operations now built into
|
||
|
* vtkMultiProcessController. The only reason this class is not deprecated
|
||
|
* already is because vtkPKdTree relies heavily on this class in ways that are
|
||
|
* not easy to work around. Since vtkPKdTree is due for a major overhaul
|
||
|
* anyway, we are leaving things the way they are for now.
|
||
|
*
|
||
|
* @sa
|
||
|
* vtkPKdTree vtkDistributedDataFilter
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkSubGroup_h
|
||
|
#define vtkSubGroup_h
|
||
|
|
||
|
#include "vtkObject.h"
|
||
|
#include "vtkParallelCoreModule.h" // For export macro
|
||
|
|
||
|
class vtkMultiProcessController;
|
||
|
class vtkCommunicator;
|
||
|
|
||
|
class VTKPARALLELCORE_EXPORT vtkSubGroup : public vtkObject
|
||
|
{
|
||
|
public:
|
||
|
vtkTypeMacro(vtkSubGroup, vtkObject);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
static vtkSubGroup* New();
|
||
|
|
||
|
// The wrapper gets confused here and falls down.
|
||
|
enum
|
||
|
{
|
||
|
MINOP = 1,
|
||
|
MAXOP = 2,
|
||
|
SUMOP = 3
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Initialize a communication subgroup for the processes
|
||
|
* with rank p0 through p1 of the given communicator. (So
|
||
|
* vtkSubGroup is limited to working with subgroups that
|
||
|
* are identified by a contiguous set of rank IDs.)
|
||
|
* The third argument is the callers rank, which must
|
||
|
* in the range from p0 through p1.
|
||
|
*/
|
||
|
|
||
|
int Initialize(int p0, int p1, int me, int tag, vtkCommunicator* c);
|
||
|
|
||
|
int Gather(int* data, int* to, int length, int root);
|
||
|
int Gather(char* data, char* to, int length, int root);
|
||
|
int Gather(float* data, float* to, int length, int root);
|
||
|
#ifdef VTK_USE_64BIT_IDS
|
||
|
int Gather(vtkIdType* data, vtkIdType* to, int length, int root);
|
||
|
#endif
|
||
|
int Broadcast(float* data, int length, int root);
|
||
|
int Broadcast(double* data, int length, int root);
|
||
|
int Broadcast(int* data, int length, int root);
|
||
|
int Broadcast(char* data, int length, int root);
|
||
|
#ifdef VTK_USE_64BIT_IDS
|
||
|
int Broadcast(vtkIdType* data, int length, int root);
|
||
|
#endif
|
||
|
int ReduceSum(int* data, int* to, int length, int root);
|
||
|
int ReduceMax(float* data, float* to, int length, int root);
|
||
|
int ReduceMax(double* data, double* to, int length, int root);
|
||
|
int ReduceMax(int* data, int* to, int length, int root);
|
||
|
int ReduceMin(float* data, float* to, int length, int root);
|
||
|
int ReduceMin(double* data, double* to, int length, int root);
|
||
|
int ReduceMin(int* data, int* to, int length, int root);
|
||
|
|
||
|
int AllReduceUniqueList(int* list, int len, int** newList);
|
||
|
int MergeSortedUnique(int* list1, int len1, int* list2, int len2, int** newList);
|
||
|
|
||
|
void setGatherPattern(int root, int length);
|
||
|
int getLocalRank(int processID);
|
||
|
|
||
|
int Barrier();
|
||
|
|
||
|
void PrintSubGroup() const;
|
||
|
|
||
|
static int MakeSortedUnique(int* list, int len, int** newList);
|
||
|
|
||
|
int tag;
|
||
|
|
||
|
protected:
|
||
|
vtkSubGroup();
|
||
|
~vtkSubGroup() override;
|
||
|
|
||
|
private:
|
||
|
int computeFanInTargets();
|
||
|
void restoreRoot(int rootLoc);
|
||
|
void moveRoot(int rootLoc);
|
||
|
void setUpRoot(int root);
|
||
|
|
||
|
int nFrom;
|
||
|
int nTo;
|
||
|
|
||
|
int sendId; // gather
|
||
|
int sendOffset;
|
||
|
int sendLength;
|
||
|
|
||
|
int recvId[20];
|
||
|
int recvOffset[20];
|
||
|
int recvLength[20];
|
||
|
int fanInFrom[20]; // reduce, broadcast
|
||
|
|
||
|
int fanInTo;
|
||
|
int nSend;
|
||
|
int nRecv;
|
||
|
int gatherRoot;
|
||
|
int gatherLength;
|
||
|
|
||
|
int* members;
|
||
|
int nmembers;
|
||
|
int myLocalRank;
|
||
|
|
||
|
vtkCommunicator* comm;
|
||
|
|
||
|
vtkSubGroup(const vtkSubGroup&) = delete;
|
||
|
void operator=(const vtkSubGroup&) = delete;
|
||
|
};
|
||
|
#endif
|