Skip to content

Commit 41fe028

Browse files
committed
add support for Zoltan with PT-Scotch
- zoltan/CMakeLists.txt: add ENABLE_PARMETIS/ENABLE_PTSCOTCH flags. - change include_dirs/link_libraries to depend on ENABLE_ flags. - cmake/FindZoltan.cmake: remove default path when ZOLTAN_PREFIX is defined. - search for pt-scotch or parmetis depending on what is enabled. - zoltan/apfZoltan.h: add PTSCOTCH ZoltanMethod. - zoltan/apfZoltanCallbacks.cc: make PARMETIS/PTSCOTCH options only work when support is compiled in. - make GRAPH method prefer ParMETIS, then PT-Scotch, then PHG. - guard PARMETIS-specifics. Signed-off-by: Aiden Woodruff <[email protected]>
1 parent 67af395 commit 41fe028

File tree

4 files changed

+74
-14
lines changed

4 files changed

+74
-14
lines changed

cmake/FindZoltan.cmake

+18-4
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,28 @@ if(ZOLTAN_PREFIX)
1010
message(STATUS "ZOLTAN_PREFIX ${ZOLTAN_PREFIX}")
1111
endif()
1212

13-
find_path(ZOLTAN_INCLUDE_DIR zoltan.h PATHS "${ZOLTAN_PREFIX}/include")
14-
15-
find_library(ZOLTAN_LIBRARY zoltan PATHS "${ZOLTAN_PREFIX}/lib")
13+
if(DEFINED ZOLTAN_PREFIX)
14+
find_path(ZOLTAN_INCLUDE_DIR zoltan.h
15+
PATHS "${ZOLTAN_PREFIX}/include"
16+
NO_DEFAULT_PATH
17+
)
18+
find_library(ZOLTAN_LIBRARY zoltan
19+
PATHS "${ZOLTAN_PREFIX}/lib"
20+
NO_DEFAULT_PATH
21+
)
22+
else()
23+
find_path(ZOLTAN_INCLUDE_DIR zoltan.h)
24+
find_library(ZOLTAN_LIBRARY zoltan)
25+
endif()
1626

1727
set(ZOLTAN_LIBRARIES ${ZOLTAN_LIBRARY} )
1828
set(ZOLTAN_INCLUDE_DIRS ${ZOLTAN_INCLUDE_DIR} )
1929

20-
find_package(Parmetis MODULE REQUIRED)
30+
if(ENABLE_PTSCOTCH)
31+
find_package(SCOTCH CONFIG REQUIRED)
32+
elseif(ENABLE_PARMETIS)
33+
find_package(Parmetis MODULE REQUIRED)
34+
endif()
2135

2236
include(FindPackageHandleStandardArgs)
2337
# handle the QUIETLY and REQUIRED arguments and set ZOLTAN_FOUND to TRUE

zoltan/CMakeLists.txt

+17-8
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@ endif()
55

66
# Package options
77
option(ENABLE_ZOLTAN "Enable Zoltan interface [ON|OFF]" OFF)
8+
option(ENABLE_PARMETIS "Enable ParMETIS for Zoltan [ON|OFF]" OFF)
9+
option(ENABLE_PTSCOTCH "Enable PT-Scotch for Zoltan [ON|OFF]" OFF)
810
xsdk_add_tpl(ZOLTAN)
911
xsdk_add_tpl(PARMETIS)
12+
xsdk_add_tpl(PTSCOTCH)
1013
message(STATUS "ENABLE_ZOLTAN: " ${ENABLE_ZOLTAN})
14+
message(STATUS "ENABLE_PARMETIS: " ${ENABLE_PARMETIS})
15+
message(STATUS "ENABLE_PTSCOTCH: " ${ENABLE_PTSCOTCH})
1116

1217
if(SCOREC_NO_MPI AND ENABLE_ZOLTAN)
1318
message(FATAL_ERROR "SCOREC_NO_MPI is incompatible with Zoltan.")
@@ -58,15 +63,19 @@ target_link_libraries(apf_zoltan PUBLIC pcu apf)
5863

5964
# Do extra work if zoltan is enabled
6065
if(ENABLE_ZOLTAN)
61-
target_include_directories(apf_zoltan PRIVATE
62-
${ZOLTAN_INCLUDE_DIRS}
63-
${PARMETIS_INCLUDE_DIRS}
64-
)
65-
target_link_libraries(apf_zoltan PUBLIC
66-
${ZOLTAN_LIBRARIES}
67-
${PARMETIS_LIBRARIES}
68-
)
66+
target_include_directories(apf_zoltan PRIVATE ${ZOLTAN_INCLUDE_DIRS})
67+
target_link_libraries(apf_zoltan PUBLIC ${ZOLTAN_LIBRARIES})
6968
target_compile_definitions(apf_zoltan PUBLIC PUMI_HAS_ZOLTAN)
69+
if(ENABLE_PTSCOTCH)
70+
target_link_libraries(apf_zoltan PUBLIC
71+
SCOTCH::ptscotch SCOTCH::ptscotcherr
72+
)
73+
target_compile_definitions(apf_zoltan PUBLIC PUMI_HAS_PTSCOTCH)
74+
elseif(ENABLE_PARMETIS)
75+
target_include_directories(apf_zoltan PRIVATE ${PARMETIS_INCLUDE_DIRS})
76+
target_link_libraries(apf_zoltan PUBLIC ${PARMETIS_LIBRARIES})
77+
target_compile_definitions(apf_zoltan PUBLIC PUMI_HAS_PARMETIS)
78+
endif()
7079
endif()
7180

7281
scorec_export_library(apf_zoltan)

zoltan/apfZoltan.h

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ enum ZoltanMethod {
4242
HYPERGRAPH,
4343
/** \brief Use ParMetis */
4444
PARMETIS,
45+
PTSCOTCH, /**< Use PT-Scotch */
4546
/** \brief General graph partitionig */
4647
GRAPH
4748
};

zoltan/apfZoltanCallbacks.cc

+38-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
#include "apfZoltanMesh.h"
1010
#include "apfZoltan.h"
1111
#include "apfShape.h"
12+
#ifdef PUMI_HAS_PARMETIS
1213
#include <metis.h>
14+
#endif
1315
#include <pcu_util.h>
1416
#include <lionPrint.h>
1517
#include <cstdlib>
@@ -29,9 +31,33 @@ static int setZoltanLbMethod(struct Zoltan_Struct* ztn, ZoltanMesh* zb)
2931
case HYPERGRAPH:
3032
lbMethod = "HYPERGRAPH"; break;
3133
case PARMETIS: //fall into GRAPH settings
34+
lbMethod = "GRAPH";
35+
#ifdef PUMI_HAS_PARMETIS
36+
Zoltan_Set_Param(ztn, "GRAPH_PACKAGE", "PARMETIS");
37+
#else
38+
lion_oprint(1, "WARNING: ParMETIS ZoltanMethod requested but ParMETIS"
39+
" was not enabled at build time.\n");
40+
#endif
41+
break;
42+
case PTSCOTCH:
43+
lbMethod = "GRAPH";
44+
#ifdef PUMI_HAS_PTSCOTCH
45+
Zoltan_Set_Param(ztn, "GRAPH_PACKAGE", "Scotch");
46+
#else
47+
lion_oprint(1, "WARNING: PT-Scotch ZoltanMethod requested but PT-Scotch"
48+
" was not enabled at build time.\n");
49+
#endif
50+
break;
3251
case GRAPH:
3352
lbMethod = "GRAPH";
34-
Zoltan_Set_Param(ztn, "GRAPH_PACKAGE", "PARMETIS"); // instead of PHG
53+
// Prefer ParMETIS, then PT-Scotch, then Zoltan-native PHG.
54+
#if defined(PUMI_HAS_PARMETIS)
55+
Zoltan_Set_Param(ztn, "GRAPH_PACKAGE", "PARMETIS");
56+
#elif defined(PUMI_HAS_PTSCOTCH)
57+
Zoltan_Set_Param(ztn, "GRAPH_PACKAGE", "Scotch");
58+
#else
59+
// Zoltan_Set_Param(ztn, "HYPERGRAPH_PACKAGE", "PHG"); //FIXME: not required?
60+
#endif
3561
break;
3662
default:
3763
lion_oprint(1,"ERROR %s Invalid LB_METHOD %d\n",__func__, zb->method);
@@ -68,8 +94,14 @@ static int setZoltanLbApproach(struct Zoltan_Struct* ztn, ZoltanMesh* zb)
6894
return 1;
6995
}
7096
Zoltan_Set_Param(ztn, "LB_APPROACH", ptnAp.c_str());
71-
if ( (3 == zb->method) || (4 == zb->method) )
97+
if (zb->method == PARMETIS
98+
#ifdef PUMI_HAS_PARMETIS // in this case GRAPH implies PARMETIS.
99+
|| zb->method == GRAPH
100+
#endif
101+
) {
72102
Zoltan_Set_Param(ztn, "PARMETIS_METHOD", pMethod.c_str());
103+
}
104+
// No zb->method == PTSCOTCH because Zoltan only supports RBISECT.
73105
return 0;
74106
}
75107

@@ -304,7 +336,9 @@ ZoltanData::~ZoltanData()
304336
void ZoltanData::run()
305337
{
306338
/* ensure Metis indices are the same size as Zoltan indices */
339+
#ifdef PUMI_HAS_PARMETIS
307340
PCU_ALWAYS_ASSERT(IDXTYPEWIDTH == sizeof(ZOLTAN_ID_TYPE)*8);
341+
#endif
308342
setup();
309343
ptn();
310344
}
@@ -331,7 +365,9 @@ void ZoltanData::setup()
331365
if ( zb->isLocal && 0 != m->getPCU()->Self() )
332366
snprintf(paramStr, 128, "%d", 0); //if local silence all but rank 0
333367
Zoltan_Set_Param(ztn, "debug_level", paramStr);
368+
#ifdef PUMI_HAS_PARMETIS
334369
Zoltan_Set_Param(ztn, "PARMETIS_OUTPUT_LEVEL", paramStr);
370+
#endif
335371
Zoltan_Set_Param(ztn, "CHECK_GRAPH", "0");
336372
Zoltan_Set_Param(ztn, "CHECK_HYPERGRAPH", "0");
337373

0 commit comments

Comments
 (0)