mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-08 13:23:51 +00:00
Split the compilation of ContourMarchingCells into instantiations
Although the contour filter was recently divided into 2 filters, flying edges and marching cubes, the marching cubes version still had many conditions and was the file that took the longest to compile on Frontier. To help speed up parallel compiles and prevent a single run of a compiler from being overwhelmed, the compilation of all the marching cubes conditions has been split up using instantiations.
This commit is contained in:
parent
f67a9f29bf
commit
0ee495f310
@ -8,4 +8,7 @@ Although `Contour` is still the preferred option for most cases because it selec
|
|||||||
|
|
||||||
Deprecate functions `GetComputeFastNormalsForStructured`, `SetComputeFastNormalsForStructured`, `GetComputeFastNormalsForUnstructured` and `GetComputeFastNormalsForUnstructured`, to use the more general `GetComputeFastNormals` and `SetComputeFastNormals` instead.
|
Deprecate functions `GetComputeFastNormalsForStructured`, `SetComputeFastNormalsForStructured`, `GetComputeFastNormalsForUnstructured` and `GetComputeFastNormalsForUnstructured`, to use the more general `GetComputeFastNormals` and `SetComputeFastNormals` instead.
|
||||||
|
|
||||||
By default, for the `Contour` filter, `GenerateNormals` is now `true`, and `ComputeFastNormals` is `false`.
|
By default, for the `Contour` filter, `GenerateNormals` is now `true`, and `ComputeFastNormals` is `false`.
|
||||||
|
|
||||||
|
The marching cubes version of contour still has several possible compile paths, so it can still take a bit to compile. To help manage the compile time further, the contour filter compilation is broken up even further using the instantiation build capabilities.
|
||||||
|
|
||||||
|
@ -34,6 +34,9 @@ set(contour_sources
|
|||||||
Contour.cxx
|
Contour.cxx
|
||||||
)
|
)
|
||||||
|
|
||||||
|
vtkm_add_instantiations(contour_instantiations INSTANTIATIONS_FILE worklet/ContourMarchingCells.h)
|
||||||
|
list(APPEND contour_sources_device ${contour_instantiations})
|
||||||
|
|
||||||
set_source_files_properties(Contour.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON)
|
set_source_files_properties(Contour.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON)
|
||||||
|
|
||||||
vtkm_library(
|
vtkm_library(
|
||||||
|
@ -59,12 +59,11 @@ vtkm::cont::DataSet ContourMarchingCells::DoExecute(const vtkm::cont::DataSet& i
|
|||||||
|
|
||||||
if (this->GenerateNormals && !this->GetComputeFastNormals())
|
if (this->GenerateNormals && !this->GetComputeFastNormals())
|
||||||
{
|
{
|
||||||
outputCells =
|
outputCells = worklet.Run(ivalues, inputCells, inputCoords, concrete, vertices, normals);
|
||||||
worklet.Run(ivalues, inputCells, inputCoords.GetData(), concrete, vertices, normals);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
outputCells = worklet.Run(ivalues, inputCells, inputCoords.GetData(), concrete, vertices);
|
outputCells = worklet.Run(ivalues, inputCells, inputCoords, concrete, vertices);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -11,10 +11,19 @@
|
|||||||
#ifndef vtk_m_worklet_ContourMarchingCells_h
|
#ifndef vtk_m_worklet_ContourMarchingCells_h
|
||||||
#define vtk_m_worklet_ContourMarchingCells_h
|
#define vtk_m_worklet_ContourMarchingCells_h
|
||||||
|
|
||||||
|
#include <vtkm/filter/contour/vtkm_filter_contour_export.h>
|
||||||
#include <vtkm/filter/contour/worklet/contour/CommonState.h>
|
#include <vtkm/filter/contour/worklet/contour/CommonState.h>
|
||||||
#include <vtkm/filter/contour/worklet/contour/FieldPropagation.h>
|
#include <vtkm/filter/contour/worklet/contour/FieldPropagation.h>
|
||||||
#include <vtkm/filter/contour/worklet/contour/MarchingCells.h>
|
#include <vtkm/filter/contour/worklet/contour/MarchingCells.h>
|
||||||
|
|
||||||
|
#include <vtkm/cont/CellSetExplicit.h>
|
||||||
|
#include <vtkm/cont/CellSetSingleType.h>
|
||||||
|
#include <vtkm/cont/CellSetStructured.h>
|
||||||
|
#include <vtkm/cont/CoordinateSystem.h>
|
||||||
|
#include <vtkm/cont/UnknownCellSet.h>
|
||||||
|
|
||||||
|
#include <vtkm/internal/Instantiations.h>
|
||||||
|
|
||||||
|
|
||||||
namespace vtkm
|
namespace vtkm
|
||||||
{
|
{
|
||||||
@ -22,6 +31,7 @@ namespace worklet
|
|||||||
{
|
{
|
||||||
namespace contour
|
namespace contour
|
||||||
{
|
{
|
||||||
|
|
||||||
struct DeduceCoordType
|
struct DeduceCoordType
|
||||||
{
|
{
|
||||||
template <typename CoordinateType, typename CellSetType, typename... Args>
|
template <typename CoordinateType, typename CellSetType, typename... Args>
|
||||||
@ -36,15 +46,41 @@ struct DeduceCoordType
|
|||||||
|
|
||||||
struct DeduceCellType
|
struct DeduceCellType
|
||||||
{
|
{
|
||||||
template <typename CellSetType, typename CoordinateType, typename... Args>
|
template <typename CellSetType, typename ValueType, typename StorageTagField>
|
||||||
void operator()(const CellSetType& cells, CoordinateType&& coordinateSystem, Args&&... args) const
|
void operator()(const CellSetType& cells,
|
||||||
{
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
vtkm::cont::CastAndCall(
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
coordinateSystem, contour::DeduceCoordType{}, cells, std::forward<Args>(args)...);
|
const std::vector<ValueType>& isovalues,
|
||||||
}
|
const vtkm::cont::ArrayHandle<ValueType, StorageTagField>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Declared outside of class, non-inline so that instantiations can be exported correctly.
|
||||||
|
template <typename CellSetType, typename ValueType, typename StorageTagField>
|
||||||
|
void DeduceCellType::operator()(const CellSetType& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<ValueType>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<ValueType, StorageTagField>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const
|
||||||
|
{
|
||||||
|
vtkm::cont::CastAndCall(coordinateSystem,
|
||||||
|
contour::DeduceCoordType{},
|
||||||
|
cells,
|
||||||
|
outputCells,
|
||||||
|
isovalues,
|
||||||
|
input,
|
||||||
|
vertices,
|
||||||
|
normals,
|
||||||
|
sharedState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace contour
|
||||||
|
|
||||||
/// \brief Compute the isosurface of a given 3D data set, supports all linear cell types
|
/// \brief Compute the isosurface of a given 3D data set, supports all linear cell types
|
||||||
class ContourMarchingCells
|
class ContourMarchingCells
|
||||||
{
|
{
|
||||||
@ -87,22 +123,18 @@ public:
|
|||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void ReleaseCellMapArrays() { this->SharedState.CellIdMap.ReleaseResources(); }
|
void ReleaseCellMapArrays() { this->SharedState.CellIdMap.ReleaseResources(); }
|
||||||
|
|
||||||
|
public:
|
||||||
// Filter called without normals generation
|
// Filter called without normals generation
|
||||||
template <typename ValueType,
|
template <typename ValueType, typename StorageTagField>
|
||||||
typename CellSetType,
|
VTKM_CONT vtkm::cont::CellSetSingleType<> Run(
|
||||||
typename CoordinateSystem,
|
|
||||||
typename StorageTagField,
|
|
||||||
typename CoordinateType,
|
|
||||||
typename StorageTagVertices>
|
|
||||||
vtkm::cont::CellSetSingleType<> Run(
|
|
||||||
const std::vector<ValueType>& isovalues,
|
const std::vector<ValueType>& isovalues,
|
||||||
const CellSetType& cells,
|
const vtkm::cont::UnknownCellSet& cells,
|
||||||
const CoordinateSystem& coordinateSystem,
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
const vtkm::cont::ArrayHandle<ValueType, StorageTagField>& input,
|
const vtkm::cont::ArrayHandle<ValueType, StorageTagField>& input,
|
||||||
vtkm::cont::ArrayHandle<vtkm::Vec<CoordinateType, 3>, StorageTagVertices>& vertices)
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices)
|
||||||
{
|
{
|
||||||
this->SharedState.GenerateNormals = false;
|
this->SharedState.GenerateNormals = false;
|
||||||
vtkm::cont::ArrayHandle<vtkm::Vec<CoordinateType, 3>> normals;
|
vtkm::cont::ArrayHandle<vtkm::Vec3f> normals;
|
||||||
|
|
||||||
vtkm::cont::CellSetSingleType<> outputCells;
|
vtkm::cont::CellSetSingleType<> outputCells;
|
||||||
vtkm::cont::CastAndCall(cells,
|
vtkm::cont::CastAndCall(cells,
|
||||||
@ -118,20 +150,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Filter called with normals generation
|
// Filter called with normals generation
|
||||||
template <typename ValueType,
|
template <typename ValueType, typename StorageTagField>
|
||||||
typename CellSetType,
|
VTKM_CONT vtkm::cont::CellSetSingleType<> Run(
|
||||||
typename CoordinateSystem,
|
|
||||||
typename StorageTagField,
|
|
||||||
typename CoordinateType,
|
|
||||||
typename StorageTagVertices,
|
|
||||||
typename StorageTagNormals>
|
|
||||||
vtkm::cont::CellSetSingleType<> Run(
|
|
||||||
const std::vector<ValueType>& isovalues,
|
const std::vector<ValueType>& isovalues,
|
||||||
const CellSetType& cells,
|
const vtkm::cont::UnknownCellSet& cells,
|
||||||
const CoordinateSystem& coordinateSystem,
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
const vtkm::cont::ArrayHandle<ValueType, StorageTagField>& input,
|
const vtkm::cont::ArrayHandle<ValueType, StorageTagField>& input,
|
||||||
vtkm::cont::ArrayHandle<vtkm::Vec<CoordinateType, 3>, StorageTagVertices>& vertices,
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
vtkm::cont::ArrayHandle<vtkm::Vec<CoordinateType, 3>, StorageTagNormals>& normals)
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals)
|
||||||
{
|
{
|
||||||
this->SharedState.GenerateNormals = true;
|
this->SharedState.GenerateNormals = true;
|
||||||
|
|
||||||
@ -152,7 +178,100 @@ public:
|
|||||||
private:
|
private:
|
||||||
vtkm::worklet::contour::CommonState SharedState;
|
vtkm::worklet::contour::CommonState SharedState;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
} // namespace vtkm::worklet
|
} // namespace vtkm::worklet
|
||||||
|
|
||||||
|
VTKM_INSTANTIATION_BEGIN
|
||||||
|
extern template void vtkm::worklet::contour::DeduceCellType::operator()(
|
||||||
|
const vtkm::cont::CellSetStructured<2>& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<vtkm::Float32>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<vtkm::Float32, vtkm::cont::StorageTagBasic>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
|
VTKM_INSTANTIATION_END
|
||||||
|
VTKM_INSTANTIATION_BEGIN
|
||||||
|
extern template void vtkm::worklet::contour::DeduceCellType::operator()(
|
||||||
|
const vtkm::cont::CellSetStructured<2>& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<vtkm::Float64>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<vtkm::Float64, vtkm::cont::StorageTagBasic>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
|
VTKM_INSTANTIATION_END
|
||||||
|
|
||||||
|
VTKM_INSTANTIATION_BEGIN
|
||||||
|
extern template void vtkm::worklet::contour::DeduceCellType::operator()(
|
||||||
|
const vtkm::cont::CellSetStructured<3>& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<vtkm::Float32>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<vtkm::Float32, vtkm::cont::StorageTagBasic>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
|
VTKM_INSTANTIATION_END
|
||||||
|
VTKM_INSTANTIATION_BEGIN
|
||||||
|
extern template void vtkm::worklet::contour::DeduceCellType::operator()(
|
||||||
|
const vtkm::cont::CellSetStructured<3>& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<vtkm::Float64>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<vtkm::Float64, vtkm::cont::StorageTagBasic>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
|
VTKM_INSTANTIATION_END
|
||||||
|
|
||||||
|
VTKM_INSTANTIATION_BEGIN
|
||||||
|
extern template void vtkm::worklet::contour::DeduceCellType::operator()(
|
||||||
|
const vtkm::cont::CellSetExplicit<>& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<vtkm::Float32>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<vtkm::Float32, vtkm::cont::StorageTagBasic>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
|
VTKM_INSTANTIATION_END
|
||||||
|
VTKM_INSTANTIATION_BEGIN
|
||||||
|
extern template void vtkm::worklet::contour::DeduceCellType::operator()(
|
||||||
|
const vtkm::cont::CellSetExplicit<>& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<vtkm::Float64>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<vtkm::Float64, vtkm::cont::StorageTagBasic>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
|
VTKM_INSTANTIATION_END
|
||||||
|
|
||||||
|
VTKM_INSTANTIATION_BEGIN
|
||||||
|
extern template void vtkm::worklet::contour::DeduceCellType::operator()(
|
||||||
|
const vtkm::cont::CellSetSingleType<>& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<vtkm::Float32>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<vtkm::Float32, vtkm::cont::StorageTagBasic>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
|
VTKM_INSTANTIATION_END
|
||||||
|
VTKM_INSTANTIATION_BEGIN
|
||||||
|
extern template void vtkm::worklet::contour::DeduceCellType::operator()(
|
||||||
|
const vtkm::cont::CellSetSingleType<>& cells,
|
||||||
|
const vtkm::cont::CoordinateSystem& coordinateSystem,
|
||||||
|
vtkm::cont::CellSetSingleType<>& outputCells,
|
||||||
|
const std::vector<vtkm::Float64>& isovalues,
|
||||||
|
const vtkm::cont::ArrayHandle<vtkm::Float64, vtkm::cont::StorageTagBasic>& input,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& vertices,
|
||||||
|
vtkm::cont::ArrayHandle<vtkm::Vec3f>& normals,
|
||||||
|
vtkm::worklet::contour::CommonState& sharedState) const;
|
||||||
|
VTKM_INSTANTIATION_END
|
||||||
|
|
||||||
#endif // vtk_m_worklet_ContourMarchingCells_h
|
#endif // vtk_m_worklet_ContourMarchingCells_h
|
||||||
|
Loading…
Reference in New Issue
Block a user