MCPcopy Create free account
hub / github.com/Kitware/VTK / MergeRemoteModels

Method MergeRemoteModels

Filters/ParallelStatistics/vtkGenerateStatistics.cxx:1610–1745  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1608}
1609
1610int vtkGenerateStatistics::MergeRemoteModels(vtkPartitionedDataSetCollection* modelTree)
1611{
1612 auto* controller = this->Controller;
1613#if VTK_DBG_MODELDATA
1614 reportRanks("*** Before Merge ***", modelTree, controller);
1615#endif
1616 if (!controller)
1617 {
1618 controller = vtkMultiProcessController::GetGlobalController();
1619 }
1620 if (!controller)
1621 {
1622 // No work to do.
1623 return 0;
1624 }
1625 int rank = controller->GetLocalProcessId();
1626 int numberOfRanks = controller->GetNumberOfProcesses();
1627 if (numberOfRanks < 2)
1628 {
1629 // No work to do.
1630 return 0;
1631 }
1632 int maxPower = std::log2(vtkMath::NearestPowerOfTwo(numberOfRanks));
1633#if VTK_DBG_MODELDATA
1634 // For debugging:
1635 std::ostringstream commlog;
1636 commlog << "/tmp/comm_" << rank << ".log";
1637#endif
1638 // Create a writer to serialize **LOCAL** model information ONLY.
1639 // We send the resulting XML via \a controller to a partner rank per pass,
1640 // where it will be aggregated with the partner's model (if any).
1641 vtkNew<vtkGenericDataObjectWriter> serializer;
1642 serializer->SetInputDataObject(0, modelTree);
1643 serializer->WriteToOutputStringOn();
1644 serializer->Write();
1645 std::string localModelString = serializer->GetOutputString();
1646 std::size_t localModelSize = localModelString.size();
1647 vtkNew<vtkGenericDataObjectReader> deserializer;
1648 deserializer->ReadFromInputStringOn();
1649 {
1650#if VTK_DBG_MODELDATA
1651 std::ofstream log(commlog.str().c_str());
1652 log << "max power " << maxPower << "\n";
1653#endif
1654 for (int power = 0; power < maxPower; ++power)
1655 {
1656#if VTK_DBG_MODELDATA
1657 log << "Pass " << power << "\n";
1658#endif
1659 int delta = (1 << power);
1660 if (rank % delta == 0)
1661 {
1662 bool recvUp = (rank % (2 * delta) == 0);
1663 if (recvUp)
1664 {
1665 int recvFrom = (rank + delta >= numberOfRanks ? -1 : rank + delta);
1666 if (recvFrom < 0)
1667 {

Callers 1

RequestDataMethod · 0.95

Calls 15

MergeModelTreesMethod · 0.95
reportRanksFunction · 0.85
GetNumberOfProcessesMethod · 0.80
log2Function · 0.50
GetLocalProcessIdMethod · 0.45
SetInputDataObjectMethod · 0.45
WriteMethod · 0.45
sizeMethod · 0.45
c_strMethod · 0.45
strMethod · 0.45
ReceiveMethod · 0.45
resizeMethod · 0.45

Tested by

no test coverage detected