From: Takahiro Hirofuchi Date: Fri, 28 Jun 2013 15:47:17 +0000 (+0200) Subject: Merge branch 'hypervisor' of scm.gforge.inria.fr:/gitroot/simgrid/simgrid into hypervisor X-Git-Tag: v3_11_beta~297^2^2~28 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/15badc71ce964f6dae6428c9a4c0198fad5d4936?hp=fc9ab0232ee601e492e7c2e271bff740fd5ad3b5 Merge branch 'hypervisor' of scm.gforge.inria.fr:/gitroot/simgrid/simgrid into hypervisor --- diff --git a/.cproject b/.cproject new file mode 100644 index 0000000000..2d167a86b9 --- /dev/null +++ b/.cproject @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore index 47a28887db..8ed50230a0 100644 --- a/.gitignore +++ b/.gitignore @@ -104,7 +104,6 @@ doc/simgrid_modules.map ################################################ ### Specific of project -.cproject .project .settings/ .anjuta @@ -144,12 +143,6 @@ examples/msg/tracing/volume examples/msg/io/file examples/msg/io/file_unlink examples/msg/mc/bugged3 -examples/msg/mc/random_test -examples/msg/mc/bugged1_for_liveness -examples/msg/mc/bugged1_while_liveness -examples/msg/mc/centralized_liveness_deadlock -examples/msg/mc/test/test_heap_comparison -examples/msg/mc/chord_liveness examples/msg/mc/test/snapshot_comparison1 examples/msg/mc/test/snapshot_comparison2 examples/msg/mc/test/snapshot_comparison3 @@ -239,6 +232,13 @@ examples/msg/mc/centralized_liveness src/replay/replay src/testall +teshsuite/smpi/allgather_coll +teshsuite/smpi/allgatherv_coll +teshsuite/smpi/allreduce_coll +teshsuite/smpi/alltoall_coll +teshsuite/smpi/alltoallv_coll +teshsuite/smpi/bcast_coll +teshsuite/smpi/reduce_coll teshsuite/smpi/allreduce teshsuite/smpi/alltoall2 teshsuite/smpi/alltoall_basic @@ -401,8 +401,10 @@ teshsuite/smpi/mpich-test/pt2pt/waitall2 teshsuite/smpi/mpich-test/pt2pt/waitall3 teshsuite/smpi/mpich-test/pt2pt/waitall4 teshsuite/smpi/mpich-test/pt2pt/waitany +teshsuite/msg/pid teshsuite/msg/get_sender teshsuite/msg/trace/test_trace_integration +teshsuite/simdag/availability/availability_test teshsuite/simdag/basic0 teshsuite/simdag/basic1 teshsuite/simdag/basic2 @@ -431,6 +433,7 @@ teshsuite/xbt/log_large_test teshsuite/xbt/parallel_log_crashtest testsuite/xbt/parmap_bench teshsuite/xbt/mmalloc_test +teshsuite/xbt/parmap_test testsuite/run_tests testsuite/simdag/sd_test testsuite/surf/lmm_usage diff --git a/COPYING b/COPYING index 98b022315f..3870bb5a5e 100644 --- a/COPYING +++ b/COPYING @@ -14,30 +14,6 @@ The SimGrid logo is distributed under the CC-BY-SA license. ========================================================================= -We have embeded pcre 8.12 library into the windows installer. - -PCRE is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. -Release 8 of PCRE is distributed under the terms of the "BSD" licence. -The basic library functions are written in C and are freestanding. Also -included in the distribution is a set of C++ wrapper functions. - -/* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*/ - -========================================================================== - The file src/xbt/snprintf.c contains this license text: /* diff --git a/ChangeLog b/ChangeLog index 2f30967188..c6c01329da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,16 +4,23 @@ SimGrid (3.10) NOT RELEASED; urgency=low * Our own implementation of getline is renamed xbt_getline, and gets used even if the OS provide a getline(). This should reduce the configuration complexity by using the same code on all platforms. + * new xbt_cfg_elm_boolean type Java: * Reintegrate Java to the main archive as desynchronizing these package is not acceptable anymore (Java is now considered stable) + * Add explicit synchronization facilities through semaphores * Bugfix: Task.setDataSize() only changed the C world, not the value cached in the Java world + MSG: + * Dramatically change the way files are handled. API and internals changed, but + this part of MSG was not considered as production grade either. + * Add explicit synchronization facilities through semaphores + SMPI: - * SMPI is not built as a separate library anymore, it's now included in - libsimgrid. + * SMPI is now included directly in the libsimgrid as the windows + linker dont forces us on splitting it anymore. * Improvements of the SMPI replay tool: - Most of the collective communications are now rooted in the same process as in the original application. @@ -22,6 +29,11 @@ SimGrid (3.10) NOT RELEASED; urgency=low - The replay tool now supports traces produce either by TAU or a modified version of MPE. - Bug Fix: the compute part of the reduce action is now taken into account. + * smpirun generates the hostfile if needed (with given hostcount and platform) + + PLATFORM: + * Handle units for values (10ms, 10kiloflops, 10Bps, ...) + * Remove rule based routing (no more pcre dependency) -- $date Da SimGrid team diff --git a/INSTALL b/INSTALL index 4953f2bfc3..bb8150cf0e 100644 --- a/INSTALL +++ b/INSTALL @@ -45,7 +45,6 @@ SimGrid archives do not have any firm dependencies. If you want to compile, you must have installed perl and cmake version 2.6 or above. -In order to improve memory management you should install libpcre. If you want to compile the java bindings, you have to have a java compiler, and the jni.h header file (available from the JDK). diff --git a/README.coding b/README.coding index e48b67f5df..35c9a55726 100644 --- a/README.coding +++ b/README.coding @@ -32,6 +32,16 @@ The tree is not split on projects, but on file finality: examples/ -> Supposed to be copy/pastable by the user, so keep it clear and avoid any kind of trick. In particular, do only include the public headers here. + + teshsuite/ -> The more test the better. Put in there any strange test + doing things that the users are not supposed to do, + just to see if our framework is robust to incorrect and + unusual behaviors. All tests written in this section + should leverage our tesh(1) utility. + + testsuite/ -> Old test suite, that should be converted to tesh and + moved to teshsuite at some point. + ** ** Indentation standard ** @@ -174,6 +184,13 @@ investigating the portability of the thing to windows. cmake -Denable_compile_optimizations=ON \ -Denable_compile_warnings=ON +* Your commit message should follow the git habits, explained eg here: + http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html + +* When you add/remove files, and/or make changes in the lists of files to build, + please check that "make distcheck" still succeeds. This is needed to ensure + that the generated archive is consistent. + * If you want to debug memory allocation problems, here are a few hints: - disable compiler optimizations, to have better backtraces; - disable the mallocators, or it will be hard to match malloc's with @@ -191,3 +208,4 @@ investigating the portability of the thing to windows. deactivate the whole logging mechanism, switching to printfs instead. SimGrid becomes incredibly verbose when doing so, but it you let you fixing the dynars. + \ No newline at end of file diff --git a/buildtools/Cmake/AddTests.cmake b/buildtools/Cmake/AddTests.cmake index 1b3dda1082..55fe3bda45 100644 --- a/buildtools/Cmake/AddTests.cmake +++ b/buildtools/Cmake/AddTests.cmake @@ -58,6 +58,7 @@ if(NOT enable_memcheck) ADD_TEST(xbt-mmalloc-64 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/mmalloc_64.tesh) ENDIF() ENDIF() + ADD_TEST(xbt-parmap ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/parmap_test.tesh) # BEGIN CONTEXTS FACTORY ADD_TEST(tesh-msg-get-sender-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) @@ -369,6 +370,63 @@ if(NOT enable_memcheck) ADD_TEST(smpi-tracing-ptp ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/tracing/smpi_traced.tesh) ADD_TEST(smpi-replay ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/smpi_replay.tesh) endif() + + + FOREACH (GATHER_COLL default ompi mpich ompi_basic_linear ompi_linear_sync ompi_binomial) + ADD_TEST(smpi-gather-coll-${GATHER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/gather:${GATHER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/gather_coll.tesh) + ENDFOREACH() + + FOREACH (ALLGATHER_COLL default 2dmesh 3dmesh bruck GB loosely_lr lr + NTSLR NTSLR_NB pair rdb rhv ring SMP_NTS + smp_simple spreading_simple ompi mpich ompi_neighborexchange) + ADD_TEST(smpi-allgather-coll-${ALLGATHER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/allgather:${ALLGATHER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/allgather_coll.tesh) + ENDFOREACH() + + FOREACH (ALLGATHERV_COLL default GB pair ring ompi mpich ompi_neighborexchange ompi_bruck) + ADD_TEST(smpi-allgatherv-coll-${ALLGATHERV_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/allgatherv:${ALLGATHERV_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/allgatherv_coll.tesh) + ENDFOREACH() + + FOREACH (ALLREDUCE_COLL default lr NTS rab1 rab2 rab_rdb + rab_rsag rdb smp_binomial smp_binomial_pipeline + smp_rdb smp_rsag smp_rsag_lr smp_rsag_rab redbcast ompi mpich ompi_ring_segmented) + ADD_TEST(smpi-allreduce-coll-${ALLREDUCE_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/allreduce:${ALLREDUCE_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/allreduce_coll.tesh) + ENDFOREACH() + + FOREACH (ALLTOALL_COLL 2dmesh 3dmesh pair pair_one_barrier pair_light_barrier + pair_mpi_barrier rdb ring ring_light_barrier + ring_mpi_barrier ring_one_barrier + simple bruck basic_linear ompi) + ADD_TEST(smpi-alltoall-coll-${ALLTOALL_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/alltoall:${ALLTOALL_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/alltoall_coll.tesh) + ENDFOREACH() + + FOREACH (ALLTOALLV_COLL default pair pair_light_barrier pair_mpi_barrier + pair_one_barrier ring ring_light_barrier + ring_mpi_barrier ring_one_barrier bruck ompi) + ADD_TEST(smpi-alltoallv-coll-${ALLTOALLV_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/alltoallv:${ALLTOALLV_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/alltoallv_coll.tesh) + ENDFOREACH() + + FOREACH (BCAST_COLL default arrival_nb arrival_pattern_aware arrival_pattern_aware_wait arrival_scatter + binomial_tree flattree flattree_pipeline NTSB NTSL NTSL_Isend scatter_LR_allgather + scatter_rdb_allgather SMP_binary SMP_binomial SMP_linear ompi mpich ompi_split_bintree ompi_pipeline) + ADD_TEST(smpi-bcast-coll-${BCAST_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/bcast:${BCAST_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast_coll.tesh) + ENDFOREACH() + + FOREACH (REDUCE_COLL default arrival_pattern_aware binomial flat_tree NTSL scatter_gather ompi mpich ompi_chain ompi_binary ompi_basic_linear ompi_binomial ompi_in_order_binary) + ADD_TEST(smpi-reduce-coll-${REDUCE_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/reduce:${REDUCE_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce_coll.tesh) + ENDFOREACH() + + FOREACH (REDUCE_SCATTER_COLL default ompi mpich ompi_basic_recursivehalving ompi_ring mpich_noncomm mpich_pair mpich_rdb) + ADD_TEST(smpi-reduce_scatter-coll-${REDUCE_SCATTER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/reduce_scatter:${REDUCE_SCATTER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce_scatter_coll.tesh) + ENDFOREACH() + + FOREACH (SCATTER_COLL default ompi mpich ompi_basic_linear ompi_binomial) + ADD_TEST(smpi-scatter-coll-${SCATTER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/scatter:${SCATTER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/scatter_coll.tesh) + ENDFOREACH() + + FOREACH (BARRIER_COLL default ompi mpich ompi_basic_linear ompi_tree ompi_bruck ompi_recursivedoubling ompi_doublering) + ADD_TEST(smpi-barrier-coll-${BARRIER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/barrier:${BARRIER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/barrier_coll.tesh) + ENDFOREACH() + endif() # END TESH TESTS @@ -407,44 +465,26 @@ if(NOT enable_memcheck) endif() endif() + # Scala examples + if(enable_scala) + set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/scala/:${SIMGRID_JAR}:${SCALA_JARS}") + ADD_TEST(scala-bypass ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/scala --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/scala ${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_bypass/bypass.tesh) + ADD_TEST(scala-kill ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/scala --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/scala ${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_kill/kill.tesh) + ADD_TEST(scala-masterslave ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/scala --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/scala ${CMAKE_HOME_DIRECTORY}/examples/scala/masterslave/masterslave.tesh) + endif() + # examples/msg/mc if(HAVE_MC) - ADD_TEST(mc-bugged1-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) - ADD_TEST(mc-centralized-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) if(CONTEXT_UCONTEXT) ADD_TEST(mc-bugged1-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) - ADD_TEST(mc-centralized-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) + ADD_TEST(mc-bugged2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) if(PROCESSOR_x86_64) # liveness model-checking works only on 64bits (for now ...) - ADD_TEST(mc-bugged1-liveness-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1_liveness.tesh) - ADD_TEST(mc-chord-neverjoin-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/chord chord_neverjoin.tesh) - ADD_TEST(mc-test-snapshot-comparison1 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison1.tesh) - ADD_TEST(mc-test-snapshot-comparison2 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison2.tesh) - ADD_TEST(mc-test-snapshot-comparison3 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison3.tesh) - ADD_TEST(mc-test-snapshot-comparison4 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison4.tesh) - ADD_TEST(mc-test-snapshot-comparison5 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison5.tesh) + ADD_TEST(mc-bugged1-liveness-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1_liveness.tesh) endif() endif() if(HAVE_RAWCTX) ADD_TEST(mc-bugged1-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) - ADD_TEST(mc-centralized-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) - endif() - endif() - - ### - ### Declare that we know that some tests are broken - ### - - # Those tests are broken : set to "fail" for release v3.6 - if(release) - if(HAVE_MC) - set_tests_properties(mc-bugged1-thread PROPERTIES WILL_FAIL true) - set_tests_properties(mc-centralized-thread PROPERTIES WILL_FAIL true) - if(CONTEXT_UCONTEXT) - set_tests_properties(mc-centralized-ucontext PROPERTIES WILL_FAIL true) - endif() - if(HAVE_RAWCTX) - set_tests_properties(mc-centralized-raw PROPERTIES WILL_FAIL true) - endif() + ADD_TEST(mc-bugged2-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) endif() endif() diff --git a/buildtools/Cmake/CompleteInFiles.cmake b/buildtools/Cmake/CompleteInFiles.cmake index a5bec10a88..472744646c 100644 --- a/buildtools/Cmake/CompleteInFiles.cmake +++ b/buildtools/Cmake/CompleteInFiles.cmake @@ -68,11 +68,6 @@ include(TestBigEndian) TEST_BIG_ENDIAN(BIGENDIAN) include(FindGraphviz) -if(WIN32) - include(FindPcreWin) -else() - include(FindPCRE) -endif() set(HAVE_GTNETS 0) if(enable_gtnets) @@ -89,6 +84,11 @@ if(enable_java) message("-- [Java] JNI include dirs: ${JNI_INCLUDE_DIRS}") set(HAVE_Java 1) endif() +if(enable_scala) + find_package(Scala REQUIRED) + message("-- [Scala] scalac found: ${SCALA_COMPILE}") + set(HAVE_Scala 1) +endif() if(enable_lua) include(FindLua51Simgrid) endif() @@ -771,6 +771,7 @@ configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid_config.h.in" "${CMAKE_ set(top_srcdir "${CMAKE_HOME_DIRECTORY}") set(srcdir "${CMAKE_HOME_DIRECTORY}/src") +set(bindir "${CMAKE_BINARY_DIR}") ### Script used when simgrid is installed set(exec_prefix ${CMAKE_INSTALL_PREFIX}) @@ -855,6 +856,9 @@ else() configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoallv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_waitall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt COPYONLY) + configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_reducescatter.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt COPYONLY) + configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY) + configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY) set(generated_files_to_clean diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 84cb6ccedf..8803ef8692 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -37,6 +37,8 @@ set(EXTRA_DIST src/smpi/README src/smpi/colls/COPYRIGHTS src/smpi/colls/colls.h + src/smpi/colls/colls_private.h + src/smpi/colls/coll_tuned_topo.h src/smpi/private.h src/smpi/smpi_mpi_dt_private.h src/surf/cpu_ti_private.h @@ -109,9 +111,12 @@ set(SMPI_SRC src/smpi/smpi_mpi_dt.c src/smpi/smpi_pmpi.c src/smpi/smpi_replay.c - #src/smpi/colls/allgather-2dmesh.c - #src/smpi/colls/allgather-3dmesh.c - #src/smpi/colls/allgather-bruck.c + src/smpi/colls/smpi_openmpi_selector.c + src/smpi/colls/smpi_mpich_selector.c + src/smpi/colls/colls_global.c + src/smpi/colls/allgather-2dmesh.c + src/smpi/colls/allgather-3dmesh.c + src/smpi/colls/allgather-bruck.c src/smpi/colls/allgather-GB.c src/smpi/colls/allgather-loosely-lr.c src/smpi/colls/allgather-lr.c @@ -119,28 +124,34 @@ set(SMPI_SRC src/smpi/colls/allgather-NTSLR-NB.c src/smpi/colls/allgather-pair.c src/smpi/colls/allgather-rdb.c - src/smpi/colls/allgather-RDB.c src/smpi/colls/allgather-rhv.c src/smpi/colls/allgather-ring.c src/smpi/colls/allgather-SMP-NTS.c src/smpi/colls/allgather-smp-simple.c - src/smpi/colls/allgather-SMP-simple.c src/smpi/colls/allgather-spreading-simple.c + src/smpi/colls/allgather-ompi-neighborexchange.c + src/smpi/colls/allgatherv-GB.c + src/smpi/colls/allgatherv-pair.c + src/smpi/colls/allgatherv-ring.c + src/smpi/colls/allgatherv-ompi-neighborexchange.c + src/smpi/colls/allgatherv-ompi-bruck.c + src/smpi/colls/allgatherv-mpich-rdb.c src/smpi/colls/allreduce-lr.c src/smpi/colls/allreduce-NTS.c src/smpi/colls/allreduce-rab1.c src/smpi/colls/allreduce-rab2.c - #src/smpi/colls/allreduce-rab-rdb.c + src/smpi/colls/allreduce-rab-rdb.c #src/smpi/colls/allreduce-rab-reduce-scatter.c src/smpi/colls/allreduce-rab-rsag.c src/smpi/colls/allreduce-rdb.c src/smpi/colls/allreduce-redbcast.c src/smpi/colls/allreduce-smp-binomial.c - #src/smpi/colls/allreduce-smp-binomial-pipeline.c + src/smpi/colls/allreduce-smp-binomial-pipeline.c src/smpi/colls/allreduce-smp-rdb.c src/smpi/colls/allreduce-smp-rsag.c src/smpi/colls/allreduce-smp-rsag-lr.c src/smpi/colls/allreduce-smp-rsag-rab.c + src/smpi/colls/allreduce-ompi-ring-segmented.c src/smpi/colls/alltoall-2dmesh.c src/smpi/colls/alltoall-3dmesh.c #src/smpi/colls/alltoall-bruck.c @@ -154,6 +165,15 @@ set(SMPI_SRC src/smpi/colls/alltoall-ring-mpi-barrier.c src/smpi/colls/alltoall-ring-one-barrier.c src/smpi/colls/alltoall-simple.c + src/smpi/colls/alltoallv-pair.c + src/smpi/colls/alltoallv-pair-light-barrier.c + src/smpi/colls/alltoallv-pair-mpi-barrier.c + src/smpi/colls/alltoallv-pair-one-barrier.c + src/smpi/colls/alltoallv-ring.c + src/smpi/colls/alltoallv-ring-light-barrier.c + src/smpi/colls/alltoallv-ring-mpi-barrier.c + src/smpi/colls/alltoallv-ring-one-barrier.c + src/smpi/colls/alltoallv-bruck.c src/smpi/colls/bcast-arrival-nb.c src/smpi/colls/bcast-arrival-pattern-aware.c src/smpi/colls/bcast-arrival-pattern-aware-wait.c @@ -169,13 +189,20 @@ set(SMPI_SRC src/smpi/colls/bcast-SMP-binary.c src/smpi/colls/bcast-SMP-binomial.c src/smpi/colls/bcast-SMP-linear.c - src/smpi/colls/bcast-TSB.c + src/smpi/colls/coll_tuned_topo.c + src/smpi/colls/bcast-ompi-split-bintree.c + src/smpi/colls/bcast-ompi-pipeline.c src/smpi/colls/reduce-arrival-pattern-aware.c src/smpi/colls/reduce-binomial.c src/smpi/colls/reduce-flat-tree.c src/smpi/colls/reduce-NTSL.c src/smpi/colls/reduce-scatter-gather.c - src/smpi/colls/star-reduction.c + src/smpi/colls/reduce-ompi.c + src/smpi/colls/gather-ompi.c + src/smpi/colls/reduce_scatter-ompi.c + src/smpi/colls/reduce_scatter-mpich.c + src/smpi/colls/scatter-ompi.c + src/smpi/colls/barrier-ompi.c ) if(SMPI_F2C) @@ -278,7 +305,6 @@ set(SURF_SRC src/surf/surf_routing_full.c src/surf/surf_routing_generic.c src/surf/surf_routing_none.c - src/surf/surf_routing_rulebased.c src/surf/surf_routing_vivaldi.c src/surf/surfxml_parse.c src/surf/surfxml_parseplatf.c @@ -323,6 +349,7 @@ set(MSG_SRC src/msg/msg_io.c src/msg/msg_mailbox.c src/msg/msg_process.c + src/msg/msg_synchro.c src/msg/msg_task.c src/msg/msg_vm.c ) @@ -386,6 +413,8 @@ set(BINDINGS_SRC set(JMSG_C_SRC src/bindings/java/jmsg.c src/bindings/java/jmsg.h + src/bindings/java/jmsg_as.c + src/bindings/java/jmsg_as.h src/bindings/java/jmsg_comm.c src/bindings/java/jmsg_comm.h src/bindings/java/jmsg_file.c @@ -411,6 +440,7 @@ set(JMSG_C_SRC ) set(JMSG_JAVA_SRC + src/bindings/java/org/simgrid/msg/As.java src/bindings/java/org/simgrid/msg/Comm.java src/bindings/java/org/simgrid/msg/File.java src/bindings/java/org/simgrid/msg/Host.java @@ -420,6 +450,7 @@ set(JMSG_JAVA_SRC src/bindings/java/org/simgrid/msg/Msg.java src/bindings/java/org/simgrid/msg/MsgException.java src/bindings/java/org/simgrid/msg/Mutex.java + src/bindings/java/org/simgrid/msg/Semaphore.java src/bindings/java/org/simgrid/msg/NativeException.java src/bindings/java/org/simgrid/msg/Process.java src/bindings/java/org/simgrid/msg/ProcessKilledError.java @@ -525,7 +556,6 @@ set(headers_to_install include/xbt/dynar.h include/xbt/ex.h include/xbt/fifo.h - include/xbt/file_stat.h include/xbt/function_types.h include/xbt/graph.h include/xbt/graphxml.h @@ -608,7 +638,6 @@ set(simgrid_sources ${SIMGRID_SRC} ${SIMIX_SRC} ${SURF_SRC} - ${TRACING_SRC} ${XBT_SRC} ) @@ -695,7 +724,6 @@ set(DOC_SOURCES doc/HelloWorld/CMakeLists.txt doc/HelloWorld/HelloWorld.c - doc/HelloWorld/FindPcreWin.cmake doc/HelloWorld/README doc/doxygen/FAQ.doc @@ -831,6 +859,7 @@ set(EXAMPLES_CMAKEFILES_TXT examples/msg/CMakeLists.txt examples/msg/actions/CMakeLists.txt examples/msg/bittorrent/CMakeLists.txt + examples/msg/chainsend/CMakeLists.txt examples/msg/chord/CMakeLists.txt examples/msg/cloud/CMakeLists.txt examples/msg/gpu/CMakeLists.txt @@ -843,15 +872,20 @@ set(EXAMPLES_CMAKEFILES_TXT examples/msg/migration/CMakeLists.txt examples/msg/ns3/CMakeLists.txt examples/msg/parallel_task/CMakeLists.txt + examples/msg/pastry/CMakeLists.txt examples/msg/pmm/CMakeLists.txt examples/msg/priority/CMakeLists.txt examples/msg/properties/CMakeLists.txt + examples/msg/semaphores/CMakeLists.txt examples/msg/sendrecv/CMakeLists.txt - examples/msg/chainsend/CMakeLists.txt examples/msg/start_kill_time/CMakeLists.txt examples/msg/suspend/CMakeLists.txt examples/msg/token_ring/CMakeLists.txt examples/msg/tracing/CMakeLists.txt + examples/scala/CMakeLists.txt + examples/scala/master_slave_bypass/CMakeLists.txt + examples/scala/master_slave_kill/CMakeLists.txt + examples/scala/masterslave/CMakeLists.txt examples/simdag/CMakeLists.txt examples/simdag/dax/CMakeLists.txt examples/simdag/dot/CMakeLists.txt @@ -869,20 +903,20 @@ set(TESHSUITE_CMAKEFILES_TXT teshsuite/msg/CMakeLists.txt teshsuite/msg/trace/CMakeLists.txt teshsuite/simdag/CMakeLists.txt + teshsuite/simdag/availability/CMakeLists.txt teshsuite/simdag/network/CMakeLists.txt teshsuite/simdag/network/mxn/CMakeLists.txt teshsuite/simdag/network/p2p/CMakeLists.txt teshsuite/simdag/partask/CMakeLists.txt teshsuite/simdag/platforms/CMakeLists.txt - teshsuite/simdag/availability/CMakeLists.txt - teshsuite/xbt/CMakeLists.txt teshsuite/smpi/CMakeLists.txt teshsuite/smpi/mpich-test/CMakeLists.txt - teshsuite/smpi/mpich-test/env/CMakeLists.txt teshsuite/smpi/mpich-test/coll/CMakeLists.txt teshsuite/smpi/mpich-test/context/CMakeLists.txt + teshsuite/smpi/mpich-test/env/CMakeLists.txt teshsuite/smpi/mpich-test/profile/CMakeLists.txt teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt + teshsuite/xbt/CMakeLists.txt ) set(TOOLS_CMAKEFILES_TXT @@ -918,10 +952,9 @@ set(CMAKE_SOURCE_FILES buildtools/Cmake/Modules/FindLibunwind.cmake buildtools/Cmake/Modules/FindLua51Simgrid.cmake buildtools/Cmake/Modules/FindNS3.cmake - buildtools/Cmake/Modules/FindPCRE.cmake - buildtools/Cmake/Modules/FindPcreWin.cmake buildtools/Cmake/Modules/FindRngStream.cmake buildtools/Cmake/Modules/FindRubySimgrid.cmake + buildtools/Cmake/Modules/FindScala.cmake buildtools/Cmake/Modules/FindSimGrid.cmake buildtools/Cmake/Modules/FindValgrind.cmake buildtools/Cmake/Option.cmake @@ -963,7 +996,6 @@ set(PLATFORMS_EXAMPLES examples/platforms/cluster.xml examples/platforms/cluster_and_one_host.xml examples/platforms/cluster_no_backbone.xml - examples/platforms/cluster_routing_rulebased.xml examples/platforms/clusters_routing_full.xml examples/platforms/conf/gridpp_grid_2004.conf examples/platforms/conf/gridpp_grid_2004.xml diff --git a/buildtools/Cmake/MakeExe.cmake b/buildtools/Cmake/MakeExe.cmake index 9cf775f5ea..92c7005e0a 100644 --- a/buildtools/Cmake/MakeExe.cmake +++ b/buildtools/Cmake/MakeExe.cmake @@ -10,29 +10,6 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite) add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools) ################################################################## -add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/tesh) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/graphicator/) - -add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/xbt) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/surf) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/xbt) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/availability) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg/trace) - add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/async) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/bittorrent) @@ -52,38 +29,68 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/startKillTime) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/suspend) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/tracing) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/properties) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/actions) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/migration) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/chainsend) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/suspend) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/priority) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/icomms) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/chainsend) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/chord) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/pmm) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/start_kill_time) - -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/io) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/cloud) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/gpu) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/tracing) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/mc) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/icomms) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/io) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/mc) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/migration) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/ns3) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/pastry) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/pmm) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/priority) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/properties) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/semaphores) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/start_kill_time) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/suspend) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/tracing) + +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_bypass) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_kill) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/masterslave) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/dax) -add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/goal) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/dot) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/goal) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/metaxml) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/properties) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/scheduling) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/smpi) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/smpi/MM) + +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg/trace) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/availability) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/xbt) + +add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/surf) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/xbt) + +add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/graphicator/) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/tesh) diff --git a/buildtools/Cmake/MakeJava.cmake b/buildtools/Cmake/MakeJava.cmake index f9037de250..86d7dd372d 100644 --- a/buildtools/Cmake/MakeJava.cmake +++ b/buildtools/Cmake/MakeJava.cmake @@ -6,23 +6,31 @@ include(UseJava) # add_library(SG_java SHARED ${JMSG_C_SRC}) set_target_properties(SG_java PROPERTIES VERSION ${libSG_java_version}) -get_target_property(COMMON_INCLUDES SG_java INCLUDE_DIRECTORIES) -if (COMMON_INCLUDES) - set_target_properties(SG_java PROPERTIES - INCLUDE_DIRECTORIES "${COMMON_INCLUDES};${JNI_INCLUDE_DIRS}") +if (CMAKE_VERSION VERSION_LESS "2.8.8") + include_directories(${JNI_INCLUDE_DIRS}) + + message(WARNING "[Java] Try to workaround missing feature in older CMake. You should better update CMake to version 2.8.8 or above.") + get_directory_property(CHECK_INCLUDES INCLUDE_DIRECTORIES) else() - set_target_properties(SG_java PROPERTIES - INCLUDE_DIRECTORIES "${JNI_INCLUDE_DIRS}") -endif() -add_dependencies(SG_java simgrid) + get_target_property(COMMON_INCLUDES SG_java INCLUDE_DIRECTORIES) + if (COMMON_INCLUDES) + set_target_properties(SG_java PROPERTIES + INCLUDE_DIRECTORIES "${COMMON_INCLUDES};${JNI_INCLUDE_DIRS}") + else() + set_target_properties(SG_java PROPERTIES + INCLUDE_DIRECTORIES "${JNI_INCLUDE_DIRS}") + endif() + add_dependencies(SG_java simgrid) -get_target_property(CHECK_INCLUDES SG_java INCLUDE_DIRECTORIES) + get_target_property(CHECK_INCLUDES SG_java INCLUDE_DIRECTORIES) +endif() message("-- [Java] SG_java includes: ${CHECK_INCLUDES}") +target_link_libraries(SG_java simgrid) + if(WIN32) - get_target_property(SIMGRID_LIB_NAME_NAME SG_java LIBRARY_OUTPUT_NAME) set_target_properties(SG_java PROPERTIES - LINK_FLAGS "-Wl,--subsystem,windows,--kill-at ${SIMGRID_LIB_NAME}" + LINK_FLAGS "-Wl,--subsystem,windows,--kill-at" PREFIX "") find_path(PEXPORTS_PATH NAMES pexports.exe PATHS NO_DEFAULT_PATHS) message(STATUS "pexports: ${PEXPORTS_PATH}") @@ -30,8 +38,6 @@ if(WIN32) add_custom_command(TARGET SG_java POST_BUILD COMMAND ${PEXPORTS_PATH}/pexports.exe ${CMAKE_BINARY_DIR}/SG_java.dll > ${CMAKE_BINARY_DIR}/SG_java.def) endif(PEXPORTS_PATH) -else() - target_link_libraries(SG_java simgrid) endif() # Rules to build simgrid.jar @@ -83,6 +89,7 @@ add_custom_command( ${CMAKE_HOME_DIRECTORY}/COPYING ${CMAKE_HOME_DIRECTORY}/ChangeLog ${CMAKE_HOME_DIRECTORY}/ChangeLog.SimGrid-java + ${CMAKE_HOME_DIRECTORY}/LICENSE-LGPL-2.1 COMMAND ${CMAKE_COMMAND} -E remove_directory "NATIVE" COMMAND ${CMAKE_COMMAND} -E make_directory "${JSG_BUNDLE}" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_SO}" "${JSG_BUNDLE}" @@ -92,6 +99,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_HOME_DIRECTORY}/COPYING" "${JSG_BUNDLE}" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_HOME_DIRECTORY}/ChangeLog" "${JSG_BUNDLE}" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_HOME_DIRECTORY}/ChangeLog.SimGrid-java" "${JSG_BUNDLE}" + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_HOME_DIRECTORY}/LICENSE-LGPL-2.1" "${JSG_BUNDLE}" COMMAND ${JAVA_ARCHIVE} -uvmf ${MANIFEST_FILE} ${SIMGRID_JAR} "NATIVE" COMMAND ${CMAKE_COMMAND} -E remove ${SIMGRID_JAR}_finalized COMMAND ${CMAKE_COMMAND} -E touch ${SIMGRID_JAR}_finalized diff --git a/buildtools/Cmake/MakeLib.cmake b/buildtools/Cmake/MakeLib.cmake index 0c8e76f6d4..93ace1d424 100644 --- a/buildtools/Cmake/MakeLib.cmake +++ b/buildtools/Cmake/MakeLib.cmake @@ -38,7 +38,7 @@ endif() # Compute the dependencies of SimGrid ##################################### -set(SIMGRID_DEP "-lm -lpcre") +set(SIMGRID_DEP "-lm") if(pthread) if(${CONTEXT_THREADS}) diff --git a/buildtools/Cmake/MakeLibWin.cmake b/buildtools/Cmake/MakeLibWin.cmake index 081c6e0530..206ab5ca34 100644 --- a/buildtools/Cmake/MakeLibWin.cmake +++ b/buildtools/Cmake/MakeLibWin.cmake @@ -24,7 +24,7 @@ else() ) endif() -set(SIMGRID_DEP "-lws2_32 -L${PATH_PCRE_LIB} -L${PATH_PTHREAD_LIB} -lm -lpcre -lpthreadGC2") +set(SIMGRID_DEP "-lws2_32 -L${PATH_PTHREAD_LIB} -lm -lpthreadGC2") if(ARCH_32_BITS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i486") diff --git a/buildtools/Cmake/Modules/FindPCRE.cmake b/buildtools/Cmake/Modules/FindPCRE.cmake deleted file mode 100644 index 2e46c9b1e6..0000000000 --- a/buildtools/Cmake/Modules/FindPCRE.cmake +++ /dev/null @@ -1,54 +0,0 @@ -find_library(PATH_PCRE_LIB - NAMES pcre - HINTS - $ENV{SIMGRID_PCRE_LIBRARY_PATH} - $ENV{LD_LIBRARY_PATH} - $ENV{PCRE_LIBRARY_PATH} - PATH_SUFFIXES lib/ GnuWin32/lib - PATHS - /opt - /opt/local - /opt/csw - /sw - /usr) - -find_path(PATH_PCRE_H "pcre.h" - HINTS - $ENV{SIMGRID_PCRE_LIBRARY_PATH} - $ENV{LD_LIBRARY_PATH} - $ENV{PCRE_LIBRARY_PATH} - PATH_SUFFIXES include/ GnuWin32/include - PATHS - /opt - /opt/local - /opt/csw - /sw - /usr) - -message(STATUS "Looking for pcre.h") -if(PATH_PCRE_H) - message(STATUS "Looking for pcre.h - found") -else() - message(STATUS "Looking for pcre.h - not found") -endif() - -message(STATUS "Looking for lib pcre") -if(PATH_PCRE_LIB) - message(STATUS "Looking for lib pcre - found") -else() - message(STATUS "Looking for lib pcre - not found") -endif() - -if(PATH_PCRE_LIB AND PATH_PCRE_H) - string(REGEX REPLACE "/libpcre.*[.]${LIB_EXE}$" "" PATH_PCRE_LIB "${PATH_PCRE_LIB}") - string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") - include_directories(${PATH_PCRE_H}) - link_directories(${PATH_PCRE_LIB}) -else() - message(FATAL_ERROR "Please install the libpcre3-dev package or equivalent before using SimGrid.") -endif() - -set(PCRE_LIBRARY_PATH $ENV{PCRE_LIBRARY_PATH}) - -mark_as_advanced(PATH_PCRE_H) -mark_as_advanced(PATH_PCRE_LIB) \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindPcreWin.cmake b/buildtools/Cmake/Modules/FindPcreWin.cmake deleted file mode 100644 index 8f454fb546..0000000000 --- a/buildtools/Cmake/Modules/FindPcreWin.cmake +++ /dev/null @@ -1,44 +0,0 @@ -# LIB libpcre.dll -find_library(PATH_PCRE_LIB - NAMES pcre - HINTS - $ENV{SIMGRID_PCRE_LIBRARY_PATH} - $ENV{PCRE_LIBRARY_PATH} - PATH_SUFFIXES bin/ GnuWin32/bin - ) - -find_path(PATH_PCRE_H "pcre.h" - HINTS - $ENV{SIMGRID_PCRE_LIBRARY_PATH} - $ENV{PCRE_LIBRARY_PATH} - PATH_SUFFIXES include/ GnuWin32/include - ) - -message(STATUS "Looking for pcre.h") -if(PATH_PCRE_H) - message(STATUS "Looking for pcre.h - found") -else() - message(STATUS "Looking for pcre.h - not found") -endif() - -message(STATUS "Looking for lib pcre") -if(PATH_PCRE_LIB) - message(STATUS "Looking for lib pcre - found") -else() - message(STATUS "Looking for lib pcre - not found") -endif() - -if(PATH_PCRE_LIB AND PATH_PCRE_H) - string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") - string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}") - if(NOT operation) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ") - endif() -else() - message(FATAL_ERROR "Please install the pcre package before using SimGrid.") -endif() - -set(PCRE_LIBRARY_PATH $ENV{PCRE_LIBRARY_PATH}) - -mark_as_advanced(PATH_PCRE_H) -mark_as_advanced(PATH_PCRE_LIB) \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindScala.cmake b/buildtools/Cmake/Modules/FindScala.cmake new file mode 100644 index 0000000000..777527ab2d --- /dev/null +++ b/buildtools/Cmake/Modules/FindScala.cmake @@ -0,0 +1,21 @@ + +find_program(SCALA_COMPILE + NAMES scalac + PATH_SUFFIXES bin/ + PATHS + /opt + /opt/local + /opt/csw + /sw + /usr + ) + +message(STATUS "Looking for scalac") +if(SCALA_COMPILE) + message(STATUS "Looking for scalac - found") +else() + message(STATUS "Looking for scalac - not found") +endif() + +set(SCALA_JARS "/usr/share/java/scala-compiler.jar:/usr/share/java/scala-library.jar:/usr/share/java/scalap.jar:/usr/share/java/scala/jline.jar:/usr/share/java/jansi.jar") + diff --git a/buildtools/Cmake/Option.cmake b/buildtools/Cmake/Option.cmake index 2df5821be0..76622f5a76 100644 --- a/buildtools/Cmake/Option.cmake +++ b/buildtools/Cmake/Option.cmake @@ -21,6 +21,7 @@ option(enable_debug "Set NDEBUG flag" on) option(enable_gtnets "Whether gtnets model is activated." off) option(enable_ns3 "Whether ns3 model is activated." off) option(enable_java "Whether the Java bindings are activated." off) +option(enable_scala "Whether the Scala bindings are activated." off) option(enable_lua "Whether the lua bindings are activated." off) option(enable_compile_warnings "Whether compilation warnings should be turned into errors." off) option(enable_maintainer_mode "Whether flex and flexml files should be rebuilt." off) @@ -46,6 +47,10 @@ else() option(enable_smpi "Whether SMPI in included in library." on) endif() +if(enable_scala AND NOT enable_java) + message(WARNING "For using scala you must turn java on with command:\ncmake -Denable_java=on .") +endif() + mark_as_advanced(HAVE_SSH) mark_as_advanced(HAVE_RSYNC) mark_as_advanced(BIBTEX2HTML_PATH) diff --git a/buildtools/Cmake/PrintArgs.cmake b/buildtools/Cmake/PrintArgs.cmake index c1393b9538..fa0fa1f309 100644 --- a/buildtools/Cmake/PrintArgs.cmake +++ b/buildtools/Cmake/PrintArgs.cmake @@ -106,6 +106,7 @@ if(NOT APPLE AND NOT WIN32) message(" NS-3 path ...........: ${ns3_path}") endif() message(" Compile Java ........: ${HAVE_Java}") +message(" Compile Scala........: ${HAVE_Scala}") message(" Compile Lua .........: ${HAVE_LUA}") message(" Compile Smpi ........: ${HAVE_SMPI}") message(" Compile Smpi f77 ....: ${SMPI_F2C}") diff --git a/buildtools/Cmake/UnitTesting.cmake b/buildtools/Cmake/UnitTesting.cmake index 4351f1b60e..7800769b06 100644 --- a/buildtools/Cmake/UnitTesting.cmake +++ b/buildtools/Cmake/UnitTesting.cmake @@ -12,7 +12,6 @@ set(TEST_CFILES src/xbt/xbt_strbuff.c src/xbt/xbt_sha.c src/xbt/config.c - src/xbt/parmap.c ) set(TEST_UNITS ${CMAKE_CURRENT_BINARY_DIR}/src/cunit_unit.c @@ -25,7 +24,6 @@ set(TEST_UNITS ${CMAKE_CURRENT_BINARY_DIR}/src/xbt_strbuff_unit.c ${CMAKE_CURRENT_BINARY_DIR}/src/xbt_sha_unit.c ${CMAKE_CURRENT_BINARY_DIR}/src/config_unit.c - ${CMAKE_CURRENT_BINARY_DIR}/src/parmap_unit.c ${CMAKE_CURRENT_BINARY_DIR}/src/simgrid_units_main.c ) diff --git a/buildtools/Cmake/src/simgrid.nsi.in b/buildtools/Cmake/src/simgrid.nsi.in index da7aeb4fd5..1323865d0a 100644 --- a/buildtools/Cmake/src/simgrid.nsi.in +++ b/buildtools/Cmake/src/simgrid.nsi.in @@ -163,8 +163,6 @@ Section "Examples" ExamplesSection file @CMAKE_HOME_DIRECTORY@\examples\msg\masterslave\deployment_masterslave_forwarder.xml file @CMAKE_HOME_DIRECTORY@\examples\msg\msg_platform.xml file @CMAKE_HOME_DIRECTORY@\doc\HelloWorld\CMakeLists.txt - file @CMAKE_HOME_DIRECTORY@\doc\HelloWorld\FindPcreWin.cmake - # create shortcuts in the start menu programs directory CreateDirectory "$SMPROGRAMS\SimGrid @SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@\Examples\" @@ -172,16 +170,6 @@ Section "Examples" ExamplesSection createShortCut "$SMPROGRAMS\SimGrid @SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@\Examples\MasterSlave project.lnk" "$INSTDIR\examples\MasterSlave" SectionEnd -Section "Pcre library" PCRESection - # install pcre library - CreateDirectory $INSTDIR\GnuWin32 - setOutPath $INSTDIR\GnuWin32 - file /r "@PCRE_LIBRARY_PATH@\lib" - file /r "@PCRE_LIBRARY_PATH@\include" - file /r "@PCRE_LIBRARY_PATH@\bin" - file /r "@PCRE_LIBRARY_PATH@\man" - file /r "@PCRE_LIBRARY_PATH@\share" -SectionEnd Section "Java Bindings" JavaSection # install java library and examples @@ -230,7 +218,6 @@ Section "SMPI Library" SMPISection file @CMAKE_HOME_DIRECTORY@\examples\smpi\hostfile file @CMAKE_HOME_DIRECTORY@\examples\msg\small_platform_with_routers.xml file @CMAKE_HOME_DIRECTORY@\examples\smpi\CMakeLists.txt - file @CMAKE_HOME_DIRECTORY@\doc\HelloWorld\FindPcreWin.cmake SectionEnd # default section start @@ -250,8 +237,6 @@ section # Set Variables WriteRegExpandStr ${env_hkcu} SIMGRID_ROOT $INSTDIR WriteRegExpandStr ${env_hkcu} SIMGRID_VERSION @SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@ - WriteRegExpandStr ${env_hkcu} SIMGRID_PCRE_LIBRARY_PATH $INSTDIR\GnuWin32 - WriteRegExpandStr ${env_hkcu} SIMGRID_PCRE_LIBRARY_VERSION "8.21" WriteRegStr HKCU "SOFTWARE\SimGrid" "Version" "@SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@" WriteRegStr HKCU "SOFTWARE\SimGrid" "InstallPath" "$INSTDIR" @@ -268,25 +253,22 @@ LangString DESC_LibSection ${LANG_ENGLISH} "Install Simgrid libraries with ass LangString DESC_BinSection ${LANG_ENGLISH} "Install some useful tools for Simgrid." LangString DESC_DocSection ${LANG_ENGLISH} "Generated (doxygen) documentation." LangString DESC_ExamplesSection ${LANG_ENGLISH} "Simgrid's HelloWorld example and some classical platforms." -LangString DESC_PCRESection ${LANG_ENGLISH} "Install the PCRE and PCREPOSIX libraries for SimGrid." LangString DESC_JAVASection ${LANG_ENGLISH} "Install the Java binding and examples." LangString DESC_SMPISection ${LANG_ENGLISH} "Install the SMPI library, headers, and examples." -LangString DESC_LibSection ${LANG_FRENCH} "Installer les librairies Simgrid et leurs Entêtes." +LangString DESC_LibSection ${LANG_FRENCH} "Installer les librairies Simgrid et leurs Ent�tes." LangString DESC_BinSection ${LANG_FRENCH} "Installer les outils optionnels." LangString DESC_DocSection ${LANG_FRENCH} "Installer la documentation." LangString DESC_ExamplesSection ${LANG_FRENCH} "Installer un exemple 'HelloWorld' et des fichiers de plate-formes types." -LangString DESC_PCRESection ${LANG_FRENCH} "Installer les librairies PCRE et PCREPOSIX for SimGrid." LangString DESC_JAVASection ${LANG_FRENCH} "Installer la librairie Simgrid-java et les exemples." -LangString DESC_SMPISection ${LANG_FRENCH} "Installer la librairie SMPI, ses en-têtes, et ses exemples." +LangString DESC_SMPISection ${LANG_FRENCH} "Installer la librairie SMPI, ses en-t�tes, et ses exemples." !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${LibSection} $(DESC_LibSection) !insertmacro MUI_DESCRIPTION_TEXT ${BinSection} $(DESC_BinSection) !insertmacro MUI_DESCRIPTION_TEXT ${DocSection} $(DESC_DocSection) !insertmacro MUI_DESCRIPTION_TEXT ${ExamplesSection} $(DESC_ExamplesSection) - !insertmacro MUI_DESCRIPTION_TEXT ${PCRESection} $(DESC_PCRESection) !insertmacro MUI_DESCRIPTION_TEXT ${JAVASection} $(DESC_JAVASection) !insertmacro MUI_DESCRIPTION_TEXT ${SMPISection} $(DESC_SMPISection) !insertmacro MUI_FUNCTION_DESCRIPTION_END @@ -394,14 +376,9 @@ section "Uninstall" RMDir /r "$INSTDIR\examples" RMDir /r "$SMPROGRAMS\SimGrid @SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@" - # delete PCRE - RMDir /r "$INSTDIR\GnuWin32" - # Delete variable DeleteRegValue ${env_hkcu} SIMGRID_ROOT DeleteRegValue ${env_hkcu} SIMGRID_VERSION - DeleteRegValue ${env_hkcu} SIMGRID_PCRE_LIBRARY_PATH - DeleteRegValue ${env_hkcu} SIMGRID_PCRE_LIBRARY_VERSION DeleteRegKey HKCU "SOFTWARE\SimGrid" # delete JAVA-bindings diff --git a/buildtools/jenkins/run.bat b/buildtools/jenkins/run.bat new file mode 100644 index 0000000000..867f69c621 --- /dev/null +++ b/buildtools/jenkins/run.bat @@ -0,0 +1 @@ +c:\mingw\msys\1.0\bin\sh -login .\buildtools\Jenkins\runmingw.sh %1 %2 diff --git a/buildtools/jenkins/run.sh b/buildtools/jenkins/run.sh new file mode 100644 index 0000000000..fe5a509b1e --- /dev/null +++ b/buildtools/jenkins/run.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +WORKSPACE=$1 +build_mode=$2 + +rm -rf $WORKSPACE/build +rm -rf $WORKSPACE/install + +mkdir $WORKSPACE/build +mkdir $WORKSPACE/install +cd $WORKSPACE/build + +cmake $WORKSPACE +make dist +tar xzf `cat VERSION`.tar.gz +cd `cat VERSION` + +if [ "$build_mode" = "Debug" ] +then +cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=ON -Denable_compile_optimizations=ON -Denable_compile_warnings=ON . +fi + +if [ "$build_mode" = "ModelChecker" ] +then +cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=ON -Denable_lua=ON -Denable_compile_optimizations=OFF -Denable_compile_warnings=ON . +fi + +if [ "$build_mode" = "DynamicAnalysis" ] +then +cmake -Denable_lua=OFF -Denable_java=ON -Denable_tracing=ON -Denable_smpi=ON -Denable_compile_optimizations=OFF -Denable_compile_warnings=ON -Denable_lib_static=OFF -Denable_model-checking=OFF -Denable_latency_bound_tracking=OFF -Denable_gtnets=OFF -Denable_jedule=OFF -Denable_mallocators=OFF -Denable_memcheck=ON . +fi + +make + +TRES=0 + +ctest -T test --no-compress-output || true +if [ -f Testing/TAG ] ; then + /usr/bin/xsltproc $WORKSPACE/buildtools/jenkins/ctest2junit.xsl Testing/`head -n 1 < Testing/TAG`/Test.xml > CTestResults.xml + mv CTestResults.xml $WORKSPACE +fi + +if [ "$build_mode" = "Debug" ] +then +cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=ON -Denable_compile_optimizations=ON -Denable_compile_warnings=ON . +fi + +if [ "$build_mode" = "ModelChecker" ] +then +cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=ON -Denable_lua=ON -Denable_compile_optimizations=OFF -Denable_compile_warnings=ON . +fi + +if [ "$build_mode" = "DynamicAnalysis" ] +then + ctest -D ContinuousStart + ctest -D ContinuousConfigure + ctest -D ContinuousBuild + ctest -D ContinuousMemCheck + ctest -D ContinuousSubmit +fi + +ctest -D ContinuousStart +ctest -D ContinuousConfigure +ctest -D ContinuousBuild +ctest -D ContinuousTest +ctest -D ContinuousSubmit + +rm -rf `cat VERSION` diff --git a/buildtools/jenkins/runmingw.sh b/buildtools/jenkins/runmingw.sh new file mode 100644 index 0000000000..dc901e89f5 --- /dev/null +++ b/buildtools/jenkins/runmingw.sh @@ -0,0 +1,22 @@ +#!c:\mingw\msys\1.0\bin\sh -login + +WORKSPACE=$1 +build_mode=$2 + +rm -rf $WORKSPACE/build +rm -rf $WORKSPACE/install +mkdir $WORKSPACE/build +mkdir $WORKSPACE/install +cd $WORKSPACE/build + +if [ "$build_mode" = "Debug" ] +then +cmake -G "MSYS Makefiles" .. +fi + +if [ "$build_mode" = "ModelChecker" ] +then +cmake -G "MSYS Makefiles" -Denable_model-checking=ON -Denable_compile_optimizations=OFF .. +fi + +make diff --git a/buildtools/pipol/rc.debian b/buildtools/pipol/rc.debian index 7cdb9c5064..5fd8a96322 100644 --- a/buildtools/pipol/rc.debian +++ b/buildtools/pipol/rc.debian @@ -11,7 +11,6 @@ sudo aptitude -y install git sudo aptitude -y install git-core sudo aptitude -y install graphviz-dev graphviz sudo aptitude -y install liblua5.1-dev lua5.1 -sudo aptitude -y install libpcre3-dev sudo aptitude -y install libunwind7-dev sudo aptitude -y install make sudo aptitude -y install valgrind diff --git a/buildtools/pipol/rc.fedora b/buildtools/pipol/rc.fedora index 8088a64cdd..35f9832a29 100644 --- a/buildtools/pipol/rc.fedora +++ b/buildtools/pipol/rc.fedora @@ -14,7 +14,6 @@ sudo yum -y -q install wget sudo yum -y -q install perl sudo yum -y -q install graphviz-dev graphviz sudo yum -y -q install f2c -sudo yum -y -q install pcre-devel pcre-static sudo yum -y -q install git-core sudo yum -y -q install ruby ruby-devel sudo yum -y -q install libunwind libunwind-devel diff --git a/buildtools/pipol/rc.mac b/buildtools/pipol/rc.mac index c14e3ea522..9fc740a2fa 100644 --- a/buildtools/pipol/rc.mac +++ b/buildtools/pipol/rc.mac @@ -1,7 +1,6 @@ #!/bin/bash #sudo port install wget -#sudo port install pcre #sudo port install gcc46 #sudo port install graphviz-devel #sudo port install lua diff --git a/buildtools/pipol/rc.ubuntu b/buildtools/pipol/rc.ubuntu index 534e321e38..cfd59e325d 100644 --- a/buildtools/pipol/rc.ubuntu +++ b/buildtools/pipol/rc.ubuntu @@ -10,7 +10,6 @@ sudo apt-get -y -qq install gcc sudo apt-get -y -qq install git-core sudo apt-get -y -qq install graphviz-dev graphviz sudo apt-get -y -qq install liblua5.1-dev lua5.1 -sudo apt-get -y -qq install libpcre3-dev sudo apt-get -y -qq install libunwind7-dev sudo apt-get -y -qq install make sudo apt-get -y -qq install perl diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index 4b9d2125e2..104b4ee2dc 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -131,7 +131,7 @@ FULL_PATH_NAMES = YES # If left blank the directory from which doxygen is run is used as the # path to strip. -STRIP_FROM_PATH = @srcdir@ +STRIP_FROM_PATH = @top_srcdir@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells @@ -690,6 +690,7 @@ INPUT = doxygen/index.doc \ index-API.doc \ @top_srcdir@/doc/doxygen/logcategories.doc \ @top_srcdir@/src/instr/ \ + @bindir@/include \ @top_srcdir@/include/ \ @top_srcdir@/include/msg \ @top_srcdir@/include/xbt \ @@ -700,7 +701,8 @@ INPUT = doxygen/index.doc \ @top_srcdir@/src/surf/ \ @top_srcdir@/src/msg/ \ @top_srcdir@/src/simdag \ - @top_srcdir@/src/simix + @top_srcdir@/src/simix \ + @bindir@/src ################################################### diff --git a/doc/HelloWorld/CMakeLists.txt b/doc/HelloWorld/CMakeLists.txt index 99c2b582f3..02d42f5c9f 100644 --- a/doc/HelloWorld/CMakeLists.txt +++ b/doc/HelloWorld/CMakeLists.txt @@ -4,9 +4,9 @@ cmake_minimum_required(VERSION 2.8) ### Need to set rc ccompiler before enable language if(WIN32) SET(CMAKE_RC_COMPILER "windres") - set(LIBRARIES_DEP simgrid pcre ws2_32 pthread) + set(LIBRARIES_DEP simgrid ws2_32 pthread) else() - set(LIBRARIES_DEP simgrid pcre pthread) + set(LIBRARIES_DEP simgrid pthread) endif() project(MY_SIMGRID_PROJECT C) @@ -17,7 +17,6 @@ set(CMAKE_EXE_LINKER_FLAGS "" CACHE TYPE INTERNAL FORCE) ############################### # Test the build dependencies # ############################### -include(FindPcreWin.cmake) message(STATUS "Looking for lib Simgrid") if("$ENV{SIMGRID_ROOT}" STREQUAL "") message(STATUS "Looking for lib Simgrid - Not found") diff --git a/doc/HelloWorld/FindPcreWin.cmake b/doc/HelloWorld/FindPcreWin.cmake deleted file mode 100644 index d4628ea12c..0000000000 --- a/doc/HelloWorld/FindPcreWin.cmake +++ /dev/null @@ -1,44 +0,0 @@ -# LIB libpcre.dll -find_library(PATH_PCRE_LIB - NAMES pcre - HINTS - $ENV{SIMGRID_PCRE_LIBRARY_PATH} - $ENV{PCRE_LIBRARY_PATH} - PATH_SUFFIXES bin/ GnuWin32/bin - ) - -find_path(PATH_PCRE_H "pcre.h" - HINTS - $ENV{SIMGRID_PCRE_LIBRARY_PATH} - $ENV{PCRE_LIBRARY_PATH} - PATH_SUFFIXES include/ GnuWin32/include - ) - -message(STATUS "Looking for pcre.h") -if(PATH_PCRE_H) - message(STATUS "Looking for pcre.h - found") -else() - message(STATUS "Looking for pcre.h - not found") -endif() - -message(STATUS "Looking for lib pcre") -if(PATH_PCRE_LIB) - message(STATUS "Looking for lib pcre - found") -else() - message(STATUS "Looking for lib pcre - not found") -endif() - -if(PATH_PCRE_LIB AND PATH_PCRE_H) - string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") - string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}") - if(NOT operation) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ") - endif() - string(REGEX REPLACE "/libpcre.dll" "" PATH_PCRE_LIB "${PATH_PCRE_LIB}") - link_directories(${PATH_PCRE_LIB}) -else() - message(FATAL_ERROR "Please install the pcre package before using SimGrid.") -endif() - -mark_as_advanced(PATH_PCRE_H) -mark_as_advanced(PATH_PCRE_LIB) \ No newline at end of file diff --git a/doc/HelloWorld/README b/doc/HelloWorld/README index 43b88f7caa..67b0585fd9 100644 --- a/doc/HelloWorld/README +++ b/doc/HelloWorld/README @@ -15,9 +15,6 @@ This is a very simple example to explain how to compile with simgrid. The example source file. - CMakeLists.txt It allows to configure the project. -- FindPCRE.cmake - Simgrid needs pcre regular expression. - This finds and links to the pcre library (Normally included into Simgrid directory "GnuWin32"). - README This explaination. @@ -27,7 +24,7 @@ This is a very simple example to explain how to compile with simgrid. - Edit CMakeLists.txt : * In the Targets section add those two lines: add_executable(TARGET_NAME SOURCES) - target_link_libraries(TARGET_NAME simgrid pcre) + target_link_libraries(TARGET_NAME simgrid) * It creates a target called 'TARGET_NAME.exe' with the sources 'SOURCES'. - To initialize your project, you'll need to run 'cmake -G"Unix Makefiles" .' - To build you project, run "cmake ." diff --git a/doc/doxygen/inside_extending.doc b/doc/doxygen/inside_extending.doc index 554ab1746b..f7c796b6f9 100644 --- a/doc/doxygen/inside_extending.doc +++ b/doc/doxygen/inside_extending.doc @@ -2,9 +2,9 @@ \page inside_extending Extending SimGrid We start to put TAGS in simgrid source code for having tutorials to see where is the important parts ans steps to create: -\li a new MSG functions or a new API. -\li a new model in surf. -\li new tags in xml files +\li \ref simgrid_dev_guide_api +\li \ref simgrid_dev_guide_model +\li \ref simgrid_dev_guide_tag \section simgrid_dev_guide_api How to add a new MSG function? Search for expression \"TUTORIAL: New API\". diff --git a/doc/doxygen/install.doc b/doc/doxygen/install.doc index e48785c153..8867f4c70f 100644 --- a/doc/doxygen/install.doc +++ b/doc/doxygen/install.doc @@ -86,8 +86,7 @@ have access to your architecture to build SimGrid on it. SimGrid only uses very standard tools: @li C compiler, C++ compiler, make and friends. - @li perl (but you may try to go without it) and libpcre (but we are - working on removing this dependency) + @li perl (but you may try to go without it) @li We use cmake to configure our compilation (download page). You need cmake version 2.8 or higher. You may want to use ccmake @@ -442,8 +441,6 @@ compiling a source file. There are: \verbatim - HelloWorld.c The example source file. - CMakeLists.txt It allows to configure the project. -- FindPCRE.cmake This finds and links to the pcre library (Normally included - into Simgrid directory "GnuWin32"). - README This explaination. \endverbatim @@ -469,8 +466,8 @@ create a target with the same name of the source. ################ #It creates a target called 'TARGET_NAME.exe' with the sources 'SOURCES' add_executable(TARGET_NAME SOURCES) -#Links TARGET_NAME with simgrid and pcre -target_link_libraries(TARGET_NAME simgrid pcre) +#Links TARGET_NAME with simgrid +target_link_libraries(TARGET_NAME simgrid) \endverbatim \li To initialize and build your project, you'll need to run \verbatim diff --git a/doc/doxygen/module-msg.doc b/doc/doxygen/module-msg.doc index 2241a153d3..d652b971a7 100644 --- a/doc/doxygen/module-msg.doc +++ b/doc/doxygen/module-msg.doc @@ -29,6 +29,7 @@ us before digging into these badly documented internal modules). - \ref msg_file_management - \ref msg_task_usage - \ref msg_VMs + - \ref msg_synchro - \ref msg_trace_driven - \ref MSG_examples - \ref msg_deprecated_functions @@ -92,6 +93,14 @@ details). * by a process to execute, communicate or otherwise handle some task. */ +/** @defgroup msg_synchro Explicit Synchronization Functions + * @ingroup MSG_API + * @brief This section describes several explicit synchronization + * mechanisms existing in MSG: semaphores (#msg_sem_t) and friends. + * + * In some situations, these things are very helpful to synchronize processes without message exchanges. + */ + /** @defgroup msg_VMs VMs * @ingroup MSG_API * @brief This section describes the interface created to mimic IaaS clouds. diff --git a/doc/doxygen/options.doc b/doc/doxygen/options.doc index 02f6728456..5f9a58ff93 100644 --- a/doc/doxygen/options.doc +++ b/doc/doxygen/options.doc @@ -173,7 +173,7 @@ price of a reduced numerical precision. By default, Surf computes the analytical models sequentially to share their resources and update their actions. It is possible to run them in parallel, using the \b surf/nthreads item (default value: 1). If you use a -negative value, the amount of available cores is automatically +negative or null value, the amount of available cores is automatically detected and used instead. Depending on the workload of the models and their complexity, you may get a @@ -401,8 +401,8 @@ If you are using the \c ucontext or \c raw context factories, you can request to execute the user code in parallel. Several threads are launched, each of them handling as much user contexts at each run. To actiave this, set the \b contexts/nthreads item to the amount of -cores that you have in your computer (or -1 to have the amount of cores -auto-detected). +cores that you have in your computer (or lower than 1 to have +the amount of cores auto-detected). Even if you asked several worker threads using the previous option, you can request to start the parallel execution (and pay the diff --git a/doc/doxygen/pls.doc b/doc/doxygen/pls.doc index 2ce0e1193a..c52f5f83df 100644 --- a/doc/doxygen/pls.doc +++ b/doc/doxygen/pls.doc @@ -195,7 +195,6 @@ Configuration of package `simgrid' on arch (=4): Compile Lua : Compile Smpi : OFF Compile Static : OFF - Compile pcre : AUTO Maintainer mode: OFF Supernovae mode: OFF @@ -205,7 +204,7 @@ Configuration of package `simgrid' on arch (=4): Latency bound : OFF Graphviz mode : - Simgrid dependencies: -lm -lpcre -lpthread -lns3 -lrt + Simgrid dependencies: -lm -lpthread -lns3 -lrt Smpi dependencies : INSTALL_PREFIX: /usr/local diff --git a/doc/msg-tuto-src/platforms/cloud.xml b/doc/msg-tuto-src/platforms/cloud.xml index df5a88231c..c2bd2e73e9 100644 --- a/doc/msg-tuto-src/platforms/cloud.xml +++ b/doc/msg-tuto-src/platforms/cloud.xml @@ -1,24 +1,23 @@ - - + - + - + - - + + - - + + - - + + @@ -27,11 +26,11 @@ - + - - - + + + @@ -39,40 +38,63 @@ - - - + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + @@ -81,11 +103,11 @@ - + - - - + + + @@ -93,34 +115,114 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + - - + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + @@ -129,11 +231,11 @@ - + - - - + + + @@ -141,16 +243,55 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - + + + + + + + + diff --git a/doc/msg-tuto-src/platforms/g5k.xml b/doc/msg-tuto-src/platforms/g5k.xml index 9d20e6c973..81e4582ee1 100644 --- a/doc/msg-tuto-src/platforms/g5k.xml +++ b/doc/msg-tuto-src/platforms/g5k.xml @@ -1,7 +1,6 @@ - - + @@ -14,523 +13,710 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - + + + + + + + + - - - + + + - - + + - - - - - + + + + + + + + + + + - - + + + + - - + + + + - - - - - - + + + + + + - + - + - - + + + + + + + + + + + + + + + + + - + + + + + + + - - - - - - - + + + + + + + - + - + - - + + + + + + + + + - + + + + + - - + + - - - - - + + + + + + + + + + + - - + + + + - - + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - + + + + + + + + + + + - - + + + + - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + + + + + - - - + + + - - + + - - - - - + + + + + + + + + + + - - + + + + - - + + + + diff --git a/doc/msg-tuto-src/platforms/griffon.xml b/doc/msg-tuto-src/platforms/griffon.xml index 1ecc49831a..b6f5d8fe3c 100644 --- a/doc/msg-tuto-src/platforms/griffon.xml +++ b/doc/msg-tuto-src/platforms/griffon.xml @@ -4,16 +4,16 @@ + radical="1-29,58,59,60" power="286.087kf" bw="125MBps" lat="24us" + bb_bw="1.25GBps" bb_lat="0" sharing_policy="FULLDUPLEX" bb_sharing_policy="SHARED"/> + radical="30-57" power="286.087kf" bw="125MBps" lat="24us" + bb_bw="1.25GBps" bb_lat="0" sharing_policy="FULLDUPLEX" bb_sharing_policy="SHARED"/> + radical="61-92" power="286.087kf" bw="125MBps" lat="24us" + bb_bw="1.25GBps" bb_lat="0" sharing_policy="FULLDUPLEX" bb_sharing_policy="SHARED"/> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/doc/msg-tuto-src/platforms/platform.xml b/doc/msg-tuto-src/platforms/platform.xml index 81a1d91fa3..552c92f55c 100644 --- a/doc/msg-tuto-src/platforms/platform.xml +++ b/doc/msg-tuto-src/platforms/platform.xml @@ -2,21 +2,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/examples/java/io/Node.java b/examples/java/io/Node.java index a0e1f9547b..353db84945 100644 --- a/examples/java/io/Node.java +++ b/examples/java/io/Node.java @@ -45,7 +45,7 @@ public class Node extends Process { filename = FILENAME1; } Msg.info("Open file " + filename); - File file = new File(mount,filename, "rw"); + File file = new File(mount,filename); long read = file.read(10000000,1); Msg.info("Having read " + read + " on " + filename); @@ -54,6 +54,6 @@ public class Node extends Process { Msg.info("Having write " + write + " on " + filename); read = file.read(10000000,1); - Msg.info("Having read " + read + " on " + filename); + Msg.info("Having read " + read + " on " + filename); } -} \ No newline at end of file +} diff --git a/examples/java/io/storage.xml b/examples/java/io/storage.xml index 58fca8974e..8036fa8cde 100644 --- a/examples/java/io/storage.xml +++ b/examples/java/io/storage.xml @@ -28,25 +28,25 @@ - + - + - + - + - - - + + + diff --git a/examples/java/master_slave_bypass/platform.xml b/examples/java/master_slave_bypass/platform.xml index 776a31b11d..d0faf97219 100644 --- a/examples/java/master_slave_bypass/platform.xml +++ b/examples/java/master_slave_bypass/platform.xml @@ -2,13 +2,13 @@ - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + diff --git a/examples/java/platform.xml b/examples/java/platform.xml index dd4de15600..84db0e240f 100644 --- a/examples/java/platform.xml +++ b/examples/java/platform.xml @@ -2,288 +2,288 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/lua/multi_matrix/quicksort_platform.xml b/examples/lua/multi_matrix/quicksort_platform.xml index 3bf658fa62..0e57183aa1 100644 --- a/examples/lua/multi_matrix/quicksort_platform.xml +++ b/examples/lua/multi_matrix/quicksort_platform.xml @@ -3,26 +3,26 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/actions/NAS_LU_S_4/platform.xml b/examples/msg/actions/NAS_LU_S_4/platform.xml index 94d6bc755a..ee95bf7c43 100644 --- a/examples/msg/actions/NAS_LU_S_4/platform.xml +++ b/examples/msg/actions/NAS_LU_S_4/platform.xml @@ -6,9 +6,9 @@ + power="1.17Gf" + bw="125MBps" lat="16.67us" + bb_bw="1.25GBps" bb_lat="16.67us"> diff --git a/examples/msg/actions/actions.c b/examples/msg/actions/actions.c index 80abc5fb71..25baa9a7b3 100644 --- a/examples/msg/actions/actions.c +++ b/examples/msg/actions/actions.c @@ -489,7 +489,11 @@ int main(int argc, char *argv[]) argv[0]); exit(1); } - + printf("WARNING: THIS BINARY IS KINDA DEPRECATED\n" + "This example is still relevant if you want to learn about MSG-based trace replay, " + "but if you want to simulate MPI-like traces, you should use the newer version " + "that is in the examples/smpi/replay directory instead.\n"); + /* Simulation setting */ MSG_create_environment(argv[1]); diff --git a/examples/msg/actions/actions.tesh b/examples/msg/actions/actions.tesh index cf77252a44..250d7037d6 100644 --- a/examples/msg/actions/actions.tesh +++ b/examples/msg/actions/actions.tesh @@ -2,6 +2,8 @@ ! output sort $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment_split.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead. +> WARNING: THIS BINARY IS KINDA DEPRECATED > [ 10.831247] (1:p0@host0) p0 recv p1 10.831247 > [ 10.831247] (2:p1@host1) p1 send p0 1e10 10.831247 > [ 10.831248] (1:p0@host0) p0 compute 12 0.000001 @@ -10,6 +12,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo ! output sort $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_allReduce.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead. +> WARNING: THIS BINARY IS KINDA DEPRECATED > [ 0.000000] (1:p0@host0) p0 comm_size 3 0.000000 > [ 51.095484] (1:p0@host0) p0 allReduce 5e8 5e8 51.095484 > [ 51.095484] (2:p1@host1) p1 allReduce 5e8 5e8 51.095484 @@ -21,6 +25,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo ! output sort $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_barrier.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead. +> WARNING: THIS BINARY IS KINDA DEPRECATED > [ 0.000000] (1:p0@host0) p0 comm_size 3 0.000000 > [ 0.000000] (2:p1@host1) p1 comm_size 3 0.000000 > [ 0.000000] (3:p2@host2) p2 comm_size 3 0.000000 @@ -33,6 +39,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo ! output sort $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_bcast.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead. +> WARNING: THIS BINARY IS KINDA DEPRECATED > [ 0.000000] (1:p0@host0) p0 comm_size 3 0.000000 > [ 0.547742] (1:p0@host0) p0 bcast 5e8 0.547742 > [ 0.547742] (2:p1@host1) p1 bcast 5e8 0.547742 @@ -53,6 +61,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo ! output sort $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_reduce.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead. +> WARNING: THIS BINARY IS KINDA DEPRECATED > [ 0.000000] (1:p0@host0) p0 comm_size 3 0.000000 > [ 0.547742] (2:p1@host1) p1 reduce 5e8 5e8 0.547742 > [ 0.547742] (3:p2@host2) p2 reduce 5e8 5e8 0.547742 @@ -64,6 +74,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo ! output sort $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_with_isend.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead. +> WARNING: THIS BINARY IS KINDA DEPRECATED > [ 0.000000] (2:p1@host1) p1 Irecv p0 0.000000 > [ 0.000000] (3:p2@host2) p2 Irecv p1 0.000000 > [ 1.088979] (1:p0@host0) p0 send p1 1e9 1.088979 diff --git a/examples/msg/actions/homogeneous_3_hosts.xml b/examples/msg/actions/homogeneous_3_hosts.xml index 68501505f3..58674673e3 100644 --- a/examples/msg/actions/homogeneous_3_hosts.xml +++ b/examples/msg/actions/homogeneous_3_hosts.xml @@ -2,14 +2,14 @@ - - - - - - + + + + + + - + diff --git a/examples/msg/bittorrent/bittorrent.tesh b/examples/msg/bittorrent/bittorrent.tesh index 8883469d4e..c64371a69f 100755 --- a/examples/msg/bittorrent/bittorrent.tesh +++ b/examples/msg/bittorrent/bittorrent.tesh @@ -14,10 +14,10 @@ $ $SG_TEST_EXENV ${bindir:=.}/bittorrent ${srcdir:=.}/../msg_platform.xml ${srcd > [ 0.000000] (7:peer@iRMX) Hi, I'm joining the network with id 7 > [ 0.000000] (8:peer@McGee) Hi, I'm joining the network with id 8 > [ 3000.000000] (1:tracker@Jacquelin) Tracker is leaving -> [ 5000.002839] (3:peer@Jean_Yves) Here is my current status: 1111111111 > [ 5000.005340] (5:peer@Geoff) Here is my current status: 1111111111 +> [ 5000.043658] (7:peer@iRMX) Here is my current status: 1111111111 > [ 5000.048881] (2:peer@Boivin) Here is my current status: 1111111111 -> [ 5000.177031] (4:peer@TeX) Here is my current status: 1111111111 -> [ 5000.201645] (6:peer@Disney) Here is my current status: 1111111111 -> [ 5000.408123] (7:peer@iRMX) Here is my current status: 1111111111 +> [ 5000.812587] (4:peer@TeX) Here is my current status: 1111111111 +> [ 5000.823538] (6:peer@Disney) Here is my current status: 1111111111 > [ 5000.888352] (8:peer@McGee) Here is my current status: 1111111111 +> [ 5000.925088] (3:peer@Jean_Yves) Here is my current status: 1111111111 diff --git a/examples/msg/bittorrent/bittorrent_platfgen.c b/examples/msg/bittorrent/bittorrent_platfgen.c index 62bbf492b9..8fac6a1e54 100644 --- a/examples/msg/bittorrent/bittorrent_platfgen.c +++ b/examples/msg/bittorrent/bittorrent_platfgen.c @@ -16,19 +16,22 @@ static RngStream rng_stream; void promoter(context_node_t node); void labeler(context_edge_t edge); void create_environment(int node_count); -void dispatch_jobs(double tracker_deadline, double peer_deadline, double seed_percentage); +void dispatch_jobs(double tracker_deadline, double peer_deadline, + double seed_percentage); -void promoter(context_node_t node) { +void promoter(context_node_t node) +{ s_sg_platf_host_cbarg_t host_parameters; - if(node->degree == 1) { + if (node->degree == 1) { //We promote only the leaf; as we use a star topology, all the nodes //will be promoted except the first one, which will be a router with //every hosts connected on. host_parameters.id = NULL; //Power from 3,000,000 to 10,000,000 - host_parameters.power_peak = 7000000 * RngStream_RandU01(rng_stream) + 3000000; + host_parameters.power_peak = + 7000000 * RngStream_RandU01(rng_stream) + 3000000; host_parameters.core_amount = 1; host_parameters.power_scale = 1; host_parameters.power_trace = NULL; @@ -41,7 +44,8 @@ void promoter(context_node_t node) { } } -void labeler(context_edge_t edge) { +void labeler(context_edge_t edge) +{ s_sg_platf_link_cbarg_t link_parameters; link_parameters.id = NULL; @@ -61,7 +65,8 @@ void labeler(context_edge_t edge) { platf_graph_link_label(edge, &link_parameters); } -void create_environment(int node_count) { +void create_environment(int node_count) +{ platf_graph_uniform(node_count); @@ -81,34 +86,38 @@ void create_environment(int node_count) { platf_generate(); } -void dispatch_jobs(double tracker_deadline, double peer_deadline, double seed_percentage) { +void dispatch_jobs(double tracker_deadline, double peer_deadline, + double seed_percentage) +{ xbt_dynar_t available_nodes = MSG_hosts_as_dynar(); msg_host_t host; unsigned int i; - char** arguments_tracker; - char** arguments_peer; + char **arguments_tracker; + char **arguments_peer; - unsigned int seed_count = (seed_percentage/100.0) * xbt_dynar_length(available_nodes); + unsigned int seed_count = + (seed_percentage / 100.0) * xbt_dynar_length(available_nodes); xbt_dynar_foreach(available_nodes, i, host) { - if(i==0) { + if (i == 0) { //The fisrt node is the tracker - arguments_tracker = xbt_malloc0(sizeof(char*) * 2); + arguments_tracker = xbt_malloc0(sizeof(char *) * 2); arguments_tracker[0] = xbt_strdup("tracker"); arguments_tracker[1] = bprintf("%f", tracker_deadline); - MSG_process_create_with_arguments("tracker", tracker, NULL, host, 2, arguments_tracker); + MSG_process_create_with_arguments("tracker", tracker, NULL, host, 2, + arguments_tracker); } else { //Other nodes are peers int argument_size; - arguments_peer = xbt_malloc0(sizeof(char*) * 4); + arguments_peer = xbt_malloc0(sizeof(char *) * 4); arguments_peer[0] = xbt_strdup("peer"); arguments_peer[1] = bprintf("%d", i); arguments_peer[2] = bprintf("%f", peer_deadline); //The first peers will be seeders - if(seed_count > 0) { + if (seed_count > 0) { seed_count--; arguments_peer[3] = xbt_strdup("1"); argument_size = 4; @@ -117,7 +126,8 @@ void dispatch_jobs(double tracker_deadline, double peer_deadline, double seed_pe arguments_peer[3] = NULL; argument_size = 3; } - MSG_process_create_with_arguments("peer", peer, NULL, host, argument_size, arguments_peer); + MSG_process_create_with_arguments("peer", peer, NULL, host, + argument_size, arguments_peer); } } } diff --git a/examples/msg/bittorrent/connection.c b/examples/msg/bittorrent/connection.c index d19d67c9a1..725bda1761 100644 --- a/examples/msg/bittorrent/connection.c +++ b/examples/msg/bittorrent/connection.c @@ -15,6 +15,7 @@ connection_t connection_new(int id) connection->id = id; connection->mailbox = bprintf("%d", id); connection->bitfield = NULL; + connection->current_piece = -1; connection->interested = 0; connection->am_interested = 0; connection->choked_upload = 1; diff --git a/examples/msg/bittorrent/connection.h b/examples/msg/bittorrent/connection.h index 807c709672..95cfbbf439 100644 --- a/examples/msg/bittorrent/connection.h +++ b/examples/msg/bittorrent/connection.h @@ -15,6 +15,7 @@ typedef struct s_connection { int messages_count; double peer_speed; double last_unchoke; + int current_piece; int am_interested:1; //Indicates if we are interested in something the peer has int interested:1; //Indicates if the peer is interested in one of our pieces int choked_upload:1; //Indicates if the peer is choked for the current peer diff --git a/examples/msg/bittorrent/messages.c b/examples/msg/bittorrent/messages.c index b5ecc8887e..fae73a7147 100644 --- a/examples/msg/bittorrent/messages.c +++ b/examples/msg/bittorrent/messages.c @@ -6,7 +6,8 @@ #include "messages.h" #include "bittorrent.h" -XBT_LOG_NEW_DEFAULT_CATEGORY(msg_messages, "Messages specific for the message factory"); +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_messages, + "Messages specific for the message factory"); #define BITS_TO_BYTES(x) ((x / 8) + (x % 8) ? 1 : 0) @@ -27,7 +28,7 @@ msg_task_t task_message_new(e_message_type type, const char *issuer_host_name, message->mailbox = mailbox; message->type = type; msg_task_t task = MSG_task_create(NULL, 0, size, message); - XBT_DEBUG("type: %d size: %d", (int)type, size); + XBT_DEBUG("type: %d size: %d", (int) type, size); return task; } @@ -36,7 +37,7 @@ msg_task_t task_message_new(e_message_type type, const char *issuer_host_name, */ msg_task_t task_message_index_new(e_message_type type, const char *issuer_host_name, - const char *mailbox, int peer_id, + const char *mailbox, int peer_id, int index, int varsize) { msg_task_t task = task_message_new(type, issuer_host_name, mailbox, peer_id, @@ -52,8 +53,8 @@ msg_task_t task_message_bitfield_new(const char *issuer_host_name, { msg_task_t task = task_message_new(MESSAGE_BITFIELD, issuer_host_name, mailbox, peer_id, - task_message_size(MESSAGE_BITFIELD) + - /* Size of bitfield in bytes */ + task_message_size(MESSAGE_BITFIELD) + + /* Size of bitfield in bytes */ BITS_TO_BYTES(bitfield_size)); message_t message = MSG_task_get_data(task); message->bitfield = bitfield; @@ -61,8 +62,9 @@ msg_task_t task_message_bitfield_new(const char *issuer_host_name, } msg_task_t task_message_request_new(const char *issuer_host_name, - const char *mailbox, int peer_id, int index, - int block_index, int block_length) + const char *mailbox, int peer_id, + int index, int block_index, + int block_length) { msg_task_t task = task_message_index_new(MESSAGE_REQUEST, issuer_host_name, mailbox, @@ -75,14 +77,13 @@ msg_task_t task_message_request_new(const char *issuer_host_name, msg_task_t task_message_piece_new(const char *issuer_host_name, const char *mailbox, int peer_id, int index, - int stalled, int block_index, + int block_index, int block_length, int block_size) { msg_task_t task = task_message_index_new(MESSAGE_PIECE, issuer_host_name, mailbox, peer_id, index, block_length * block_size); message_t message = MSG_task_get_data(task); - message->stalled = stalled; message->block_index = block_index; message->block_length = block_length; return task; @@ -99,16 +100,36 @@ int task_message_size(e_message_type type) { int size = 0; switch (type) { - case MESSAGE_HANDSHAKE: size = MESSAGE_HANDSHAKE_SIZE; break; - case MESSAGE_CHOKE: size = MESSAGE_CHOKE_SIZE; break; - case MESSAGE_UNCHOKE: size = MESSAGE_UNCHOKE_SIZE; break; - case MESSAGE_INTERESTED: size = MESSAGE_INTERESTED_SIZE; break; - case MESSAGE_NOTINTERESTED: size = MESSAGE_INTERESTED_SIZE; break; - case MESSAGE_HAVE: size = MESSAGE_HAVE_SIZE; break; - case MESSAGE_BITFIELD: size = MESSAGE_BITFIELD_SIZE; break; - case MESSAGE_REQUEST: size = MESSAGE_REQUEST_SIZE; break; - case MESSAGE_PIECE: size = MESSAGE_PIECE_SIZE; break; - case MESSAGE_CANCEL: size = MESSAGE_CANCEL_SIZE; break; + case MESSAGE_HANDSHAKE: + size = MESSAGE_HANDSHAKE_SIZE; + break; + case MESSAGE_CHOKE: + size = MESSAGE_CHOKE_SIZE; + break; + case MESSAGE_UNCHOKE: + size = MESSAGE_UNCHOKE_SIZE; + break; + case MESSAGE_INTERESTED: + size = MESSAGE_INTERESTED_SIZE; + break; + case MESSAGE_NOTINTERESTED: + size = MESSAGE_INTERESTED_SIZE; + break; + case MESSAGE_HAVE: + size = MESSAGE_HAVE_SIZE; + break; + case MESSAGE_BITFIELD: + size = MESSAGE_BITFIELD_SIZE; + break; + case MESSAGE_REQUEST: + size = MESSAGE_REQUEST_SIZE; + break; + case MESSAGE_PIECE: + size = MESSAGE_PIECE_SIZE; + break; + case MESSAGE_CANCEL: + size = MESSAGE_CANCEL_SIZE; + break; } return size; } diff --git a/examples/msg/bittorrent/messages.h b/examples/msg/bittorrent/messages.h index 8e29f040d4..6f191a477c 100644 --- a/examples/msg/bittorrent/messages.h +++ b/examples/msg/bittorrent/messages.h @@ -52,22 +52,20 @@ typedef struct s_message { int index; int block_index; int block_length; - int stalled:1; } s_message_t, *message_t; /** * Builds a new value-less message */ msg_task_t task_message_new(e_message_type type, - const char *issuer_host_name, - const char *mailbox, int peer_id, - int size); + const char *issuer_host_name, + const char *mailbox, int peer_id, int size); /** * Builds a new "have/piece" message */ msg_task_t task_message_index_new(e_message_type type, - const char *issuer_host_name, - const char *mailbox, int peer_id, - int index, int varsize); + const char *issuer_host_name, + const char *mailbox, int peer_id, + int index, int varsize); /** * Builds a new bitfield message */ @@ -78,15 +76,16 @@ msg_task_t task_message_bitfield_new(const char *issuer_host_name, * Builds a new "request" message */ msg_task_t task_message_request_new(const char *issuer_host_name, - const char *mailbox, int peer_id, int index, - int block_index, int block_length); + const char *mailbox, int peer_id, + int index, int block_index, + int block_length); /** * Build a new "piece" message */ msg_task_t task_message_piece_new(const char *issuer_host_name, const char *mailbox, int peer_id, int index, - int stalled, int block_index, + int block_index, int block_length, int block_size); /** * Free a message task diff --git a/examples/msg/bittorrent/peer.c b/examples/msg/bittorrent/peer.c index 632b19e0a0..fc3e27fe66 100644 --- a/examples/msg/bittorrent/peer.c +++ b/examples/msg/bittorrent/peer.c @@ -1,5 +1,5 @@ - /* Copyright (c) 2012. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2012. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -9,23 +9,34 @@ #include "messages.h" #include #include +#include XBT_LOG_NEW_DEFAULT_CATEGORY(msg_peers, "Messages specific for the peers"); //TODO: Let users change this /* * File transfered data - * + * For the test, default values are : * File size: 10 pieces * 5 blocks/piece * 16384 bytes/block = 819200 bytes */ -static int FILE_SIZE = 10 * 5 * 16384; -static int FILE_PIECES = 10; -static int PIECES_BLOCKS = 5; -static int BLOCK_SIZE = 16384; -static int BLOCKS_REQUESTED = 2; +#define FILE_PIECES 10 +#define PIECES_BLOCKS 5 +#define BLOCK_SIZE 16384 +#define ENABLE_END_GAME_MODE 1 /** + * Number of blocks asked by each request + */ +#define BLOCKS_REQUESTED 2 + + +static const unsigned long int FILE_SIZE = FILE_PIECES * PIECES_BLOCKS * BLOCK_SIZE; + + +#define SLEEP_DURATION 1 + + /** * Peer main function */ int peer(int argc, char *argv[]) @@ -84,9 +95,8 @@ void leech_loop(peer_t peer, double deadline) * (since it couldn't have gotten more than 50 peers) */ send_handshake_all(peer); - //Wait for at least one "bitfield" message. - wait_for_pieces(peer, deadline); XBT_DEBUG("Starting main leech loop"); + while (MSG_get_clock() < deadline && peer->pieces < FILE_PIECES) { if (peer->comm_received == NULL) { peer->task_received = NULL; @@ -100,24 +110,18 @@ void leech_loop(peer_t peer, double deadline) handle_message(peer, peer->task_received); } } else { - handle_pending_sends(peer); - if (peer->current_piece != -1) { - send_interested_to_peers(peer); - } else { - //If the current interested pieces is < MAX - if (peer->pieces_requested < MAX_PIECES) { - update_current_piece(peer); - } - } //We don't execute the choke algorithm if we don't already have a piece if (MSG_get_clock() >= next_choked_update && peer->pieces > 0) { update_choked_peers(peer); next_choked_update += UPDATE_CHOKED_INTERVAL; } else { - MSG_process_sleep(1); + MSG_process_sleep(SLEEP_DURATION); } } } + if (peer->pieces == FILE_PIECES) + XBT_DEBUG("%d becomes a seeder", peer->id); + } /** @@ -148,7 +152,7 @@ void seed_loop(peer_t peer, double deadline) //TODO: Change the choked peer algorithm when seeding. next_choked_update += UPDATE_CHOKED_INTERVAL; } else { - MSG_process_sleep(1); + MSG_process_sleep(SLEEP_DURATION); } } } @@ -172,9 +176,8 @@ int get_peers_data(peer_t peer) msg_comm_t comm_received; while (!send_success && MSG_get_clock() < timeout) { XBT_DEBUG("Sending a peer request to the tracker."); - msg_error_t status = - MSG_task_send_with_timeout(task_send, TRACKER_MAILBOX, - GET_PEERS_TIMEOUT); + msg_error_t status = MSG_task_send_with_timeout(task_send, TRACKER_MAILBOX, + GET_PEERS_TIMEOUT); if (status == MSG_OK) { send_success = 1; } @@ -235,17 +238,14 @@ void peer_init(peer_t peer, int id, int seed) peer->pieces = 0; peer->pieces_count = xbt_new0(short, FILE_PIECES); - peer->pieces_requested = 0; peer->current_pieces = xbt_dynar_new(sizeof(int), NULL); - peer->current_piece = -1; - peer->stream = MSG_host_get_data(MSG_host_self()); + peer->stream = RngStream_CreateStream(""); peer->comm_received = NULL; peer->round = 0; - peer->pending_sends = xbt_dynar_new(sizeof(msg_comm_t), NULL); } /** @@ -262,10 +262,11 @@ void peer_free(peer_t peer) xbt_dict_free(&peer->peers); xbt_dict_free(&peer->active_peers); xbt_dynar_free(&peer->current_pieces); - xbt_dynar_free(&peer->pending_sends); xbt_free(peer->pieces_count); xbt_free(peer->bitfield); xbt_free(peer->bitfield_blocks); + + RngStream_DeleteStream(&peer->stream); } /** @@ -277,29 +278,41 @@ int has_finished(char *bitfield) return ((memchr(bitfield, '0', sizeof(char) * FILE_PIECES) == NULL) ? 1 : 0); } -/** - * Handle pending sends and remove those which are done - * @param peer Peer data - */ -void handle_pending_sends(peer_t peer) +int nb_interested_peers(peer_t peer) { - int index; + xbt_dict_cursor_t cursor = NULL; + char *key; + connection_t connection; + int nb = 0; + xbt_dict_foreach(peer->peers, cursor, key, connection) { + if (connection->interested) + nb++; + } + return nb; +} - while ((index = MSG_comm_testany(peer->pending_sends)) != -1) { - msg_comm_t comm_send = xbt_dynar_get_as(peer->pending_sends, index, msg_comm_t); - int status = MSG_comm_get_status(comm_send); - xbt_dynar_remove_at(peer->pending_sends, index, &comm_send); - XBT_DEBUG("Communication %p is finished with status %d, dynar size is now %lu", comm_send, status, xbt_dynar_length(peer->pending_sends)); - msg_task_t task = MSG_comm_get_task(comm_send); - MSG_comm_destroy(comm_send); +void update_active_peers_set(peer_t peer, connection_t remote_peer) +{ - if (status != MSG_OK) { - task_message_free(task); + if (remote_peer->interested && !remote_peer->choked_upload) { + //add in the active peers set + xbt_dict_set_ext(peer->active_peers, (char *) &remote_peer->id, + sizeof(int), remote_peer, NULL); + } else { + //remove + xbt_ex_t e; + TRY { + xbt_dict_remove_ext(peer->active_peers, (char *) &remote_peer->id, + sizeof(int)); + } + CATCH(e) { + xbt_ex_free(e); } } } + /** * Handle a received message sent by another peer * @param peer Peer data @@ -333,9 +346,11 @@ void handle_message(peer_t peer, msg_task_t task) update_pieces_count_from_bitfield(peer, message->bitfield); //Store the bitfield remote_peer->bitfield = xbt_strdup(message->bitfield); - //Update the current piece - if (peer->current_piece == -1 && peer->pieces < FILE_PIECES) { - update_current_piece(peer); + xbt_assert(!remote_peer->am_interested, + "Should not be interested at first"); + if (is_interested(peer, remote_peer)) { + remote_peer->am_interested = 1; + send_interested(peer, message->mailbox); } break; case MESSAGE_INTERESTED: @@ -345,66 +360,65 @@ void handle_message(peer_t peer, msg_task_t task) "A non-in-our-list peer has sent us a message. WTH ?"); //Update the interested state of the peer. remote_peer->interested = 1; + update_active_peers_set(peer, remote_peer); break; case MESSAGE_NOTINTERESTED: - XBT_DEBUG("Received a NOTINTERESTED message from %s (%s)", message->mailbox, - message->issuer_host_name); + XBT_DEBUG("Received a NOTINTERESTED message from %s (%s)", + message->mailbox, message->issuer_host_name); xbt_assert((remote_peer != NULL), "A non-in-our-list peer has sent us a message. WTH ?"); remote_peer->interested = 0; + update_active_peers_set(peer, remote_peer); break; case MESSAGE_UNCHOKE: xbt_assert((remote_peer != NULL), "A non-in-our-list peer has sent us a message. WTH ?"); XBT_DEBUG("Received a UNCHOKE message from %s (%s)", message->mailbox, message->issuer_host_name); + xbt_assert(remote_peer->choked_download, "WTF !!!"); remote_peer->choked_download = 0; - xbt_dict_set_ext(peer->active_peers, (char *) &message->peer_id, - sizeof(int), remote_peer, NULL); //Send requests to the peer, since it has unchoked us - send_requests_to_peer(peer, remote_peer); + if (remote_peer->am_interested) + request_new_piece_to_peer(peer, remote_peer); break; case MESSAGE_CHOKE: xbt_assert((remote_peer != NULL), "A non-in-our-list peer has sent us a message. WTH ?"); XBT_DEBUG("Received a CHOKE message from %s (%s)", message->mailbox, message->issuer_host_name); + xbt_assert(!remote_peer->choked_download, "WTF !!!"); remote_peer->choked_download = 1; - xbt_ex_t e; - TRY { - xbt_dict_remove_ext(peer->active_peers, (char *) &message->peer_id, - sizeof(int)); - } - CATCH(e) { - xbt_ex_free(e); - } + remove_current_piece(peer, remote_peer, remote_peer->current_piece); break; case MESSAGE_HAVE: XBT_DEBUG("Received a HAVE message from %s (%s) of piece %d", message->mailbox, message->issuer_host_name, message->index); + xbt_assert(remote_peer->bitfield, "bitfield not received"); xbt_assert((message->index >= 0 && message->index < FILE_PIECES), "Wrong HAVE message received"); - if (remote_peer->bitfield == NULL) - return; remote_peer->bitfield[message->index] = '1'; peer->pieces_count[message->index]++; //If the piece is in our pieces, we tell the peer that we are interested. - if (!remote_peer->am_interested && in_current_pieces(peer, message->index)) { + if (!remote_peer->am_interested && peer->bitfield[message->index] == '0') { remote_peer->am_interested = 1; - send_interested(peer, remote_peer->mailbox); + send_interested(peer, message->mailbox); + if (!remote_peer->choked_download) + request_new_piece_to_peer(peer, remote_peer); } break; case MESSAGE_REQUEST: + xbt_assert(remote_peer->interested, "WTF !!!"); + xbt_assert((message->index >= 0 && message->index < FILE_PIECES), "Wrong request received"); if (!remote_peer->choked_upload) { XBT_DEBUG("Received a REQUEST from %s (%s) for %d (%d,%d)", - message->mailbox, message->issuer_host_name, message->peer_id, + message->mailbox, message->issuer_host_name, message->index, message->block_index, message->block_index + message->block_length); if (peer->bitfield[message->index] == '1') { - send_piece(peer, message->mailbox, message->index, 0, + send_piece(peer, message->mailbox, message->index, message->block_index, message->block_length); } } else { @@ -413,33 +427,22 @@ void handle_message(peer_t peer, msg_task_t task) } break; case MESSAGE_PIECE: + XBT_DEBUG("Received piece %d (%d,%d) from %s (%s)", message->index, + message->block_index, + message->block_index + message->block_length, + message->mailbox, message->issuer_host_name); + xbt_assert(!remote_peer->choked_download, "WTF !!!"); + xbt_assert(remote_peer->am_interested || ENABLE_END_GAME_MODE, "Can't received a piece if I'm not interested wihtout end-game mode! piece (%d) bitfield(%s) remote bitfield(%s)", message->index, peer->bitfield, remote_peer->bitfield); + xbt_assert(remote_peer->choked_download != 1, "Can't received a piece if I'm choked !"); xbt_assert((message->index >= 0 && message->index < FILE_PIECES), "Wrong piece received"); //TODO: Execute à computation. - if (message->stalled) { - XBT_DEBUG("The received piece %d from %s (%s) is STALLED", message->index, - message->mailbox, message->issuer_host_name); - } else { - XBT_DEBUG("Received piece %d (%d,%d) from %s (%s)", message->index, - message->block_index, - message->block_index + message->block_length, message->mailbox, - message->issuer_host_name); if (peer->bitfield[message->index] == '0') { update_bitfield_blocks(peer, message->index, message->block_index, message->block_length); if (piece_complete(peer, message->index)) { - peer->pieces_requested--; //Removing the piece from our piece list - unsigned i; - int piece_index = -1, piece; - xbt_dynar_foreach(peer->current_pieces, i, piece) { - if (piece == message->index) { - piece_index = i; - break; - } - } - xbt_assert(piece_index != -1, "Received an incorrect piece"); - xbt_dynar_remove_at(peer->current_pieces, piece_index, NULL); + remove_current_piece(peer, remote_peer, message->index); //Setting the fact that we have the piece peer->bitfield[message->index] = '1'; peer->pieces++; @@ -448,13 +451,18 @@ void handle_message(peer_t peer, msg_task_t task) send_have(peer, message->index); //sending UNINTERSTED to peers that doesn't have what we want. update_interested_after_receive(peer); + } else { // piece not completed + send_request_to_peer(peer, remote_peer, message->index); // ask for the next block } } else { XBT_DEBUG("However, we already have it"); + xbt_assert(ENABLE_END_GAME_MODE, "Should not happen because we don't use end game mode !"); + request_new_piece_to_peer(peer, remote_peer); } - } break; case MESSAGE_CANCEL: + XBT_DEBUG("The received CANCEL from %s (%s)", + message->mailbox, message->issuer_host_name); break; } //Update the peer speed. @@ -469,31 +477,34 @@ void handle_message(peer_t peer, msg_task_t task) } /** - * Wait for the node to receive interesting bitfield messages (ie: non empty) - * to be received - * @param deadline peer deadline - * @param peer peer data + * Selects the appropriate piece to download and requests it to the remote_peer */ -void wait_for_pieces(peer_t peer, double deadline) +void request_new_piece_to_peer(peer_t peer, connection_t remote_peer) { - int finished = 0; - while (MSG_get_clock() < deadline && !finished) { - if (peer->comm_received == NULL) { - peer->task_received = NULL; - peer->comm_received = MSG_task_irecv(&peer->task_received, peer->mailbox); - } - msg_error_t status = MSG_comm_wait(peer->comm_received, TIMEOUT_MESSAGE); - //free the comm already, we don't need it anymore - MSG_comm_destroy(peer->comm_received); - peer->comm_received = NULL; - if (status == MSG_OK) { - MSG_task_get_data(peer->task_received); - handle_message(peer, peer->task_received); - if (peer->current_piece != -1) { - finished = 1; - } + int piece = select_piece_to_download(peer, remote_peer); + if (piece != -1) { + xbt_dynar_push_as(peer->current_pieces, int, piece); + send_request_to_peer(peer, remote_peer, piece); + } +} + +/** + * remove current_piece from the list of currently downloaded pieces. + */ +void remove_current_piece(peer_t peer, connection_t remote_peer, + int current_piece) +{ + int piece_index = -1, piece; + unsigned int i; + xbt_dynar_foreach(peer->current_pieces, i, piece) { + if (piece == current_piece) { + piece_index = i; + break; } } + if (piece_index != -1) + xbt_dynar_remove_at(peer->current_pieces, piece_index, NULL); + remote_peer->current_piece = -1; } /** @@ -511,53 +522,127 @@ void update_pieces_count_from_bitfield(peer_t peer, char *bitfield) } } + + /** - * Update the piece the peer is currently interested in. - * There is two cases (as described in "Bittorrent Architecture Protocol", Ryan Toole : - * If the peer has less than 3 pieces, he chooses a piece at random. + * Return the piece to be downloaded + * There are two cases (as described in "Bittorrent Architecture Protocol", Ryan Toole : + * If a piece is partially downloaded, this piece will be selected prioritarily + * If the peer has strictly less than 4 pieces, he chooses a piece at random. * If the peer has more than pieces, he downloads the pieces that are the less - * replicated + * replicated (rarest policy). + * If all pieces have been downloaded or requested, we select a random requested piece (endgame mode). + * @param peer: local peer + * @param remote_peer: information about the connection + * @return the piece to download if possible. -1 otherwise */ -void update_current_piece(peer_t peer) +int select_piece_to_download(peer_t peer, connection_t remote_peer) { - if (xbt_dynar_length(peer->current_pieces) >= (FILE_PIECES - peer->pieces)) { - return; + int piece = -1; + + piece = partially_downloaded_piece(peer, remote_peer); + // strict priority policy + if (piece != -1) + return piece; + + // end game mode + if (xbt_dynar_length(peer->current_pieces) >= (FILE_PIECES - peer->pieces) + && is_interested(peer, remote_peer)) { + if(!ENABLE_END_GAME_MODE) + return -1; + int i; + int nb_interesting_pieces = 0; + int random_piece_index, current_index = 0; + // compute the number of interesting pieces + for (i = 0; i < FILE_PIECES; i++) { + if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1') { + nb_interesting_pieces++; + } + } + xbt_assert(nb_interesting_pieces != 0, "WTF !!!"); + // get a random interesting piece + random_piece_index = + RngStream_RandInt(peer->stream, 0, nb_interesting_pieces - 1); + for (i = 0; i < FILE_PIECES; i++) { + if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1') { + if (random_piece_index == current_index) { + piece = i; + break; + } + current_index++; + } + } + xbt_assert(piece != -1, "WTF !!!"); + return piece; } - if (1 || peer->pieces < 3) { - int i = 0; - do { - peer->current_piece = - RngStream_RandInt(peer->stream, 0, FILE_PIECES - 1);; - i++; - } while (! - (peer->bitfield[peer->current_piece] == '0' - && !in_current_pieces(peer, peer->current_piece))); - } else { - //Trivial min algorithm. - int i, min_id = -1; - short min = -1; + // Random first policy + if (peer->pieces < 4 && is_interested_and_free(peer, remote_peer)) { + int i; + int nb_interesting_pieces = 0; + int random_piece_index, current_index = 0; + // compute the number of interesting pieces for (i = 0; i < FILE_PIECES; i++) { - if (peer->bitfield[i] == '0') { - min = peer->pieces_count[i]; - min_id = i; - break; + if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' + && !in_current_pieces(peer, i)) { + nb_interesting_pieces++; + } + } + xbt_assert(nb_interesting_pieces != 0, "WTF !!!"); + // get a random interesting piece + random_piece_index = + RngStream_RandInt(peer->stream, 0, nb_interesting_pieces - 1); + for (i = 0; i < FILE_PIECES; i++) { + if (peer->bitfield[i] == '0' && remote_peer->bitfield[i] == '1' + && !in_current_pieces(peer, i)) { + if (random_piece_index == current_index) { + piece = i; + break; + } + current_index++; } } - xbt_assert((min > -1), "Couldn't find a minimum"); - for (i = 1; i < FILE_PIECES; i++) { - if (peer->pieces_count[i] < min && peer->bitfield[i] == '0') { + xbt_assert(piece != -1, "WTF !!!"); + return piece; + } else { // Rarest first policy + int i; + short min = SHRT_MAX; + int nb_min_pieces = 0; + int random_rarest_index, current_index = 0; + // compute the smallest number of copies of available pieces + for (i = 0; i < FILE_PIECES; i++) { + if (peer->pieces_count[i] < min && peer->bitfield[i] == '0' + && remote_peer->bitfield[i] == '1' && !in_current_pieces(peer, i)) min = peer->pieces_count[i]; - min_id = i; + } + xbt_assert(min != SHRT_MAX + || !is_interested_and_free(peer, remote_peer), "WTF !!!"); + // compute the number of rarest pieces + for (i = 0; i < FILE_PIECES; i++) { + if (peer->pieces_count[i] == min && peer->bitfield[i] == '0' + && remote_peer->bitfield[i] == '1' && !in_current_pieces(peer, i)) + nb_min_pieces++; + } + xbt_assert(nb_min_pieces != 0 + || !is_interested_and_free(peer, remote_peer), "WTF !!!"); + // get a random rarest piece + random_rarest_index = RngStream_RandInt(peer->stream, 0, nb_min_pieces - 1); + for (i = 0; i < FILE_PIECES; i++) { + if (peer->pieces_count[i] == min && peer->bitfield[i] == '0' + && remote_peer->bitfield[i] == '1' && !in_current_pieces(peer, i)) { + if (random_rarest_index == current_index) { + piece = i; + break; + } + current_index++; } } - peer->current_piece = min_id; + xbt_assert(piece != -1 + || !is_interested_and_free(peer, remote_peer), "WTF !!!"); + return piece; } - xbt_dynar_push_as(peer->current_pieces, int, peer->current_piece); - XBT_DEBUG("New interested piece: %d", peer->current_piece); - xbt_assert((peer->current_piece >= 0 && peer->current_piece < FILE_PIECES), - "Peer want to retrieve a piece that doesn't exist."); } + /** * Update the list of current choked and unchoked peers, using the * choke algorithm @@ -565,34 +650,37 @@ void update_current_piece(peer_t peer) */ void update_choked_peers(peer_t peer) { + if (nb_interested_peers(peer) == 0) + return; + // if(xbt_dict_size(peer->active_peers) > 0) + // return; + XBT_DEBUG("(%d) update_choked peers %d active peers", peer->id, + xbt_dict_size(peer->active_peers)); //update the current round peer->round = (peer->round + 1) % 3; - char *key; + char *key, *key_choked=NULL; connection_t peer_choosed = NULL; + connection_t peer_choked = NULL; //remove a peer from the list xbt_dict_cursor_t cursor = NULL; xbt_dict_cursor_first(peer->active_peers, &cursor); - if (!xbt_dict_is_empty(peer->active_peers)) { - key = xbt_dict_cursor_get_key(cursor); - connection_t peer_choked = xbt_dict_cursor_get_data(cursor); - if (peer_choked) { - send_choked(peer, peer_choked->mailbox); - peer_choked->choked_upload = 1; - } - xbt_dict_remove_ext(peer->active_peers, key, sizeof(int)); + if (xbt_dict_length(peer->active_peers) > 0) { + key_choked = xbt_dict_cursor_get_key(cursor); + peer_choked = xbt_dict_cursor_get_data(cursor); } xbt_dict_cursor_free(&cursor); - /** - * If we are currently seeding, we unchoke the peer which has - * been unchoke the least time. - */ + /** + * If we are currently seeding, we unchoke the peer which has + * been unchoke the least time. + */ if (peer->pieces == FILE_PIECES) { connection_t connection; double unchoke_time = MSG_get_clock() + 1; xbt_dict_foreach(peer->peers, cursor, key, connection) { - if (connection->last_unchoke < unchoke_time && connection->interested) { + if (connection->last_unchoke < unchoke_time && connection->interested + && connection->choked_upload) { unchoke_time = connection->last_unchoke; peer_choosed = connection; } @@ -603,9 +691,8 @@ void update_choked_peers(peer_t peer) int j = 0; do { //We choose a random peer to unchoke. - int id_chosen = - RngStream_RandInt(peer->stream, 0, - xbt_dict_length(peer->peers) - 1); + int id_chosen = RngStream_RandInt(peer->stream, 0, + xbt_dict_length(peer->peers) - 1); int i = 0; connection_t connection; xbt_dict_foreach(peer->peers, cursor, key, connection) { @@ -616,7 +703,7 @@ void update_choked_peers(peer_t peer) i++; } xbt_dict_cursor_free(&cursor); - if (peer_choosed->interested == 0) { + if (!peer_choosed->interested || !peer_choosed->choked_upload) { peer_choosed = NULL; } j++; @@ -626,8 +713,8 @@ void update_choked_peers(peer_t peer) connection_t connection; double fastest_speed = 0.0; xbt_dict_foreach(peer->peers, cursor, key, connection) { - if (connection->peer_speed > fastest_speed && connection->choked_upload - && connection->interested) { + if (connection->peer_speed > fastest_speed + && connection->choked_upload && connection->interested) { peer_choosed = connection; fastest_speed = connection->peer_speed; } @@ -635,14 +722,45 @@ void update_choked_peers(peer_t peer) } } - if (peer_choosed != NULL) { - peer_choosed->choked_upload = 0; - xbt_dict_set_ext(peer->active_peers, (char *) &peer_choosed->id, - sizeof(int), peer_choosed, NULL); - peer_choosed->last_unchoke = MSG_get_clock(); - send_unchoked(peer, peer_choosed->mailbox); - } + if (peer_choosed != NULL) + XBT_DEBUG + ("(%d) update_choked peers unchoked (%d) ; int (%d) ; choked (%d) ", + peer->id, peer_choosed->id, peer_choosed->interested, + peer_choosed->choked_upload); + + // if (xbt_dict_size(peer->peers) > 0) + // xbt_assert((xbt_dict_size(peer->active_peers) != 0), + // "No more active peers !"); + + // if (peer_choked != NULL && peer_choked->choked_upload != 0) + // peer_choked = NULL; + // if (peer_choosed != NULL && peer_choosed->choked_upload == 0) + // peer_choosed = NULL; + + if (peer_choked != peer_choosed) { + if (peer_choked != NULL) { + xbt_assert((!peer_choked->choked_upload), + "Tries to choked a choked peer"); + peer_choked->choked_upload = 1; + xbt_assert((*((int *) key_choked) == peer_choked->id), "WTF !!!"); + update_active_peers_set(peer, peer_choked); + // xbt_dict_remove_ext(peer->active_peers, key_choked, sizeof(int)); + XBT_DEBUG("(%d) Sending a CHOKE to %d", peer->id, peer_choked->id); + send_choked(peer, peer_choked->mailbox); + } + if (peer_choosed != NULL) { + xbt_assert((peer_choosed->choked_upload), + "Tries to unchoked an unchoked peer"); + peer_choosed->choked_upload = 0; + xbt_dict_set_ext(peer->active_peers, (char *) &peer_choosed->id, + sizeof(int), peer_choosed, NULL); + peer_choosed->last_unchoke = MSG_get_clock(); + XBT_DEBUG("(%d) Sending a UNCHOKE to %d", peer->id, peer_choosed->id); + update_active_peers_set(peer, peer_choosed); + send_unchoked(peer, peer_choosed->mailbox); + } + } } /** @@ -655,20 +773,20 @@ void update_interested_after_receive(peer_t peer) char *key; xbt_dict_cursor_t cursor; connection_t connection; - unsigned cpt; - int interested, piece; + int interested; xbt_dict_foreach(peer->peers, cursor, key, connection) { interested = 0; if (connection->am_interested) { + xbt_assert(connection->bitfield, "Bitfield not received"); //Check if the peer still has a piece we want. - xbt_dynar_foreach(peer->current_pieces, cpt, piece) { - xbt_assert((piece >= 0), "Wrong piece."); - if (connection->bitfield && connection->bitfield[piece] == '1') { + int i; + for (i = 0; i < FILE_PIECES; i++) { + if (connection->bitfield[i] == '1' && peer->bitfield[i] == '0') { interested = 1; break; } } - if (!interested) { + if (!interested) { //no more piece to download from connection connection->am_interested = 0; send_notinterested(peer, connection->mailbox); } @@ -704,7 +822,8 @@ int piece_complete(peer_t peer, int index) } /** - * Returns the first block that a peer doesn't have in a piece + * Returns the first block that a peer doesn't have in a piece. + * If the peer has all blocks of the piece, returns -1. */ int get_first_block(peer_t peer, int piece) { @@ -717,55 +836,103 @@ int get_first_block(peer_t peer, int piece) return -1; } +/** + * Indicates if the remote peer has a piece not stored by the local peer + */ +int is_interested(peer_t peer, connection_t remote_peer) +{ + xbt_assert(remote_peer->bitfield, "Bitfield not received"); + int i; + for (i = 0; i < FILE_PIECES; i++) { + if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0') { + return 1; + } + } + return 0; +} + +/** + * Indicates if the remote peer has a piece not stored by the local peer nor requested by the local peer + */ +int is_interested_and_free(peer_t peer, connection_t remote_peer) +{ + xbt_assert(remote_peer->bitfield, "Bitfield not received"); + int i; + for (i = 0; i < FILE_PIECES; i++) { + if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0' + && !in_current_pieces(peer, i)) { + return 1; + } + } + return 0; +} + + +/** + * Returns a piece that is partially downloaded and stored by the remote peer if any + * -1 otherwise. + */ +int partially_downloaded_piece(peer_t peer, connection_t remote_peer) +{ + xbt_assert(remote_peer->bitfield, "Bitfield not received"); + int i; + for (i = 0; i < FILE_PIECES; i++) { + if (remote_peer->bitfield[i] == '1' && peer->bitfield[i] == '0' + && !in_current_pieces(peer, i)) { + if (get_first_block(peer, i) > 0) + return i; + } + } + return -1; +} + + /** * Send request messages to a peer that have unchoked us * @param peer peer * @param remote_peer peer data to the peer we want to send the request */ -void send_requests_to_peer(peer_t peer, connection_t remote_peer) +void send_request_to_peer(peer_t peer, connection_t remote_peer, int piece) { - unsigned i; - int piece, block_index, block_length; - xbt_dynar_foreach(peer->current_pieces, i, piece) { - if (remote_peer->bitfield && remote_peer->bitfield[piece] == '1') { - block_index = get_first_block(peer, piece); - if (block_index != -1) { - block_length = PIECES_BLOCKS - block_index; - block_length = min(BLOCKS_REQUESTED, block_length); - send_request(peer, remote_peer->mailbox, piece, block_index, - block_length); - break; - } - } + remote_peer->current_piece = piece; + int block_index, block_length; + xbt_assert(remote_peer->bitfield, "bitfield not received"); + xbt_assert(remote_peer->bitfield[piece] == '1', "WTF !!!"); + block_index = get_first_block(peer, piece); + if (block_index != -1) { + block_length = PIECES_BLOCKS - block_index; + block_length = min(BLOCKS_REQUESTED, block_length); + send_request(peer, remote_peer->mailbox, piece, block_index, block_length); } } + /** - * Find the peers that have the current interested piece and send them - * the "interested" message + * Indicates if a piece is currently being downloaded by the peer. */ -void send_interested_to_peers(peer_t peer) +int in_current_pieces(peer_t peer, int piece) { - char *key; - xbt_dict_cursor_t cursor = NULL; - connection_t connection; - xbt_assert((peer->current_piece != -1), - "Tried to send a interested message wheras the current_piece is -1"); - xbt_dict_foreach(peer->peers, cursor, key, connection) { - if (connection->bitfield - && connection->bitfield[peer->current_piece] == '1') { - connection->am_interested = 1; - msg_task_t task = - task_message_new(MESSAGE_INTERESTED, peer->hostname, peer->mailbox, - peer->id, task_message_size(MESSAGE_INTERESTED)); - MSG_task_dsend(task, connection->mailbox, task_message_free); - XBT_DEBUG("Send INTERESTED to %s", connection->mailbox); + unsigned i; + int peer_piece; + xbt_dynar_foreach(peer->current_pieces, i, peer_piece) { + if (peer_piece == piece) { + return 1; } } - peer->current_piece = -1; - peer->pieces_requested++; + return 0; } + + + +/*********************************************************** + * + * Low level message functions + * + ***********************************************************/ + + + /** * Send a "interested" message to a peer * @param peer peer data @@ -835,7 +1002,7 @@ void send_choked(peer_t peer, const char *mailbox) { XBT_DEBUG("Sending a CHOKE to %s", mailbox); msg_task_t task = - task_message_new(MESSAGE_CHOKE, peer->hostname, peer->mailbox, + task_message_new(MESSAGE_CHOKE, peer->hostname, peer->mailbox, peer->id, task_message_size(MESSAGE_CHOKE)); MSG_task_dsend(task, mailbox, task_message_free); } @@ -864,7 +1031,8 @@ void send_have(peer_t peer, int piece) xbt_dict_foreach(peer->peers, cursor, key, remote_peer) { msg_task_t task = task_message_index_new(MESSAGE_HAVE, peer->hostname, peer->mailbox, - peer->id, piece, task_message_size(MESSAGE_HAVE)); + peer->id, piece, + task_message_size(MESSAGE_HAVE)); MSG_task_dsend(task, remote_peer->mailbox, task_message_free); } } @@ -879,16 +1047,14 @@ void send_bitfield(peer_t peer, const char *mailbox) msg_task_t task = task_message_bitfield_new(peer->hostname, peer->mailbox, peer->id, peer->bitfield, FILE_PIECES); - //Async send and append to pending sends - msg_comm_t comm = MSG_task_isend(task, mailbox); - xbt_dynar_push(peer->pending_sends, &comm); + MSG_task_dsend(task, mailbox, task_message_free); } /** * Send a "request" message to a pair, containing a request for a piece */ -void send_request(peer_t peer, const char *mailbox, int piece, int block_index, - int block_length) +void send_request(peer_t peer, const char *mailbox, int piece, + int block_index, int block_length) { XBT_DEBUG("Sending a REQUEST to %s for piece %d (%d,%d)", mailbox, piece, block_index, block_length); @@ -901,7 +1067,7 @@ void send_request(peer_t peer, const char *mailbox, int piece, int block_index, /** * Send a "piece" message to a pair, containing a piece of the file */ -void send_piece(peer_t peer, const char *mailbox, int piece, int stalled, +void send_piece(peer_t peer, const char *mailbox, int piece, int block_index, int block_length) { XBT_DEBUG("Sending the PIECE %d (%d,%d) to %s", piece, block_index, @@ -911,19 +1077,6 @@ void send_piece(peer_t peer, const char *mailbox, int piece, int stalled, "Tried to send a piece that we doesn't have."); msg_task_t task = task_message_piece_new(peer->hostname, peer->mailbox, peer->id, piece, - stalled, block_index, block_length, BLOCK_SIZE); + block_index, block_length, BLOCK_SIZE); MSG_task_dsend(task, mailbox, task_message_free); } - -int in_current_pieces(peer_t peer, int piece) -{ - unsigned i; - int is_in = 0, peer_piece; - xbt_dynar_foreach(peer->current_pieces, i, peer_piece) { - if (peer_piece == piece) { - is_in = 1; - break; - } - } - return is_in; -} diff --git a/examples/msg/bittorrent/peer.h b/examples/msg/bittorrent/peer.h index b4687745cc..b3d003bbb2 100644 --- a/examples/msg/bittorrent/peer.h +++ b/examples/msg/bittorrent/peer.h @@ -24,11 +24,11 @@ typedef struct s_peer { short *pieces_count; //number of peers that have each piece. xbt_dynar_t current_pieces; //current pieces the peer is downloading - int current_piece; //current pieces - int pieces_requested; //number of pieces the peer has requested xbt_dict_t peers; //peers list xbt_dict_t active_peers; //active peers list + int round; //current round for the chocking algortihm. + char mailbox[MAILBOX_SIZE]; //peer mailbox. char mailbox_tracker[MAILBOX_SIZE]; //pair mailbox while communicating with the tracker. @@ -37,13 +37,11 @@ typedef struct s_peer { msg_task_t task_received; //current task being received msg_comm_t comm_received; //current comm - int round; //current round for the chocking algortihm. RngStream stream; //RngStream for double begin_receive_time; //time when the receiving communication has begun, useful for calculating host speed. - xbt_dynar_t pending_sends; // list of sends being delivered } s_peer_t, *peer_t; /** @@ -60,13 +58,9 @@ void peer_free(peer_t peer); int has_finished(char *bitfield); -void handle_pending_sends(peer_t peer); void handle_message(peer_t peer, msg_task_t task); -void wait_for_pieces(peer_t peer, double deadline); - void update_pieces_count_from_bitfield(peer_t peer, char *bitfield); -void update_current_piece(peer_t peer); void update_choked_peers(peer_t peer); void update_interested_after_receive(peer_t peer); @@ -77,9 +71,20 @@ int piece_complete(peer_t peer, int index); int get_first_block(peer_t peer, int piece); -void send_requests_to_peer(peer_t peer, connection_t remote_peer); +int nb_interested_peers(peer_t peer); +int is_interested(peer_t peer, connection_t remote_peer); +int is_interested_and_free(peer_t peer, connection_t remote_peer); +int in_current_pieces(peer_t peer, int piece); +int partially_downloaded_piece(peer_t peer, connection_t remote_peer); + +void request_new_piece_to_peer(peer_t peer, connection_t remote_peer); +void send_request_to_peer(peer_t peer, connection_t remote_peer, int piece); +void remove_current_piece(peer_t peer, connection_t remote_peer, + int current_piece); + +void update_active_peers_set(peer_t peer, connection_t remote_peer); +int select_piece_to_download(peer_t peer, connection_t remote_peer); -void send_interested_to_peers(peer_t peer); void send_handshake_all(peer_t peer); void send_interested(peer_t peer, const char *mailbox); @@ -91,10 +96,9 @@ void send_choked(peer_t peer, const char *mailbox); void send_unchoked(peer_t peer, const char *mailbox); void send_have(peer_t peer, int piece); -void send_request(peer_t peer, const char *mailbox, int piece, int block_index, - int block_length); -void send_piece(peer_t peer, const char *mailbox, int piece, int stalled, +void send_request(peer_t peer, const char *mailbox, int piece, + int block_index, int block_length); +void send_piece(peer_t peer, const char *mailbox, int piece, int block_index, int block_length); -int in_current_pieces(peer_t peer, int piece); #endif /* BITTORRENT_PEER_H */ diff --git a/examples/msg/chainsend/platform_chainsend.xml b/examples/msg/chainsend/platform_chainsend.xml index 98febadbca..3b6916f6dc 100644 --- a/examples/msg/chainsend/platform_chainsend.xml +++ b/examples/msg/chainsend/platform_chainsend.xml @@ -3,23 +3,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/examples/msg/gtnets/crosstraffic-p.xml b/examples/msg/gtnets/crosstraffic-p.xml index 5ee8a47ac3..da382f622c 100644 --- a/examples/msg/gtnets/crosstraffic-p.xml +++ b/examples/msg/gtnets/crosstraffic-p.xml @@ -7,10 +7,10 @@ --> - - + + - + diff --git a/examples/msg/gtnets/dogbone-p.xml b/examples/msg/gtnets/dogbone-p.xml index 9041b9bc1a..35e117b3bc 100644 --- a/examples/msg/gtnets/dogbone-p.xml +++ b/examples/msg/gtnets/dogbone-p.xml @@ -6,18 +6,18 @@ --> - - - - + + + + - - - - - + + + + + diff --git a/examples/msg/gtnets/onelink-p.xml b/examples/msg/gtnets/onelink-p.xml index b76e6cedc2..16ae96317e 100644 --- a/examples/msg/gtnets/onelink-p.xml +++ b/examples/msg/gtnets/onelink-p.xml @@ -7,10 +7,10 @@ 100MB, 5ms --> - - + + - + diff --git a/examples/msg/gtnets/waxman-p.xml b/examples/msg/gtnets/waxman-p.xml index 10e0f94507..25b02f3c5b 100644 --- a/examples/msg/gtnets/waxman-p.xml +++ b/examples/msg/gtnets/waxman-p.xml @@ -2,606 +2,606 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/icomms/small_platform.xml b/examples/msg/icomms/small_platform.xml index 1455f4c85f..481e3c237b 100644 --- a/examples/msg/icomms/small_platform.xml +++ b/examples/msg/icomms/small_platform.xml @@ -3,13 +3,13 @@ - - - - - - - + + + + + + + diff --git a/examples/msg/io/file.c b/examples/msg/io/file.c index fc799860ba..84bded3c8b 100644 --- a/examples/msg/io/file.c +++ b/examples/msg/io/file.c @@ -33,35 +33,31 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(io_file, int host(int argc, char *argv[]) { msg_file_t file = NULL; - s_msg_stat_t stat; void *ptr = NULL; char* mount = xbt_strdup("/home"); - double read,write; + size_t read,write; if(!strcmp(MSG_process_get_name(MSG_process_self()),"0")) - file = MSG_file_open(mount,FILENAME1,"rw"); + file = MSG_file_open(mount,FILENAME1); else if(!strcmp(MSG_process_get_name(MSG_process_self()),"1")) - file = MSG_file_open(mount,FILENAME2,"rw"); + file = MSG_file_open(mount,FILENAME2); else if(!strcmp(MSG_process_get_name(MSG_process_self()),"2")) - file = MSG_file_open(mount,FILENAME3,"rw"); + file = MSG_file_open(mount,FILENAME3); else if(!strcmp(MSG_process_get_name(MSG_process_self()),"3")) - file = MSG_file_open(mount,FILENAME4,"rw"); + file = MSG_file_open(mount,FILENAME4); else xbt_die("FILENAME NOT DEFINED %s",MSG_process_get_name(MSG_process_self())); XBT_INFO("\tOpen file '%s'",file->name); - read = MSG_file_read(ptr,10000000,sizeof(char*),file); // Read for 10Mo - XBT_INFO("\tHave read %8.1f on %s",read,file->name); + read = MSG_file_read(ptr,10000000,file); // Read for 10MB + XBT_INFO("\tHave read %zu on %s",read,file->name); - write = MSG_file_write(ptr,100000,sizeof(char*),file); // Write for 100Ko - XBT_INFO("\tHave written %8.1f on %s",write,file->name); + write = MSG_file_write(ptr,100000,file); // Write for 100KB + XBT_INFO("\tHave written %zu on %s",write,file->name); - read = MSG_file_read(ptr,10000000,sizeof(char*),file); // Read for 10Mo - XBT_INFO("\tHave read %8.1f on %s",read,file->name); - - MSG_file_stat(file,&stat); - XBT_INFO("\tFile stat %s Size %.1f",file->name,stat.size); - MSG_file_free_stat(&stat); + read = MSG_file_read(ptr,110000,file); // Read for 110KB + XBT_INFO("\tHave read %zu on %s (of size %zu)",read,file->name, + MSG_file_get_size(file)); XBT_INFO("\tClose file '%s'",file->name); MSG_file_close(file); diff --git a/examples/msg/io/file_unlink.c b/examples/msg/io/file_unlink.c index f230372e11..30c7c17469 100644 --- a/examples/msg/io/file_unlink.c +++ b/examples/msg/io/file_unlink.c @@ -30,19 +30,13 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(io_file, int host(int argc, char *argv[]) { msg_file_t file = NULL; - s_msg_stat_t stat; void *ptr = NULL; char* mount = xbt_strdup("/home"); - double write; + size_t write; // First open XBT_INFO("\tOpen file '%s'",FILENAME1); - file = MSG_file_open(mount,FILENAME1,"rw"); - - // Print stat - MSG_file_stat(file,&stat); - XBT_INFO("\tFile stat %s Size %.1f",file->name,stat.size); - MSG_file_free_stat(&stat); + file = MSG_file_open(mount,FILENAME1); // Unlink the file XBT_INFO("\tUnlink file '%s'",file->name); @@ -50,21 +44,11 @@ int host(int argc, char *argv[]) // Re Open the file wich is in fact created XBT_INFO("\tOpen file '%s'",FILENAME1); - file = MSG_file_open(mount,FILENAME1,"rw"); - - // Print stat - MSG_file_stat(file,&stat); - XBT_INFO("\tFile stat %s Size %.1f",file->name,stat.size); - MSG_file_free_stat(&stat); + file = MSG_file_open(mount,FILENAME1); // Write into the new file - write = MSG_file_write(ptr,100000,sizeof(char*),file); // Write for 100Ko - XBT_INFO("\tHave written %8.1f on %s",write,file->name); - - // Print the stat - MSG_file_stat(file,&stat); - XBT_INFO("\tFile stat %s Size %.1f",file->name,stat.size); - MSG_file_free_stat(&stat); + write = MSG_file_write(ptr,100000,file); // Write for 100Ko + XBT_INFO("\tHave written %zu on %s",write,file->name); // Close the file XBT_INFO("\tClose file '%s'",file->name); diff --git a/examples/msg/io/io.tesh b/examples/msg/io/io.tesh index 224a1f8eb7..5b7455a311 100644 --- a/examples/msg/io/io.tesh +++ b/examples/msg/io/io.tesh @@ -6,37 +6,30 @@ $ ${bindir:=.}/io/file ${srcdir:=.}/examples/platforms/storage.xml "--log=root.f > [ 0.000000] (2:1@alice) Open file './doc/simgrid/examples/platforms/One_cluster_no_backbone.xml' > [ 0.000000] (3:2@carl) Open file './doc/simgrid/examples/platforms/g5k_cabinets.xml' > [ 0.000000] (4:3@bob) Open file './doc/simgrid/examples/platforms/nancy.xml' -> [ 0.000005] (2:1@alice) Have read 482.0 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml -> [ 0.000040] (4:3@bob) Have read 4028.0 on ./doc/simgrid/examples/platforms/nancy.xml -> [ 0.000170] (1:0@denise) Have read 17028.0 on ./doc/simgrid/examples/platforms/g5k.xml -> [ 0.000226] (3:2@carl) Have read 22645.0 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml -> [ 0.003338] (2:1@alice) Have written 100000.0 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml -> [ 0.003374] (4:3@bob) Have written 100000.0 on ./doc/simgrid/examples/platforms/nancy.xml -> [ 0.003504] (1:0@denise) Have written 100000.0 on ./doc/simgrid/examples/platforms/g5k.xml -> [ 0.003560] (3:2@carl) Have written 100000.0 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml -> [ 0.004343] (2:1@alice) Have read 100482.0 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml -> [ 0.004343] (2:1@alice) File stat ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml Size 100482.0 +> [ 0.000005] (2:1@alice) Have read 482 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml +> [ 0.000040] (4:3@bob) Have read 4028 on ./doc/simgrid/examples/platforms/nancy.xml +> [ 0.000170] (1:0@denise) Have read 17028 on ./doc/simgrid/examples/platforms/g5k.xml +> [ 0.000226] (3:2@carl) Have read 22645 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml +> [ 0.003338] (2:1@alice) Have written 100000 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml +> [ 0.003374] (4:3@bob) Have written 100000 on ./doc/simgrid/examples/platforms/nancy.xml +> [ 0.003504] (1:0@denise) Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml +> [ 0.003560] (3:2@carl) Have written 100000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml +> [ 0.004343] (2:1@alice) Have read 100481 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml (of size 100481) > [ 0.004343] (2:1@alice) Close file './doc/simgrid/examples/platforms/One_cluster_no_backbone.xml' -> [ 0.004414] (4:3@bob) Have read 104028.0 on ./doc/simgrid/examples/platforms/nancy.xml -> [ 0.004414] (4:3@bob) File stat ./doc/simgrid/examples/platforms/nancy.xml Size 104028.0 +> [ 0.004414] (4:3@bob) Have read 104027 on ./doc/simgrid/examples/platforms/nancy.xml (of size 104027) > [ 0.004414] (4:3@bob) Close file './doc/simgrid/examples/platforms/nancy.xml' -> [ 0.004674] (1:0@denise) Have read 117028.0 on ./doc/simgrid/examples/platforms/g5k.xml -> [ 0.004674] (1:0@denise) File stat ./doc/simgrid/examples/platforms/g5k.xml Size 117028.0 -> [ 0.004674] (1:0@denise) Close file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.004786] (3:2@carl) Have read 122645.0 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml -> [ 0.004786] (3:2@carl) File stat ./doc/simgrid/examples/platforms/g5k_cabinets.xml Size 122645.0 -> [ 0.004786] (3:2@carl) Close file './doc/simgrid/examples/platforms/g5k_cabinets.xml' -> [ 0.004786] (0:@) Simulation time 0.00478623 +> [ 0.004604] (1:0@denise) Have read 110000 on ./doc/simgrid/examples/platforms/g5k.xml (of size 117027) +> [ 0.004604] (1:0@denise) Close file './doc/simgrid/examples/platforms/g5k.xml' +> [ 0.004660] (3:2@carl) Have read 110000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml (of size 122644) +> [ 0.004660] (3:2@carl) Close file './doc/simgrid/examples/platforms/g5k_cabinets.xml' +> [ 0.004660] (0:@) Simulation time 0.00465978 $ ${bindir:=.}/io/file_unlink ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) Number of host '4' > [ 0.000000] (1:0@denise) Open file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.000000] (1:0@denise) File stat ./doc/simgrid/examples/platforms/g5k.xml Size 17028.0 > [ 0.000000] (1:0@denise) Unlink file './doc/simgrid/examples/platforms/g5k.xml' > [ 0.000000] (1:0@denise) Open file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.000000] (1:0@denise) File stat ./doc/simgrid/examples/platforms/g5k.xml Size 0.0 -> [ 0.003333] (1:0@denise) Have written 100000.0 on ./doc/simgrid/examples/platforms/g5k.xml -> [ 0.003333] (1:0@denise) File stat ./doc/simgrid/examples/platforms/g5k.xml Size 100000.0 +> [ 0.003333] (1:0@denise) Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml > [ 0.003333] (1:0@denise) Close file './doc/simgrid/examples/platforms/g5k.xml' > [ 0.003333] (1:0@denise) > [ 0.003333] (1:0@denise) ls ./ diff --git a/examples/msg/masterslave/masterslave_failure.c b/examples/msg/masterslave/masterslave_failure.c index 6a4f5e324a..32b38ced20 100644 --- a/examples/msg/masterslave/masterslave_failure.c +++ b/examples/msg/masterslave/masterslave_failure.c @@ -16,7 +16,6 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, int master(int argc, char *argv[]); int slave(int argc, char *argv[]); -int forwarder(int argc, char *argv[]); msg_error_t test_all(const char *platform_file, const char *application_file); diff --git a/examples/msg/masterslave/masterslave_mailbox.c b/examples/msg/masterslave/masterslave_mailbox.c index 73dd03c896..e2ab9385a8 100644 --- a/examples/msg/masterslave/masterslave_mailbox.c +++ b/examples/msg/masterslave/masterslave_mailbox.c @@ -16,9 +16,6 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, int master(int argc, char *argv[]); int slave(int argc, char *argv[]); -int forwarder(int argc, char *argv[]); -msg_error_t test_all(const char *platform_file, - const char *application_file); /** Emitter function */ int master(int argc, char *argv[]) diff --git a/examples/msg/masterslave/platform_clusters.xml b/examples/msg/masterslave/platform_clusters.xml index d6f9f7101f..daed872131 100644 --- a/examples/msg/masterslave/platform_clusters.xml +++ b/examples/msg/masterslave/platform_clusters.xml @@ -3,14 +3,14 @@ + radical="0-499" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> + radical="500-999" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> - + - - + + - - - + + + [ 0.000000] (0:@) Configuration change: Set 'model-check' to '1' > [ 0.000000] (0:@) Check a safety property @@ -9,21 +10,28 @@ $ ${bindir:=.}/bugged1 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)% > [ 0.000000] (1:server@HostA) OK > [ 0.000000] (4:client@HostD) Sent! > [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (3:client@HostC) Sent! > [ 0.000000] (2:client@HostB) Sent! > [ 0.000000] (1:server@HostA) ************************** > [ 0.000000] (1:server@HostA) *** PROPERTY NOT VALID *** > [ 0.000000] (1:server@HostA) ************************** > [ 0.000000] (1:server@HostA) Counter-example execution trace: -> [ 0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (1:server@HostA) [(2)client] iSend (src=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(2)client -> (1)server]) -> [ 0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (1:server@HostA) [(2)client] Wait (comm=(verbose only) [(2)client -> (1)server]) -> [ 0.000000] (1:server@HostA) [(4)client] iSend (src=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(4)client -> (1)server]) -> [ 0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (1:server@HostA) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(3)client -> (1)server]) -> [ 0.000000] (1:server@HostA) Expanded states = 17 -> [ 0.000000] (1:server@HostA) Visited states = 32 -> [ 0.000000] (1:server@HostA) Executed transitions = 30 +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(2)HostB (client)] iSend (src=(2)HostB (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(2)HostB (client)-> (1)HostA (server)]) +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(2)HostB (client)] Wait (comm=(verbose only) [(2)HostB (client)-> (1)HostA (server)]) +> [ 0.000000] (1:server@HostA) [(4)HostD (client)] iSend (src=(4)HostD (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(4)HostD (client)-> (1)HostA (server)]) +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(3)HostC (client)] iSend (src=(3)HostC (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)]) +> [ 0.000000] (1:server@HostA) Expanded states = 22 +> [ 0.000000] (1:server@HostA) Visited states = 56 +> [ 0.000000] (1:server@HostA) Executed transitions = 52 diff --git a/examples/msg/mc/bugged1_liveness.c b/examples/msg/mc/bugged1_liveness.c index 7fc5066c19..90dd58a2b0 100644 --- a/examples/msg/mc/bugged1_liveness.c +++ b/examples/msg/mc/bugged1_liveness.c @@ -29,7 +29,7 @@ int coordinator(int argc, char *argv[]) int CS_used = 0; msg_task_t task = NULL, answer = NULL; - while (1) { + while(1){ MSG_task_receive(&task, "coordinator"); const char *kind = MSG_task_get_name(task); if (!strcmp(kind, "request")) { @@ -37,7 +37,7 @@ int coordinator(int argc, char *argv[]) if (CS_used) { XBT_INFO("CS already used."); } else { - if(strcmp(req, "2") == 0){ + if(strcmp(req, "1") != 0){ XBT_INFO("CS idle. Grant immediatly"); answer = MSG_task_create("grant", 0, 1000, NULL); MSG_task_send(answer, req); @@ -63,10 +63,8 @@ int client(int argc, char *argv[]) char *my_mailbox = xbt_strdup(argv[1]); msg_task_t grant = NULL, release = NULL; - - - while(1) { - + + while(1){ XBT_INFO("Ask the request"); MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox), "coordinator"); diff --git a/examples/msg/mc/bugged1_liveness.tesh b/examples/msg/mc/bugged1_liveness.tesh index 6954ef6956..f69fd27319 100644 --- a/examples/msg/mc/bugged1_liveness.tesh +++ b/examples/msg/mc/bugged1_liveness.tesh @@ -1,45 +1,45 @@ #! ./tesh ! expect signal SIGABRT -! timeout 200 +! timeout 20 $ ${bindir:=.}/bugged1_liveness --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext > [ 0.000000] (0:@) Configuration change: Set 'model-check' to '1' > [ 0.000000] (0:@) Check the liveness property promela_bugged1_liveness -> [ 0.000000] (2:client@Fafard) Ask the request -> [ 0.000000] (3:client@Boivin) Ask the request -> [ 0.000000] (2:client@Fafard) Propositions changed : r=1, cs=0 +> [ 0.000000] (2:client@Boivin) Ask the request +> [ 0.000000] (3:client@Fafard) Ask the request +> [ 0.000000] (2:client@Boivin) Propositions changed : r=1, cs=0 > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly -> [ 0.000000] (3:client@Boivin) 2 got the answer. Sleep a bit and release it +> [ 0.000000] (3:client@Fafard) 2 got the answer. Sleep a bit and release it > [ 0.000000] (1:coordinator@Tremblay) CS release. resource now idle -> [ 0.000000] (3:client@Boivin) Ask the request +> [ 0.000000] (3:client@Fafard) Ask the request > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly -> [ 0.000000] (0:@) Next pair (depth = 22, 1 interleave) already reached (equal to state 11) ! +> [ 0.000000] (0:@) Pair 22 already reached (equal to pair 10) ! > [ 0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* > [ 0.000000] (0:@) | ACCEPTANCE CYCLE | > [ 0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* > [ 0.000000] (0:@) Counter-example that violates formula : -> [ 0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(2)client] iSend (src=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(2)client -> (1)coordinator]) -> [ 0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(2)client] Wait (comm=(verbose only) [(2)client -> (1)coordinator]) -> [ 0.000000] (0:@) [(2)client] iRecv (dst=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator]) -> [ 0.000000] (0:@) [(1)coordinator] iSend (src=coordinator, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)coordinator]) -> [ 0.000000] (0:@) [(3)client] iRecv (dst=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(1)coordinator -> (3)client]) -> [ 0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(1)coordinator -> (3)client]) -> [ 0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator]) -> [ 0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)coordinator]) -> [ 0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator]) -> [ 0.000000] (0:@) [(1)coordinator] iSend (src=coordinator, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) Expanded pairs = 23 -> [ 0.000000] (0:@) Visited pairs = 21 +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv (dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(2)Boivin (client)] iSend (src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv (dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(2)Boivin (client)] Wait (comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) +> [ 0.000000] (0:@) [(2)Boivin (client)] iRecv (dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(3)Fafard (client)] iSend (src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iSend (src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(3)Fafard (client)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) +> [ 0.000000] (0:@) [(3)Fafard (client)] iRecv (dst=(3)Fafard (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)]) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv (dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(3)Fafard (client)] Wait (comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)]) +> [ 0.000000] (0:@) [(3)Fafard (client)] iSend (src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv (dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(3)Fafard (client)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) +> [ 0.000000] (0:@) [(3)Fafard (client)] iSend (src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iSend (src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (0:@) Expanded pairs = 22 +> [ 0.000000] (0:@) Visited pairs = 22 > [ 0.000000] (0:@) Executed transitions = 21 diff --git a/examples/msg/mc/bugged2.tesh b/examples/msg/mc/bugged2.tesh new file mode 100644 index 0000000000..bbfd7ac102 --- /dev/null +++ b/examples/msg/mc/bugged2.tesh @@ -0,0 +1,899 @@ +#! ./tesh + +! expect signal SIGABRT +! timeout 20 +$ ${bindir:=.}/bugged2 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (0:@) Configuration change: Set 'model-check' to '1' +> [ 0.000000] (0:@) Check a safety property +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) ************************** +> [ 0.000000] (1:server@HostA) *** PROPERTY NOT VALID *** +> [ 0.000000] (1:server@HostA) ************************** +> [ 0.000000] (1:server@HostA) Counter-example execution trace: +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(3)HostC (client)] iSend (src=(3)HostC (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)]) +> [ 0.000000] (1:server@HostA) [(3)HostC (client)] Wait (comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)]) +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(3)HostC (client)] iSend (src=(3)HostC (client), buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)]) +> [ 0.000000] (1:server@HostA) Expanded states = 461 +> [ 0.000000] (1:server@HostA) Visited states = 2271 +> [ 0.000000] (1:server@HostA) Executed transitions = 2117 diff --git a/examples/msg/mc/chord/chord_liveness.c b/examples/msg/mc/chord/chord.c similarity index 87% rename from examples/msg/mc/chord/chord_liveness.c rename to examples/msg/mc/chord/chord.c index 48563958ae..9d9feae5c1 100644 --- a/examples/msg/mc/chord/chord_liveness.c +++ b/examples/msg/mc/chord/chord.c @@ -10,7 +10,6 @@ #include "xbt/log.h" #include "xbt/asserts.h" #include "simgrid/modelchecker.h" -#include "chord_liveness.h" #include "mc/mc.h" /** @addtogroup MSG_examples @@ -23,7 +22,7 @@ */ -XBT_LOG_NEW_DEFAULT_CATEGORY(chord_liveness, +XBT_LOG_NEW_DEFAULT_CATEGORY(mc_chord, "Messages specific for this example"); #define COMM_SIZE 10 @@ -33,12 +32,19 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(chord_liveness, static int nb_bits = 24; static int nb_keys = 0; static int timeout = 50; -static int max_simulation_time = 1000; +//static int max_simulation_time = 1000; static int periodic_stabilize_delay = 20; static int periodic_fix_fingers_delay = 120; static int periodic_check_predecessor_delay = 120; static int periodic_lookup_delay = 10; +// Liveness properties verification +static int j = 0; + +static int predJ(){ + return j; +} + //extern long int smx_total_comms; /* @@ -121,8 +127,6 @@ static void check_predecessor(node_t node); static void random_lookup(node_t); static void quit_notify(node_t node); -/* Global variable corresponding to atomic proposition */ -int node_join = 0; /** * \brief Global initialization of the Chord simulation. @@ -209,9 +213,11 @@ static void get_mailbox(int node_id, char* mailbox) static void task_free(void* task) { // TODO add a parameter data_free_function to MSG_task_create? - xbt_free(MSG_task_get_data(task)); - MSG_task_destroy(task); - task = NULL; + if(task != NULL){ + xbt_free(MSG_task_get_data(task)); + MSG_task_destroy(task); + task = NULL; + } } /** @@ -220,7 +226,7 @@ static void task_free(void* task) */ static void print_finger_table(node_t node) { - if (XBT_LOG_ISENABLED(chord_liveness, xbt_log_priority_verbose)) { + if (XBT_LOG_ISENABLED(mc_chord, xbt_log_priority_verbose)) { int i; XBT_VERB("My finger table:"); XBT_VERB("Start | Succ "); @@ -286,12 +292,15 @@ int node(int argc, char *argv[]) msg_task_t task_received = NULL; int i; int join_success = 0; - double deadline; + //double deadline; double next_stabilize_date = init_time + periodic_stabilize_delay; double next_fix_fingers_date = init_time + periodic_fix_fingers_delay; double next_check_predecessor_date = init_time + periodic_check_predecessor_delay; double next_lookup_date = init_time + periodic_lookup_delay; + //int stab = 0, fix = 0, check = 0, rand_look = 0; + int end = 0; + xbt_assert(argc == 3 || argc == 5, "Wrong number of arguments for this node"); // initialize my node @@ -308,14 +317,14 @@ int node(int argc, char *argv[]) } if (argc == 3) { // first ring - deadline = atof(argv[2]); + //deadline = atof(argv[2]); create(&node); join_success = 1; } else { int known_id = atoi(argv[2]); //double sleep_time = atof(argv[3]); - deadline = atof(argv[4]); + //deadline = atof(argv[4]); /* // sleep before starting @@ -326,18 +335,24 @@ int node(int argc, char *argv[]) join_success = join(&node, known_id); - if(join_success){ - XBT_INFO("Node %d joined the ring", node.id); - node_join = 1; - //MC_compare(); - } + if(join_success) + j = 1; + + //MC_assert(!join_success); + } if (join_success) { - while (MSG_get_clock() < init_time + deadline -// && MSG_get_clock() < node.last_change_date + 1000 - && MSG_get_clock() < max_simulation_time) { + XBT_INFO("Node %d joined the ring", node.id); + + //while (MSG_get_clock() < init_time + deadline + // && MSG_get_clock() < node.last_change_date + 1000 + //&& MSG_get_clock() < max_simulation_time) { + + //while (!(stab == 1 || fix == 1 || check == 1 || rand_look == 1)) { + + while(1){ if (node.comm_receive == NULL) { task_received = NULL; @@ -347,35 +362,74 @@ int node(int argc, char *argv[]) if (!MSG_comm_test(node.comm_receive)) { - // no task was received: make some periodic calls - if (MSG_get_clock() >= next_stabilize_date) { - stabilize(&node); - next_stabilize_date = MSG_get_clock() + periodic_stabilize_delay; - } - else if (MSG_get_clock() >= next_fix_fingers_date) { - fix_fingers(&node); - next_fix_fingers_date = MSG_get_clock() + periodic_fix_fingers_delay; - } - else if (MSG_get_clock() >= next_check_predecessor_date) { - check_predecessor(&node); - next_check_predecessor_date = MSG_get_clock() + periodic_check_predecessor_delay; - } - else if (MSG_get_clock() >= next_lookup_date) { - random_lookup(&node); - next_lookup_date = MSG_get_clock() + periodic_lookup_delay; - } - else { - // nothing to do: sleep for a while - MSG_process_sleep(5); - } + #ifdef HAVE_MC + if(MC_is_active()){ + if(end == 0 && MC_random()){ + stabilize(&node); + end = 1; + }else if(end == 0 && MC_random()){ + fix_fingers(&node); + end = 1; + }else if(end == 0 && MC_random()){ + check_predecessor(&node); + end = 1; + }else if(end == 0 && MC_random()){ + random_lookup(&node); + end = 1; + }else{ + MSG_process_sleep(5); + } + }else{ + if (MSG_get_clock() >= next_stabilize_date) { + stabilize(&node); + next_stabilize_date = MSG_get_clock() + periodic_stabilize_delay; + } + else if (MSG_get_clock() >= next_fix_fingers_date) { + fix_fingers(&node); + next_fix_fingers_date = MSG_get_clock() + periodic_fix_fingers_delay; + } + else if (MSG_get_clock() >= next_check_predecessor_date) { + check_predecessor(&node); + next_check_predecessor_date = MSG_get_clock() + periodic_check_predecessor_delay; + } + else if (MSG_get_clock() >= next_lookup_date) { + random_lookup(&node); + next_lookup_date = MSG_get_clock() + periodic_lookup_delay; + } + else { + // nothing to do: sleep for a while + MSG_process_sleep(5); + } + } + #else + if (MSG_get_clock() >= next_stabilize_date) { + stabilize(&node); + next_stabilize_date = MSG_get_clock() + periodic_stabilize_delay; + } + else if (MSG_get_clock() >= next_fix_fingers_date) { + fix_fingers(&node); + next_fix_fingers_date = MSG_get_clock() + periodic_fix_fingers_delay; + } + else if (MSG_get_clock() >= next_check_predecessor_date) { + check_predecessor(&node); + next_check_predecessor_date = MSG_get_clock() + periodic_check_predecessor_delay; + } + else if (MSG_get_clock() >= next_lookup_date) { + random_lookup(&node); + next_lookup_date = MSG_get_clock() + periodic_lookup_delay; + } + else { + // nothing to do: sleep for a while + MSG_process_sleep(5); + } + #endif + }else{ if (node.comm_receive) { XBT_INFO("A transfer has occured"); - //MC_compare(); - // a transfer has occured msg_error_t status = MSG_comm_get_status(node.comm_receive); @@ -403,6 +457,9 @@ int node(int argc, char *argv[]) // leave the ring leave(&node); + + XBT_INFO("Node %d leave the ring", node.id); + //sleep(15); } // stop the simulation @@ -792,7 +849,7 @@ int closest_preceding_node(node_t node, int id) */ static void stabilize(node_t node) { - XBT_DEBUG("Stabilizing node"); + XBT_DEBUG("Stabilizing node %d", node->id); // get the predecessor of my immediate successor int candidate_id; @@ -821,6 +878,8 @@ static void stabilize(node_t node) */ static void notify(node_t node, int predecessor_candidate_id) { + XBT_DEBUG("Notifying node %d", node->id); + if (node->pred_id == -1 || is_in_interval(predecessor_candidate_id, node->pred_id + 1, node->id - 1)) { @@ -895,24 +954,19 @@ static void random_lookup(node_t node) find_successor(node, id); } -int predJoin(void){ - return node_join; -} - - /** * \brief Main function. */ int main(int argc, char *argv[]) { MSG_init(&argc, argv); - /*if (argc < 3) { + if (argc < 3) { printf("Usage: %s [-nb_bits=n] [-timeout=t] platform_file deployment_file\n", argv[0]); - printf("example: %s ../msg_platform.xml chord.xml\n", argv[0]); + printf("example: %s ../../msg_platform.xml deploy_chord1.xml\n", argv[0]); exit(1); - }*/ + } - char **options = &argv[0]; + char **options = &argv[1]; while (!strncmp(options[0], "-", 1)) { int length = strlen("-nb_bits="); @@ -934,21 +988,20 @@ int main(int argc, char *argv[]) options++; } - //const char* platform_file = options[0]; - //const char* application_file = options[1]; + const char* platform_file = options[0]; + const char* application_file = options[1]; chord_initialize(); - MSG_config("model-check/property","promela_chord_liveness"); - MC_automaton_new_propositional_symbol("join", &predJoin); - - MSG_create_environment("../../msg_platform.xml"); + //MSG_config("model-check/property","promela_join"); + MC_automaton_new_propositional_symbol("j", &predJ); + MSG_create_environment(platform_file); + MSG_function_register("node", node); - MSG_launch_application("deploy_chord_liveness.xml"); + MSG_launch_application(application_file); msg_error_t res = MSG_main(); - //XBT_CRITICAL("Messages created: %ld", smx_total_comms); XBT_INFO("Simulated time: %g", MSG_get_clock()); chord_exit(); diff --git a/examples/msg/mc/chord/chord_liveness.h b/examples/msg/mc/chord/chord_liveness.h deleted file mode 100644 index e522b77e32..0000000000 --- a/examples/msg/mc/chord/chord_liveness.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _CHORD_LIVENESS_H -#define _CHORD_LIVENESS_H - -int predJoin(void); - -#endif diff --git a/examples/msg/mc/chord/chord_neverjoin.tesh b/examples/msg/mc/chord/chord_neverjoin.tesh index ffc6a67193..5e4fcfb80e 100644 --- a/examples/msg/mc/chord/chord_neverjoin.tesh +++ b/examples/msg/mc/chord/chord_neverjoin.tesh @@ -2,30 +2,29 @@ ! expect signal SIGABRT ! timeout 200 -$ ${bindir:=.}/chord_liveness --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext +$ ${bindir:=.}/chord ../../msg_platform.xml deploy_chord4.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) Configuration change: Set 'model-check' to '1' -> [ 0.000000] (0:@) Check the liveness property promela_chord_liveness -> [ 0.000000] (1:node@Jean_Yves) Joining the ring with id 14, knowing node 1 -> [ 0.000000] (2:node@Boivin) Joining the ring with id 8, knowing node 1 -> [ 0.000000] (3:node@Jacquelin) A transfer has occured -> [ 0.000000] (3:node@Jacquelin) The task was successfully received by node 1 -> [ 0.000000] (1:node@Jean_Yves) Node 14 joined the ring -> [ 0.000000] (0:@) Next pair (depth = 11, 2 interleave) already reached (equal to state 11) ! -> [ 0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* -> [ 0.000000] (0:@) | ACCEPTANCE CYCLE | -> [ 0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* -> [ 0.000000] (0:@) Counter-example that violates formula : -> [ 0.000000] (0:@) [(1)node] iSend (src=node, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(2)node] iSend (src=node, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(3)node] iRecv (dst=node, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(1)node] Wait (comm=(verbose only) [(1)node -> (3)node]) -> [ 0.000000] (0:@) [(1)node] iRecv (dst=node, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(3)node] Test TRUE (comm=(verbose only) [(1)node -> (3)node]) -> [ 0.000000] (0:@) [(3)node] iSend (src=node, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(1)node] Wait (comm=(verbose only) [(3)node -> (1)node]) -> [ 0.000000] (0:@) [(1)node] iRecv (dst=node, buff=(verbose only), size=(verbose only)) -> [ 0.000000] (0:@) [(1)node] Test FALSE (comm=(verbose only)) -> [ 0.000000] (0:@) Expanded pairs = 14 -> [ 0.000000] (0:@) Visited pairs = 10 -> [ 0.000000] (0:@) Executed transitions = 10 +> [ 0.000000] (0:@) Check a safety property +> [ 0.000000] (1:node@Jean_Yves) Joining the ring with id 6, knowing node 16 +> [ 0.000000] (2:node@Boivin) Joining the ring with id 10, knowing node 16 +> [ 0.000000] (3:node@TeX) Joining the ring with id 8, knowing node 16 +> [ 0.000000] (4:node@Jacquelin) A transfer has occured +> [ 0.000000] (4:node@Jacquelin) The task was successfully received by node 16 +> [ 0.000000] (1:node@Jean_Yves) Node 6 joined the ring +> [ 0.000000] (1:node@Jean_Yves) ************************** +> [ 0.000000] (1:node@Jean_Yves) *** PROPERTY NOT VALID *** +> [ 0.000000] (1:node@Jean_Yves) ************************** +> [ 0.000000] (1:node@Jean_Yves) Counter-example execution trace: +> [ 0.000000] (1:node@Jean_Yves) [(1)node] iSend (src=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:node@Jean_Yves) [(2)node] iSend (src=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:node@Jean_Yves) [(3)node] iSend (src=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:node@Jean_Yves) [(4)node] iRecv (dst=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:node@Jean_Yves) [(1)node] Wait (comm=(verbose only) [(1)node -> (4)node]) +> [ 0.000000] (1:node@Jean_Yves) [(1)node] iRecv (dst=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:node@Jean_Yves) [(4)node] Test TRUE (comm=(verbose only) [(1)node -> (4)node]) +> [ 0.000000] (1:node@Jean_Yves) [(4)node] iSend (src=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:node@Jean_Yves) [(1)node] Wait (comm=(verbose only) [(4)node -> (1)node]) +> [ 0.000000] (1:node@Jean_Yves) Expanded states = 9 +> [ 0.000000] (1:node@Jean_Yves) Visited states = 9 +> [ 0.000000] (1:node@Jean_Yves) Executed transitions = 9 diff --git a/examples/msg/mc/chord/chord_neverjoin_timeout_visited.tesh b/examples/msg/mc/chord/chord_neverjoin_timeout_visited.tesh new file mode 100644 index 0000000000..a0afde7775 --- /dev/null +++ b/examples/msg/mc/chord/chord_neverjoin_timeout_visited.tesh @@ -0,0 +1,80 @@ +#! ./tesh + +! expect signal SIGABRT +! timeout 200 +$ ${bindir:=.}/chord ../../msg_platform.xml deploy_chord4.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext --cfg=model-check/timeout:1 --cfg=model-check/visited:100 +> [ 0.000000] (0:@) Configuration change: Set 'model-check' to '1' +> [ 0.000000] (0:@) Configuration change: Set 'model-check/timeout' to '1' +> [ 0.000000] (0:@) Configuration change: Set 'model-check/visited' to '100' +> [ 0.000000] (0:@) Check a safety property +> [ 0.000000] (1:node@Jean_Yves) Joining the ring with id 6, knowing node 16 +> [ 0.000000] (2:node@Boivin) Joining the ring with id 10, knowing node 16 +> [ 0.000000] (3:node@TeX) Joining the ring with id 8, knowing node 16 +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (4:node@Jacquelin) A transfer has occured +> [ 0.000000] (4:node@Jacquelin) The task was successfully received by node 16 +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (4:node@Jacquelin) A transfer has occured +> [ 0.000000] (4:node@Jacquelin) The task was successfully received by node 16 +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (4:node@Jacquelin) A transfer has occured +> [ 0.000000] (4:node@Jacquelin) The task was successfully received by node 16 +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (4:node@Jacquelin) A transfer has occured +> [ 0.000000] (4:node@Jacquelin) The task was successfully received by node 16 +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (4:node@Jacquelin) A transfer has occured +> [ 0.000000] (4:node@Jacquelin) The task was successfully received by node 16 +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (4:node@Jacquelin) A transfer has occured +> [ 0.000000] (4:node@Jacquelin) The task was successfully received by node 16 +> [ 0.000000] (3:node@TeX) Cannot join the ring. +> [ 0.000000] (1:node@Jean_Yves) Cannot join the ring. +> [ 0.000000] (2:node@Boivin) Cannot join the ring. +> [ 0.000000] (4:node@Jacquelin) A transfer has occured +> [ 0.000000] (4:node@Jacquelin) The task was successfully received by node 16 +> [ 0.000000] (3:node@TeX) Node 8 joined the ring +> [ 0.000000] (3:node@TeX) ************************** +> [ 0.000000] (3:node@TeX) *** PROPERTY NOT VALID *** +> [ 0.000000] (3:node@TeX) ************************** +> [ 0.000000] (3:node@TeX) Counter-example execution trace: +> [ 0.000000] (3:node@TeX) [(1)node] iSend (src=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (3:node@TeX) [(1)node] WaitTimeout (comm=(verbose only)) +> [ 0.000000] (3:node@TeX) [(2)node] iSend (src=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (3:node@TeX) [(2)node] WaitTimeout (comm=(verbose only)) +> [ 0.000000] (3:node@TeX) [(3)node] iSend (src=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (3:node@TeX) [(4)node] iRecv (dst=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (3:node@TeX) [(3)node] Wait (comm=(verbose only) [(3)node -> (4)node]) +> [ 0.000000] (3:node@TeX) [(4)node] Test TRUE (comm=(verbose only) [(3)node -> (4)node]) +> [ 0.000000] (3:node@TeX) [(3)node] iRecv (dst=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (3:node@TeX) [(4)node] iSend (src=node, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (3:node@TeX) [(3)node] Wait (comm=(verbose only) [(4)node -> (3)node]) +> [ 0.000000] (3:node@TeX) Expanded states = 42 +> [ 0.000000] (3:node@TeX) Visited states = 170 +> [ 0.000000] (3:node@TeX) Executed transitions = 159 diff --git a/examples/msg/mc/chord/deploy_chord_liveness.xml b/examples/msg/mc/chord/deploy_chord4.xml similarity index 52% rename from examples/msg/mc/chord/deploy_chord_liveness.xml rename to examples/msg/mc/chord/deploy_chord4.xml index 2f870491b1..f03b06bf33 100644 --- a/examples/msg/mc/chord/deploy_chord_liveness.xml +++ b/examples/msg/mc/chord/deploy_chord4.xml @@ -3,22 +3,30 @@ - - - + + + - - + + + + + + + + + - + + diff --git a/examples/msg/mc/chord/promela_chord_liveness b/examples/msg/mc/chord/promela_chord_liveness deleted file mode 100644 index 0e9dd9dd44..0000000000 --- a/examples/msg/mc/chord/promela_chord_liveness +++ /dev/null @@ -1,12 +0,0 @@ -never { /* !(!(GFjoin)) */ -T0_init : /* init */ - if - :: (join) -> goto accept_S1 - :: (1) -> goto T0_init - fi; -accept_S1 : /* 1 */ - if - :: (join) -> goto accept_S1 - :: (1) -> goto T0_init - fi; -} \ No newline at end of file diff --git a/examples/msg/mc/deploy_bugged1_liveness.xml b/examples/msg/mc/deploy_bugged1_liveness.xml index 7ebdbaf581..f38ea85593 100644 --- a/examples/msg/mc/deploy_bugged1_liveness.xml +++ b/examples/msg/mc/deploy_bugged1_liveness.xml @@ -6,38 +6,12 @@ - + - + - - diff --git a/examples/msg/mc/platform.xml b/examples/msg/mc/platform.xml index 210e3e72b8..00e89c1155 100644 --- a/examples/msg/mc/platform.xml +++ b/examples/msg/mc/platform.xml @@ -2,13 +2,13 @@ - - - - - - - + + + + + + + diff --git a/examples/msg/mc/test/snapshot_comparison_platform.xml b/examples/msg/mc/test/snapshot_comparison_platform.xml index a62a6e0334..cc4ea2c55b 100644 --- a/examples/msg/mc/test/snapshot_comparison_platform.xml +++ b/examples/msg/mc/test/snapshot_comparison_platform.xml @@ -2,13 +2,13 @@ - - - - - - - + + + + + + + diff --git a/examples/msg/msg_platform.xml b/examples/msg/msg_platform.xml index dd4de15600..84db0e240f 100644 --- a/examples/msg/msg_platform.xml +++ b/examples/msg/msg_platform.xml @@ -2,288 +2,288 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/3hosts_2links_p.xml b/examples/msg/ns3/3hosts_2links_p.xml index b6068e1291..83caaeae6e 100644 --- a/examples/msg/ns3/3hosts_2links_p.xml +++ b/examples/msg/ns3/3hosts_2links_p.xml @@ -6,12 +6,12 @@ - - - + + + - - + + diff --git a/examples/msg/ns3/3links-p.xml b/examples/msg/ns3/3links-p.xml index a7e6848251..548490f451 100644 --- a/examples/msg/ns3/3links-p.xml +++ b/examples/msg/ns3/3links-p.xml @@ -12,16 +12,16 @@ --> - - - - - - + + + + + + - - - + + + diff --git a/examples/msg/ns3/dogbone-p.xml b/examples/msg/ns3/dogbone-p.xml index 08eb81c1d7..bfef6ad6e7 100644 --- a/examples/msg/ns3/dogbone-p.xml +++ b/examples/msg/ns3/dogbone-p.xml @@ -6,18 +6,18 @@ --> - - - - + + + + - - - - - + + + + + diff --git a/examples/msg/parallel_task/test_ptask_platform.xml b/examples/msg/parallel_task/test_ptask_platform.xml index 6132794da3..cbcd074dd6 100644 --- a/examples/msg/parallel_task/test_ptask_platform.xml +++ b/examples/msg/parallel_task/test_ptask_platform.xml @@ -3,16 +3,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/examples/msg/pastry/CMakeLists.txt b/examples/msg/pastry/CMakeLists.txt new file mode 100644 index 0000000000..39aef6b6d9 --- /dev/null +++ b/examples/msg/pastry/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 2.6) + +set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(pastry pastry.c) + +### Add definitions for compile +target_link_libraries(pastry simgrid ) + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/pastry.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/pastry_crosstraffic.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + ${CMAKE_CURRENT_SOURCE_DIR}/pastry10.xml + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/pastry.c + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/examples/msg/pastry/pastry.c b/examples/msg/pastry/pastry.c new file mode 100644 index 0000000000..cbcfcd5ff2 --- /dev/null +++ b/examples/msg/pastry/pastry.c @@ -0,0 +1,655 @@ +#include +#include +#include "msg/msg.h" +#include "xbt/log.h" +#include "xbt/asserts.h" + + XBT_LOG_NEW_DEFAULT_CATEGORY(msg_pastry, + "Messages specific for this msg example"); + +/*************************************** + * PASTRY * + * * + * TODO: * + * - handle node departure * + * - handle objects on the network * + * - handle neighborood in the update * + * * + ***************************************/ + +#define COMM_SIZE 10 +#define COMP_SIZE 0 +#define MAILBOX_NAME_SIZE 10 + +#define DOMAIN_SIZE 4 +#define LEVELS_COUNT 8 // sizeof(int)*8/DOMAIN_SIZE +#define LEVEL_SIZE 16 // 2^DOMAIN_SIZE +#define NEIGHBORHOOD_SIZE 6 +#define NAMESPACE_SIZE 6 +#define MAILBOX_NAME_SIZE 10 + +static int nb_bits = 16; +static int timeout = 50; +static int max_simulation_time = 1000; + +extern long int smx_total_comms; + + +typedef struct s_node { + int id; //128bits generated random(2^128 -1) + int known_id; + char mailbox[MAILBOX_NAME_SIZE]; // my mailbox name (string representation of the id) + int namespace_set[NAMESPACE_SIZE]; + int neighborhood_set[NEIGHBORHOOD_SIZE]; + int routing_table[LEVELS_COUNT][LEVEL_SIZE]; + int ready; + msg_comm_t comm_receive; // current communication to receive + xbt_fifo_t pending_tasks; +} s_node_t, *node_t; + +typedef struct s_state { + int id; + int namespace_set[NAMESPACE_SIZE]; + int neighborhood_set[NEIGHBORHOOD_SIZE]; + int routing_table[LEVELS_COUNT][LEVEL_SIZE]; +} s_state_t, *state_t; + +/** + * Types of tasks exchanged between nodes. + */ +typedef enum { + TASK_JOIN, + TASK_JOIN_REPLY, + TASK_JOIN_LAST_REPLY, + TASK_UPDATE +} e_task_type_t; + +typedef struct s_task_data { + e_task_type_t type; // type of task + int sender_id; // id paramater (used by some types of tasks) + //int request_finger; // finger parameter (used by some types of tasks) + int answer_id; // answer (used by some types of tasks) + char answer_to[MAILBOX_NAME_SIZE]; // mailbox to send an answer to (if any) + //const char* issuer_host_name; // used for logging + int steps; + state_t state; +} s_task_data_t, *task_data_t; + + +static void print_node(node_t node); +static void print_node_id(node_t node); +static void print_node_neighborood_set(node_t node); +static void print_node_routing_table(node_t node); +static void print_node_namespace_set(node_t node); +static state_t node_get_state(node_t node); +static void get_mailbox(int node_id, char* mailbox); +static int domain(int a, int level); +static int shl(int a, int b); +static int closest_in_namespace_set(node_t node, int dest); +static int routing_next(node_t node, int dest); +static void create(node_t node); +static int join(node_t node); + + +/** + * \brief Gets the mailbox name of a host given its chord id. + * \param node_id id of a node + * \param mailbox pointer to where the mailbox name should be written + * (there must be enough space) + */ +static void get_mailbox(int node_id, char* mailbox) +{ + snprintf(mailbox, MAILBOX_NAME_SIZE - 1, "%d", node_id); +} + +/** + * Get the specific level of a node id + */ +int domain_mask = 0; +static int domain(int a, int level) { + if (domain_mask == 0) + domain_mask = pow(2, DOMAIN_SIZE) - 1; + int shift = (LEVELS_COUNT-level-1)*DOMAIN_SIZE; + return (a >> shift) & domain_mask; +} + +/** + * Get the shared domains between the two givens ids + */ +static int shl(int a, int b) { + int l = 0; + while(lnamespace_set[NAMESPACE_SIZE-1] <= dest) & (dest <= node->namespace_set[0])) { + best_dist = abs(node->id - dest); + res = node->id; + int i, dist; + for (i=0; inamespace_set[i]!=-1) { + dist = abs(node->namespace_set[i] - dest); + if (distnamespace_set[i]; + } + } + } + } + return res; +} + +/* + * Find the next node to forward a meassage to + */ +static int routing_next(node_t node, int dest) { + int closest = closest_in_namespace_set(node, dest); + int res = -1; + if (closest!=-1) + return closest; + + int l = shl(node->id, dest); + res = node->routing_table[l][domain(dest, l)]; + if (res!=-1) + return res; + + //rare case + int dist = abs(node->id - dest); + int i,j; + for (i=l; irouting_table[i][j]; + if (res!=-1 && abs(res - dest)neighborhood_set[i]; + if (res!=-1 && shl(res, dest)>=l && abs(res - dest)namespace_set[i]; + if (res!=-1 && shl(res, dest)>=l && abs(res - dest)id; +} + +/* + * Handle a given task + */ +static void handle_task(node_t node, msg_task_t task) { + XBT_DEBUG("Handling task %p", task); + char mailbox[MAILBOX_NAME_SIZE]; + int i, j, min, max, d; + msg_task_t task_sent; + task_data_t req_data; + task_data_t task_data = (task_data_t) MSG_task_get_data(task); + e_task_type_t type = task_data->type; + // If the node is not ready keep the task for later + if (node->ready != 0 && !(type==TASK_JOIN_LAST_REPLY || type==TASK_JOIN_REPLY)) { + XBT_DEBUG("Task pending %i", type); + xbt_fifo_push(node->pending_tasks, task); + return; + } + switch (type) { + /* + * Try to join the ring + */ + case TASK_JOIN:; + int next = routing_next(node, task_data->answer_id); + XBT_DEBUG("Join request from %08x forwarding to %08x", task_data->answer_id, next); + type = TASK_JOIN_LAST_REPLY; + + req_data = xbt_new0(s_task_data_t,1); + req_data->answer_id = task_data->sender_id; + req_data->steps = task_data->steps + 1; + + // if next different from current node forward the join + if (next!=node->id) { + get_mailbox(next, mailbox); + task_data->sender_id = node->id; + task_data->steps++; + task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, task_data); + MSG_task_send_with_timeout(task_sent, mailbox, timeout); + type = TASK_JOIN_REPLY; + } + + // send back the current node state to the joining node + req_data->type = type; + req_data->sender_id = node->id; + get_mailbox(node->id, req_data->answer_to); + req_data->state = node_get_state(node); + task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data); + MSG_task_send_with_timeout(task_sent, task_data->answer_to, timeout); + break; + + /* + * Join reply from all the node touched by the join + */ + case TASK_JOIN_LAST_REPLY: + // if last node touched reply, copy its namespace set + // TODO: it's work only if the two nodes are side to side (is it really the case ?) + j = (task_data->sender_id < node->id) ? -1 : 0; + for (i=0; inamespace_set[i] = task_data->state->namespace_set[i-j]; + node->namespace_set[NAMESPACE_SIZE-1-i] = task_data->state->namespace_set[NAMESPACE_SIZE-1-i-j-1]; + } + node->namespace_set[NAMESPACE_SIZE/2+j] = task_data->sender_id; + node->ready += task_data->steps + 1; + case TASK_JOIN_REPLY: + XBT_DEBUG("Joining Reply"); + + // if first node touched reply, copy its neighborood set + if (task_data->sender_id == node->known_id) { + node->neighborhood_set[0] = task_data->sender_id; + for (i=1; ineighborhood_set[i] = task_data->state->neighborhood_set[i-1]; + } + + // copy the corresponding routing table levels + min = (node->id==task_data->answer_id) ? 0 : shl(node->id, task_data->answer_id); + max = shl(node->id, task_data->sender_id)+1; + for (i=min;iid, i); + for (j=0; jrouting_table[i][j] = task_data->state->routing_table[i][j]; + } + + node->ready--; + // if the node is ready, do all the pending tasks and send update to known nodes + if (node->ready==0) { + XBT_DEBUG("Node %i is ready!!!", node->id); + + while(xbt_fifo_size(node->pending_tasks)) + handle_task(node, xbt_fifo_pop(node->pending_tasks)); + + for (i=0; inamespace_set[i]; + if (j!=-1) { + XBT_DEBUG("Send update to %i", j); + get_mailbox(j, mailbox); + + req_data = xbt_new0(s_task_data_t,1); + req_data->answer_id = node->id; + req_data->steps = 0; + req_data->type = TASK_UPDATE; + req_data->sender_id = node->id; + get_mailbox(node->id, req_data->answer_to); + req_data->state = node_get_state(node); + task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data); + MSG_task_send_with_timeout(task_sent, mailbox, timeout); + } + } + } + break; + + /* + * Recieved an update of state + */ + case TASK_UPDATE: + XBT_DEBUG("Task update %i !!!", node->id); + + /* Update namespace ses */ + printf("Task update from %i !!!\n", task_data->sender_id); + print_node_id(node); + print_node_namespace_set(node); + int curr_namespace_set[NAMESPACE_SIZE]; + int task_namespace_set[NAMESPACE_SIZE+1]; + + // Copy the current namedspace + // and the task state namespace with state->id in the middle + i=0; + for (; inamespace_set[i]; + task_namespace_set[i] = task_data->state->namespace_set[i]; + } + task_namespace_set[i] = task_data->state->id; + for (; inamespace_set[i]; + task_namespace_set[i+1] = task_data->state->namespace_set[i]; + } + + // get the index of values before and after node->id in task_namespace + min = -1; + max = -1; + for (i=0; i<=NAMESPACE_SIZE; i++) { + j = task_namespace_set[i]; + if (iid) min = i; + if (j != -1 && max == -1 && j > node->id) max = i; + } + printf("\n"); + + // add lower elements + j = NAMESPACE_SIZE/2-1; + for (i=NAMESPACE_SIZE/2-1; i>=0; i--) { + printf("i:%i, j:%i, min:%i, currj:%08x, taskmin:%08x\n", i, j, min, curr_namespace_set[j], task_namespace_set[min]); + if (min<0) { + node->namespace_set[i] = curr_namespace_set[j]; + j--; + } else if (curr_namespace_set[j] == task_namespace_set[min]) { + node->namespace_set[i] = curr_namespace_set[j]; + j--; min--; + } else if (curr_namespace_set[j] > task_namespace_set[min]) { + node->namespace_set[i] = curr_namespace_set[j]; + j--; + } else { + node->namespace_set[i] = task_namespace_set[min]; + min--; + } + } + + // add greater elements + j = NAMESPACE_SIZE/2; + for (i=NAMESPACE_SIZE/2; i=NAMESPACE_SIZE) { + node->namespace_set[i] = curr_namespace_set[j]; + j++; + } else if (curr_namespace_set[j] == -1) { + node->namespace_set[i] = task_namespace_set[max]; + max++; + } else if (curr_namespace_set[j] == task_namespace_set[max]) { + node->namespace_set[i] = curr_namespace_set[j]; + j++; max++; + } else if (curr_namespace_set[j] < task_namespace_set[max]) { + node->namespace_set[i] = curr_namespace_set[j]; + j++; + } else { + node->namespace_set[i] = task_namespace_set[max]; + max++; + } + } + print_node_namespace_set(node); + + /* Update routing table */ + for (i=shl(node->id, task_data->state->id); irouting_table[i][j]==-1 && task_data->state->routing_table[i][j]==-1) + node->routing_table[i][j] = task_data->state->routing_table[i][j]; + } + } + } +} + +/** + * \brief Initializes the current node as the first one of the system. + * \param node the current node + */ +static void create(node_t node){ + node->ready = 0; + XBT_DEBUG("Create a new Pastry ring..."); +} + +/* + * Join the ring + */ +static int join(node_t node){ + task_data_t req_data = xbt_new0(s_task_data_t,1); + req_data->type = TASK_JOIN; + req_data->sender_id = node->id; + req_data->answer_id = node->id; + req_data->steps = 0; + get_mailbox(node->id, req_data->answer_to); + + char mailbox[MAILBOX_NAME_SIZE]; + get_mailbox(node->known_id, mailbox); + + msg_task_t task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data); + XBT_DEBUG("Trying to join Pastry ring... (with node %s)", mailbox); + MSG_task_send_with_timeout(task_sent, mailbox, timeout); + + return 1; +} + +/* + * Print the node infomations + */ +static void print_node(node_t node) { + printf("Node:\n"); + print_node_id(node); + print_node_neighborood_set(node); + print_node_routing_table(node); + print_node_namespace_set(node); +} + +/* + * Print the node id + */ +static void print_node_id(node_t node) { + int i; + printf(" id: %i '%08x' ", node->id, node->id); + for (i=0;iid, i)); + printf("\n"); +} + +/* + * Print the node neighborood set + */ +static void print_node_neighborood_set(node_t node) { + int i; + printf(" neighborood:\n"); + for (i=0; ineighborhood_set[i]); +} + +/* + * Print the routing table + */ +static void print_node_routing_table(node_t node) { + int i,j; + printf(" routing table:\n"); + for (i=0; irouting_table[i][j]); + printf("\n"); + } +} + +/* + * Print the node namespace set + */ +static void print_node_namespace_set(node_t node) { + int i; + printf(" namespace:\n"); + for (i=0; inamespace_set[i]); + printf("\n"); + +} + +/* + * Get the corresponding state of a node + */ +static state_t node_get_state(node_t node) { + int i,j; + state_t state = xbt_new0(s_state_t,1); + state->id = node->id; + for (i=0; ineighborhood_set[i] = node->neighborhood_set[i]; + + for (i=0; irouting_table[i][j] = node->routing_table[i][j]; + + for (i=0; inamespace_set[i] = node->namespace_set[i]; + + return state; +} + + +/** + * \brief Node Function + * Arguments: + * - my id + * - the id of a guy I know in the system (except for the first node) + * - the time to sleep before I join (except for the first node) + * - the deadline time + */ +static int node(int argc, char *argv[]) +{ + double init_time = MSG_get_clock(); + msg_task_t task_received = NULL; + int join_success = 0; + double deadline; + xbt_assert(argc == 3 || argc == 5, "Wrong number of arguments for this node"); + s_node_t node = {0}; + node.id = atoi(argv[1]); + node.known_id = -1; + node.ready = -1; + node.pending_tasks = xbt_fifo_new(); + get_mailbox(node.id, node.mailbox); + XBT_DEBUG("New node with id %s (%08x)", node.mailbox, node.id); + + int i,j,d; + for (i=0; i + + + + + + + + + + + + + diff --git a/examples/msg/pastry/pastry_crosstraffic.tesh b/examples/msg/pastry/pastry_crosstraffic.tesh new file mode 100644 index 0000000000..dce7b71cd0 --- /dev/null +++ b/examples/msg/pastry/pastry_crosstraffic.tesh @@ -0,0 +1,3019 @@ +#! ./tesh + +p Testing the Chord implementation with MSG + +! output sort +$ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/chord.xml --log=msg_chord.thres:verbose "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (1:node@Gatien) Joining the ring with id 48, knowing node 1 +> [ 0.000000] (2:node@McGee) Joining the ring with id 42, knowing node 1 +> [ 0.000000] (3:node@iRMX) Joining the ring with id 38, knowing node 1 +> [ 0.000000] (4:node@Geoff) Joining the ring with id 32, knowing node 1 +> [ 0.000000] (5:node@TeX) Joining the ring with id 21, knowing node 1 +> [ 0.000000] (6:node@Jean_Yves) Joining the ring with id 14, knowing node 1 +> [ 0.000000] (7:node@Boivin) Joining the ring with id 8, knowing node 1 +> [ 0.000000] (8:node@Jacquelin) My finger table: +> [ 0.000000] (8:node@Jacquelin) Start | Succ +> [ 0.000000] (8:node@Jacquelin) 2 | 1 +> [ 0.000000] (8:node@Jacquelin) 3 | 1 +> [ 0.000000] (8:node@Jacquelin) 5 | 1 +> [ 0.000000] (8:node@Jacquelin) 9 | 1 +> [ 0.000000] (8:node@Jacquelin) 17 | 1 +> [ 0.000000] (8:node@Jacquelin) 33 | 1 +> [ 0.000000] (8:node@Jacquelin) Predecessor: -1 +> [ 6.274448] (1:node@Gatien) My finger table: +> [ 6.274448] (1:node@Gatien) Start | Succ +> [ 6.274448] (1:node@Gatien) 49 | 1 +> [ 6.274448] (1:node@Gatien) 50 | 48 +> [ 6.274448] (1:node@Gatien) 52 | 48 +> [ 6.274448] (1:node@Gatien) 56 | 48 +> [ 6.274448] (1:node@Gatien) 0 | 48 +> [ 6.274448] (1:node@Gatien) 16 | 48 +> [ 6.274448] (1:node@Gatien) Predecessor: -1 +> [ 10.888356] (2:node@McGee) My finger table: +> [ 10.888356] (2:node@McGee) Start | Succ +> [ 10.888356] (2:node@McGee) 43 | 1 +> [ 10.888356] (2:node@McGee) 44 | 42 +> [ 10.888356] (2:node@McGee) 46 | 42 +> [ 10.888356] (2:node@McGee) 50 | 42 +> [ 10.888356] (2:node@McGee) 58 | 42 +> [ 10.888356] (2:node@McGee) 10 | 42 +> [ 10.888356] (2:node@McGee) Predecessor: -1 +> [ 18.043675] (3:node@iRMX) My finger table: +> [ 18.043675] (3:node@iRMX) Start | Succ +> [ 18.043675] (3:node@iRMX) 39 | 1 +> [ 18.043675] (3:node@iRMX) 40 | 38 +> [ 18.043675] (3:node@iRMX) 42 | 38 +> [ 18.043675] (3:node@iRMX) 46 | 38 +> [ 18.043675] (3:node@iRMX) 54 | 38 +> [ 18.043675] (3:node@iRMX) 6 | 38 +> [ 18.043675] (3:node@iRMX) Predecessor: -1 +> [ 20.005344] (4:node@Geoff) My finger table: +> [ 20.005344] (4:node@Geoff) Start | Succ +> [ 20.005344] (4:node@Geoff) 33 | 1 +> [ 20.005344] (4:node@Geoff) 34 | 32 +> [ 20.005344] (4:node@Geoff) 36 | 32 +> [ 20.005344] (4:node@Geoff) 40 | 32 +> [ 20.005344] (4:node@Geoff) 48 | 32 +> [ 20.005344] (4:node@Geoff) 0 | 32 +> [ 20.005344] (4:node@Geoff) Predecessor: -1 +> [ 26.812602] (5:node@TeX) My finger table: +> [ 26.812602] (5:node@TeX) Start | Succ +> [ 26.812602] (5:node@TeX) 22 | 1 +> [ 26.812602] (5:node@TeX) 23 | 21 +> [ 26.812602] (5:node@TeX) 25 | 21 +> [ 26.812602] (5:node@TeX) 29 | 21 +> [ 26.812602] (5:node@TeX) 37 | 21 +> [ 26.812602] (5:node@TeX) 53 | 21 +> [ 26.812602] (5:node@TeX) Predecessor: -1 +> [ 30.925131] (6:node@Jean_Yves) My finger table: +> [ 30.925131] (6:node@Jean_Yves) Start | Succ +> [ 30.925131] (6:node@Jean_Yves) 15 | 1 +> [ 30.925131] (6:node@Jean_Yves) 16 | 14 +> [ 30.925131] (6:node@Jean_Yves) 18 | 14 +> [ 30.925131] (6:node@Jean_Yves) 22 | 14 +> [ 30.925131] (6:node@Jean_Yves) 30 | 14 +> [ 30.925131] (6:node@Jean_Yves) 46 | 14 +> [ 30.925131] (6:node@Jean_Yves) Predecessor: -1 +> [ 36.048886] (7:node@Boivin) My finger table: +> [ 36.048886] (7:node@Boivin) Start | Succ +> [ 36.048886] (7:node@Boivin) 9 | 1 +> [ 36.048886] (7:node@Boivin) 10 | 8 +> [ 36.048886] (7:node@Boivin) 12 | 8 +> [ 36.048886] (7:node@Boivin) 16 | 8 +> [ 36.048886] (7:node@Boivin) 24 | 8 +> [ 36.048886] (7:node@Boivin) 40 | 8 +> [ 36.048886] (7:node@Boivin) Predecessor: -1 +> [ 75.000000] (8:node@Jacquelin) My finger table: +> [ 75.000000] (8:node@Jacquelin) Start | Succ +> [ 75.000000] (8:node@Jacquelin) 2 | 1 +> [ 75.000000] (8:node@Jacquelin) 3 | 1 +> [ 75.000000] (8:node@Jacquelin) 5 | 1 +> [ 75.000000] (8:node@Jacquelin) 9 | 1 +> [ 75.000000] (8:node@Jacquelin) 17 | 1 +> [ 75.000000] (8:node@Jacquelin) 33 | 1 +> [ 75.000000] (8:node@Jacquelin) Predecessor: 32 +> [ 80.000000] (8:node@Jacquelin) My finger table: +> [ 80.000000] (8:node@Jacquelin) Start | Succ +> [ 80.000000] (8:node@Jacquelin) 2 | 1 +> [ 80.000000] (8:node@Jacquelin) 3 | 1 +> [ 80.000000] (8:node@Jacquelin) 5 | 1 +> [ 80.000000] (8:node@Jacquelin) 9 | 1 +> [ 80.000000] (8:node@Jacquelin) 17 | 1 +> [ 80.000000] (8:node@Jacquelin) 33 | 1 +> [ 80.000000] (8:node@Jacquelin) Predecessor: 42 +> [ 81.274448] (8:node@Jacquelin) My finger table: +> [ 81.274448] (8:node@Jacquelin) Start | Succ +> [ 81.274448] (8:node@Jacquelin) 2 | 42 +> [ 81.274448] (8:node@Jacquelin) 3 | 1 +> [ 81.274448] (8:node@Jacquelin) 5 | 1 +> [ 81.274448] (8:node@Jacquelin) 9 | 1 +> [ 81.274448] (8:node@Jacquelin) 17 | 1 +> [ 81.274448] (8:node@Jacquelin) 33 | 1 +> [ 81.274448] (8:node@Jacquelin) Predecessor: 48 +> [116.655207] (2:node@McGee) My finger table: +> [116.655207] (2:node@McGee) Start | Succ +> [116.655207] (2:node@McGee) 43 | 48 +> [116.655207] (2:node@McGee) 44 | 42 +> [116.655207] (2:node@McGee) 46 | 42 +> [116.655207] (2:node@McGee) 50 | 42 +> [116.655207] (2:node@McGee) 58 | 42 +> [116.655207] (2:node@McGee) 10 | 42 +> [116.655207] (2:node@McGee) Predecessor: 1 +> [141.383343] (1:node@Gatien) My finger table: +> [141.383343] (1:node@Gatien) Start | Succ +> [141.383343] (1:node@Gatien) 49 | 1 +> [141.383343] (1:node@Gatien) 50 | 48 +> [141.383343] (1:node@Gatien) 52 | 48 +> [141.383343] (1:node@Gatien) 56 | 48 +> [141.383343] (1:node@Gatien) 0 | 48 +> [141.383343] (1:node@Gatien) 16 | 48 +> [141.383343] (1:node@Gatien) Predecessor: 42 +> [187.430835] (2:node@McGee) My finger table: +> [187.430835] (2:node@McGee) Start | Succ +> [187.430835] (2:node@McGee) 43 | 48 +> [187.430835] (2:node@McGee) 44 | 42 +> [187.430835] (2:node@McGee) 46 | 42 +> [187.430835] (2:node@McGee) 50 | 42 +> [187.430835] (2:node@McGee) 58 | 42 +> [187.430835] (2:node@McGee) 10 | 42 +> [187.430835] (2:node@McGee) Predecessor: 8 +> [224.180962] (2:node@McGee) My finger table: +> [224.180962] (2:node@McGee) Start | Succ +> [224.180962] (2:node@McGee) 43 | 48 +> [224.180962] (2:node@McGee) 44 | 42 +> [224.180962] (2:node@McGee) 46 | 42 +> [224.180962] (2:node@McGee) 50 | 42 +> [224.180962] (2:node@McGee) 58 | 42 +> [224.180962] (2:node@McGee) 10 | 42 +> [224.180962] (2:node@McGee) Predecessor: 38 +> [238.097222] (7:node@Boivin) My finger table: +> [238.097222] (7:node@Boivin) Start | Succ +> [238.097222] (7:node@Boivin) 9 | 38 +> [238.097222] (7:node@Boivin) 10 | 8 +> [238.097222] (7:node@Boivin) 12 | 8 +> [238.097222] (7:node@Boivin) 16 | 8 +> [238.097222] (7:node@Boivin) 24 | 8 +> [238.097222] (7:node@Boivin) 40 | 8 +> [238.097222] (7:node@Boivin) Predecessor: 1 +> [244.544647] (1:node@Gatien) My finger table: +> [244.544647] (1:node@Gatien) Start | Succ +> [244.544647] (1:node@Gatien) 49 | 1 +> [244.544647] (1:node@Gatien) 50 | 1 +> [244.544647] (1:node@Gatien) 52 | 48 +> [244.544647] (1:node@Gatien) 56 | 48 +> [244.544647] (1:node@Gatien) 0 | 48 +> [244.544647] (1:node@Gatien) 16 | 48 +> [244.544647] (1:node@Gatien) Predecessor: 42 +> [251.309994] (7:node@Boivin) My finger table: +> [251.309994] (7:node@Boivin) Start | Succ +> [251.309994] (7:node@Boivin) 9 | 38 +> [251.309994] (7:node@Boivin) 10 | 38 +> [251.309994] (7:node@Boivin) 12 | 8 +> [251.309994] (7:node@Boivin) 16 | 8 +> [251.309994] (7:node@Boivin) 24 | 8 +> [251.309994] (7:node@Boivin) 40 | 8 +> [251.309994] (7:node@Boivin) Predecessor: 1 +> [252.819580] (2:node@McGee) My finger table: +> [252.819580] (2:node@McGee) Start | Succ +> [252.819580] (2:node@McGee) 43 | 48 +> [252.819580] (2:node@McGee) 44 | 48 +> [252.819580] (2:node@McGee) 46 | 42 +> [252.819580] (2:node@McGee) 50 | 42 +> [252.819580] (2:node@McGee) 58 | 42 +> [252.819580] (2:node@McGee) 10 | 42 +> [252.819580] (2:node@McGee) Predecessor: 38 +> [268.906974] (6:node@Jean_Yves) My finger table: +> [268.906974] (6:node@Jean_Yves) Start | Succ +> [268.906974] (6:node@Jean_Yves) 15 | 38 +> [268.906974] (6:node@Jean_Yves) 16 | 38 +> [268.906974] (6:node@Jean_Yves) 18 | 14 +> [268.906974] (6:node@Jean_Yves) 22 | 14 +> [268.906974] (6:node@Jean_Yves) 30 | 14 +> [268.906974] (6:node@Jean_Yves) 46 | 14 +> [268.906974] (6:node@Jean_Yves) Predecessor: -1 +> [272.587495] (3:node@iRMX) My finger table: +> [272.587495] (3:node@iRMX) Start | Succ +> [272.587495] (3:node@iRMX) 39 | 42 +> [272.587495] (3:node@iRMX) 40 | 38 +> [272.587495] (3:node@iRMX) 42 | 38 +> [272.587495] (3:node@iRMX) 46 | 38 +> [272.587495] (3:node@iRMX) 54 | 38 +> [272.587495] (3:node@iRMX) 6 | 38 +> [272.587495] (3:node@iRMX) Predecessor: 8 +> [275.995507] (8:node@Jacquelin) My finger table: +> [275.995507] (8:node@Jacquelin) Start | Succ +> [275.995507] (8:node@Jacquelin) 2 | 8 +> [275.995507] (8:node@Jacquelin) 3 | 8 +> [275.995507] (8:node@Jacquelin) 5 | 1 +> [275.995507] (8:node@Jacquelin) 9 | 1 +> [275.995507] (8:node@Jacquelin) 17 | 1 +> [275.995507] (8:node@Jacquelin) 33 | 1 +> [275.995507] (8:node@Jacquelin) Predecessor: 48 +> [278.895082] (3:node@iRMX) My finger table: +> [278.895082] (3:node@iRMX) Start | Succ +> [278.895082] (3:node@iRMX) 39 | 42 +> [278.895082] (3:node@iRMX) 40 | 38 +> [278.895082] (3:node@iRMX) 42 | 38 +> [278.895082] (3:node@iRMX) 46 | 38 +> [278.895082] (3:node@iRMX) 54 | 38 +> [278.895082] (3:node@iRMX) 6 | 38 +> [278.895082] (3:node@iRMX) Predecessor: 14 +> [285.028772] (3:node@iRMX) My finger table: +> [285.028772] (3:node@iRMX) Start | Succ +> [285.028772] (3:node@iRMX) 39 | 42 +> [285.028772] (3:node@iRMX) 40 | 42 +> [285.028772] (3:node@iRMX) 42 | 38 +> [285.028772] (3:node@iRMX) 46 | 38 +> [285.028772] (3:node@iRMX) 54 | 38 +> [285.028772] (3:node@iRMX) 6 | 38 +> [285.028772] (3:node@iRMX) Predecessor: 14 +> [299.124613] (4:node@Geoff) My finger table: +> [299.124613] (4:node@Geoff) Start | Succ +> [299.124613] (4:node@Geoff) 33 | 38 +> [299.124613] (4:node@Geoff) 34 | 38 +> [299.124613] (4:node@Geoff) 36 | 32 +> [299.124613] (4:node@Geoff) 40 | 32 +> [299.124613] (4:node@Geoff) 48 | 32 +> [299.124613] (4:node@Geoff) 0 | 32 +> [299.124613] (4:node@Geoff) Predecessor: -1 +> [302.471288] (5:node@TeX) My finger table: +> [302.471288] (5:node@TeX) Start | Succ +> [302.471288] (5:node@TeX) 22 | 38 +> [302.471288] (5:node@TeX) 23 | 38 +> [302.471288] (5:node@TeX) 25 | 21 +> [302.471288] (5:node@TeX) 29 | 21 +> [302.471288] (5:node@TeX) 37 | 21 +> [302.471288] (5:node@TeX) 53 | 21 +> [302.471288] (5:node@TeX) Predecessor: -1 +> [309.606669] (3:node@iRMX) My finger table: +> [309.606669] (3:node@iRMX) Start | Succ +> [309.606669] (3:node@iRMX) 39 | 42 +> [309.606669] (3:node@iRMX) 40 | 42 +> [309.606669] (3:node@iRMX) 42 | 38 +> [309.606669] (3:node@iRMX) 46 | 38 +> [309.606669] (3:node@iRMX) 54 | 38 +> [309.606669] (3:node@iRMX) 6 | 38 +> [309.606669] (3:node@iRMX) Predecessor: 32 +> [352.254169] (6:node@Jean_Yves) My finger table: +> [352.254169] (6:node@Jean_Yves) Start | Succ +> [352.254169] (6:node@Jean_Yves) 15 | 32 +> [352.254169] (6:node@Jean_Yves) 16 | 38 +> [352.254169] (6:node@Jean_Yves) 18 | 14 +> [352.254169] (6:node@Jean_Yves) 22 | 14 +> [352.254169] (6:node@Jean_Yves) 30 | 14 +> [352.254169] (6:node@Jean_Yves) 46 | 14 +> [352.254169] (6:node@Jean_Yves) Predecessor: 8 +> [367.424317] (4:node@Geoff) My finger table: +> [367.424317] (4:node@Geoff) Start | Succ +> [367.424317] (4:node@Geoff) 33 | 38 +> [367.424317] (4:node@Geoff) 34 | 38 +> [367.424317] (4:node@Geoff) 36 | 32 +> [367.424317] (4:node@Geoff) 40 | 32 +> [367.424317] (4:node@Geoff) 48 | 32 +> [367.424317] (4:node@Geoff) 0 | 32 +> [367.424317] (4:node@Geoff) Predecessor: 14 +> [368.585370] (1:node@Gatien) My finger table: +> [368.585370] (1:node@Gatien) Start | Succ +> [368.585370] (1:node@Gatien) 49 | 1 +> [368.585370] (1:node@Gatien) 50 | 1 +> [368.585370] (1:node@Gatien) 52 | 1 +> [368.585370] (1:node@Gatien) 56 | 48 +> [368.585370] (1:node@Gatien) 0 | 48 +> [368.585370] (1:node@Gatien) 16 | 48 +> [368.585370] (1:node@Gatien) Predecessor: 42 +> [374.895628] (2:node@McGee) My finger table: +> [374.895628] (2:node@McGee) Start | Succ +> [374.895628] (2:node@McGee) 43 | 48 +> [374.895628] (2:node@McGee) 44 | 48 +> [374.895628] (2:node@McGee) 46 | 48 +> [374.895628] (2:node@McGee) 50 | 42 +> [374.895628] (2:node@McGee) 58 | 42 +> [374.895628] (2:node@McGee) 10 | 42 +> [374.895628] (2:node@McGee) Predecessor: 38 +> [392.072209] (7:node@Boivin) My finger table: +> [392.072209] (7:node@Boivin) Start | Succ +> [392.072209] (7:node@Boivin) 9 | 14 +> [392.072209] (7:node@Boivin) 10 | 38 +> [392.072209] (7:node@Boivin) 12 | 14 +> [392.072209] (7:node@Boivin) 16 | 8 +> [392.072209] (7:node@Boivin) 24 | 8 +> [392.072209] (7:node@Boivin) 40 | 8 +> [392.072209] (7:node@Boivin) Predecessor: 1 +> [398.554322] (4:node@Geoff) My finger table: +> [398.554322] (4:node@Geoff) Start | Succ +> [398.554322] (4:node@Geoff) 33 | 38 +> [398.554322] (4:node@Geoff) 34 | 38 +> [398.554322] (4:node@Geoff) 36 | 32 +> [398.554322] (4:node@Geoff) 40 | 32 +> [398.554322] (4:node@Geoff) 48 | 32 +> [398.554322] (4:node@Geoff) 0 | 32 +> [398.554322] (4:node@Geoff) Predecessor: 21 +> [400.952052] (6:node@Jean_Yves) My finger table: +> [400.952052] (6:node@Jean_Yves) Start | Succ +> [400.952052] (6:node@Jean_Yves) 15 | 21 +> [400.952052] (6:node@Jean_Yves) 16 | 38 +> [400.952052] (6:node@Jean_Yves) 18 | 21 +> [400.952052] (6:node@Jean_Yves) 22 | 14 +> [400.952052] (6:node@Jean_Yves) 30 | 14 +> [400.952052] (6:node@Jean_Yves) 46 | 14 +> [400.952052] (6:node@Jean_Yves) Predecessor: 8 +> [405.305451] (8:node@Jacquelin) My finger table: +> [405.305451] (8:node@Jacquelin) Start | Succ +> [405.305451] (8:node@Jacquelin) 2 | 8 +> [405.305451] (8:node@Jacquelin) 3 | 8 +> [405.305451] (8:node@Jacquelin) 5 | 8 +> [405.305451] (8:node@Jacquelin) 9 | 1 +> [405.305451] (8:node@Jacquelin) 17 | 1 +> [405.305451] (8:node@Jacquelin) 33 | 1 +> [405.305451] (8:node@Jacquelin) Predecessor: 48 +> [410.451797] (3:node@iRMX) My finger table: +> [410.451797] (3:node@iRMX) Start | Succ +> [410.451797] (3:node@iRMX) 39 | 42 +> [410.451797] (3:node@iRMX) 40 | 42 +> [410.451797] (3:node@iRMX) 42 | 42 +> [410.451797] (3:node@iRMX) 46 | 38 +> [410.451797] (3:node@iRMX) 54 | 38 +> [410.451797] (3:node@iRMX) 6 | 38 +> [410.451797] (3:node@iRMX) Predecessor: 32 +> [420.675344] (4:node@Geoff) My finger table: +> [420.675344] (4:node@Geoff) Start | Succ +> [420.675344] (4:node@Geoff) 33 | 38 +> [420.675344] (4:node@Geoff) 34 | 38 +> [420.675344] (4:node@Geoff) 36 | 38 +> [420.675344] (4:node@Geoff) 40 | 32 +> [420.675344] (4:node@Geoff) 48 | 32 +> [420.675344] (4:node@Geoff) 0 | 32 +> [420.675344] (4:node@Geoff) Predecessor: 21 +> [423.624187] (5:node@TeX) My finger table: +> [423.624187] (5:node@TeX) Start | Succ +> [423.624187] (5:node@TeX) 22 | 32 +> [423.624187] (5:node@TeX) 23 | 38 +> [423.624187] (5:node@TeX) 25 | 32 +> [423.624187] (5:node@TeX) 29 | 21 +> [423.624187] (5:node@TeX) 37 | 21 +> [423.624187] (5:node@TeX) 53 | 21 +> [423.624187] (5:node@TeX) Predecessor: -1 +> [437.092176] (5:node@TeX) My finger table: +> [437.092176] (5:node@TeX) Start | Succ +> [437.092176] (5:node@TeX) 22 | 32 +> [437.092176] (5:node@TeX) 23 | 38 +> [437.092176] (5:node@TeX) 25 | 32 +> [437.092176] (5:node@TeX) 29 | 21 +> [437.092176] (5:node@TeX) 37 | 21 +> [437.092176] (5:node@TeX) 53 | 21 +> [437.092176] (5:node@TeX) Predecessor: 14 +> [492.679275] (1:node@Gatien) My finger table: +> [492.679275] (1:node@Gatien) Start | Succ +> [492.679275] (1:node@Gatien) 49 | 1 +> [492.679275] (1:node@Gatien) 50 | 1 +> [492.679275] (1:node@Gatien) 52 | 1 +> [492.679275] (1:node@Gatien) 56 | 1 +> [492.679275] (1:node@Gatien) 0 | 48 +> [492.679275] (1:node@Gatien) 16 | 48 +> [492.679275] (1:node@Gatien) Predecessor: 42 +> [518.542807] (7:node@Boivin) My finger table: +> [518.542807] (7:node@Boivin) Start | Succ +> [518.542807] (7:node@Boivin) 9 | 14 +> [518.542807] (7:node@Boivin) 10 | 38 +> [518.542807] (7:node@Boivin) 12 | 14 +> [518.542807] (7:node@Boivin) 16 | 21 +> [518.542807] (7:node@Boivin) 24 | 8 +> [518.542807] (7:node@Boivin) 40 | 8 +> [518.542807] (7:node@Boivin) Predecessor: 1 +> [535.761245] (2:node@McGee) My finger table: +> [535.761245] (2:node@McGee) Start | Succ +> [535.761245] (2:node@McGee) 43 | 48 +> [535.761245] (2:node@McGee) 44 | 48 +> [535.761245] (2:node@McGee) 46 | 48 +> [535.761245] (2:node@McGee) 50 | 1 +> [535.761245] (2:node@McGee) 58 | 42 +> [535.761245] (2:node@McGee) 10 | 42 +> [535.761245] (2:node@McGee) Predecessor: 38 +> [536.972611] (8:node@Jacquelin) My finger table: +> [536.972611] (8:node@Jacquelin) Start | Succ +> [536.972611] (8:node@Jacquelin) 2 | 8 +> [536.972611] (8:node@Jacquelin) 3 | 8 +> [536.972611] (8:node@Jacquelin) 5 | 8 +> [536.972611] (8:node@Jacquelin) 9 | 14 +> [536.972611] (8:node@Jacquelin) 17 | 1 +> [536.972611] (8:node@Jacquelin) 33 | 1 +> [536.972611] (8:node@Jacquelin) Predecessor: 48 +> [549.045448] (3:node@iRMX) My finger table: +> [549.045448] (3:node@iRMX) Start | Succ +> [549.045448] (3:node@iRMX) 39 | 42 +> [549.045448] (3:node@iRMX) 40 | 42 +> [549.045448] (3:node@iRMX) 42 | 42 +> [549.045448] (3:node@iRMX) 46 | 48 +> [549.045448] (3:node@iRMX) 54 | 38 +> [549.045448] (3:node@iRMX) 6 | 38 +> [549.045448] (3:node@iRMX) Predecessor: 32 +> [555.217227] (6:node@Jean_Yves) My finger table: +> [555.217227] (6:node@Jean_Yves) Start | Succ +> [555.217227] (6:node@Jean_Yves) 15 | 21 +> [555.217227] (6:node@Jean_Yves) 16 | 38 +> [555.217227] (6:node@Jean_Yves) 18 | 21 +> [555.217227] (6:node@Jean_Yves) 22 | 32 +> [555.217227] (6:node@Jean_Yves) 30 | 14 +> [555.217227] (6:node@Jean_Yves) 46 | 14 +> [555.217227] (6:node@Jean_Yves) Predecessor: 8 +> [560.036449] (5:node@TeX) My finger table: +> [560.036449] (5:node@TeX) Start | Succ +> [560.036449] (5:node@TeX) 22 | 32 +> [560.036449] (5:node@TeX) 23 | 38 +> [560.036449] (5:node@TeX) 25 | 32 +> [560.036449] (5:node@TeX) 29 | 32 +> [560.036449] (5:node@TeX) 37 | 21 +> [560.036449] (5:node@TeX) 53 | 21 +> [560.036449] (5:node@TeX) Predecessor: 14 +> [577.866994] (4:node@Geoff) My finger table: +> [577.866994] (4:node@Geoff) Start | Succ +> [577.866994] (4:node@Geoff) 33 | 38 +> [577.866994] (4:node@Geoff) 34 | 38 +> [577.866994] (4:node@Geoff) 36 | 38 +> [577.866994] (4:node@Geoff) 40 | 42 +> [577.866994] (4:node@Geoff) 48 | 32 +> [577.866994] (4:node@Geoff) 0 | 32 +> [577.866994] (4:node@Geoff) Predecessor: 21 +> [803.668999] (0:@) Messages created: 768 +> [803.668999] (0:@) Simulated time: 803.669 + +! output sort +$ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.xml ${srcdir:=.}/chord10.xml --log=msg_chord.thres:verbose "--log=root.fmt:[%11.6r]%e(%i:%P@%h)%e%m%n" --cfg=network/model:Constant +> [ 0.000000] (0:@) Configuration change: Set 'network/model' to 'Constant' +> [ 0.000000] (0:@) Switching workstation model to compound since you changed the network and/or cpu model(s) +> [ 0.000000] (10:node@c-9.me) Joining the ring with id 2015253, knowing node 1319738 +> [ 0.000000] (1:node@c-0.me) My finger table: +> [ 0.000000] (1:node@c-0.me) Start | Succ +> [ 0.000000] (1:node@c-0.me) 43 | 42 +> [ 0.000000] (1:node@c-0.me) 44 | 42 +> [ 0.000000] (1:node@c-0.me) 46 | 42 +> [ 0.000000] (1:node@c-0.me) 50 | 42 +> [ 0.000000] (1:node@c-0.me) 58 | 42 +> [ 0.000000] (1:node@c-0.me) 74 | 42 +> [ 0.000000] (1:node@c-0.me) 106 | 42 +> [ 0.000000] (1:node@c-0.me) 170 | 42 +> [ 0.000000] (1:node@c-0.me) 298 | 42 +> [ 0.000000] (1:node@c-0.me) 554 | 42 +> [ 0.000000] (1:node@c-0.me) 1066 | 42 +> [ 0.000000] (1:node@c-0.me) 2090 | 42 +> [ 0.000000] (1:node@c-0.me) 4138 | 42 +> [ 0.000000] (1:node@c-0.me) 8234 | 42 +> [ 0.000000] (1:node@c-0.me) 16426 | 42 +> [ 0.000000] (1:node@c-0.me) 32810 | 42 +> [ 0.000000] (1:node@c-0.me) 65578 | 42 +> [ 0.000000] (1:node@c-0.me) 131114 | 42 +> [ 0.000000] (1:node@c-0.me) 262186 | 42 +> [ 0.000000] (1:node@c-0.me) 524330 | 42 +> [ 0.000000] (1:node@c-0.me) 1048618 | 42 +> [ 0.000000] (1:node@c-0.me) 2097194 | 42 +> [ 0.000000] (1:node@c-0.me) 4194346 | 42 +> [ 0.000000] (1:node@c-0.me) 8388650 | 42 +> [ 0.000000] (1:node@c-0.me) Predecessor: -1 +> [ 0.000000] (2:node@c-1.me) Joining the ring with id 366680, knowing node 42 +> [ 0.000000] (3:node@c-2.me) Joining the ring with id 533744, knowing node 366680 +> [ 0.000000] (4:node@c-3.me) Joining the ring with id 1319738, knowing node 42 +> [ 0.000000] (5:node@c-4.me) Joining the ring with id 16509405, knowing node 366680 +> [ 0.000000] (6:node@c-5.me) Joining the ring with id 10874876, knowing node 533744 +> [ 0.000000] (7:node@c-6.me) Joining the ring with id 16728096, knowing node 1319738 +> [ 0.000000] (8:node@c-7.me) Joining the ring with id 10004760, knowing node 16509405 +> [ 0.000000] (9:node@c-8.me) Joining the ring with id 6518808, knowing node 42 +> [ 4.000000] (3:node@c-2.me) My finger table: +> [ 4.000000] (3:node@c-2.me) Start | Succ +> [ 4.000000] (3:node@c-2.me) 533745 | 366680 +> [ 4.000000] (3:node@c-2.me) 533746 | 533744 +> [ 4.000000] (3:node@c-2.me) 533748 | 533744 +> [ 4.000000] (3:node@c-2.me) 533752 | 533744 +> [ 4.000000] (3:node@c-2.me) 533760 | 533744 +> [ 4.000000] (3:node@c-2.me) 533776 | 533744 +> [ 4.000000] (3:node@c-2.me) 533808 | 533744 +> [ 4.000000] (3:node@c-2.me) 533872 | 533744 +> [ 4.000000] (3:node@c-2.me) 534000 | 533744 +> [ 4.000000] (3:node@c-2.me) 534256 | 533744 +> [ 4.000000] (3:node@c-2.me) 534768 | 533744 +> [ 4.000000] (3:node@c-2.me) 535792 | 533744 +> [ 4.000000] (3:node@c-2.me) 537840 | 533744 +> [ 4.000000] (3:node@c-2.me) 541936 | 533744 +> [ 4.000000] (3:node@c-2.me) 550128 | 533744 +> [ 4.000000] (3:node@c-2.me) 566512 | 533744 +> [ 4.000000] (3:node@c-2.me) 599280 | 533744 +> [ 4.000000] (3:node@c-2.me) 664816 | 533744 +> [ 4.000000] (3:node@c-2.me) 795888 | 533744 +> [ 4.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 4.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 4.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 4.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 4.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 4.000000] (3:node@c-2.me) Predecessor: -1 +> [ 4.000000] (6:node@c-5.me) My finger table: +> [ 4.000000] (6:node@c-5.me) Start | Succ +> [ 4.000000] (6:node@c-5.me) 10874877 | 533744 +> [ 4.000000] (6:node@c-5.me) 10874878 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10874880 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10874884 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10874892 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10874908 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10874940 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10875004 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10875132 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10875388 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10875900 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10876924 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10878972 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10883068 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10891260 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10907644 | 10874876 +> [ 4.000000] (6:node@c-5.me) 10940412 | 10874876 +> [ 4.000000] (6:node@c-5.me) 11005948 | 10874876 +> [ 4.000000] (6:node@c-5.me) 11137020 | 10874876 +> [ 4.000000] (6:node@c-5.me) 11399164 | 10874876 +> [ 4.000000] (6:node@c-5.me) 11923452 | 10874876 +> [ 4.000000] (6:node@c-5.me) 12972028 | 10874876 +> [ 4.000000] (6:node@c-5.me) 15069180 | 10874876 +> [ 4.000000] (6:node@c-5.me) 2486268 | 10874876 +> [ 4.000000] (6:node@c-5.me) Predecessor: -1 +> [ 5.000000] (5:node@c-4.me) My finger table: +> [ 5.000000] (5:node@c-4.me) Start | Succ +> [ 5.000000] (5:node@c-4.me) 16509406 | 366680 +> [ 5.000000] (5:node@c-4.me) 16509407 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16509409 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16509413 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16509421 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16509437 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16509469 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 5.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 5.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 5.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 5.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 5.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 5.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 5.000000] (5:node@c-4.me) Predecessor: -1 +> [ 5.000000] (8:node@c-7.me) My finger table: +> [ 5.000000] (8:node@c-7.me) Start | Succ +> [ 5.000000] (8:node@c-7.me) 10004761 | 16509405 +> [ 5.000000] (8:node@c-7.me) 10004762 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10004764 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10004768 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10004776 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10004792 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10004824 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 5.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 5.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 5.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 5.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 5.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 5.000000] (8:node@c-7.me) Predecessor: -1 +> [ 6.000000] (2:node@c-1.me) My finger table: +> [ 6.000000] (2:node@c-1.me) Start | Succ +> [ 6.000000] (2:node@c-1.me) 366681 | 42 +> [ 6.000000] (2:node@c-1.me) 366682 | 366680 +> [ 6.000000] (2:node@c-1.me) 366684 | 366680 +> [ 6.000000] (2:node@c-1.me) 366688 | 366680 +> [ 6.000000] (2:node@c-1.me) 366696 | 366680 +> [ 6.000000] (2:node@c-1.me) 366712 | 366680 +> [ 6.000000] (2:node@c-1.me) 366744 | 366680 +> [ 6.000000] (2:node@c-1.me) 366808 | 366680 +> [ 6.000000] (2:node@c-1.me) 366936 | 366680 +> [ 6.000000] (2:node@c-1.me) 367192 | 366680 +> [ 6.000000] (2:node@c-1.me) 367704 | 366680 +> [ 6.000000] (2:node@c-1.me) 368728 | 366680 +> [ 6.000000] (2:node@c-1.me) 370776 | 366680 +> [ 6.000000] (2:node@c-1.me) 374872 | 366680 +> [ 6.000000] (2:node@c-1.me) 383064 | 366680 +> [ 6.000000] (2:node@c-1.me) 399448 | 366680 +> [ 6.000000] (2:node@c-1.me) 432216 | 366680 +> [ 6.000000] (2:node@c-1.me) 497752 | 366680 +> [ 6.000000] (2:node@c-1.me) 628824 | 366680 +> [ 6.000000] (2:node@c-1.me) 890968 | 366680 +> [ 6.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 6.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 6.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 6.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 6.000000] (2:node@c-1.me) Predecessor: -1 +> [ 8.000000] (7:node@c-6.me) My finger table: +> [ 8.000000] (7:node@c-6.me) Start | Succ +> [ 8.000000] (7:node@c-6.me) 16728097 | 1319738 +> [ 8.000000] (7:node@c-6.me) 16728098 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16728100 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16728104 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16728112 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16728128 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 8.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 8.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 8.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 8.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 8.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 8.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 8.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 8.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 8.000000] (7:node@c-6.me) Predecessor: -1 +> [ 9.000000] (10:node@c-9.me) My finger table: +> [ 9.000000] (10:node@c-9.me) Start | Succ +> [ 9.000000] (10:node@c-9.me) 2015254 | 1319738 +> [ 9.000000] (10:node@c-9.me) 2015255 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2015257 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2015261 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2015269 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2015285 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2015317 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2015381 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2015509 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2015765 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2016277 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2017301 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2019349 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2023445 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2031637 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2048021 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2080789 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2146325 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2277397 | 2015253 +> [ 9.000000] (10:node@c-9.me) 2539541 | 2015253 +> [ 9.000000] (10:node@c-9.me) 3063829 | 2015253 +> [ 9.000000] (10:node@c-9.me) 4112405 | 2015253 +> [ 9.000000] (10:node@c-9.me) 6209557 | 2015253 +> [ 9.000000] (10:node@c-9.me) 10403861 | 2015253 +> [ 9.000000] (10:node@c-9.me) Predecessor: -1 +> [ 11.000000] (4:node@c-3.me) My finger table: +> [ 11.000000] (4:node@c-3.me) Start | Succ +> [ 11.000000] (4:node@c-3.me) 1319739 | 42 +> [ 11.000000] (4:node@c-3.me) 1319740 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1319742 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1319746 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1319754 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 11.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 11.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 11.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 11.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 11.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 11.000000] (4:node@c-3.me) Predecessor: -1 +> [ 16.000000] (9:node@c-8.me) My finger table: +> [ 16.000000] (9:node@c-8.me) Start | Succ +> [ 16.000000] (9:node@c-8.me) 6518809 | 42 +> [ 16.000000] (9:node@c-8.me) 6518810 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6518812 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6518816 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6518824 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6518840 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 16.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 16.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 16.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 16.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 16.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 16.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 16.000000] (9:node@c-8.me) Predecessor: -1 +> [ 26.000000] (4:node@c-3.me) My finger table: +> [ 26.000000] (4:node@c-3.me) Start | Succ +> [ 26.000000] (4:node@c-3.me) 1319739 | 42 +> [ 26.000000] (4:node@c-3.me) 1319740 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1319742 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1319746 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1319754 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 26.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 26.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 26.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 26.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 26.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 26.000000] (4:node@c-3.me) Predecessor: 16728096 +> [ 31.000000] (2:node@c-1.me) My finger table: +> [ 31.000000] (2:node@c-1.me) Start | Succ +> [ 31.000000] (2:node@c-1.me) 366681 | 42 +> [ 31.000000] (2:node@c-1.me) 366682 | 366680 +> [ 31.000000] (2:node@c-1.me) 366684 | 366680 +> [ 31.000000] (2:node@c-1.me) 366688 | 366680 +> [ 31.000000] (2:node@c-1.me) 366696 | 366680 +> [ 31.000000] (2:node@c-1.me) 366712 | 366680 +> [ 31.000000] (2:node@c-1.me) 366744 | 366680 +> [ 31.000000] (2:node@c-1.me) 366808 | 366680 +> [ 31.000000] (2:node@c-1.me) 366936 | 366680 +> [ 31.000000] (2:node@c-1.me) 367192 | 366680 +> [ 31.000000] (2:node@c-1.me) 367704 | 366680 +> [ 31.000000] (2:node@c-1.me) 368728 | 366680 +> [ 31.000000] (2:node@c-1.me) 370776 | 366680 +> [ 31.000000] (2:node@c-1.me) 374872 | 366680 +> [ 31.000000] (2:node@c-1.me) 383064 | 366680 +> [ 31.000000] (2:node@c-1.me) 399448 | 366680 +> [ 31.000000] (2:node@c-1.me) 432216 | 366680 +> [ 31.000000] (2:node@c-1.me) 497752 | 366680 +> [ 31.000000] (2:node@c-1.me) 628824 | 366680 +> [ 31.000000] (2:node@c-1.me) 890968 | 366680 +> [ 31.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 31.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 31.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 31.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 31.000000] (2:node@c-1.me) Predecessor: 16509405 +> [ 32.000000] (5:node@c-4.me) My finger table: +> [ 32.000000] (5:node@c-4.me) Start | Succ +> [ 32.000000] (5:node@c-4.me) 16509406 | 366680 +> [ 32.000000] (5:node@c-4.me) 16509407 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16509409 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16509413 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16509421 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16509437 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16509469 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 32.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 32.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 32.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 32.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 32.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 32.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 32.000000] (5:node@c-4.me) Predecessor: 10004760 +> [ 38.000000] (3:node@c-2.me) My finger table: +> [ 38.000000] (3:node@c-2.me) Start | Succ +> [ 38.000000] (3:node@c-2.me) 533745 | 16509405 +> [ 38.000000] (3:node@c-2.me) 533746 | 533744 +> [ 38.000000] (3:node@c-2.me) 533748 | 533744 +> [ 38.000000] (3:node@c-2.me) 533752 | 533744 +> [ 38.000000] (3:node@c-2.me) 533760 | 533744 +> [ 38.000000] (3:node@c-2.me) 533776 | 533744 +> [ 38.000000] (3:node@c-2.me) 533808 | 533744 +> [ 38.000000] (3:node@c-2.me) 533872 | 533744 +> [ 38.000000] (3:node@c-2.me) 534000 | 533744 +> [ 38.000000] (3:node@c-2.me) 534256 | 533744 +> [ 38.000000] (3:node@c-2.me) 534768 | 533744 +> [ 38.000000] (3:node@c-2.me) 535792 | 533744 +> [ 38.000000] (3:node@c-2.me) 537840 | 533744 +> [ 38.000000] (3:node@c-2.me) 541936 | 533744 +> [ 38.000000] (3:node@c-2.me) 550128 | 533744 +> [ 38.000000] (3:node@c-2.me) 566512 | 533744 +> [ 38.000000] (3:node@c-2.me) 599280 | 533744 +> [ 38.000000] (3:node@c-2.me) 664816 | 533744 +> [ 38.000000] (3:node@c-2.me) 795888 | 533744 +> [ 38.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 38.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 38.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 38.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 38.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 38.000000] (3:node@c-2.me) Predecessor: 10874876 +> [ 50.000000] (1:node@c-0.me) My finger table: +> [ 50.000000] (1:node@c-0.me) Start | Succ +> [ 50.000000] (1:node@c-0.me) 43 | 42 +> [ 50.000000] (1:node@c-0.me) 44 | 42 +> [ 50.000000] (1:node@c-0.me) 46 | 42 +> [ 50.000000] (1:node@c-0.me) 50 | 42 +> [ 50.000000] (1:node@c-0.me) 58 | 42 +> [ 50.000000] (1:node@c-0.me) 74 | 42 +> [ 50.000000] (1:node@c-0.me) 106 | 42 +> [ 50.000000] (1:node@c-0.me) 170 | 42 +> [ 50.000000] (1:node@c-0.me) 298 | 42 +> [ 50.000000] (1:node@c-0.me) 554 | 42 +> [ 50.000000] (1:node@c-0.me) 1066 | 42 +> [ 50.000000] (1:node@c-0.me) 2090 | 42 +> [ 50.000000] (1:node@c-0.me) 4138 | 42 +> [ 50.000000] (1:node@c-0.me) 8234 | 42 +> [ 50.000000] (1:node@c-0.me) 16426 | 42 +> [ 50.000000] (1:node@c-0.me) 32810 | 42 +> [ 50.000000] (1:node@c-0.me) 65578 | 42 +> [ 50.000000] (1:node@c-0.me) 131114 | 42 +> [ 50.000000] (1:node@c-0.me) 262186 | 42 +> [ 50.000000] (1:node@c-0.me) 524330 | 42 +> [ 50.000000] (1:node@c-0.me) 1048618 | 42 +> [ 50.000000] (1:node@c-0.me) 2097194 | 42 +> [ 50.000000] (1:node@c-0.me) 4194346 | 42 +> [ 50.000000] (1:node@c-0.me) 8388650 | 42 +> [ 50.000000] (1:node@c-0.me) Predecessor: 366680 +> [ 60.000000] (1:node@c-0.me) My finger table: +> [ 60.000000] (1:node@c-0.me) Start | Succ +> [ 60.000000] (1:node@c-0.me) 43 | 42 +> [ 60.000000] (1:node@c-0.me) 44 | 42 +> [ 60.000000] (1:node@c-0.me) 46 | 42 +> [ 60.000000] (1:node@c-0.me) 50 | 42 +> [ 60.000000] (1:node@c-0.me) 58 | 42 +> [ 60.000000] (1:node@c-0.me) 74 | 42 +> [ 60.000000] (1:node@c-0.me) 106 | 42 +> [ 60.000000] (1:node@c-0.me) 170 | 42 +> [ 60.000000] (1:node@c-0.me) 298 | 42 +> [ 60.000000] (1:node@c-0.me) 554 | 42 +> [ 60.000000] (1:node@c-0.me) 1066 | 42 +> [ 60.000000] (1:node@c-0.me) 2090 | 42 +> [ 60.000000] (1:node@c-0.me) 4138 | 42 +> [ 60.000000] (1:node@c-0.me) 8234 | 42 +> [ 60.000000] (1:node@c-0.me) 16426 | 42 +> [ 60.000000] (1:node@c-0.me) 32810 | 42 +> [ 60.000000] (1:node@c-0.me) 65578 | 42 +> [ 60.000000] (1:node@c-0.me) 131114 | 42 +> [ 60.000000] (1:node@c-0.me) 262186 | 42 +> [ 60.000000] (1:node@c-0.me) 524330 | 42 +> [ 60.000000] (1:node@c-0.me) 1048618 | 42 +> [ 60.000000] (1:node@c-0.me) 2097194 | 42 +> [ 60.000000] (1:node@c-0.me) 4194346 | 42 +> [ 60.000000] (1:node@c-0.me) 8388650 | 42 +> [ 60.000000] (1:node@c-0.me) Predecessor: 1319738 +> [ 70.000000] (1:node@c-0.me) My finger table: +> [ 70.000000] (1:node@c-0.me) Start | Succ +> [ 70.000000] (1:node@c-0.me) 43 | 1319738 +> [ 70.000000] (1:node@c-0.me) 44 | 42 +> [ 70.000000] (1:node@c-0.me) 46 | 42 +> [ 70.000000] (1:node@c-0.me) 50 | 42 +> [ 70.000000] (1:node@c-0.me) 58 | 42 +> [ 70.000000] (1:node@c-0.me) 74 | 42 +> [ 70.000000] (1:node@c-0.me) 106 | 42 +> [ 70.000000] (1:node@c-0.me) 170 | 42 +> [ 70.000000] (1:node@c-0.me) 298 | 42 +> [ 70.000000] (1:node@c-0.me) 554 | 42 +> [ 70.000000] (1:node@c-0.me) 1066 | 42 +> [ 70.000000] (1:node@c-0.me) 2090 | 42 +> [ 70.000000] (1:node@c-0.me) 4138 | 42 +> [ 70.000000] (1:node@c-0.me) 8234 | 42 +> [ 70.000000] (1:node@c-0.me) 16426 | 42 +> [ 70.000000] (1:node@c-0.me) 32810 | 42 +> [ 70.000000] (1:node@c-0.me) 65578 | 42 +> [ 70.000000] (1:node@c-0.me) 131114 | 42 +> [ 70.000000] (1:node@c-0.me) 262186 | 42 +> [ 70.000000] (1:node@c-0.me) 524330 | 42 +> [ 70.000000] (1:node@c-0.me) 1048618 | 42 +> [ 70.000000] (1:node@c-0.me) 2097194 | 42 +> [ 70.000000] (1:node@c-0.me) 4194346 | 42 +> [ 70.000000] (1:node@c-0.me) 8388650 | 42 +> [ 70.000000] (1:node@c-0.me) Predecessor: 6518808 +> [ 85.000000] (4:node@c-3.me) My finger table: +> [ 85.000000] (4:node@c-3.me) Start | Succ +> [ 85.000000] (4:node@c-3.me) 1319739 | 6518808 +> [ 85.000000] (4:node@c-3.me) 1319740 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1319742 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1319746 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1319754 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 85.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 85.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 85.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 85.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 85.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 85.000000] (4:node@c-3.me) Predecessor: 42 +> [ 86.000000] (8:node@c-7.me) My finger table: +> [ 86.000000] (8:node@c-7.me) Start | Succ +> [ 86.000000] (8:node@c-7.me) 10004761 | 16509405 +> [ 86.000000] (8:node@c-7.me) 10004762 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10004764 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10004768 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10004776 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10004792 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10004824 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 86.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 86.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 86.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 86.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 86.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 86.000000] (8:node@c-7.me) Predecessor: 533744 +> [ 90.000000] (7:node@c-6.me) My finger table: +> [ 90.000000] (7:node@c-6.me) Start | Succ +> [ 90.000000] (7:node@c-6.me) 16728097 | 1319738 +> [ 90.000000] (7:node@c-6.me) 16728098 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16728100 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16728104 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16728112 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16728128 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 90.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 90.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 90.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 90.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 90.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 90.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 90.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 90.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 90.000000] (7:node@c-6.me) Predecessor: 2015253 +> [ 109.000000] (9:node@c-8.me) My finger table: +> [ 109.000000] (9:node@c-8.me) Start | Succ +> [ 109.000000] (9:node@c-8.me) 6518809 | 42 +> [ 109.000000] (9:node@c-8.me) 6518810 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6518812 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6518816 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6518824 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6518840 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 109.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 109.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 109.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 109.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 109.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 109.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 109.000000] (9:node@c-8.me) Predecessor: 366680 +> [ 110.000000] (9:node@c-8.me) My finger table: +> [ 110.000000] (9:node@c-8.me) Start | Succ +> [ 110.000000] (9:node@c-8.me) 6518809 | 42 +> [ 110.000000] (9:node@c-8.me) 6518810 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6518812 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6518816 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6518824 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6518840 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 110.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 110.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 110.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 110.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 110.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 110.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 110.000000] (9:node@c-8.me) Predecessor: 1319738 +> [ 145.000000] (1:node@c-0.me) My finger table: +> [ 145.000000] (1:node@c-0.me) Start | Succ +> [ 145.000000] (1:node@c-0.me) 43 | 1319738 +> [ 145.000000] (1:node@c-0.me) 44 | 42 +> [ 145.000000] (1:node@c-0.me) 46 | 42 +> [ 145.000000] (1:node@c-0.me) 50 | 42 +> [ 145.000000] (1:node@c-0.me) 58 | 42 +> [ 145.000000] (1:node@c-0.me) 74 | 42 +> [ 145.000000] (1:node@c-0.me) 106 | 42 +> [ 145.000000] (1:node@c-0.me) 170 | 42 +> [ 145.000000] (1:node@c-0.me) 298 | 42 +> [ 145.000000] (1:node@c-0.me) 554 | 42 +> [ 145.000000] (1:node@c-0.me) 1066 | 42 +> [ 145.000000] (1:node@c-0.me) 2090 | 42 +> [ 145.000000] (1:node@c-0.me) 4138 | 42 +> [ 145.000000] (1:node@c-0.me) 8234 | 42 +> [ 145.000000] (1:node@c-0.me) 16426 | 42 +> [ 145.000000] (1:node@c-0.me) 32810 | 42 +> [ 145.000000] (1:node@c-0.me) 65578 | 42 +> [ 145.000000] (1:node@c-0.me) 131114 | 42 +> [ 145.000000] (1:node@c-0.me) 262186 | 42 +> [ 145.000000] (1:node@c-0.me) 524330 | 42 +> [ 145.000000] (1:node@c-0.me) 1048618 | 42 +> [ 145.000000] (1:node@c-0.me) 2097194 | 42 +> [ 145.000000] (1:node@c-0.me) 4194346 | 42 +> [ 145.000000] (1:node@c-0.me) 8388650 | 42 +> [ 145.000000] (1:node@c-0.me) Predecessor: 16728096 +> [ 157.000000] (4:node@c-3.me) My finger table: +> [ 157.000000] (4:node@c-3.me) Start | Succ +> [ 157.000000] (4:node@c-3.me) 1319739 | 6518808 +> [ 157.000000] (4:node@c-3.me) 1319740 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1319742 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1319746 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1319754 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 157.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 157.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 157.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 157.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 157.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 157.000000] (4:node@c-3.me) Predecessor: 366680 +> [ 184.000000] (7:node@c-6.me) My finger table: +> [ 184.000000] (7:node@c-6.me) Start | Succ +> [ 184.000000] (7:node@c-6.me) 16728097 | 42 +> [ 184.000000] (7:node@c-6.me) 16728098 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16728100 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16728104 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16728112 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16728128 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 184.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 184.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 184.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 184.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 184.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 184.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 184.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 184.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 184.000000] (7:node@c-6.me) Predecessor: 6518808 +> [ 202.000000] (2:node@c-1.me) My finger table: +> [ 202.000000] (2:node@c-1.me) Start | Succ +> [ 202.000000] (2:node@c-1.me) 366681 | 1319738 +> [ 202.000000] (2:node@c-1.me) 366682 | 366680 +> [ 202.000000] (2:node@c-1.me) 366684 | 366680 +> [ 202.000000] (2:node@c-1.me) 366688 | 366680 +> [ 202.000000] (2:node@c-1.me) 366696 | 366680 +> [ 202.000000] (2:node@c-1.me) 366712 | 366680 +> [ 202.000000] (2:node@c-1.me) 366744 | 366680 +> [ 202.000000] (2:node@c-1.me) 366808 | 366680 +> [ 202.000000] (2:node@c-1.me) 366936 | 366680 +> [ 202.000000] (2:node@c-1.me) 367192 | 366680 +> [ 202.000000] (2:node@c-1.me) 367704 | 366680 +> [ 202.000000] (2:node@c-1.me) 368728 | 366680 +> [ 202.000000] (2:node@c-1.me) 370776 | 366680 +> [ 202.000000] (2:node@c-1.me) 374872 | 366680 +> [ 202.000000] (2:node@c-1.me) 383064 | 366680 +> [ 202.000000] (2:node@c-1.me) 399448 | 366680 +> [ 202.000000] (2:node@c-1.me) 432216 | 366680 +> [ 202.000000] (2:node@c-1.me) 497752 | 366680 +> [ 202.000000] (2:node@c-1.me) 628824 | 366680 +> [ 202.000000] (2:node@c-1.me) 890968 | 366680 +> [ 202.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 202.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 202.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 202.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 202.000000] (2:node@c-1.me) Predecessor: 42 +> [ 221.000000] (9:node@c-8.me) My finger table: +> [ 221.000000] (9:node@c-8.me) Start | Succ +> [ 221.000000] (9:node@c-8.me) 6518809 | 16728096 +> [ 221.000000] (9:node@c-8.me) 6518810 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6518812 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6518816 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6518824 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6518840 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 221.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 221.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 221.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 221.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 221.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 221.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 221.000000] (9:node@c-8.me) Predecessor: 2015253 +> [ 240.000000] (6:node@c-5.me) My finger table: +> [ 240.000000] (6:node@c-5.me) Start | Succ +> [ 240.000000] (6:node@c-5.me) 10874877 | 533744 +> [ 240.000000] (6:node@c-5.me) 10874878 | 533744 +> [ 240.000000] (6:node@c-5.me) 10874880 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10874884 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10874892 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10874908 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10874940 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10875004 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10875132 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10875388 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10875900 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10876924 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10878972 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10883068 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10891260 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10907644 | 10874876 +> [ 240.000000] (6:node@c-5.me) 10940412 | 10874876 +> [ 240.000000] (6:node@c-5.me) 11005948 | 10874876 +> [ 240.000000] (6:node@c-5.me) 11137020 | 10874876 +> [ 240.000000] (6:node@c-5.me) 11399164 | 10874876 +> [ 240.000000] (6:node@c-5.me) 11923452 | 10874876 +> [ 240.000000] (6:node@c-5.me) 12972028 | 10874876 +> [ 240.000000] (6:node@c-5.me) 15069180 | 10874876 +> [ 240.000000] (6:node@c-5.me) 2486268 | 10874876 +> [ 240.000000] (6:node@c-5.me) Predecessor: -1 +> [ 247.000000] (5:node@c-4.me) My finger table: +> [ 247.000000] (5:node@c-4.me) Start | Succ +> [ 247.000000] (5:node@c-4.me) 16509406 | 16728096 +> [ 247.000000] (5:node@c-4.me) 16509407 | 16728096 +> [ 247.000000] (5:node@c-4.me) 16509409 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16509413 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16509421 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16509437 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16509469 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 247.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 247.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 247.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 247.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 247.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 247.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 247.000000] (5:node@c-4.me) Predecessor: 10004760 +> [ 250.000000] (1:node@c-0.me) My finger table: +> [ 250.000000] (1:node@c-0.me) Start | Succ +> [ 250.000000] (1:node@c-0.me) 43 | 366680 +> [ 250.000000] (1:node@c-0.me) 44 | 366680 +> [ 250.000000] (1:node@c-0.me) 46 | 42 +> [ 250.000000] (1:node@c-0.me) 50 | 42 +> [ 250.000000] (1:node@c-0.me) 58 | 42 +> [ 250.000000] (1:node@c-0.me) 74 | 42 +> [ 250.000000] (1:node@c-0.me) 106 | 42 +> [ 250.000000] (1:node@c-0.me) 170 | 42 +> [ 250.000000] (1:node@c-0.me) 298 | 42 +> [ 250.000000] (1:node@c-0.me) 554 | 42 +> [ 250.000000] (1:node@c-0.me) 1066 | 42 +> [ 250.000000] (1:node@c-0.me) 2090 | 42 +> [ 250.000000] (1:node@c-0.me) 4138 | 42 +> [ 250.000000] (1:node@c-0.me) 8234 | 42 +> [ 250.000000] (1:node@c-0.me) 16426 | 42 +> [ 250.000000] (1:node@c-0.me) 32810 | 42 +> [ 250.000000] (1:node@c-0.me) 65578 | 42 +> [ 250.000000] (1:node@c-0.me) 131114 | 42 +> [ 250.000000] (1:node@c-0.me) 262186 | 42 +> [ 250.000000] (1:node@c-0.me) 524330 | 42 +> [ 250.000000] (1:node@c-0.me) 1048618 | 42 +> [ 250.000000] (1:node@c-0.me) 2097194 | 42 +> [ 250.000000] (1:node@c-0.me) 4194346 | 42 +> [ 250.000000] (1:node@c-0.me) 8388650 | 42 +> [ 250.000000] (1:node@c-0.me) Predecessor: 16728096 +> [ 251.000000] (3:node@c-2.me) My finger table: +> [ 251.000000] (3:node@c-2.me) Start | Succ +> [ 251.000000] (3:node@c-2.me) 533745 | 10004760 +> [ 251.000000] (3:node@c-2.me) 533746 | 10004760 +> [ 251.000000] (3:node@c-2.me) 533748 | 533744 +> [ 251.000000] (3:node@c-2.me) 533752 | 533744 +> [ 251.000000] (3:node@c-2.me) 533760 | 533744 +> [ 251.000000] (3:node@c-2.me) 533776 | 533744 +> [ 251.000000] (3:node@c-2.me) 533808 | 533744 +> [ 251.000000] (3:node@c-2.me) 533872 | 533744 +> [ 251.000000] (3:node@c-2.me) 534000 | 533744 +> [ 251.000000] (3:node@c-2.me) 534256 | 533744 +> [ 251.000000] (3:node@c-2.me) 534768 | 533744 +> [ 251.000000] (3:node@c-2.me) 535792 | 533744 +> [ 251.000000] (3:node@c-2.me) 537840 | 533744 +> [ 251.000000] (3:node@c-2.me) 541936 | 533744 +> [ 251.000000] (3:node@c-2.me) 550128 | 533744 +> [ 251.000000] (3:node@c-2.me) 566512 | 533744 +> [ 251.000000] (3:node@c-2.me) 599280 | 533744 +> [ 251.000000] (3:node@c-2.me) 664816 | 533744 +> [ 251.000000] (3:node@c-2.me) 795888 | 533744 +> [ 251.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 251.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 251.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 251.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 251.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 251.000000] (3:node@c-2.me) Predecessor: 10874876 +> [ 253.000000] (8:node@c-7.me) My finger table: +> [ 253.000000] (8:node@c-7.me) Start | Succ +> [ 253.000000] (8:node@c-7.me) 10004761 | 16509405 +> [ 253.000000] (8:node@c-7.me) 10004762 | 16509405 +> [ 253.000000] (8:node@c-7.me) 10004764 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10004768 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10004776 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10004792 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10004824 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 253.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 253.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 253.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 253.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 253.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 253.000000] (8:node@c-7.me) Predecessor: 533744 +> [ 263.000000] (2:node@c-1.me) My finger table: +> [ 263.000000] (2:node@c-1.me) Start | Succ +> [ 263.000000] (2:node@c-1.me) 366681 | 1319738 +> [ 263.000000] (2:node@c-1.me) 366682 | 1319738 +> [ 263.000000] (2:node@c-1.me) 366684 | 366680 +> [ 263.000000] (2:node@c-1.me) 366688 | 366680 +> [ 263.000000] (2:node@c-1.me) 366696 | 366680 +> [ 263.000000] (2:node@c-1.me) 366712 | 366680 +> [ 263.000000] (2:node@c-1.me) 366744 | 366680 +> [ 263.000000] (2:node@c-1.me) 366808 | 366680 +> [ 263.000000] (2:node@c-1.me) 366936 | 366680 +> [ 263.000000] (2:node@c-1.me) 367192 | 366680 +> [ 263.000000] (2:node@c-1.me) 367704 | 366680 +> [ 263.000000] (2:node@c-1.me) 368728 | 366680 +> [ 263.000000] (2:node@c-1.me) 370776 | 366680 +> [ 263.000000] (2:node@c-1.me) 374872 | 366680 +> [ 263.000000] (2:node@c-1.me) 383064 | 366680 +> [ 263.000000] (2:node@c-1.me) 399448 | 366680 +> [ 263.000000] (2:node@c-1.me) 432216 | 366680 +> [ 263.000000] (2:node@c-1.me) 497752 | 366680 +> [ 263.000000] (2:node@c-1.me) 628824 | 366680 +> [ 263.000000] (2:node@c-1.me) 890968 | 366680 +> [ 263.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 263.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 263.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 263.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 263.000000] (2:node@c-1.me) Predecessor: 42 +> [ 268.000000] (4:node@c-3.me) My finger table: +> [ 268.000000] (4:node@c-3.me) Start | Succ +> [ 268.000000] (4:node@c-3.me) 1319739 | 2015253 +> [ 268.000000] (4:node@c-3.me) 1319740 | 2015253 +> [ 268.000000] (4:node@c-3.me) 1319742 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1319746 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1319754 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 268.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 268.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 268.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 268.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 268.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 268.000000] (4:node@c-3.me) Predecessor: 366680 +> [ 269.000000] (10:node@c-9.me) My finger table: +> [ 269.000000] (10:node@c-9.me) Start | Succ +> [ 269.000000] (10:node@c-9.me) 2015254 | 6518808 +> [ 269.000000] (10:node@c-9.me) 2015255 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2015257 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2015261 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2015269 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2015285 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2015317 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2015381 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2015509 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2015765 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2016277 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2017301 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2019349 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2023445 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2031637 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2048021 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2080789 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2146325 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2277397 | 2015253 +> [ 269.000000] (10:node@c-9.me) 2539541 | 2015253 +> [ 269.000000] (10:node@c-9.me) 3063829 | 2015253 +> [ 269.000000] (10:node@c-9.me) 4112405 | 2015253 +> [ 269.000000] (10:node@c-9.me) 6209557 | 2015253 +> [ 269.000000] (10:node@c-9.me) 10403861 | 2015253 +> [ 269.000000] (10:node@c-9.me) Predecessor: 1319738 +> [ 274.000000] (10:node@c-9.me) My finger table: +> [ 274.000000] (10:node@c-9.me) Start | Succ +> [ 274.000000] (10:node@c-9.me) 2015254 | 6518808 +> [ 274.000000] (10:node@c-9.me) 2015255 | 6518808 +> [ 274.000000] (10:node@c-9.me) 2015257 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2015261 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2015269 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2015285 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2015317 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2015381 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2015509 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2015765 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2016277 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2017301 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2019349 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2023445 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2031637 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2048021 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2080789 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2146325 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2277397 | 2015253 +> [ 274.000000] (10:node@c-9.me) 2539541 | 2015253 +> [ 274.000000] (10:node@c-9.me) 3063829 | 2015253 +> [ 274.000000] (10:node@c-9.me) 4112405 | 2015253 +> [ 274.000000] (10:node@c-9.me) 6209557 | 2015253 +> [ 274.000000] (10:node@c-9.me) 10403861 | 2015253 +> [ 274.000000] (10:node@c-9.me) Predecessor: 1319738 +> [ 274.000000] (9:node@c-8.me) My finger table: +> [ 274.000000] (9:node@c-8.me) Start | Succ +> [ 274.000000] (9:node@c-8.me) 6518809 | 16728096 +> [ 274.000000] (9:node@c-8.me) 6518810 | 16728096 +> [ 274.000000] (9:node@c-8.me) 6518812 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6518816 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6518824 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6518840 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 274.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 274.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 274.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 274.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 274.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 274.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 274.000000] (9:node@c-8.me) Predecessor: 2015253 +> [ 275.000000] (7:node@c-6.me) My finger table: +> [ 275.000000] (7:node@c-6.me) Start | Succ +> [ 275.000000] (7:node@c-6.me) 16728097 | 42 +> [ 275.000000] (7:node@c-6.me) 16728098 | 42 +> [ 275.000000] (7:node@c-6.me) 16728100 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16728104 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16728112 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16728128 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 275.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 275.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 275.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 275.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 275.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 275.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 275.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 275.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 275.000000] (7:node@c-6.me) Predecessor: 6518808 +> [ 288.000000] (7:node@c-6.me) My finger table: +> [ 288.000000] (7:node@c-6.me) Start | Succ +> [ 288.000000] (7:node@c-6.me) 16728097 | 42 +> [ 288.000000] (7:node@c-6.me) 16728098 | 42 +> [ 288.000000] (7:node@c-6.me) 16728100 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16728104 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16728112 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16728128 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 288.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 288.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 288.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 288.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 288.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 288.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 288.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 288.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 288.000000] (7:node@c-6.me) Predecessor: 16509405 +> [ 361.000000] (8:node@c-7.me) My finger table: +> [ 361.000000] (8:node@c-7.me) Start | Succ +> [ 361.000000] (8:node@c-7.me) 10004761 | 16509405 +> [ 361.000000] (8:node@c-7.me) 10004762 | 16509405 +> [ 361.000000] (8:node@c-7.me) 10004764 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10004768 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10004776 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10004792 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10004824 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 361.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 361.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 361.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 361.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 361.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 361.000000] (8:node@c-7.me) Predecessor: 6518808 +> [ 364.000000] (6:node@c-5.me) My finger table: +> [ 364.000000] (6:node@c-5.me) Start | Succ +> [ 364.000000] (6:node@c-5.me) 10874877 | 533744 +> [ 364.000000] (6:node@c-5.me) 10874878 | 533744 +> [ 364.000000] (6:node@c-5.me) 10874880 | 533744 +> [ 364.000000] (6:node@c-5.me) 10874884 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10874892 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10874908 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10874940 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10875004 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10875132 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10875388 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10875900 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10876924 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10878972 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10883068 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10891260 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10907644 | 10874876 +> [ 364.000000] (6:node@c-5.me) 10940412 | 10874876 +> [ 364.000000] (6:node@c-5.me) 11005948 | 10874876 +> [ 364.000000] (6:node@c-5.me) 11137020 | 10874876 +> [ 364.000000] (6:node@c-5.me) 11399164 | 10874876 +> [ 364.000000] (6:node@c-5.me) 11923452 | 10874876 +> [ 364.000000] (6:node@c-5.me) 12972028 | 10874876 +> [ 364.000000] (6:node@c-5.me) 15069180 | 10874876 +> [ 364.000000] (6:node@c-5.me) 2486268 | 10874876 +> [ 364.000000] (6:node@c-5.me) Predecessor: -1 +> [ 371.000000] (3:node@c-2.me) My finger table: +> [ 371.000000] (3:node@c-2.me) Start | Succ +> [ 371.000000] (3:node@c-2.me) 533745 | 10004760 +> [ 371.000000] (3:node@c-2.me) 533746 | 10004760 +> [ 371.000000] (3:node@c-2.me) 533748 | 10004760 +> [ 371.000000] (3:node@c-2.me) 533752 | 533744 +> [ 371.000000] (3:node@c-2.me) 533760 | 533744 +> [ 371.000000] (3:node@c-2.me) 533776 | 533744 +> [ 371.000000] (3:node@c-2.me) 533808 | 533744 +> [ 371.000000] (3:node@c-2.me) 533872 | 533744 +> [ 371.000000] (3:node@c-2.me) 534000 | 533744 +> [ 371.000000] (3:node@c-2.me) 534256 | 533744 +> [ 371.000000] (3:node@c-2.me) 534768 | 533744 +> [ 371.000000] (3:node@c-2.me) 535792 | 533744 +> [ 371.000000] (3:node@c-2.me) 537840 | 533744 +> [ 371.000000] (3:node@c-2.me) 541936 | 533744 +> [ 371.000000] (3:node@c-2.me) 550128 | 533744 +> [ 371.000000] (3:node@c-2.me) 566512 | 533744 +> [ 371.000000] (3:node@c-2.me) 599280 | 533744 +> [ 371.000000] (3:node@c-2.me) 664816 | 533744 +> [ 371.000000] (3:node@c-2.me) 795888 | 533744 +> [ 371.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 371.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 371.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 371.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 371.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 371.000000] (3:node@c-2.me) Predecessor: 10874876 +> [ 372.000000] (1:node@c-0.me) My finger table: +> [ 372.000000] (1:node@c-0.me) Start | Succ +> [ 372.000000] (1:node@c-0.me) 43 | 366680 +> [ 372.000000] (1:node@c-0.me) 44 | 366680 +> [ 372.000000] (1:node@c-0.me) 46 | 366680 +> [ 372.000000] (1:node@c-0.me) 50 | 42 +> [ 372.000000] (1:node@c-0.me) 58 | 42 +> [ 372.000000] (1:node@c-0.me) 74 | 42 +> [ 372.000000] (1:node@c-0.me) 106 | 42 +> [ 372.000000] (1:node@c-0.me) 170 | 42 +> [ 372.000000] (1:node@c-0.me) 298 | 42 +> [ 372.000000] (1:node@c-0.me) 554 | 42 +> [ 372.000000] (1:node@c-0.me) 1066 | 42 +> [ 372.000000] (1:node@c-0.me) 2090 | 42 +> [ 372.000000] (1:node@c-0.me) 4138 | 42 +> [ 372.000000] (1:node@c-0.me) 8234 | 42 +> [ 372.000000] (1:node@c-0.me) 16426 | 42 +> [ 372.000000] (1:node@c-0.me) 32810 | 42 +> [ 372.000000] (1:node@c-0.me) 65578 | 42 +> [ 372.000000] (1:node@c-0.me) 131114 | 42 +> [ 372.000000] (1:node@c-0.me) 262186 | 42 +> [ 372.000000] (1:node@c-0.me) 524330 | 42 +> [ 372.000000] (1:node@c-0.me) 1048618 | 42 +> [ 372.000000] (1:node@c-0.me) 2097194 | 42 +> [ 372.000000] (1:node@c-0.me) 4194346 | 42 +> [ 372.000000] (1:node@c-0.me) 8388650 | 42 +> [ 372.000000] (1:node@c-0.me) Predecessor: 16728096 +> [ 374.000000] (8:node@c-7.me) My finger table: +> [ 374.000000] (8:node@c-7.me) Start | Succ +> [ 374.000000] (8:node@c-7.me) 10004761 | 16509405 +> [ 374.000000] (8:node@c-7.me) 10004762 | 16509405 +> [ 374.000000] (8:node@c-7.me) 10004764 | 16509405 +> [ 374.000000] (8:node@c-7.me) 10004768 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10004776 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10004792 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10004824 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 374.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 374.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 374.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 374.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 374.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 374.000000] (8:node@c-7.me) Predecessor: 6518808 +> [ 375.000000] (5:node@c-4.me) My finger table: +> [ 375.000000] (5:node@c-4.me) Start | Succ +> [ 375.000000] (5:node@c-4.me) 16509406 | 16728096 +> [ 375.000000] (5:node@c-4.me) 16509407 | 16728096 +> [ 375.000000] (5:node@c-4.me) 16509409 | 16728096 +> [ 375.000000] (5:node@c-4.me) 16509413 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16509421 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16509437 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16509469 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 375.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 375.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 375.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 375.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 375.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 375.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 375.000000] (5:node@c-4.me) Predecessor: 10004760 +> [ 395.000000] (9:node@c-8.me) My finger table: +> [ 395.000000] (9:node@c-8.me) Start | Succ +> [ 395.000000] (9:node@c-8.me) 6518809 | 10004760 +> [ 395.000000] (9:node@c-8.me) 6518810 | 16728096 +> [ 395.000000] (9:node@c-8.me) 6518812 | 10004760 +> [ 395.000000] (9:node@c-8.me) 6518816 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6518824 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6518840 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 395.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 395.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 395.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 395.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 395.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 395.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 395.000000] (9:node@c-8.me) Predecessor: 2015253 +> [ 398.000000] (7:node@c-6.me) My finger table: +> [ 398.000000] (7:node@c-6.me) Start | Succ +> [ 398.000000] (7:node@c-6.me) 16728097 | 42 +> [ 398.000000] (7:node@c-6.me) 16728098 | 42 +> [ 398.000000] (7:node@c-6.me) 16728100 | 42 +> [ 398.000000] (7:node@c-6.me) 16728104 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16728112 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16728128 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 398.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 398.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 398.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 398.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 398.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 398.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 398.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 398.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 398.000000] (7:node@c-6.me) Predecessor: 16509405 +> [ 405.000000] (4:node@c-3.me) My finger table: +> [ 405.000000] (4:node@c-3.me) Start | Succ +> [ 405.000000] (4:node@c-3.me) 1319739 | 2015253 +> [ 405.000000] (4:node@c-3.me) 1319740 | 2015253 +> [ 405.000000] (4:node@c-3.me) 1319742 | 2015253 +> [ 405.000000] (4:node@c-3.me) 1319746 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1319754 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 405.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 405.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 405.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 405.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 405.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 405.000000] (4:node@c-3.me) Predecessor: 366680 +> [ 411.000000] (2:node@c-1.me) My finger table: +> [ 411.000000] (2:node@c-1.me) Start | Succ +> [ 411.000000] (2:node@c-1.me) 366681 | 1319738 +> [ 411.000000] (2:node@c-1.me) 366682 | 1319738 +> [ 411.000000] (2:node@c-1.me) 366684 | 1319738 +> [ 411.000000] (2:node@c-1.me) 366688 | 366680 +> [ 411.000000] (2:node@c-1.me) 366696 | 366680 +> [ 411.000000] (2:node@c-1.me) 366712 | 366680 +> [ 411.000000] (2:node@c-1.me) 366744 | 366680 +> [ 411.000000] (2:node@c-1.me) 366808 | 366680 +> [ 411.000000] (2:node@c-1.me) 366936 | 366680 +> [ 411.000000] (2:node@c-1.me) 367192 | 366680 +> [ 411.000000] (2:node@c-1.me) 367704 | 366680 +> [ 411.000000] (2:node@c-1.me) 368728 | 366680 +> [ 411.000000] (2:node@c-1.me) 370776 | 366680 +> [ 411.000000] (2:node@c-1.me) 374872 | 366680 +> [ 411.000000] (2:node@c-1.me) 383064 | 366680 +> [ 411.000000] (2:node@c-1.me) 399448 | 366680 +> [ 411.000000] (2:node@c-1.me) 432216 | 366680 +> [ 411.000000] (2:node@c-1.me) 497752 | 366680 +> [ 411.000000] (2:node@c-1.me) 628824 | 366680 +> [ 411.000000] (2:node@c-1.me) 890968 | 366680 +> [ 411.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 411.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 411.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 411.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 411.000000] (2:node@c-1.me) Predecessor: 42 +> [ 426.000000] (10:node@c-9.me) My finger table: +> [ 426.000000] (10:node@c-9.me) Start | Succ +> [ 426.000000] (10:node@c-9.me) 2015254 | 6518808 +> [ 426.000000] (10:node@c-9.me) 2015255 | 6518808 +> [ 426.000000] (10:node@c-9.me) 2015257 | 6518808 +> [ 426.000000] (10:node@c-9.me) 2015261 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2015269 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2015285 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2015317 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2015381 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2015509 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2015765 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2016277 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2017301 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2019349 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2023445 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2031637 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2048021 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2080789 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2146325 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2277397 | 2015253 +> [ 426.000000] (10:node@c-9.me) 2539541 | 2015253 +> [ 426.000000] (10:node@c-9.me) 3063829 | 2015253 +> [ 426.000000] (10:node@c-9.me) 4112405 | 2015253 +> [ 426.000000] (10:node@c-9.me) 6209557 | 2015253 +> [ 426.000000] (10:node@c-9.me) 10403861 | 2015253 +> [ 426.000000] (10:node@c-9.me) Predecessor: 1319738 +> [ 486.000000] (6:node@c-5.me) My finger table: +> [ 486.000000] (6:node@c-5.me) Start | Succ +> [ 486.000000] (6:node@c-5.me) 10874877 | 533744 +> [ 486.000000] (6:node@c-5.me) 10874878 | 533744 +> [ 486.000000] (6:node@c-5.me) 10874880 | 533744 +> [ 486.000000] (6:node@c-5.me) 10874884 | 533744 +> [ 486.000000] (6:node@c-5.me) 10874892 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10874908 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10874940 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10875004 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10875132 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10875388 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10875900 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10876924 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10878972 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10883068 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10891260 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10907644 | 10874876 +> [ 486.000000] (6:node@c-5.me) 10940412 | 10874876 +> [ 486.000000] (6:node@c-5.me) 11005948 | 10874876 +> [ 486.000000] (6:node@c-5.me) 11137020 | 10874876 +> [ 486.000000] (6:node@c-5.me) 11399164 | 10874876 +> [ 486.000000] (6:node@c-5.me) 11923452 | 10874876 +> [ 486.000000] (6:node@c-5.me) 12972028 | 10874876 +> [ 486.000000] (6:node@c-5.me) 15069180 | 10874876 +> [ 486.000000] (6:node@c-5.me) 2486268 | 10874876 +> [ 486.000000] (6:node@c-5.me) Predecessor: -1 +> [ 491.000000] (4:node@c-3.me) My finger table: +> [ 491.000000] (4:node@c-3.me) Start | Succ +> [ 491.000000] (4:node@c-3.me) 1319739 | 2015253 +> [ 491.000000] (4:node@c-3.me) 1319740 | 2015253 +> [ 491.000000] (4:node@c-3.me) 1319742 | 2015253 +> [ 491.000000] (4:node@c-3.me) 1319746 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1319754 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 491.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 491.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 491.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 491.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 491.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 491.000000] (4:node@c-3.me) Predecessor: 533744 +> [ 492.000000] (1:node@c-0.me) My finger table: +> [ 492.000000] (1:node@c-0.me) Start | Succ +> [ 492.000000] (1:node@c-0.me) 43 | 366680 +> [ 492.000000] (1:node@c-0.me) 44 | 366680 +> [ 492.000000] (1:node@c-0.me) 46 | 366680 +> [ 492.000000] (1:node@c-0.me) 50 | 366680 +> [ 492.000000] (1:node@c-0.me) 58 | 42 +> [ 492.000000] (1:node@c-0.me) 74 | 42 +> [ 492.000000] (1:node@c-0.me) 106 | 42 +> [ 492.000000] (1:node@c-0.me) 170 | 42 +> [ 492.000000] (1:node@c-0.me) 298 | 42 +> [ 492.000000] (1:node@c-0.me) 554 | 42 +> [ 492.000000] (1:node@c-0.me) 1066 | 42 +> [ 492.000000] (1:node@c-0.me) 2090 | 42 +> [ 492.000000] (1:node@c-0.me) 4138 | 42 +> [ 492.000000] (1:node@c-0.me) 8234 | 42 +> [ 492.000000] (1:node@c-0.me) 16426 | 42 +> [ 492.000000] (1:node@c-0.me) 32810 | 42 +> [ 492.000000] (1:node@c-0.me) 65578 | 42 +> [ 492.000000] (1:node@c-0.me) 131114 | 42 +> [ 492.000000] (1:node@c-0.me) 262186 | 42 +> [ 492.000000] (1:node@c-0.me) 524330 | 42 +> [ 492.000000] (1:node@c-0.me) 1048618 | 42 +> [ 492.000000] (1:node@c-0.me) 2097194 | 42 +> [ 492.000000] (1:node@c-0.me) 4194346 | 42 +> [ 492.000000] (1:node@c-0.me) 8388650 | 42 +> [ 492.000000] (1:node@c-0.me) Predecessor: 16728096 +> [ 495.000000] (3:node@c-2.me) My finger table: +> [ 495.000000] (3:node@c-2.me) Start | Succ +> [ 495.000000] (3:node@c-2.me) 533745 | 1319738 +> [ 495.000000] (3:node@c-2.me) 533746 | 10004760 +> [ 495.000000] (3:node@c-2.me) 533748 | 10004760 +> [ 495.000000] (3:node@c-2.me) 533752 | 1319738 +> [ 495.000000] (3:node@c-2.me) 533760 | 533744 +> [ 495.000000] (3:node@c-2.me) 533776 | 533744 +> [ 495.000000] (3:node@c-2.me) 533808 | 533744 +> [ 495.000000] (3:node@c-2.me) 533872 | 533744 +> [ 495.000000] (3:node@c-2.me) 534000 | 533744 +> [ 495.000000] (3:node@c-2.me) 534256 | 533744 +> [ 495.000000] (3:node@c-2.me) 534768 | 533744 +> [ 495.000000] (3:node@c-2.me) 535792 | 533744 +> [ 495.000000] (3:node@c-2.me) 537840 | 533744 +> [ 495.000000] (3:node@c-2.me) 541936 | 533744 +> [ 495.000000] (3:node@c-2.me) 550128 | 533744 +> [ 495.000000] (3:node@c-2.me) 566512 | 533744 +> [ 495.000000] (3:node@c-2.me) 599280 | 533744 +> [ 495.000000] (3:node@c-2.me) 664816 | 533744 +> [ 495.000000] (3:node@c-2.me) 795888 | 533744 +> [ 495.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 495.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 495.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 495.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 495.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 495.000000] (3:node@c-2.me) Predecessor: 10874876 +> [ 502.000000] (8:node@c-7.me) My finger table: +> [ 502.000000] (8:node@c-7.me) Start | Succ +> [ 502.000000] (8:node@c-7.me) 10004761 | 16509405 +> [ 502.000000] (8:node@c-7.me) 10004762 | 16509405 +> [ 502.000000] (8:node@c-7.me) 10004764 | 16509405 +> [ 502.000000] (8:node@c-7.me) 10004768 | 16509405 +> [ 502.000000] (8:node@c-7.me) 10004776 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10004792 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10004824 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 502.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 502.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 502.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 502.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 502.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 502.000000] (8:node@c-7.me) Predecessor: 6518808 +> [ 505.000000] (5:node@c-4.me) My finger table: +> [ 505.000000] (5:node@c-4.me) Start | Succ +> [ 505.000000] (5:node@c-4.me) 16509406 | 16728096 +> [ 505.000000] (5:node@c-4.me) 16509407 | 16728096 +> [ 505.000000] (5:node@c-4.me) 16509409 | 16728096 +> [ 505.000000] (5:node@c-4.me) 16509413 | 16728096 +> [ 505.000000] (5:node@c-4.me) 16509421 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16509437 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16509469 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 505.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 505.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 505.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 505.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 505.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 505.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 505.000000] (5:node@c-4.me) Predecessor: 10004760 +> [ 521.000000] (7:node@c-6.me) My finger table: +> [ 521.000000] (7:node@c-6.me) Start | Succ +> [ 521.000000] (7:node@c-6.me) 16728097 | 42 +> [ 521.000000] (7:node@c-6.me) 16728098 | 42 +> [ 521.000000] (7:node@c-6.me) 16728100 | 42 +> [ 521.000000] (7:node@c-6.me) 16728104 | 42 +> [ 521.000000] (7:node@c-6.me) 16728112 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16728128 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 521.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 521.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 521.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 521.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 521.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 521.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 521.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 521.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 521.000000] (7:node@c-6.me) Predecessor: 16509405 +> [ 535.000000] (9:node@c-8.me) My finger table: +> [ 535.000000] (9:node@c-8.me) Start | Succ +> [ 535.000000] (9:node@c-8.me) 6518809 | 10004760 +> [ 535.000000] (9:node@c-8.me) 6518810 | 16728096 +> [ 535.000000] (9:node@c-8.me) 6518812 | 10004760 +> [ 535.000000] (9:node@c-8.me) 6518816 | 10004760 +> [ 535.000000] (9:node@c-8.me) 6518824 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6518840 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 535.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 535.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 535.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 535.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 535.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 535.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 535.000000] (9:node@c-8.me) Predecessor: 2015253 +> [ 537.000000] (4:node@c-3.me) My finger table: +> [ 537.000000] (4:node@c-3.me) Start | Succ +> [ 537.000000] (4:node@c-3.me) 1319739 | 2015253 +> [ 537.000000] (4:node@c-3.me) 1319740 | 2015253 +> [ 537.000000] (4:node@c-3.me) 1319742 | 2015253 +> [ 537.000000] (4:node@c-3.me) 1319746 | 2015253 +> [ 537.000000] (4:node@c-3.me) 1319754 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 537.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 537.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 537.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 537.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 537.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 537.000000] (4:node@c-3.me) Predecessor: 533744 +> [ 539.000000] (2:node@c-1.me) My finger table: +> [ 539.000000] (2:node@c-1.me) Start | Succ +> [ 539.000000] (2:node@c-1.me) 366681 | 533744 +> [ 539.000000] (2:node@c-1.me) 366682 | 1319738 +> [ 539.000000] (2:node@c-1.me) 366684 | 1319738 +> [ 539.000000] (2:node@c-1.me) 366688 | 533744 +> [ 539.000000] (2:node@c-1.me) 366696 | 366680 +> [ 539.000000] (2:node@c-1.me) 366712 | 366680 +> [ 539.000000] (2:node@c-1.me) 366744 | 366680 +> [ 539.000000] (2:node@c-1.me) 366808 | 366680 +> [ 539.000000] (2:node@c-1.me) 366936 | 366680 +> [ 539.000000] (2:node@c-1.me) 367192 | 366680 +> [ 539.000000] (2:node@c-1.me) 367704 | 366680 +> [ 539.000000] (2:node@c-1.me) 368728 | 366680 +> [ 539.000000] (2:node@c-1.me) 370776 | 366680 +> [ 539.000000] (2:node@c-1.me) 374872 | 366680 +> [ 539.000000] (2:node@c-1.me) 383064 | 366680 +> [ 539.000000] (2:node@c-1.me) 399448 | 366680 +> [ 539.000000] (2:node@c-1.me) 432216 | 366680 +> [ 539.000000] (2:node@c-1.me) 497752 | 366680 +> [ 539.000000] (2:node@c-1.me) 628824 | 366680 +> [ 539.000000] (2:node@c-1.me) 890968 | 366680 +> [ 539.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 539.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 539.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 539.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 539.000000] (2:node@c-1.me) Predecessor: 42 +> [ 540.000000] (3:node@c-2.me) My finger table: +> [ 540.000000] (3:node@c-2.me) Start | Succ +> [ 540.000000] (3:node@c-2.me) 533745 | 1319738 +> [ 540.000000] (3:node@c-2.me) 533746 | 10004760 +> [ 540.000000] (3:node@c-2.me) 533748 | 10004760 +> [ 540.000000] (3:node@c-2.me) 533752 | 1319738 +> [ 540.000000] (3:node@c-2.me) 533760 | 533744 +> [ 540.000000] (3:node@c-2.me) 533776 | 533744 +> [ 540.000000] (3:node@c-2.me) 533808 | 533744 +> [ 540.000000] (3:node@c-2.me) 533872 | 533744 +> [ 540.000000] (3:node@c-2.me) 534000 | 533744 +> [ 540.000000] (3:node@c-2.me) 534256 | 533744 +> [ 540.000000] (3:node@c-2.me) 534768 | 533744 +> [ 540.000000] (3:node@c-2.me) 535792 | 533744 +> [ 540.000000] (3:node@c-2.me) 537840 | 533744 +> [ 540.000000] (3:node@c-2.me) 541936 | 533744 +> [ 540.000000] (3:node@c-2.me) 550128 | 533744 +> [ 540.000000] (3:node@c-2.me) 566512 | 533744 +> [ 540.000000] (3:node@c-2.me) 599280 | 533744 +> [ 540.000000] (3:node@c-2.me) 664816 | 533744 +> [ 540.000000] (3:node@c-2.me) 795888 | 533744 +> [ 540.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 540.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 540.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 540.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 540.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 540.000000] (3:node@c-2.me) Predecessor: 366680 +> [ 567.000000] (10:node@c-9.me) My finger table: +> [ 567.000000] (10:node@c-9.me) Start | Succ +> [ 567.000000] (10:node@c-9.me) 2015254 | 6518808 +> [ 567.000000] (10:node@c-9.me) 2015255 | 6518808 +> [ 567.000000] (10:node@c-9.me) 2015257 | 6518808 +> [ 567.000000] (10:node@c-9.me) 2015261 | 6518808 +> [ 567.000000] (10:node@c-9.me) 2015269 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2015285 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2015317 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2015381 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2015509 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2015765 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2016277 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2017301 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2019349 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2023445 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2031637 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2048021 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2080789 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2146325 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2277397 | 2015253 +> [ 567.000000] (10:node@c-9.me) 2539541 | 2015253 +> [ 567.000000] (10:node@c-9.me) 3063829 | 2015253 +> [ 567.000000] (10:node@c-9.me) 4112405 | 2015253 +> [ 567.000000] (10:node@c-9.me) 6209557 | 2015253 +> [ 567.000000] (10:node@c-9.me) 10403861 | 2015253 +> [ 567.000000] (10:node@c-9.me) Predecessor: 1319738 +> [ 613.000000] (1:node@c-0.me) My finger table: +> [ 613.000000] (1:node@c-0.me) Start | Succ +> [ 613.000000] (1:node@c-0.me) 43 | 366680 +> [ 613.000000] (1:node@c-0.me) 44 | 366680 +> [ 613.000000] (1:node@c-0.me) 46 | 366680 +> [ 613.000000] (1:node@c-0.me) 50 | 366680 +> [ 613.000000] (1:node@c-0.me) 58 | 366680 +> [ 613.000000] (1:node@c-0.me) 74 | 42 +> [ 613.000000] (1:node@c-0.me) 106 | 42 +> [ 613.000000] (1:node@c-0.me) 170 | 42 +> [ 613.000000] (1:node@c-0.me) 298 | 42 +> [ 613.000000] (1:node@c-0.me) 554 | 42 +> [ 613.000000] (1:node@c-0.me) 1066 | 42 +> [ 613.000000] (1:node@c-0.me) 2090 | 42 +> [ 613.000000] (1:node@c-0.me) 4138 | 42 +> [ 613.000000] (1:node@c-0.me) 8234 | 42 +> [ 613.000000] (1:node@c-0.me) 16426 | 42 +> [ 613.000000] (1:node@c-0.me) 32810 | 42 +> [ 613.000000] (1:node@c-0.me) 65578 | 42 +> [ 613.000000] (1:node@c-0.me) 131114 | 42 +> [ 613.000000] (1:node@c-0.me) 262186 | 42 +> [ 613.000000] (1:node@c-0.me) 524330 | 42 +> [ 613.000000] (1:node@c-0.me) 1048618 | 42 +> [ 613.000000] (1:node@c-0.me) 2097194 | 42 +> [ 613.000000] (1:node@c-0.me) 4194346 | 42 +> [ 613.000000] (1:node@c-0.me) 8388650 | 42 +> [ 613.000000] (1:node@c-0.me) Predecessor: 16728096 +> [ 616.000000] (3:node@c-2.me) My finger table: +> [ 616.000000] (3:node@c-2.me) Start | Succ +> [ 616.000000] (3:node@c-2.me) 533745 | 1319738 +> [ 616.000000] (3:node@c-2.me) 533746 | 10004760 +> [ 616.000000] (3:node@c-2.me) 533748 | 10004760 +> [ 616.000000] (3:node@c-2.me) 533752 | 1319738 +> [ 616.000000] (3:node@c-2.me) 533760 | 1319738 +> [ 616.000000] (3:node@c-2.me) 533776 | 533744 +> [ 616.000000] (3:node@c-2.me) 533808 | 533744 +> [ 616.000000] (3:node@c-2.me) 533872 | 533744 +> [ 616.000000] (3:node@c-2.me) 534000 | 533744 +> [ 616.000000] (3:node@c-2.me) 534256 | 533744 +> [ 616.000000] (3:node@c-2.me) 534768 | 533744 +> [ 616.000000] (3:node@c-2.me) 535792 | 533744 +> [ 616.000000] (3:node@c-2.me) 537840 | 533744 +> [ 616.000000] (3:node@c-2.me) 541936 | 533744 +> [ 616.000000] (3:node@c-2.me) 550128 | 533744 +> [ 616.000000] (3:node@c-2.me) 566512 | 533744 +> [ 616.000000] (3:node@c-2.me) 599280 | 533744 +> [ 616.000000] (3:node@c-2.me) 664816 | 533744 +> [ 616.000000] (3:node@c-2.me) 795888 | 533744 +> [ 616.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 616.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 616.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 616.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 616.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 616.000000] (3:node@c-2.me) Predecessor: 366680 +> [ 620.000000] (6:node@c-5.me) My finger table: +> [ 620.000000] (6:node@c-5.me) Start | Succ +> [ 620.000000] (6:node@c-5.me) 10874877 | 16728096 +> [ 620.000000] (6:node@c-5.me) 10874878 | 533744 +> [ 620.000000] (6:node@c-5.me) 10874880 | 533744 +> [ 620.000000] (6:node@c-5.me) 10874884 | 533744 +> [ 620.000000] (6:node@c-5.me) 10874892 | 16728096 +> [ 620.000000] (6:node@c-5.me) 10874908 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10874940 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10875004 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10875132 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10875388 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10875900 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10876924 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10878972 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10883068 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10891260 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10907644 | 10874876 +> [ 620.000000] (6:node@c-5.me) 10940412 | 10874876 +> [ 620.000000] (6:node@c-5.me) 11005948 | 10874876 +> [ 620.000000] (6:node@c-5.me) 11137020 | 10874876 +> [ 620.000000] (6:node@c-5.me) 11399164 | 10874876 +> [ 620.000000] (6:node@c-5.me) 11923452 | 10874876 +> [ 620.000000] (6:node@c-5.me) 12972028 | 10874876 +> [ 620.000000] (6:node@c-5.me) 15069180 | 10874876 +> [ 620.000000] (6:node@c-5.me) 2486268 | 10874876 +> [ 620.000000] (6:node@c-5.me) Predecessor: -1 +> [ 629.000000] (8:node@c-7.me) My finger table: +> [ 629.000000] (8:node@c-7.me) Start | Succ +> [ 629.000000] (8:node@c-7.me) 10004761 | 16509405 +> [ 629.000000] (8:node@c-7.me) 10004762 | 16509405 +> [ 629.000000] (8:node@c-7.me) 10004764 | 16509405 +> [ 629.000000] (8:node@c-7.me) 10004768 | 16509405 +> [ 629.000000] (8:node@c-7.me) 10004776 | 16509405 +> [ 629.000000] (8:node@c-7.me) 10004792 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10004824 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 629.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 629.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 629.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 629.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 629.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 629.000000] (8:node@c-7.me) Predecessor: 6518808 +> [ 630.000000] (5:node@c-4.me) My finger table: +> [ 630.000000] (5:node@c-4.me) Start | Succ +> [ 630.000000] (5:node@c-4.me) 16509406 | 16728096 +> [ 630.000000] (5:node@c-4.me) 16509407 | 16728096 +> [ 630.000000] (5:node@c-4.me) 16509409 | 16728096 +> [ 630.000000] (5:node@c-4.me) 16509413 | 16728096 +> [ 630.000000] (5:node@c-4.me) 16509421 | 16728096 +> [ 630.000000] (5:node@c-4.me) 16509437 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16509469 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 630.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 630.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 630.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 630.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 630.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 630.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 630.000000] (5:node@c-4.me) Predecessor: 10004760 +> [ 653.000000] (7:node@c-6.me) My finger table: +> [ 653.000000] (7:node@c-6.me) Start | Succ +> [ 653.000000] (7:node@c-6.me) 16728097 | 42 +> [ 653.000000] (7:node@c-6.me) 16728098 | 42 +> [ 653.000000] (7:node@c-6.me) 16728100 | 42 +> [ 653.000000] (7:node@c-6.me) 16728104 | 42 +> [ 653.000000] (7:node@c-6.me) 16728112 | 42 +> [ 653.000000] (7:node@c-6.me) 16728128 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 653.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 653.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 653.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 653.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 653.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 653.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 653.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 653.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 653.000000] (7:node@c-6.me) Predecessor: 16509405 +> [ 663.000000] (2:node@c-1.me) My finger table: +> [ 663.000000] (2:node@c-1.me) Start | Succ +> [ 663.000000] (2:node@c-1.me) 366681 | 533744 +> [ 663.000000] (2:node@c-1.me) 366682 | 1319738 +> [ 663.000000] (2:node@c-1.me) 366684 | 1319738 +> [ 663.000000] (2:node@c-1.me) 366688 | 533744 +> [ 663.000000] (2:node@c-1.me) 366696 | 533744 +> [ 663.000000] (2:node@c-1.me) 366712 | 366680 +> [ 663.000000] (2:node@c-1.me) 366744 | 366680 +> [ 663.000000] (2:node@c-1.me) 366808 | 366680 +> [ 663.000000] (2:node@c-1.me) 366936 | 366680 +> [ 663.000000] (2:node@c-1.me) 367192 | 366680 +> [ 663.000000] (2:node@c-1.me) 367704 | 366680 +> [ 663.000000] (2:node@c-1.me) 368728 | 366680 +> [ 663.000000] (2:node@c-1.me) 370776 | 366680 +> [ 663.000000] (2:node@c-1.me) 374872 | 366680 +> [ 663.000000] (2:node@c-1.me) 383064 | 366680 +> [ 663.000000] (2:node@c-1.me) 399448 | 366680 +> [ 663.000000] (2:node@c-1.me) 432216 | 366680 +> [ 663.000000] (2:node@c-1.me) 497752 | 366680 +> [ 663.000000] (2:node@c-1.me) 628824 | 366680 +> [ 663.000000] (2:node@c-1.me) 890968 | 366680 +> [ 663.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 663.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 663.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 663.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 663.000000] (2:node@c-1.me) Predecessor: 42 +> [ 668.000000] (4:node@c-3.me) My finger table: +> [ 668.000000] (4:node@c-3.me) Start | Succ +> [ 668.000000] (4:node@c-3.me) 1319739 | 2015253 +> [ 668.000000] (4:node@c-3.me) 1319740 | 2015253 +> [ 668.000000] (4:node@c-3.me) 1319742 | 2015253 +> [ 668.000000] (4:node@c-3.me) 1319746 | 2015253 +> [ 668.000000] (4:node@c-3.me) 1319754 | 2015253 +> [ 668.000000] (4:node@c-3.me) 1319770 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 668.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 668.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 668.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 668.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 668.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 668.000000] (4:node@c-3.me) Predecessor: 533744 +> [ 683.000000] (5:node@c-4.me) My finger table: +> [ 683.000000] (5:node@c-4.me) Start | Succ +> [ 683.000000] (5:node@c-4.me) 16509406 | 16728096 +> [ 683.000000] (5:node@c-4.me) 16509407 | 16728096 +> [ 683.000000] (5:node@c-4.me) 16509409 | 16728096 +> [ 683.000000] (5:node@c-4.me) 16509413 | 16728096 +> [ 683.000000] (5:node@c-4.me) 16509421 | 16728096 +> [ 683.000000] (5:node@c-4.me) 16509437 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16509469 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 683.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 683.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 683.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 683.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 683.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 683.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 683.000000] (5:node@c-4.me) Predecessor: 10874876 +> [ 688.000000] (9:node@c-8.me) My finger table: +> [ 688.000000] (9:node@c-8.me) Start | Succ +> [ 688.000000] (9:node@c-8.me) 6518809 | 10004760 +> [ 688.000000] (9:node@c-8.me) 6518810 | 16728096 +> [ 688.000000] (9:node@c-8.me) 6518812 | 10004760 +> [ 688.000000] (9:node@c-8.me) 6518816 | 10004760 +> [ 688.000000] (9:node@c-8.me) 6518824 | 10004760 +> [ 688.000000] (9:node@c-8.me) 6518840 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 688.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 688.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 688.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 688.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 688.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 688.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 688.000000] (9:node@c-8.me) Predecessor: 2015253 +> [ 699.000000] (10:node@c-9.me) My finger table: +> [ 699.000000] (10:node@c-9.me) Start | Succ +> [ 699.000000] (10:node@c-9.me) 2015254 | 6518808 +> [ 699.000000] (10:node@c-9.me) 2015255 | 6518808 +> [ 699.000000] (10:node@c-9.me) 2015257 | 6518808 +> [ 699.000000] (10:node@c-9.me) 2015261 | 6518808 +> [ 699.000000] (10:node@c-9.me) 2015269 | 6518808 +> [ 699.000000] (10:node@c-9.me) 2015285 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2015317 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2015381 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2015509 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2015765 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2016277 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2017301 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2019349 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2023445 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2031637 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2048021 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2080789 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2146325 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2277397 | 2015253 +> [ 699.000000] (10:node@c-9.me) 2539541 | 2015253 +> [ 699.000000] (10:node@c-9.me) 3063829 | 2015253 +> [ 699.000000] (10:node@c-9.me) 4112405 | 2015253 +> [ 699.000000] (10:node@c-9.me) 6209557 | 2015253 +> [ 699.000000] (10:node@c-9.me) 10403861 | 2015253 +> [ 699.000000] (10:node@c-9.me) Predecessor: 1319738 +> [ 733.000000] (6:node@c-5.me) My finger table: +> [ 733.000000] (6:node@c-5.me) Start | Succ +> [ 733.000000] (6:node@c-5.me) 10874877 | 16509405 +> [ 733.000000] (6:node@c-5.me) 10874878 | 533744 +> [ 733.000000] (6:node@c-5.me) 10874880 | 533744 +> [ 733.000000] (6:node@c-5.me) 10874884 | 533744 +> [ 733.000000] (6:node@c-5.me) 10874892 | 16728096 +> [ 733.000000] (6:node@c-5.me) 10874908 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10874940 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10875004 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10875132 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10875388 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10875900 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10876924 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10878972 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10883068 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10891260 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10907644 | 10874876 +> [ 733.000000] (6:node@c-5.me) 10940412 | 10874876 +> [ 733.000000] (6:node@c-5.me) 11005948 | 10874876 +> [ 733.000000] (6:node@c-5.me) 11137020 | 10874876 +> [ 733.000000] (6:node@c-5.me) 11399164 | 10874876 +> [ 733.000000] (6:node@c-5.me) 11923452 | 10874876 +> [ 733.000000] (6:node@c-5.me) 12972028 | 10874876 +> [ 733.000000] (6:node@c-5.me) 15069180 | 10874876 +> [ 733.000000] (6:node@c-5.me) 2486268 | 10874876 +> [ 733.000000] (6:node@c-5.me) Predecessor: 10004760 +> [ 735.000000] (1:node@c-0.me) My finger table: +> [ 735.000000] (1:node@c-0.me) Start | Succ +> [ 735.000000] (1:node@c-0.me) 43 | 366680 +> [ 735.000000] (1:node@c-0.me) 44 | 366680 +> [ 735.000000] (1:node@c-0.me) 46 | 366680 +> [ 735.000000] (1:node@c-0.me) 50 | 366680 +> [ 735.000000] (1:node@c-0.me) 58 | 366680 +> [ 735.000000] (1:node@c-0.me) 74 | 366680 +> [ 735.000000] (1:node@c-0.me) 106 | 42 +> [ 735.000000] (1:node@c-0.me) 170 | 42 +> [ 735.000000] (1:node@c-0.me) 298 | 42 +> [ 735.000000] (1:node@c-0.me) 554 | 42 +> [ 735.000000] (1:node@c-0.me) 1066 | 42 +> [ 735.000000] (1:node@c-0.me) 2090 | 42 +> [ 735.000000] (1:node@c-0.me) 4138 | 42 +> [ 735.000000] (1:node@c-0.me) 8234 | 42 +> [ 735.000000] (1:node@c-0.me) 16426 | 42 +> [ 735.000000] (1:node@c-0.me) 32810 | 42 +> [ 735.000000] (1:node@c-0.me) 65578 | 42 +> [ 735.000000] (1:node@c-0.me) 131114 | 42 +> [ 735.000000] (1:node@c-0.me) 262186 | 42 +> [ 735.000000] (1:node@c-0.me) 524330 | 42 +> [ 735.000000] (1:node@c-0.me) 1048618 | 42 +> [ 735.000000] (1:node@c-0.me) 2097194 | 42 +> [ 735.000000] (1:node@c-0.me) 4194346 | 42 +> [ 735.000000] (1:node@c-0.me) 8388650 | 42 +> [ 735.000000] (1:node@c-0.me) Predecessor: 16728096 +> [ 743.000000] (3:node@c-2.me) My finger table: +> [ 743.000000] (3:node@c-2.me) Start | Succ +> [ 743.000000] (3:node@c-2.me) 533745 | 1319738 +> [ 743.000000] (3:node@c-2.me) 533746 | 10004760 +> [ 743.000000] (3:node@c-2.me) 533748 | 10004760 +> [ 743.000000] (3:node@c-2.me) 533752 | 1319738 +> [ 743.000000] (3:node@c-2.me) 533760 | 1319738 +> [ 743.000000] (3:node@c-2.me) 533776 | 1319738 +> [ 743.000000] (3:node@c-2.me) 533808 | 533744 +> [ 743.000000] (3:node@c-2.me) 533872 | 533744 +> [ 743.000000] (3:node@c-2.me) 534000 | 533744 +> [ 743.000000] (3:node@c-2.me) 534256 | 533744 +> [ 743.000000] (3:node@c-2.me) 534768 | 533744 +> [ 743.000000] (3:node@c-2.me) 535792 | 533744 +> [ 743.000000] (3:node@c-2.me) 537840 | 533744 +> [ 743.000000] (3:node@c-2.me) 541936 | 533744 +> [ 743.000000] (3:node@c-2.me) 550128 | 533744 +> [ 743.000000] (3:node@c-2.me) 566512 | 533744 +> [ 743.000000] (3:node@c-2.me) 599280 | 533744 +> [ 743.000000] (3:node@c-2.me) 664816 | 533744 +> [ 743.000000] (3:node@c-2.me) 795888 | 533744 +> [ 743.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 743.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 743.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 743.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 743.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 743.000000] (3:node@c-2.me) Predecessor: 366680 +> [ 752.000000] (5:node@c-4.me) My finger table: +> [ 752.000000] (5:node@c-4.me) Start | Succ +> [ 752.000000] (5:node@c-4.me) 16509406 | 16728096 +> [ 752.000000] (5:node@c-4.me) 16509407 | 16728096 +> [ 752.000000] (5:node@c-4.me) 16509409 | 16728096 +> [ 752.000000] (5:node@c-4.me) 16509413 | 16728096 +> [ 752.000000] (5:node@c-4.me) 16509421 | 16728096 +> [ 752.000000] (5:node@c-4.me) 16509437 | 16728096 +> [ 752.000000] (5:node@c-4.me) 16509469 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 752.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 752.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 752.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 752.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 752.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 752.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 752.000000] (5:node@c-4.me) Predecessor: 10874876 +> [ 753.000000] (6:node@c-5.me) My finger table: +> [ 753.000000] (6:node@c-5.me) Start | Succ +> [ 753.000000] (6:node@c-5.me) 10874877 | 16509405 +> [ 753.000000] (6:node@c-5.me) 10874878 | 533744 +> [ 753.000000] (6:node@c-5.me) 10874880 | 533744 +> [ 753.000000] (6:node@c-5.me) 10874884 | 533744 +> [ 753.000000] (6:node@c-5.me) 10874892 | 16728096 +> [ 753.000000] (6:node@c-5.me) 10874908 | 16509405 +> [ 753.000000] (6:node@c-5.me) 10874940 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10875004 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10875132 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10875388 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10875900 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10876924 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10878972 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10883068 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10891260 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10907644 | 10874876 +> [ 753.000000] (6:node@c-5.me) 10940412 | 10874876 +> [ 753.000000] (6:node@c-5.me) 11005948 | 10874876 +> [ 753.000000] (6:node@c-5.me) 11137020 | 10874876 +> [ 753.000000] (6:node@c-5.me) 11399164 | 10874876 +> [ 753.000000] (6:node@c-5.me) 11923452 | 10874876 +> [ 753.000000] (6:node@c-5.me) 12972028 | 10874876 +> [ 753.000000] (6:node@c-5.me) 15069180 | 10874876 +> [ 753.000000] (6:node@c-5.me) 2486268 | 10874876 +> [ 753.000000] (6:node@c-5.me) Predecessor: 10004760 +> [ 765.000000] (8:node@c-7.me) My finger table: +> [ 765.000000] (8:node@c-7.me) Start | Succ +> [ 765.000000] (8:node@c-7.me) 10004761 | 10874876 +> [ 765.000000] (8:node@c-7.me) 10004762 | 16509405 +> [ 765.000000] (8:node@c-7.me) 10004764 | 16509405 +> [ 765.000000] (8:node@c-7.me) 10004768 | 16509405 +> [ 765.000000] (8:node@c-7.me) 10004776 | 16509405 +> [ 765.000000] (8:node@c-7.me) 10004792 | 10874876 +> [ 765.000000] (8:node@c-7.me) 10004824 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 765.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 765.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 765.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 765.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 765.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 765.000000] (8:node@c-7.me) Predecessor: 6518808 +> [ 774.000000] (7:node@c-6.me) My finger table: +> [ 774.000000] (7:node@c-6.me) Start | Succ +> [ 774.000000] (7:node@c-6.me) 16728097 | 42 +> [ 774.000000] (7:node@c-6.me) 16728098 | 42 +> [ 774.000000] (7:node@c-6.me) 16728100 | 42 +> [ 774.000000] (7:node@c-6.me) 16728104 | 42 +> [ 774.000000] (7:node@c-6.me) 16728112 | 42 +> [ 774.000000] (7:node@c-6.me) 16728128 | 42 +> [ 774.000000] (7:node@c-6.me) 16728160 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 774.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 774.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 774.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 774.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 774.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 774.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 774.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 774.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 774.000000] (7:node@c-6.me) Predecessor: 16509405 +> [ 796.000000] (2:node@c-1.me) My finger table: +> [ 796.000000] (2:node@c-1.me) Start | Succ +> [ 796.000000] (2:node@c-1.me) 366681 | 533744 +> [ 796.000000] (2:node@c-1.me) 366682 | 1319738 +> [ 796.000000] (2:node@c-1.me) 366684 | 1319738 +> [ 796.000000] (2:node@c-1.me) 366688 | 533744 +> [ 796.000000] (2:node@c-1.me) 366696 | 533744 +> [ 796.000000] (2:node@c-1.me) 366712 | 533744 +> [ 796.000000] (2:node@c-1.me) 366744 | 366680 +> [ 796.000000] (2:node@c-1.me) 366808 | 366680 +> [ 796.000000] (2:node@c-1.me) 366936 | 366680 +> [ 796.000000] (2:node@c-1.me) 367192 | 366680 +> [ 796.000000] (2:node@c-1.me) 367704 | 366680 +> [ 796.000000] (2:node@c-1.me) 368728 | 366680 +> [ 796.000000] (2:node@c-1.me) 370776 | 366680 +> [ 796.000000] (2:node@c-1.me) 374872 | 366680 +> [ 796.000000] (2:node@c-1.me) 383064 | 366680 +> [ 796.000000] (2:node@c-1.me) 399448 | 366680 +> [ 796.000000] (2:node@c-1.me) 432216 | 366680 +> [ 796.000000] (2:node@c-1.me) 497752 | 366680 +> [ 796.000000] (2:node@c-1.me) 628824 | 366680 +> [ 796.000000] (2:node@c-1.me) 890968 | 366680 +> [ 796.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 796.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 796.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 796.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 796.000000] (2:node@c-1.me) Predecessor: 42 +> [ 808.000000] (9:node@c-8.me) My finger table: +> [ 808.000000] (9:node@c-8.me) Start | Succ +> [ 808.000000] (9:node@c-8.me) 6518809 | 10004760 +> [ 808.000000] (9:node@c-8.me) 6518810 | 16728096 +> [ 808.000000] (9:node@c-8.me) 6518812 | 10004760 +> [ 808.000000] (9:node@c-8.me) 6518816 | 10004760 +> [ 808.000000] (9:node@c-8.me) 6518824 | 10004760 +> [ 808.000000] (9:node@c-8.me) 6518840 | 10004760 +> [ 808.000000] (9:node@c-8.me) 6518872 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 808.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 808.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 808.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 808.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 808.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 808.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 808.000000] (9:node@c-8.me) Predecessor: 2015253 +> [ 810.000000] (4:node@c-3.me) My finger table: +> [ 810.000000] (4:node@c-3.me) Start | Succ +> [ 810.000000] (4:node@c-3.me) 1319739 | 2015253 +> [ 810.000000] (4:node@c-3.me) 1319740 | 2015253 +> [ 810.000000] (4:node@c-3.me) 1319742 | 2015253 +> [ 810.000000] (4:node@c-3.me) 1319746 | 2015253 +> [ 810.000000] (4:node@c-3.me) 1319754 | 2015253 +> [ 810.000000] (4:node@c-3.me) 1319770 | 2015253 +> [ 810.000000] (4:node@c-3.me) 1319802 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 810.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 810.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 810.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 810.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 810.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 810.000000] (4:node@c-3.me) Predecessor: 533744 +> [ 831.000000] (10:node@c-9.me) My finger table: +> [ 831.000000] (10:node@c-9.me) Start | Succ +> [ 831.000000] (10:node@c-9.me) 2015254 | 6518808 +> [ 831.000000] (10:node@c-9.me) 2015255 | 6518808 +> [ 831.000000] (10:node@c-9.me) 2015257 | 6518808 +> [ 831.000000] (10:node@c-9.me) 2015261 | 6518808 +> [ 831.000000] (10:node@c-9.me) 2015269 | 6518808 +> [ 831.000000] (10:node@c-9.me) 2015285 | 6518808 +> [ 831.000000] (10:node@c-9.me) 2015317 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2015381 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2015509 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2015765 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2016277 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2017301 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2019349 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2023445 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2031637 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2048021 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2080789 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2146325 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2277397 | 2015253 +> [ 831.000000] (10:node@c-9.me) 2539541 | 2015253 +> [ 831.000000] (10:node@c-9.me) 3063829 | 2015253 +> [ 831.000000] (10:node@c-9.me) 4112405 | 2015253 +> [ 831.000000] (10:node@c-9.me) 6209557 | 2015253 +> [ 831.000000] (10:node@c-9.me) 10403861 | 2015253 +> [ 831.000000] (10:node@c-9.me) Predecessor: 1319738 +> [ 859.000000] (1:node@c-0.me) My finger table: +> [ 859.000000] (1:node@c-0.me) Start | Succ +> [ 859.000000] (1:node@c-0.me) 43 | 366680 +> [ 859.000000] (1:node@c-0.me) 44 | 366680 +> [ 859.000000] (1:node@c-0.me) 46 | 366680 +> [ 859.000000] (1:node@c-0.me) 50 | 366680 +> [ 859.000000] (1:node@c-0.me) 58 | 366680 +> [ 859.000000] (1:node@c-0.me) 74 | 366680 +> [ 859.000000] (1:node@c-0.me) 106 | 366680 +> [ 859.000000] (1:node@c-0.me) 170 | 42 +> [ 859.000000] (1:node@c-0.me) 298 | 42 +> [ 859.000000] (1:node@c-0.me) 554 | 42 +> [ 859.000000] (1:node@c-0.me) 1066 | 42 +> [ 859.000000] (1:node@c-0.me) 2090 | 42 +> [ 859.000000] (1:node@c-0.me) 4138 | 42 +> [ 859.000000] (1:node@c-0.me) 8234 | 42 +> [ 859.000000] (1:node@c-0.me) 16426 | 42 +> [ 859.000000] (1:node@c-0.me) 32810 | 42 +> [ 859.000000] (1:node@c-0.me) 65578 | 42 +> [ 859.000000] (1:node@c-0.me) 131114 | 42 +> [ 859.000000] (1:node@c-0.me) 262186 | 42 +> [ 859.000000] (1:node@c-0.me) 524330 | 42 +> [ 859.000000] (1:node@c-0.me) 1048618 | 42 +> [ 859.000000] (1:node@c-0.me) 2097194 | 42 +> [ 859.000000] (1:node@c-0.me) 4194346 | 42 +> [ 859.000000] (1:node@c-0.me) 8388650 | 42 +> [ 859.000000] (1:node@c-0.me) Predecessor: 16728096 +> [ 873.000000] (5:node@c-4.me) My finger table: +> [ 873.000000] (5:node@c-4.me) Start | Succ +> [ 873.000000] (5:node@c-4.me) 16509406 | 16728096 +> [ 873.000000] (5:node@c-4.me) 16509407 | 16728096 +> [ 873.000000] (5:node@c-4.me) 16509409 | 16728096 +> [ 873.000000] (5:node@c-4.me) 16509413 | 16728096 +> [ 873.000000] (5:node@c-4.me) 16509421 | 16728096 +> [ 873.000000] (5:node@c-4.me) 16509437 | 16728096 +> [ 873.000000] (5:node@c-4.me) 16509469 | 16728096 +> [ 873.000000] (5:node@c-4.me) 16509533 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16509661 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16509917 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16510429 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16511453 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16513501 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16517597 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16525789 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16542173 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16574941 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16640477 | 16509405 +> [ 873.000000] (5:node@c-4.me) 16771549 | 16509405 +> [ 873.000000] (5:node@c-4.me) 256477 | 16509405 +> [ 873.000000] (5:node@c-4.me) 780765 | 16509405 +> [ 873.000000] (5:node@c-4.me) 1829341 | 16509405 +> [ 873.000000] (5:node@c-4.me) 3926493 | 16509405 +> [ 873.000000] (5:node@c-4.me) 8120797 | 16509405 +> [ 873.000000] (5:node@c-4.me) Predecessor: 10874876 +> [ 893.000000] (3:node@c-2.me) My finger table: +> [ 893.000000] (3:node@c-2.me) Start | Succ +> [ 893.000000] (3:node@c-2.me) 533745 | 1319738 +> [ 893.000000] (3:node@c-2.me) 533746 | 10004760 +> [ 893.000000] (3:node@c-2.me) 533748 | 10004760 +> [ 893.000000] (3:node@c-2.me) 533752 | 1319738 +> [ 893.000000] (3:node@c-2.me) 533760 | 1319738 +> [ 893.000000] (3:node@c-2.me) 533776 | 1319738 +> [ 893.000000] (3:node@c-2.me) 533808 | 1319738 +> [ 893.000000] (3:node@c-2.me) 533872 | 533744 +> [ 893.000000] (3:node@c-2.me) 534000 | 533744 +> [ 893.000000] (3:node@c-2.me) 534256 | 533744 +> [ 893.000000] (3:node@c-2.me) 534768 | 533744 +> [ 893.000000] (3:node@c-2.me) 535792 | 533744 +> [ 893.000000] (3:node@c-2.me) 537840 | 533744 +> [ 893.000000] (3:node@c-2.me) 541936 | 533744 +> [ 893.000000] (3:node@c-2.me) 550128 | 533744 +> [ 893.000000] (3:node@c-2.me) 566512 | 533744 +> [ 893.000000] (3:node@c-2.me) 599280 | 533744 +> [ 893.000000] (3:node@c-2.me) 664816 | 533744 +> [ 893.000000] (3:node@c-2.me) 795888 | 533744 +> [ 893.000000] (3:node@c-2.me) 1058032 | 533744 +> [ 893.000000] (3:node@c-2.me) 1582320 | 533744 +> [ 893.000000] (3:node@c-2.me) 2630896 | 533744 +> [ 893.000000] (3:node@c-2.me) 4728048 | 533744 +> [ 893.000000] (3:node@c-2.me) 8922352 | 533744 +> [ 893.000000] (3:node@c-2.me) Predecessor: 366680 +> [ 896.000000] (7:node@c-6.me) My finger table: +> [ 896.000000] (7:node@c-6.me) Start | Succ +> [ 896.000000] (7:node@c-6.me) 16728097 | 42 +> [ 896.000000] (7:node@c-6.me) 16728098 | 42 +> [ 896.000000] (7:node@c-6.me) 16728100 | 42 +> [ 896.000000] (7:node@c-6.me) 16728104 | 42 +> [ 896.000000] (7:node@c-6.me) 16728112 | 42 +> [ 896.000000] (7:node@c-6.me) 16728128 | 42 +> [ 896.000000] (7:node@c-6.me) 16728160 | 42 +> [ 896.000000] (7:node@c-6.me) 16728224 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16728352 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16728608 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16729120 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16730144 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16732192 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16736288 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16744480 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16760864 | 16728096 +> [ 896.000000] (7:node@c-6.me) 16416 | 16728096 +> [ 896.000000] (7:node@c-6.me) 81952 | 16728096 +> [ 896.000000] (7:node@c-6.me) 213024 | 16728096 +> [ 896.000000] (7:node@c-6.me) 475168 | 16728096 +> [ 896.000000] (7:node@c-6.me) 999456 | 16728096 +> [ 896.000000] (7:node@c-6.me) 2048032 | 16728096 +> [ 896.000000] (7:node@c-6.me) 4145184 | 16728096 +> [ 896.000000] (7:node@c-6.me) 8339488 | 16728096 +> [ 896.000000] (7:node@c-6.me) Predecessor: 16509405 +> [ 899.000000] (6:node@c-5.me) My finger table: +> [ 899.000000] (6:node@c-5.me) Start | Succ +> [ 899.000000] (6:node@c-5.me) 10874877 | 16509405 +> [ 899.000000] (6:node@c-5.me) 10874878 | 533744 +> [ 899.000000] (6:node@c-5.me) 10874880 | 533744 +> [ 899.000000] (6:node@c-5.me) 10874884 | 533744 +> [ 899.000000] (6:node@c-5.me) 10874892 | 16728096 +> [ 899.000000] (6:node@c-5.me) 10874908 | 16509405 +> [ 899.000000] (6:node@c-5.me) 10874940 | 16509405 +> [ 899.000000] (6:node@c-5.me) 10875004 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10875132 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10875388 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10875900 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10876924 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10878972 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10883068 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10891260 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10907644 | 10874876 +> [ 899.000000] (6:node@c-5.me) 10940412 | 10874876 +> [ 899.000000] (6:node@c-5.me) 11005948 | 10874876 +> [ 899.000000] (6:node@c-5.me) 11137020 | 10874876 +> [ 899.000000] (6:node@c-5.me) 11399164 | 10874876 +> [ 899.000000] (6:node@c-5.me) 11923452 | 10874876 +> [ 899.000000] (6:node@c-5.me) 12972028 | 10874876 +> [ 899.000000] (6:node@c-5.me) 15069180 | 10874876 +> [ 899.000000] (6:node@c-5.me) 2486268 | 10874876 +> [ 899.000000] (6:node@c-5.me) Predecessor: 10004760 +> [ 899.000000] (8:node@c-7.me) My finger table: +> [ 899.000000] (8:node@c-7.me) Start | Succ +> [ 899.000000] (8:node@c-7.me) 10004761 | 10874876 +> [ 899.000000] (8:node@c-7.me) 10004762 | 16509405 +> [ 899.000000] (8:node@c-7.me) 10004764 | 16509405 +> [ 899.000000] (8:node@c-7.me) 10004768 | 16509405 +> [ 899.000000] (8:node@c-7.me) 10004776 | 16509405 +> [ 899.000000] (8:node@c-7.me) 10004792 | 10874876 +> [ 899.000000] (8:node@c-7.me) 10004824 | 10874876 +> [ 899.000000] (8:node@c-7.me) 10004888 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10005016 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10005272 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10005784 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10006808 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10008856 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10012952 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10021144 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10037528 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10070296 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10135832 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10266904 | 10004760 +> [ 899.000000] (8:node@c-7.me) 10529048 | 10004760 +> [ 899.000000] (8:node@c-7.me) 11053336 | 10004760 +> [ 899.000000] (8:node@c-7.me) 12101912 | 10004760 +> [ 899.000000] (8:node@c-7.me) 14199064 | 10004760 +> [ 899.000000] (8:node@c-7.me) 1616152 | 10004760 +> [ 899.000000] (8:node@c-7.me) Predecessor: 6518808 +> [ 921.000000] (2:node@c-1.me) My finger table: +> [ 921.000000] (2:node@c-1.me) Start | Succ +> [ 921.000000] (2:node@c-1.me) 366681 | 533744 +> [ 921.000000] (2:node@c-1.me) 366682 | 1319738 +> [ 921.000000] (2:node@c-1.me) 366684 | 1319738 +> [ 921.000000] (2:node@c-1.me) 366688 | 533744 +> [ 921.000000] (2:node@c-1.me) 366696 | 533744 +> [ 921.000000] (2:node@c-1.me) 366712 | 533744 +> [ 921.000000] (2:node@c-1.me) 366744 | 533744 +> [ 921.000000] (2:node@c-1.me) 366808 | 366680 +> [ 921.000000] (2:node@c-1.me) 366936 | 366680 +> [ 921.000000] (2:node@c-1.me) 367192 | 366680 +> [ 921.000000] (2:node@c-1.me) 367704 | 366680 +> [ 921.000000] (2:node@c-1.me) 368728 | 366680 +> [ 921.000000] (2:node@c-1.me) 370776 | 366680 +> [ 921.000000] (2:node@c-1.me) 374872 | 366680 +> [ 921.000000] (2:node@c-1.me) 383064 | 366680 +> [ 921.000000] (2:node@c-1.me) 399448 | 366680 +> [ 921.000000] (2:node@c-1.me) 432216 | 366680 +> [ 921.000000] (2:node@c-1.me) 497752 | 366680 +> [ 921.000000] (2:node@c-1.me) 628824 | 366680 +> [ 921.000000] (2:node@c-1.me) 890968 | 366680 +> [ 921.000000] (2:node@c-1.me) 1415256 | 366680 +> [ 921.000000] (2:node@c-1.me) 2463832 | 366680 +> [ 921.000000] (2:node@c-1.me) 4560984 | 366680 +> [ 921.000000] (2:node@c-1.me) 8755288 | 366680 +> [ 921.000000] (2:node@c-1.me) Predecessor: 42 +> [ 928.000000] (9:node@c-8.me) My finger table: +> [ 928.000000] (9:node@c-8.me) Start | Succ +> [ 928.000000] (9:node@c-8.me) 6518809 | 10004760 +> [ 928.000000] (9:node@c-8.me) 6518810 | 16728096 +> [ 928.000000] (9:node@c-8.me) 6518812 | 10004760 +> [ 928.000000] (9:node@c-8.me) 6518816 | 10004760 +> [ 928.000000] (9:node@c-8.me) 6518824 | 10004760 +> [ 928.000000] (9:node@c-8.me) 6518840 | 10004760 +> [ 928.000000] (9:node@c-8.me) 6518872 | 10004760 +> [ 928.000000] (9:node@c-8.me) 6518936 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6519064 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6519320 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6519832 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6520856 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6522904 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6527000 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6535192 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6551576 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6584344 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6649880 | 6518808 +> [ 928.000000] (9:node@c-8.me) 6780952 | 6518808 +> [ 928.000000] (9:node@c-8.me) 7043096 | 6518808 +> [ 928.000000] (9:node@c-8.me) 7567384 | 6518808 +> [ 928.000000] (9:node@c-8.me) 8615960 | 6518808 +> [ 928.000000] (9:node@c-8.me) 10713112 | 6518808 +> [ 928.000000] (9:node@c-8.me) 14907416 | 6518808 +> [ 928.000000] (9:node@c-8.me) Predecessor: 2015253 +> [ 930.000000] (4:node@c-3.me) My finger table: +> [ 930.000000] (4:node@c-3.me) Start | Succ +> [ 930.000000] (4:node@c-3.me) 1319739 | 2015253 +> [ 930.000000] (4:node@c-3.me) 1319740 | 2015253 +> [ 930.000000] (4:node@c-3.me) 1319742 | 2015253 +> [ 930.000000] (4:node@c-3.me) 1319746 | 2015253 +> [ 930.000000] (4:node@c-3.me) 1319754 | 2015253 +> [ 930.000000] (4:node@c-3.me) 1319770 | 2015253 +> [ 930.000000] (4:node@c-3.me) 1319802 | 2015253 +> [ 930.000000] (4:node@c-3.me) 1319866 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1319994 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1320250 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1320762 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1321786 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1323834 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1327930 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1336122 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1352506 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1385274 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1450810 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1581882 | 1319738 +> [ 930.000000] (4:node@c-3.me) 1844026 | 1319738 +> [ 930.000000] (4:node@c-3.me) 2368314 | 1319738 +> [ 930.000000] (4:node@c-3.me) 3416890 | 1319738 +> [ 930.000000] (4:node@c-3.me) 5514042 | 1319738 +> [ 930.000000] (4:node@c-3.me) 9708346 | 1319738 +> [ 930.000000] (4:node@c-3.me) Predecessor: 533744 +> [ 962.000000] (10:node@c-9.me) My finger table: +> [ 962.000000] (10:node@c-9.me) Start | Succ +> [ 962.000000] (10:node@c-9.me) 2015254 | 6518808 +> [ 962.000000] (10:node@c-9.me) 2015255 | 6518808 +> [ 962.000000] (10:node@c-9.me) 2015257 | 6518808 +> [ 962.000000] (10:node@c-9.me) 2015261 | 6518808 +> [ 962.000000] (10:node@c-9.me) 2015269 | 6518808 +> [ 962.000000] (10:node@c-9.me) 2015285 | 6518808 +> [ 962.000000] (10:node@c-9.me) 2015317 | 6518808 +> [ 962.000000] (10:node@c-9.me) 2015381 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2015509 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2015765 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2016277 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2017301 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2019349 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2023445 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2031637 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2048021 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2080789 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2146325 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2277397 | 2015253 +> [ 962.000000] (10:node@c-9.me) 2539541 | 2015253 +> [ 962.000000] (10:node@c-9.me) 3063829 | 2015253 +> [ 962.000000] (10:node@c-9.me) 4112405 | 2015253 +> [ 962.000000] (10:node@c-9.me) 6209557 | 2015253 +> [ 962.000000] (10:node@c-9.me) 10403861 | 2015253 +> [ 962.000000] (10:node@c-9.me) Predecessor: 1319738 +> [ 982.000000] (1:node@c-0.me) My finger table: +> [ 982.000000] (1:node@c-0.me) Start | Succ +> [ 982.000000] (1:node@c-0.me) 43 | 366680 +> [ 982.000000] (1:node@c-0.me) 44 | 366680 +> [ 982.000000] (1:node@c-0.me) 46 | 366680 +> [ 982.000000] (1:node@c-0.me) 50 | 366680 +> [ 982.000000] (1:node@c-0.me) 58 | 366680 +> [ 982.000000] (1:node@c-0.me) 74 | 366680 +> [ 982.000000] (1:node@c-0.me) 106 | 366680 +> [ 982.000000] (1:node@c-0.me) 170 | 366680 +> [ 982.000000] (1:node@c-0.me) 298 | 42 +> [ 982.000000] (1:node@c-0.me) 554 | 42 +> [ 982.000000] (1:node@c-0.me) 1066 | 42 +> [ 982.000000] (1:node@c-0.me) 2090 | 42 +> [ 982.000000] (1:node@c-0.me) 4138 | 42 +> [ 982.000000] (1:node@c-0.me) 8234 | 42 +> [ 982.000000] (1:node@c-0.me) 16426 | 42 +> [ 982.000000] (1:node@c-0.me) 32810 | 42 +> [ 982.000000] (1:node@c-0.me) 65578 | 42 +> [ 982.000000] (1:node@c-0.me) 131114 | 42 +> [ 982.000000] (1:node@c-0.me) 262186 | 42 +> [ 982.000000] (1:node@c-0.me) 524330 | 42 +> [ 982.000000] (1:node@c-0.me) 1048618 | 42 +> [ 982.000000] (1:node@c-0.me) 2097194 | 42 +> [ 982.000000] (1:node@c-0.me) 4194346 | 42 +> [ 982.000000] (1:node@c-0.me) 8388650 | 42 +> [ 982.000000] (1:node@c-0.me) Predecessor: 16728096 +> [1154.000000] (0:@) Messages created: 2049 +> [1154.000000] (0:@) Simulated time: 1154 diff --git a/examples/msg/pmm/msg_pmm.c b/examples/msg/pmm/msg_pmm.c index ba8a65c1c4..ee45fec5d5 100644 --- a/examples/msg/pmm/msg_pmm.c +++ b/examples/msg/pmm/msg_pmm.c @@ -271,7 +271,7 @@ static void task_cleanup(void *arg){ int main(int argc, char *argv[]) { #ifdef BENCH_THIS_CODE - xbt_os_timer_t timer = xbt_os_timer_new(); + xbt_os_cputimer_t timer = xbt_os_timer_new(); #endif MSG_init(&argc, argv); @@ -286,11 +286,11 @@ int main(int argc, char *argv[]) MSG_launch_application(application_file); #ifdef BENCH_THIS_CODE - xbt_os_timer_start(timer); + xbt_os_cputimer_start(timer); #endif msg_error_t res = MSG_main(); #ifdef BENCH_THIS_CODE - xbt_os_timer_stop(timer); + xbt_os_cputimer_stop(timer); #endif XBT_CRITICAL("Simulated time: %g", MSG_get_clock()); diff --git a/examples/msg/properties/msg_prop.c b/examples/msg/properties/msg_prop.c index 993a3549dd..1594db28cc 100644 --- a/examples/msg/properties/msg_prop.c +++ b/examples/msg/properties/msg_prop.c @@ -31,7 +31,6 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Property test"); int alice(int argc, char *argv[]); int bob(int argc, char *argv[]); int carole(int argc, char *argv[]); -int forwarder(int argc, char *argv[]); msg_error_t test_all(const char *platform_file, const char *application_file); diff --git a/examples/msg/semaphores/CMakeLists.txt b/examples/msg/semaphores/CMakeLists.txt new file mode 100644 index 0000000000..d8b48ddf74 --- /dev/null +++ b/examples/msg/semaphores/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.6) + +set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(synchro synchro.c) + +### Add definitions for compile +target_link_libraries(synchro simgrid) + +set(tesh_files + ${tesh_files} + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/synchro.c + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/examples/msg/semaphores/synchro.c b/examples/msg/semaphores/synchro.c new file mode 100644 index 0000000000..b66b1d3ad3 --- /dev/null +++ b/examples/msg/semaphores/synchro.c @@ -0,0 +1,76 @@ +#include +#include +#include "msg/msg.h" +#include "xbt/log.h" + +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_semaphore_example, + "Messages specific for this msg example"); + +msg_sem_t sem; + +static int peer(int argc, char* argv[]){ + + int i = 0; + + while(i < argc) { + double wait_time = atof(argv[i++]); + MSG_process_sleep(wait_time); + XBT_INFO("Trying to acquire %d", i); + MSG_sem_acquire(sem); + XBT_INFO("Acquired %d", i); + + wait_time = atof(argv[i++]); + MSG_process_sleep(wait_time); + XBT_INFO("Releasing %d", i); + MSG_sem_release(sem); + XBT_INFO("Released %d", i); + } + MSG_process_sleep(50); + XBT_INFO("Done"); + + return 0; +} + +int main(int argc, char* argv[]) { + + MSG_init(&argc, argv); + MSG_create_environment(argv[1]); + + xbt_dynar_t hosts = MSG_hosts_as_dynar(); + msg_host_t h = xbt_dynar_get_as(hosts,0,msg_host_t); + + sem = MSG_sem_init(1); + char** aliceTimes = xbt_new(char*, 9); + int nbAlice = 0; + aliceTimes[nbAlice++] = xbt_strdup("0"); + aliceTimes[nbAlice++] = xbt_strdup("1"); + aliceTimes[nbAlice++] = xbt_strdup("3"); + aliceTimes[nbAlice++] = xbt_strdup("5"); + aliceTimes[nbAlice++] = xbt_strdup("1"); + aliceTimes[nbAlice++] = xbt_strdup("2"); + aliceTimes[nbAlice++] = xbt_strdup("5"); + aliceTimes[nbAlice++] = xbt_strdup("0"); + aliceTimes[nbAlice++] = NULL; + + char** bobTimes = xbt_new(char*, 9); + int nbBob = 0; + bobTimes[nbBob++] = xbt_strdup("0.9"); + bobTimes[nbBob++] = xbt_strdup("1"); + bobTimes[nbBob++] = xbt_strdup("1"); + bobTimes[nbBob++] = xbt_strdup("2"); + bobTimes[nbBob++] = xbt_strdup("2"); + bobTimes[nbBob++] = xbt_strdup("0"); + bobTimes[nbBob++] = xbt_strdup("0"); + bobTimes[nbBob++] = xbt_strdup("5"); + bobTimes[nbBob++] = NULL; + + + MSG_process_create_with_arguments(xbt_strdup("Alice"), peer, NULL, + h, 8, aliceTimes); + MSG_process_create_with_arguments(xbt_strdup("Bob"), peer, NULL, + h, 8, bobTimes); + + msg_error_t res = MSG_main(); + printf("Finished\n"); + return (res != MSG_OK); +} diff --git a/examples/msg/sendrecv/platform_sendrecv.xml b/examples/msg/sendrecv/platform_sendrecv.xml index 82ba2f97e0..25d1cf385d 100644 --- a/examples/msg/sendrecv/platform_sendrecv.xml +++ b/examples/msg/sendrecv/platform_sendrecv.xml @@ -3,9 +3,9 @@ - - - + + + diff --git a/examples/msg/small_platform.xml b/examples/msg/small_platform.xml index 9823e34576..677a35d23b 100644 --- a/examples/msg/small_platform.xml +++ b/examples/msg/small_platform.xml @@ -3,25 +3,25 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/small_platform_with_failures.xml b/examples/msg/small_platform_with_failures.xml index 8041c4d245..7995a5ffb3 100644 --- a/examples/msg/small_platform_with_failures.xml +++ b/examples/msg/small_platform_with_failures.xml @@ -3,23 +3,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/examples/msg/small_platform_with_routers.xml b/examples/msg/small_platform_with_routers.xml index fc3233f8c8..ebc944db16 100644 --- a/examples/msg/small_platform_with_routers.xml +++ b/examples/msg/small_platform_with_routers.xml @@ -2,31 +2,31 @@ - - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/examples/msg/tracing/platform.xml b/examples/msg/tracing/platform.xml index 81a1d91fa3..552c92f55c 100644 --- a/examples/msg/tracing/platform.xml +++ b/examples/msg/tracing/platform.xml @@ -2,21 +2,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/examples/platforms/bypassASroute.xml b/examples/platforms/bypassASroute.xml index 3b6623c5bf..7380d4f6b4 100644 --- a/examples/platforms/bypassASroute.xml +++ b/examples/platforms/bypassASroute.xml @@ -3,18 +3,18 @@ + radical="1" power="1Gf" bw="125MBps" lat="50us"/> + radical="2" power="1Gf" bw="125MBps" lat="50us"/> + radical="3" power="1Gf" bw="125MBps" lat="50us"/> - - - - + + + + - - + + - - - + + + - - - - - - - + + + + + + + @@ -46,7 +46,7 @@ - + - + - + - + - - + + - - + + - - + + @@ -27,11 +26,11 @@ - + - - - + + + @@ -39,40 +38,63 @@ - - - + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + @@ -81,11 +103,11 @@ - + - - - + + + @@ -93,34 +115,114 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + - - + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + @@ -129,11 +231,11 @@ - + - - - + + + @@ -141,16 +243,55 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - + + + + + + + + diff --git a/examples/platforms/cluster.xml b/examples/platforms/cluster.xml index 18db17a434..4b67f5b8f4 100644 --- a/examples/platforms/cluster.xml +++ b/examples/platforms/cluster.xml @@ -13,7 +13,7 @@ + radical="0-99" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> diff --git a/examples/platforms/cluster_and_one_host.xml b/examples/platforms/cluster_and_one_host.xml index 67a9430ca4..179f4050cf 100644 --- a/examples/platforms/cluster_and_one_host.xml +++ b/examples/platforms/cluster_and_one_host.xml @@ -3,14 +3,14 @@ - + - + diff --git a/examples/platforms/cluster_no_backbone.xml b/examples/platforms/cluster_no_backbone.xml index a5ac5140b4..f481a7b59d 100644 --- a/examples/platforms/cluster_no_backbone.xml +++ b/examples/platforms/cluster_no_backbone.xml @@ -16,6 +16,6 @@ + radical="0-262144" power="1Gf" bw="125MBps" lat="50us"/> diff --git a/examples/platforms/cluster_routing_rulebased.xml b/examples/platforms/cluster_routing_rulebased.xml deleted file mode 100644 index 1ab2accebe..0000000000 --- a/examples/platforms/cluster_routing_rulebased.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/platforms/clusters_routing_full.xml b/examples/platforms/clusters_routing_full.xml index 4598d7c8d6..b7bd013ab9 100644 --- a/examples/platforms/clusters_routing_full.xml +++ b/examples/platforms/clusters_routing_full.xml @@ -26,14 +26,14 @@ + power="1Gf" bw="125MBps" lat="50us" bb_bw="2.25GBps" + bb_lat="500us" /> + power="1Gf" bw="125MBps" lat="50us" bb_bw="2.25GBps" + bb_lat="500us" /> - + diff --git a/examples/platforms/conf/gridpp_grid_2004.xml b/examples/platforms/conf/gridpp_grid_2004.xml index d7a79173fd..af2d582016 100644 --- a/examples/platforms/conf/gridpp_grid_2004.xml +++ b/examples/platforms/conf/gridpp_grid_2004.xml @@ -49,27 +49,27 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -87,44 +87,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/conf/lcg_sept2004_grid.xml b/examples/platforms/conf/lcg_sept2004_grid.xml index c97214e352..fced84a585 100644 --- a/examples/platforms/conf/lcg_sept2004_grid.xml +++ b/examples/platforms/conf/lcg_sept2004_grid.xml @@ -2,74 +2,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -105,133 +105,133 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/config.xml b/examples/platforms/config.xml index 1c1827aa45..8f370186b1 100644 --- a/examples/platforms/config.xml +++ b/examples/platforms/config.xml @@ -12,12 +12,12 @@ - - + + - - - + + + diff --git a/examples/platforms/content/storage_content.txt b/examples/platforms/content/storage_content.txt index fad5a1fc23..5b444d1661 100644 --- a/examples/platforms/content/storage_content.txt +++ b/examples/platforms/content/storage_content.txt @@ -1,499 +1,499 @@ --rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx --rw-r--r-- 1 user user 1262 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml --rw-r--r-- 1 user user 148 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/Main.cxx --rw-r--r-- 1 user user 870 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/Slave.cxx --rw-r--r-- 1 user user 65 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx --rw-r--r-- 1 user user 1891 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/Master.cxx --rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml --rw-r--r-- 1 user user 1137 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx --rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx --rw-r--r-- 1 user user 148 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/Main.cxx --rw-r--r-- 1 user user 693 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/Slave.cxx --rw-r--r-- 1 user user 65 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/BasicTask.cxx --rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/basic_platform.xml --rw-r--r-- 1 user user 2148 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/Master.cxx --rw-r--r-- 1 user user 1188 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/basic_deployment.xml --rw-r--r-- 1 user user 1244 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/Forwarder.cxx --rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/FinalizeTask.cxx --rw-r--r-- 1 user user 148 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/Main.cxx --rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_platform.xml --rw-r--r-- 1 user user 913 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/Slave.cxx --rw-r--r-- 1 user user 65 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/BasicTask.cxx --rw-r--r-- 1 user user 1188 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_deployment.xml --rw-r--r-- 1 user user 1896 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/Master.cxx --rw-r--r-- 1 user user 1181 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/Forwarder.cxx --rw-r--r-- 1 user user 149 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/Main.cxx --rw-r--r-- 1 user user 1073 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/Sender.cxx --rw-r--r-- 1 user user 275 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/ping_pong_deployment.xml --rw-r--r-- 1 user user 4718 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/ping_pong_platform.xml --rw-r--r-- 1 user user 957 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/Receiver.cxx --rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/PingPongTask.cxx --rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/FinalizeTask.cxx --rw-r--r-- 1 user user 146 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/Main.cxx --rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/CommTimeTask.cxx --rw-r--r-- 1 user user 889 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/Slave.cxx --rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/comm_time_platform.xml --rw-r--r-- 1 user user 1730 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/Master.cxx --rw-r--r-- 1 user user 1884 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/comm_time_deployment.xml --rw-r--r-- 1 user user 150 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/Main.cxx --rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/suspend_platform.xml --rw-r--r-- 1 user user 187 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/suspend_deployment.xml --rw-r--r-- 1 user user 826 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/DreamMaster.cxx --rw-r--r-- 1 user user 429 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/LazyGuy.cxx --rw-r--r-- 1 user user 1387 2011-10-05 16:04 ./doc/simgrid/examples/smpi/mc_bugged2.c --rw-r--r-- 1 user user 3496 2011-10-05 16:04 ./doc/simgrid/examples/smpi/scatter.c --rw-r--r-- 1 user user 1411 2011-10-05 16:04 ./doc/simgrid/examples/smpi/mc_bugged1.c --rw-r--r-- 1 user user 649 2011-10-05 16:04 ./doc/simgrid/examples/smpi/get_processor_name.c --rw-r--r-- 1 user user 1857 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/README --rw-r--r-- 1 user user 347 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-sampling/README --rw-r--r-- 1 user user 3300 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-sampling/randlc.c --rw-r--r-- 1 user user 13723 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-sampling/ep.c --rw-r--r-- 1 user user 347 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-trace/README --rw-r--r-- 1 user user 3300 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-trace/randlc.c --rw-r--r-- 1 user user 13850 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-trace/ep-trace.c --rw-r--r-- 1 user user 394 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/config/NAS.samples/README --rw-r--r-- 1 user user 38276 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/IS-trace/is-trace.c --rw-r--r-- 1 user user 999 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-trace/README --rw-r--r-- 1 user user 5451 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-trace/DGraph.c --rw-r--r-- 1 user user 23031 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-trace/dt.c --rw-r--r-- 1 user user 38077 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/IS/is.c --rw-r--r-- 1 user user 2406 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MPI_dummy/README --rw-r--r-- 1 user user 5660 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MPI_dummy/mpi_dummy.c --rw-r--r-- 1 user user 1700 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime_sgi64.c --rw-r--r-- 1 user user 228 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime.c --rw-r--r-- 1 user user 1441 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/common/randdp.c --rw-r--r-- 1 user user 1159 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/common/c_timers.c --rw-r--r-- 1 user user 3086 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/common/c_print_results.c --rw-r--r-- 1 user user 1461 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/sys/README --rw-r--r-- 1 user user 38805 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/sys/setparams.c --rw-r--r-- 1 user user 926 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/SP/README --rw-r--r-- 1 user user 276 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/FT/README --rw-r--r-- 1 user user 999 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT/README --rw-r--r-- 1 user user 5451 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT/DGraph.c --rw-r--r-- 1 user user 22620 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT/dt.c --rw-r--r-- 1 user user 347 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP/README --rw-r--r-- 1 user user 3300 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP/randlc.c --rw-r--r-- 1 user user 13688 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP/ep.c --rw-r--r-- 1 user user 999 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-folding/README --rw-r--r-- 1 user user 5451 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-folding/DGraph.c --rw-r--r-- 1 user user 22704 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-folding/dt.c --rw-r--r-- 1 user user 5465 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MG/README --rw-r--r-- 1 user user 983 2011-10-05 16:04 ./doc/simgrid/examples/smpi/bcast.c --rw-r--r-- 1 user user 628 2011-10-05 16:04 ./doc/simgrid/examples/smpi/compute2.c --rw-r--r-- 1 user user 1652 2011-10-05 16:04 ./doc/simgrid/examples/smpi/sendrecv.c --rw-r--r-- 1 user user 2135 2011-10-05 16:04 ./doc/simgrid/examples/smpi/allreduce.c --rw-r--r-- 1 user user 7069 2011-10-05 16:04 ./doc/simgrid/examples/smpi/mvmul.c --rw-r--r-- 1 user user 4441 2011-10-05 16:04 ./doc/simgrid/examples/smpi/alltoallv.c --rw-r--r-- 1 user user 8529 2011-10-05 16:04 ./doc/simgrid/examples/smpi/smpi_traced.c --rw-r--r-- 1 user user 816 2011-10-05 16:04 ./doc/simgrid/examples/smpi/compute3.c --rw-r--r-- 1 user user 3545 2011-10-05 16:04 ./doc/simgrid/examples/smpi/reduce.c --rw-r--r-- 1 user user 2466 2011-10-05 16:04 ./doc/simgrid/examples/smpi/bcbench.c --rw-r--r-- 1 user user 1273 2011-10-05 16:04 ./doc/simgrid/examples/smpi/ttest01.c --rw-r--r-- 1 user user 622 2011-10-05 16:04 ./doc/simgrid/examples/smpi/compute.c --rw-r--r-- 1 user user 766 2011-10-05 16:04 ./doc/simgrid/examples/smpi/barrier.c --rw-r--r-- 1 user user 1453 2011-10-05 16:04 ./doc/simgrid/examples/smpi/alltoall_basic.c --rw-r--r-- 1 user user 2286 2011-10-05 16:04 ./doc/simgrid/examples/smpi/pingpong.c --rw-r--r-- 1 user user 2799 2011-10-05 16:04 ./doc/simgrid/examples/smpi/alltoall2.c --rw-r--r-- 1 user user 705 2011-10-05 16:04 ./doc/simgrid/examples/smpi/split.c --rw-r--r-- 1 user user 1970 2011-10-05 16:04 ./doc/simgrid/examples/xbt/sem_basic.c --rw-r--r-- 1 user user 7207 2011-10-05 16:04 ./doc/simgrid/examples/xbt/sem_sched.c --rw-r--r-- 1 user user 4582 2011-10-05 16:04 ./doc/simgrid/examples/msg/small_platform.xml --rw-r--r-- 1 user user 4805 2011-10-05 16:04 ./doc/simgrid/examples/msg/README --rw-r--r-- 1 user user 272 2011-10-05 16:04 ./doc/simgrid/examples/msg/properties/deployment_properties.xml --rw-r--r-- 1 user user 3853 2011-10-05 16:04 ./doc/simgrid/examples/msg/properties/msg_prop.c --rw-r--r-- 1 user user 856 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3links-p.xml --rw-r--r-- 1 user user 582 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/dogbone-d.xml --rw-r--r-- 1 user user 1817 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/Two_clusters.xml --rw-r--r-- 1 user user 927 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3links-d.xml --rw-r--r-- 1 user user 1280 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3links-d-timer.xml --rw-r--r-- 1 user user 5177 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/ns3.c --rw-r--r-- 1 user user 369 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/Two_clusters-d.xml --rw-r--r-- 1 user user 367 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/One_cluster-d.xml --rw-r--r-- 1 user user 1497 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/dogbone-p.xml --rw-r--r-- 1 user user 566 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3hosts_2links_p.xml --rw-r--r-- 1 user user 352 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3hosts_2links_d.xml --rw-r--r-- 1 user user 658 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/One_cluster.xml --rw-r--r-- 1 user user 2922 2011-10-05 16:04 ./doc/simgrid/examples/msg/migration/migration.c --rw-r--r-- 1 user user 4746 2011-10-05 16:04 ./doc/simgrid/examples/msg/small_platform_with_failures.xml --rw-r--r-- 1 user user 972 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/small_platform.xml --rw-r--r-- 1 user user 678 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer.xml --rw-r--r-- 1 user user 891 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer05.xml --rw-r--r-- 1 user user 855 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer02.xml --rw-r--r-- 1 user user 4276 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/peer2.c --rw-r--r-- 1 user user 851 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer03.xml --rw-r--r-- 1 user user 852 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer04.xml --rw-r--r-- 1 user user 5102 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/peer.c --rw-r--r-- 1 user user 855 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer01.xml --rw-r--r-- 1 user user 5258 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/peer3.c --rw-r--r-- 1 user user 654 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml --rw-r--r-- 1 user user 5423 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_task/test_ptask.c --rw-r--r-- 1 user user 2380 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_task/test_ptask_platform.xml --rw-r--r-- 1 user user 2708 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_task/parallel_task.c --rw-r--r-- 1 user user 6217 2011-10-05 16:04 ./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c --rw-r--r-- 1 user user 598 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test9.xml --rw-r--r-- 1 user user 372 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test3.xml --rw-r--r-- 1 user user 206 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test_trace_integration.xml --rw-r--r-- 1 user user 370 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test2.xml --rw-r--r-- 1 user user 501 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test7.xml --rw-r--r-- 1 user user 683 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test11.xml --rw-r--r-- 1 user user 371 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test4.xml --rw-r--r-- 1 user user 598 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test10.xml --rw-r--r-- 1 user user 372 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test6.xml --rw-r--r-- 1 user user 498 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test8.xml --rw-r--r-- 1 user user 371 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test5.xml --rw-r--r-- 1 user user 1960 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test_trace_integration.c --rw-r--r-- 1 user user 366 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test1.xml --rw-r--r-- 1 user user 1002 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/pcontexts_platform.xml --rw-r--r-- 1 user user 467 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts2_4.xml --rw-r--r-- 1 user user 2236 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/pcontexts2.c --rw-r--r-- 1 user user 242 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_2.xml --rw-r--r-- 1 user user 353 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_4.xml --rw-r--r-- 1 user user 1752 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/pcontexts.c --rw-r--r-- 1 user user 800 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/deployment.xml --rw-r--r-- 1 user user 4374 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/ms.c --rw-r--r-- 1 user user 3930 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/platform.xml --rw-r--r-- 1 user user 3594 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/tasks.c --rw-r--r-- 1 user user 223 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/procmig-deploy.xml --rw-r--r-- 1 user user 3282 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/procmig.c --rw-r--r-- 1 user user 3358 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/categories.c --rw-r--r-- 1 user user 689 2011-10-05 16:04 ./doc/simgrid/examples/msg/sendrecv/README --rw-r--r-- 1 user user 321 2011-10-05 16:04 ./doc/simgrid/examples/msg/sendrecv/deployment_sendrecv.xml --rw-r--r-- 1 user user 5098 2011-10-05 16:04 ./doc/simgrid/examples/msg/sendrecv/sendrecv.c --rw-r--r-- 1 user user 528 2011-10-05 16:04 ./doc/simgrid/examples/msg/sendrecv/platform_sendrecv.xml --rw-r--r-- 1 user user 439 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/onelink-p.xml --rw-r--r-- 1 user user 575 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/fullduplex-p.xml --rw-r--r-- 1 user user 576 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/dogbone-d.xml --rw-r--r-- 1 user user 46642 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/waxman-d.xml --rw-r--r-- 1 user user 4964600 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/waxman-p.xml --rw-r--r-- 1 user user 1029 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/fullduplex-d.xml --rw-r--r-- 1 user user 356 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/onelink-d.xml --rw-r--r-- 1 user user 6172 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/gtnets.c --rw-r--r-- 1 user user 1482 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/dogbone-p.xml --rw-r--r-- 1 user user 9688 2011-10-05 16:04 ./doc/simgrid/examples/msg/pmm/msg_pmm.c --rw-r--r-- 1 user user 786 2011-10-05 16:04 ./doc/simgrid/examples/msg/pmm/pmm_9_deploy.xml --rw-r--r-- 1 user user 1378 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/bugged1.c --rw-r--r-- 1 user user 377 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_bugged3.xml --rw-r--r-- 1 user user 925 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_mutex.xml --rw-r--r-- 1 user user 876 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/platform.xml --rw-r--r-- 1 user user 377 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_bugged2.xml --rw-r--r-- 1 user user 563 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/random_test.c --rw-r--r-- 1 user user 459 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_bugged1.xml --rw-r--r-- 1 user user 1827 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/bugged3.c --rw-r--r-- 1 user user 468 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_random_test.xml --rw-r--r-- 1 user user 1957 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/bugged2.c --rw-r--r-- 1 user user 3375 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/centralized_mutex.c --rw-r--r-- 1 user user 1007 2011-10-05 16:04 ./doc/simgrid/examples/msg/token_ring/two_clusters.xml --rw-r--r-- 1 user user 4205 2011-10-05 16:04 ./doc/simgrid/examples/msg/token_ring/ring_call.c --rw-r--r-- 1 user user 556 2011-10-05 16:04 ./doc/simgrid/examples/msg/token_ring/two_peers.xml --rw-r--r-- 1 user user 2261806 2011-10-05 16:04 ./doc/simgrid/examples/msg/msg_platform.xml --rw-r--r-- 1 user user 406 2011-10-05 16:04 ./doc/simgrid/examples/msg/priority/deployment_priority.xml --rw-r--r-- 1 user user 2394 2011-10-05 16:04 ./doc/simgrid/examples/msg/priority/priority.c --rw-r--r-- 1 user user 19339 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/actions.c --rw-r--r-- 1 user user 249 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/deployment.xml --rw-r--r-- 1 user user 6805 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform_flat.xml --rw-r--r-- 1 user user 387 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform.xml --rw-r--r-- 1 user user 605 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/NAS_LU_S_4/deploy_MPI_4.xml --rw-r--r-- 1 user user 1066 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/toto.xml --rw-r--r-- 1 user user 1066 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/titi.xml --rw-r--r-- 1 user user 525 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/deployment_split.xml --rw-r--r-- 1 user user 906 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/homogeneous_3_hosts.xml --rw-r--r-- 1 user user 224 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/bcast_deployment.xml --rw-r--r-- 1 user user 501 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/actions_deployment_split.xml --rw-r--r-- 1 user user 9082 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_bypass.c --rw-r--r-- 1 user user 990 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox.xml --rw-r--r-- 1 user user 6773 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_cluster.c --rw-r--r-- 1 user user 3952 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_console.c --rw-r--r-- 1 user user 930 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/platform_clusters.xml --rw-r--r-- 1 user user 1078 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox_multicore.xml --rw-r--r-- 1 user user 7120 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_failure.c --rw-r--r-- 1 user user 4170 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave_vivaldi.xml --rw-r--r-- 1 user user 1382 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave_forwarder.xml --rw-r--r-- 1 user user 6438 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_forwarder.c --rw-r--r-- 1 user user 2535 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/platform_script.lua --rw-r--r-- 1 user user 998 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave.xml --rw-r--r-- 1 user user 6805 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/jumbo_deployment.xml --rw-r--r-- 1 user user 878 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/jumbo_deployment_masterslave_mailbox.xml --rw-r--r-- 1 user user 4118 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_mailbox.c --rw-r--r-- 1 user user 2692 2011-10-05 16:04 ./doc/simgrid/examples/msg/suspend/suspend.c --rw-r--r-- 1 user user 183 2011-10-05 16:04 ./doc/simgrid/examples/msg/suspend/deployment_suspend.xml --rw-r--r-- 1 user user 5295 2011-10-05 16:04 ./doc/simgrid/examples/msg/small_platform_with_routers.xml --rw-r--r-- 1 user user 13992 2011-10-05 16:04 ./doc/simgrid/examples/msg/chord/chord90.xml --rw-r--r-- 1 user user 2236 2011-10-05 16:04 ./doc/simgrid/examples/msg/chord/chord.xml --rw-r--r-- 1 user user 1624671 2011-10-05 16:04 ./doc/simgrid/examples/msg/chord/chord10k.xml --rw-r--r-- 1 user user 28995 2011-10-05 16:04 ./doc/simgrid/examples/msg/chord/chord.c --rw-r--r-- 1 user user 4628 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/quicksort_platform.xml --rw-r--r-- 1 user user 227 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/mult_matrix.lua --rw-r--r-- 1 user user 1199 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/receiver.lua --rw-r--r-- 1 user user 524 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/quicksort_deployment.xml --rw-r--r-- 1 user user 748 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/sender.lua --rw-r--r-- 1 user user 2196 2011-10-05 16:04 ./doc/simgrid/examples/lua/mult_matrix.lua --rw-r--r-- 1 user user 1416 2011-10-05 16:04 ./doc/simgrid/examples/lua/README --rw-r--r-- 1 user user 879 2011-10-05 16:04 ./doc/simgrid/examples/lua/deploy.xml --rw-r--r-- 1 user user 1125 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/master.lua --rw-r--r-- 1 user user 729 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/slave.lua --rw-r--r-- 1 user user 1950 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/splay_platform.lua --rw-r--r-- 1 user user 304 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/splay_ctrl.lua --rw-r--r-- 1 user user 487 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/splay_deploy_masterslave.lua --rw-r--r-- 1 user user 1390 2011-10-05 16:04 ./doc/simgrid/examples/lua/tracing/master.lua --rw-r--r-- 1 user user 713 2011-10-05 16:04 ./doc/simgrid/examples/lua/tracing/slave.lua --rw-r--r-- 1 user user 491 2011-10-05 16:04 ./doc/simgrid/examples/lua/tracing/master_slave_trace.lua --rw-r--r-- 1 user user 2298 2011-10-05 16:04 ./doc/simgrid/examples/lua/SimSplay/sim_splay.lua --rw-r--r-- 1 user user 402 2011-10-05 16:04 ./doc/simgrid/examples/lua/SimSplay/splay_school.lua --rw-r--r-- 1 user user 1906 2011-10-05 16:04 ./doc/simgrid/examples/lua/SimSplay/chord.lua --rw-r--r-- 1 user user 1706 2011-10-05 16:04 ./doc/simgrid/examples/lua/SimSplay/platform_script.lua --rw-r--r-- 1 user user 1125 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/master.lua --rw-r--r-- 1 user user 480 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/deploy.lua --rw-r--r-- 1 user user 730 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/slave.lua --rw-r--r-- 1 user user 2424 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/platform.lua --rw-r--r-- 1 user user 158 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/master_slave_bypass.lua --rw-r--r-- 1 user user 1125 2011-10-05 16:04 ./doc/simgrid/examples/lua/masterslave/master.lua --rw-r--r-- 1 user user 730 2011-10-05 16:04 ./doc/simgrid/examples/lua/masterslave/slave.lua --rw-r--r-- 1 user user 2424 2011-10-05 16:04 ./doc/simgrid/examples/lua/masterslave/platform.lua --rw-r--r-- 1 user user 378 2011-10-05 16:04 ./doc/simgrid/examples/lua/masterslave/master_slave.lua --rw-r--r-- 1 user user 3012 2011-10-05 16:04 ./doc/simgrid/examples/simdag/properties/sd_prop.c --rw-r--r-- 1 user user 9663 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Strassen.xml --rw-r--r-- 1 user user 23087 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Montage_25.xml --rw-r--r-- 1 user user 267014 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Sipht_30.xml --rw-r--r-- 1 user user 4346 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/dax_test.c --rw-r--r-- 1 user user 48868 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Montage_50.xml --rw-r--r-- 1 user user 28774 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Inspiral_30.xml --rw-r--r-- 1 user user 289 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/sagittaire.xml --rw-r--r-- 1 user user 11328 2011-10-05 16:04 ./doc/simgrid/examples/simdag/scheduling/minmin_test.c --rw-r--r-- 1 user user 23087 2011-10-05 16:04 ./doc/simgrid/examples/simdag/scheduling/Montage_25.xml --rw-r--r-- 1 user user 5670 2011-10-05 16:04 ./doc/simgrid/examples/simdag/scheduling/simulacrum_7_hosts.xml --rw-r--r-- 1 user user 4153 2011-10-05 16:04 ./doc/simgrid/examples/simdag/sd_seq_access.c --rw-r--r-- 1 user user 6976 2011-10-05 16:04 ./doc/simgrid/examples/simdag/sd_test_console.c --rw-r--r-- 1 user user 2207 2011-10-05 16:04 ./doc/simgrid/examples/simdag/metaxml/sd_meta.c --rw-r--r-- 1 user user 14326 2011-10-05 16:04 ./doc/simgrid/examples/simdag/2clusters.xml --rw-r--r-- 1 user user 7538 2011-10-05 16:04 ./doc/simgrid/examples/simdag/sd_test2.c --rw-r--r-- 1 user user 1864 2011-10-05 16:04 ./doc/simgrid/examples/simdag/platform_script.lua --rw-r--r-- 1 user user 4354 2011-10-05 16:04 ./doc/simgrid/examples/simdag/simdag_trace.c --rw-r--r-- 1 user user 6964 2011-10-05 16:04 ./doc/simgrid/examples/simdag/sd_test.c --rw-r--r-- 1 user user 1622 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dot/dot_test2.c --rw-r--r-- 1 user user 3590 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dot/simulate_dot.c --rw-r--r-- 1 user user 4002 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dot/dot_test.c --rw-r--r-- 1 user user 17028 2011-10-05 16:04 ./doc/simgrid/examples/platforms/g5k.xml --rw-r--r-- 1 user user 482 2011-10-05 16:04 ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml --rw-r--r-- 1 user user 22645 2011-10-05 16:04 ./doc/simgrid/examples/platforms/g5k_cabinets.xml --rw-r--r-- 1 user user 4028 2011-10-05 16:04 ./doc/simgrid/examples/platforms/nancy.xml --rw-r--r-- 1 user user 15970 2011-10-05 16:04 ./doc/simgrid/examples/platforms/lcg_sept2004_grid.xml --rw-r--r-- 1 user user 930 2011-10-05 16:04 ./doc/simgrid/examples/platforms/Two_clusters.xml --rw-r--r-- 1 user user 3274 2011-10-05 16:04 ./doc/simgrid/examples/platforms/vivaldi.xml --rw-r--r-- 1 user user 6096 2011-10-05 16:04 ./doc/simgrid/examples/platforms/gridpp_grid_2004.xml --rw-r--r-- 1 user user 1879 2011-10-05 16:04 ./doc/simgrid/examples/platforms/griffon.xml --rw-r--r-- 1 user user 28125 2011-10-05 16:04 ./doc/simgrid/examples/platforms/median_harvard.xml --rw-r--r-- 1 user user 1273 2011-10-05 16:04 ./doc/simgrid/examples/platforms/prop.xml --rw-r--r-- 1 user user 661 2011-10-05 16:04 ./doc/simgrid/examples/platforms/One_cluster.xml --rw-r--r-- 1 user user 2323 2011-10-05 16:04 ./doc/simgrid/examples/platforms/gdx.xml --rw-r--r-- 1 user user 222 2011-10-05 16:04 ./doc/simgrid/examples/platforms/multicore_machine.xml --rw-r--r-- 1 user user 36192 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__str.html --rw-r--r-- 1 user user 14505 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__decl.html --rw-r--r-- 1 user user 2130 2011-10-05 16:04 ./doc/simgrid/html/bug.html --rw-r--r-- 1 user user 10658 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__C.html --rw-r--r-- 1 user user 2512 2011-10-05 16:04 ./doc/simgrid/html/structs__xbt__strbuff__t.html --rw-r--r-- 1 user user 4803 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html --rw-r--r-- 1 user user 11932 2011-10-05 16:04 ./doc/simgrid/html/simgrid_modules2.png --rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html --rw-r--r-- 1 user user 13562 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__actions.html --rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_intra.html --rw-r--r-- 1 user user 8326 2011-10-05 16:04 ./doc/simgrid/html/simgrid_logo_small.png --rw-r--r-- 1 user user 4203 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__resources.html --rw-r--r-- 1 user user 2751 2011-10-05 16:04 ./doc/simgrid/html/structsurf__cpu__model__extension__public.html --rw-r--r-- 1 user user 1095 2011-10-05 16:04 ./doc/simgrid/html/tabs.css --rw-r--r-- 1 user user 6991 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set.html --rw-r--r-- 1 user user 9653 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__curs.html --rw-r--r-- 1 user user 10014 2011-10-05 16:04 ./doc/simgrid/html/structxbt__ex__t.html --rw-r--r-- 1 user user 5794 2011-10-05 16:04 ./doc/simgrid/html/pages.html --rw-r--r-- 1 user user 30160 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html --rw-r--r-- 1 user user 6276 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__API.html --rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html --rw-r--r-- 1 user user 3202 2011-10-05 16:04 ./doc/simgrid/html/todo.html --rw-r--r-- 1 user user 159 2011-10-05 16:04 ./doc/simgrid/html/nav_f.png --rw-r--r-- 1 user user 23050 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__queue.html --rw-r--r-- 1 user user 9876 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__cons.html --rw-r--r-- 1 user user 17707 2011-10-05 16:04 ./doc/simgrid/html/structsurf__model.html --rw-r--r-- 1 user user 43212 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_asynchronous_communications.html --rw-r--r-- 1 user user 30326 2011-10-05 16:04 ./doc/simgrid/html/Paje_MSG_screenshot_thn.jpg --rw-r--r-- 1 user user 2783 2011-10-05 16:04 ./doc/simgrid/html/structsurf__network__model__extension__public.html --rw-r--r-- 1 user user 2621 2011-10-05 16:04 ./doc/simgrid/html/structsurf__model__description.html --rw-r--r-- 1 user user 19042 2011-10-05 16:04 ./doc/simgrid/html/group__m__host__management.html --rw-r--r-- 1 user user 14045 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__perl.html --rw-r--r-- 1 user user 12734 2011-10-05 16:04 ./doc/simgrid/html/modules.html --rw-r--r-- 1 user user 7707 2011-10-05 16:04 ./doc/simgrid/html/annotated.html --rw-r--r-- 1 user user 6191 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo.html --rw-r--r-- 1 user user 3765 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__parmap.html --rw-r--r-- 1 user user 58483 2011-10-05 16:04 ./doc/simgrid/html/tracing.html --rw-r--r-- 1 user user 2523 2011-10-05 16:04 ./doc/simgrid/html/structs__surf__metric__t.html --rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html --rw-r--r-- 1 user user 5923 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag.html --rw-r--r-- 1 user user 11436 2011-10-05 16:04 ./doc/simgrid/html/functions_vars.html --rw-r--r-- 1 user user 8194 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__type.html --rw-r--r-- 1 user user 60084 2011-10-05 16:04 ./doc/simgrid/html/win_install_02.png --rw-r--r-- 1 user user 8309 2011-10-05 16:04 ./doc/simgrid/html/simgrid_modules.png --rw-r--r-- 1 user user 8348 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__error.html --rw-r--r-- 1 user user 15743 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__cons.html --rw-r--r-- 1 user user 21536 2011-10-05 16:04 ./doc/simgrid/html/simgrid_logo.png --rw-r--r-- 1 user user 7717 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__misc.html --rw-r--r-- 1 user user 3460 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__context.html --rw-r--r-- 1 user user 8963 2011-10-05 16:04 ./doc/simgrid/html/group__m__channel__management.html --rw-r--r-- 1 user user 4188 2011-10-05 16:04 ./doc/simgrid/html/structm__task.html --rw-r--r-- 1 user user 8561 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__curs.html --rw-r--r-- 1 user user 60965 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__log.html --rw-r--r-- 1 user user 118 2011-10-05 16:04 ./doc/simgrid/html/open.png --rw-r--r-- 1 user user 9008 2011-10-05 16:04 ./doc/simgrid/html/group__msg__simulation.html --rw-r--r-- 1 user user 11976 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__cursor.html --rw-r--r-- 1 user user 5102 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__log__cats.html --rw-r--r-- 1 user user 55802 2011-10-05 16:04 ./doc/simgrid/html/win_install_03.png --rw-r--r-- 1 user user 3249 2011-10-05 16:04 ./doc/simgrid/html/poster_thumbnail.png --rw-r--r-- 1 user user 7557 2011-10-05 16:04 ./doc/simgrid/html/group__m__datatypes__management__details.html --rw-r--r-- 1 user user 24314 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__basic.html --rw-r--r-- 1 user user 61053 2011-10-05 16:04 ./doc/simgrid/html/win_install_01.png --rw-r--r-- 1 user user 126 2011-10-05 16:04 ./doc/simgrid/html/closed.png --rw-r--r-- 1 user user 6958 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__adt.html --rw-r--r-- 1 user user 9659 2011-10-05 16:04 ./doc/simgrid/html/index.html --rw-r--r-- 1 user user 17867 2011-10-05 16:04 ./doc/simgrid/html/group__SD__link__management.html --rw-r--r-- 1 user user 5443 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__JAVA.html --rw-r--r-- 1 user user 10385 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__simulation.html --rw-r--r-- 1 user user 4188 2011-10-05 16:04 ./doc/simgrid/html/structm__host.html --rw-r--r-- 1 user user 22436 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__array.html --rw-r--r-- 1 user user 386 2011-10-05 16:04 ./doc/simgrid/html/simgrid.css --rw-r--r-- 1 user user 15389 2011-10-05 16:04 ./doc/simgrid/html/group__SD__task__dependency__management.html --rw-r--r-- 1 user user 7225 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__grounding.html --rw-r--r-- 1 user user 11863 2011-10-05 16:04 ./doc/simgrid/html/pls.html --rw-r--r-- 1 user user 12693 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__ctn.html --rw-r--r-- 1 user user 11564 2011-10-05 16:04 ./doc/simgrid/html/functions.html --rw-r--r-- 1 user user 9616 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__speed.html --rw-r--r-- 1 user user 24837 2011-10-05 16:04 ./doc/simgrid/html/installSimgrid.html --rw-r--r-- 1 user user 59769 2011-10-05 16:04 ./doc/simgrid/html/triva-graph_configuration.png --rw-r--r-- 1 user user 55335 2011-10-05 16:04 ./doc/simgrid/html/triva-graph_visualization.png --rw-r--r-- 1 user user 51294 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave.html --rw-r--r-- 1 user user 3942 2011-10-05 16:04 ./doc/simgrid/html/doxygen.png --rw-r--r-- 1 user user 10757 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator__cons.html --rw-r--r-- 1 user user 125324 2011-10-05 16:04 ./doc/simgrid/html/group__API__index.html --rw-r--r-- 1 user user 9746 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__cons.html --rw-r--r-- 1 user user 19885 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__func.html --rw-r--r-- 1 user user 4674 2011-10-05 16:04 ./doc/simgrid/html/group__SimGrid__API.html --rw-r--r-- 1 user user 9591 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__misc.html --rw-r--r-- 1 user user 5121 2011-10-05 16:04 ./doc/simgrid/html/structxbt__set__elm__.html --rw-r--r-- 1 user user 19320 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__get.html --rw-r--r-- 1 user user 23685 2011-10-05 16:04 ./doc/simgrid/html/bindings.html --rw-r--r-- 1 user user 6916 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict.html --rw-r--r-- 1 user user 3904 2011-10-05 16:04 ./doc/simgrid/html/use.html --rw-r--r-- 1 user user 20935 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__basic.html --rw-r--r-- 1 user user 23682 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__graph.html --rw-r--r-- 1 user user 6444 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator.html --rw-r--r-- 1 user user 11076 2011-10-05 16:04 ./doc/simgrid/html/structsurf__workstation__model__extension__public.html --rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis.html --rw-r--r-- 1 user user 4663 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__misc.html --rw-r--r-- 1 user user 226 2011-10-05 16:04 ./doc/simgrid/html/simdag.html --rw-r--r-- 1 user user 340759 2011-10-05 16:04 ./doc/simgrid/html/Paje_MSG_screenshot.jpg --rw-r--r-- 1 user user 65293 2011-10-05 16:04 ./doc/simgrid/html/group__msg__gos__functions.html --rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html --rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_extern.html --rw-r--r-- 1 user user 5094 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__LUA.html --rw-r--r-- 1 user user 14081 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar.html --rw-r--r-- 1 user user 2480 2011-10-05 16:04 ./doc/simgrid/html/structs__model__type.html --rw-r--r-- 1 user user 19296 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__synchro.html --rw-r--r-- 1 user user 677 2011-10-05 16:04 ./doc/simgrid/html/bc_s.png --rw-r--r-- 1 user user 6934 2011-10-05 16:04 ./doc/simgrid/html/classes.html --rw-r--r-- 1 user user 29778 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__direct.html --rw-r--r-- 1 user user 37757 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__use.html --rw-r--r-- 1 user user 9306 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator__objects.html --rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html --rw-r--r-- 1 user user 18525 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__multi.html --rw-r--r-- 1 user user 16459 2011-10-05 16:04 ./doc/simgrid/html/group__m__datatypes__management.html --rw-r--r-- 1 user user 178 2011-10-05 16:04 ./doc/simgrid/html/tab_b.png --rw-r--r-- 1 user user 45009 2011-10-05 16:04 ./doc/simgrid/html/group__SD__simulation.html --rw-r--r-- 1 user user 50885 2011-10-05 16:04 ./doc/simgrid/html/group__msg__easier__life.html --rw-r--r-- 1 user user 35307 2011-10-05 16:04 ./doc/simgrid/html/group__m__task__management.html --rw-r--r-- 1 user user 140 2011-10-05 16:04 ./doc/simgrid/html/tab_a.png --rw-r--r-- 1 user user 16354 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__config.html --rw-r--r-- 1 user user 7629 2011-10-05 16:04 ./doc/simgrid/html/options.html --rw-r--r-- 1 user user 18891 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__nnul.html --rw-r--r-- 1 user user 52033 2011-10-05 16:04 ./doc/simgrid/html/win_install_04.png --rw-r--r-- 1 user user 8353 2011-10-05 16:04 ./doc/simgrid/html/structsurf__action.html --rw-r--r-- 1 user user 32537 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__ex.html --rw-r--r-- 1 user user 6659 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__API.html --rw-r--r-- 1 user user 12350 2011-10-05 16:04 ./doc/simgrid/html/doxygen.css --rw-r--r-- 1 user user 7965 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__cons.html --rw-r--r-- 1 user user 7821 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__build__api.html --rw-r--r-- 1 user user 47169 2011-10-05 16:04 ./doc/simgrid/html/group__m__process__management.html --rw-r--r-- 1 user user 19747 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__curs.html --rw-r--r-- 1 user user 20816 2011-10-05 16:04 ./doc/simgrid/html/group__SD__datatypes__management.html --rw-r--r-- 1 user user 8379 2011-10-05 16:04 ./doc/simgrid/html/group__SD__API.html --rw-r--r-- 1 user user 4776 2011-10-05 16:04 ./doc/simgrid/html/group__SMPI__API.html --rw-r--r-- 1 user user 12131 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__perl.html --rw-r--r-- 1 user user 15874 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__register.html --rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_core.html --rw-r--r-- 1 user user 46397 2011-10-05 16:04 ./doc/simgrid/html/group__SD__workstation__management.html --rw-r--r-- 1 user user 4794 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_lua.html --rw-r--r-- 1 user user 6026 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__API.html --rw-r--r-- 1 user user 227 2011-10-05 16:04 ./doc/simgrid/html/msg.html --rw-r--r-- 1 user user 60347 2011-10-05 16:04 ./doc/simgrid/html/group__SD__task__management.html --rw-r--r-- 1 user user 10095 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__syscall.html --rw-r--r-- 1 user user 18482 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__heap.html --rw-r--r-- 1 user user 7301 2011-10-05 16:04 ./doc/simgrid/html/structsurf__action__state.html --rw-r--r-- 1 user user 189 2011-10-05 16:04 ./doc/simgrid/html/tab_s.png --rw-r--r-- 1 user user 192 2011-10-05 16:04 ./doc/simgrid/html/tab_h.png --rw-r--r-- 1 user user 97 2011-10-05 16:04 ./doc/simgrid/html/nav_h.png --rw-r--r-- 1 user user 4826 2011-10-05 16:04 ./include/smpi/mpif.h --rw-r--r-- 1 user user 1139 2012-03-13 14:44 ./include/smpi/smpif.h --rw-r--r-- 1 user user 510 2011-10-05 16:04 ./include/smpi/mpi.h --rw-r--r-- 1 user user 3187 2011-10-05 16:04 ./include/smpi/smpi_cocci.h --rw-r--r-- 1 user user 24101 2011-10-05 16:04 ./include/smpi/smpi.h --rw-r--r-- 1 user user 3626 2011-10-05 16:04 ./include/xbt/fifo.h --rw-r--r-- 1 user user 7459 2011-10-05 16:04 ./include/xbt/dict.h --rw-r--r-- 1 user user 2111 2011-10-05 16:04 ./include/xbt/str.h --rw-r--r-- 1 user user 25433 2011-10-05 16:04 ./include/xbt/log.h --rw-r--r-- 1 user user 8031 2011-10-05 16:04 ./include/xbt/misc.h --rw-r--r-- 1 user user 4477 2011-10-05 16:04 ./include/xbt/synchro_core.h --rw-r--r-- 1 user user 1976 2011-10-05 16:04 ./include/xbt/mmalloc.h --rw-r--r-- 1 user user 917 2011-10-05 16:04 ./include/xbt/replay_trace_reader.h --rw-r--r-- 1 user user 1111 2011-10-05 16:04 ./include/xbt/function_types.h --rw-r--r-- 1 user user 1281 2011-10-05 16:04 ./include/xbt/strbuff.h --rw-r--r-- 1 user user 684 2011-10-05 16:04 ./include/xbt/virtu.h --rw-r--r-- 1 user user 1871 2011-10-05 16:04 ./include/xbt/asserts.h --rw-r--r-- 1 user user 23255 2011-10-05 16:04 ./include/xbt/ex.h --rw-r--r-- 1 user user 5668 2011-10-05 16:04 ./include/xbt/graph.h --rw-r--r-- 1 user user 5474 2011-10-05 16:04 ./include/xbt/graphxml.h --rw-r--r-- 1 user user 2252 2011-10-05 16:04 ./include/xbt/queue.h --rw-r--r-- 1 user user 3027 2011-10-05 16:04 ./include/xbt/matrix.h --rw-r--r-- 1 user user 2422 2011-10-05 16:04 ./include/xbt/setset.h --rw-r--r-- 1 user user 743 2011-10-05 16:04 ./include/xbt/time.h --rw-r--r-- 1 user user 2014 2011-10-05 16:04 ./include/xbt/lib.h --rw-r--r-- 1 user user 1064 2011-10-05 16:04 ./include/xbt/hash.h --rw-r--r-- 1 user user 4383 2011-10-05 16:04 ./include/xbt/set.h --rw-r--r-- 1 user user 9224 2011-10-05 16:04 ./include/xbt/config.h --rw-r--r-- 1 user user 4941 2011-10-05 16:04 ./include/xbt/sysdep.h --rw-r--r-- 1 user user 5352 2011-10-05 16:04 ./include/xbt/swag.h --rw-r--r-- 1 user user 1926 2011-10-05 16:04 ./include/xbt/graphxml_parse.h --rw-r--r-- 1 user user 870 2011-10-05 16:04 ./include/xbt/peer.h --rw-r--r-- 1 user user 648 2011-10-05 16:04 ./include/xbt/module.h --rw-r--r-- 1 user user 5523 2011-10-05 16:04 ./include/xbt/cunit.h --rw-r--r-- 1 user user 1166 2011-10-05 16:04 ./include/xbt/parmap.h --rw-r--r-- 1 user user 2296 2011-10-05 16:04 ./include/xbt/mallocator.h --rw-r--r-- 1 user user 9553 2011-10-05 16:04 ./include/xbt/dynar.h --rw-r--r-- 1 user user 1444 2011-10-05 16:04 ./include/xbt/heap.h --rw-r--r-- 1 user user 876 2011-10-05 16:04 ./include/xbt.h --rw-r--r-- 1 user user 4635 2011-10-05 16:04 ./include/msg/datatypes.h --rw-r--r-- 1 user user 12038 2011-10-05 16:04 ./include/msg/msg.h --rw-r--r-- 1 user user 3641 2012-03-13 14:44 ./include/simgrid_config.h --rw-r--r-- 1 user user 96 2011-10-05 16:04 ./include/mc/modelchecker.h --rw-r--r-- 1 user user 23583 2011-10-05 16:04 ./include/surf/simgrid_dtd.h --rw-r--r-- 1 user user 1167 2011-10-05 16:04 ./include/surf/surf_routing.h --rw-r--r-- 1 user user 5343 2011-10-05 16:04 ./include/surf/surfxml_parse.h --rw-r--r-- 1 user user 5750 2011-10-05 16:04 ./include/instr/instr.h --rw-r--r-- 1 user user 10325 2011-10-05 16:04 ./include/simdag/simdag.h --rw-r--r-- 1 user user 3715 2011-10-05 16:04 ./include/simdag/datatypes.h --rw-r--r-- 1 user user 13003 2011-10-05 16:04 ./include/simix/simix.h --rw-r--r-- 1 user user 3346 2011-10-05 16:04 ./include/simix/datatypes.h --rw-r--r-- 1 user user 4040 2011-10-05 16:04 ./include/simix/context.h --rw-r--r-- 1 user user 12710497 2012-03-13 14:44 ./lib/libsimgrid.so.3.6.2 --rwxr-xr-x 1 user user 918 2012-03-13 14:44 ./bin/smpicc --rwxr-xr-x 1 user user 7292 2012-03-13 14:44 ./bin/smpirun --rwxr-xr-x 1 user user 1990 2012-03-13 14:44 ./bin/smpif2c --rwxr-xr-x 1 user user 5018 2011-10-05 16:04 ./bin/simgrid_update_xml --rwxr-xr-x 1 user user 66986 2012-03-13 14:44 ./bin/graphicator --rwxr-xr-x 1 user user 2993 2011-10-05 16:04 ./bin/simgrid-colorizer --rwxr-xr-x 1 user user 820 2012-03-13 14:44 ./bin/smpiff --rwxr-xr-x 1 user user 356434 2012-03-13 14:44 ./bin/tesh +./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 71 +./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 1262 +./doc/simgrid/examples/cxx/autoDestination/Main.cxx 148 +./doc/simgrid/examples/cxx/autoDestination/Slave.cxx 870 +./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 65 +./doc/simgrid/examples/cxx/autoDestination/Master.cxx 1891 +./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 2133932 +./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 1137 +./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx 71 +./doc/simgrid/examples/cxx/basic/Main.cxx 148 +./doc/simgrid/examples/cxx/basic/Slave.cxx 693 +./doc/simgrid/examples/cxx/basic/BasicTask.cxx 65 +./doc/simgrid/examples/cxx/basic/basic_platform.xml 2133932 +./doc/simgrid/examples/cxx/basic/Master.cxx 2148 +./doc/simgrid/examples/cxx/basic/basic_deployment.xml 1188 +./doc/simgrid/examples/cxx/basic/Forwarder.cxx 1244 +./doc/simgrid/examples/cxx/explicitDestination/FinalizeTask.cxx 71 +./doc/simgrid/examples/cxx/explicitDestination/Main.cxx 148 +./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_platform.xml 2133932 +./doc/simgrid/examples/cxx/explicitDestination/Slave.cxx 913 +./doc/simgrid/examples/cxx/explicitDestination/BasicTask.cxx 65 +./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_deployment.xml 1188 +./doc/simgrid/examples/cxx/explicitDestination/Master.cxx 1896 +./doc/simgrid/examples/cxx/explicitDestination/Forwarder.cxx 1181 +./doc/simgrid/examples/cxx/ping_pong/Main.cxx 149 +./doc/simgrid/examples/cxx/ping_pong/Sender.cxx 1073 +./doc/simgrid/examples/cxx/ping_pong/ping_pong_deployment.xml 275 +./doc/simgrid/examples/cxx/ping_pong/ping_pong_platform.xml 4718 +./doc/simgrid/examples/cxx/ping_pong/Receiver.cxx 957 +./doc/simgrid/examples/cxx/ping_pong/PingPongTask.cxx 71 +./doc/simgrid/examples/cxx/comm_time/FinalizeTask.cxx 71 +./doc/simgrid/examples/cxx/comm_time/Main.cxx 146 +./doc/simgrid/examples/cxx/comm_time/CommTimeTask.cxx 71 +./doc/simgrid/examples/cxx/comm_time/Slave.cxx 889 +./doc/simgrid/examples/cxx/comm_time/comm_time_platform.xml 2133932 +./doc/simgrid/examples/cxx/comm_time/Master.cxx 1730 +./doc/simgrid/examples/cxx/comm_time/comm_time_deployment.xml 1884 +./doc/simgrid/examples/cxx/suspend/Main.cxx 150 +./doc/simgrid/examples/cxx/suspend/suspend_platform.xml 2133932 +./doc/simgrid/examples/cxx/suspend/suspend_deployment.xml 187 +./doc/simgrid/examples/cxx/suspend/DreamMaster.cxx 826 +./doc/simgrid/examples/cxx/suspend/LazyGuy.cxx 429 +./doc/simgrid/examples/smpi/mc_bugged2.c 1387 +./doc/simgrid/examples/smpi/scatter.c 3496 +./doc/simgrid/examples/smpi/mc_bugged1.c 1411 +./doc/simgrid/examples/smpi/get_processor_name.c 649 +./doc/simgrid/examples/smpi/NAS/README 1857 +./doc/simgrid/examples/smpi/NAS/EP-sampling/README 347 +./doc/simgrid/examples/smpi/NAS/EP-sampling/randlc.c 3300 +./doc/simgrid/examples/smpi/NAS/EP-sampling/ep.c 13723 +./doc/simgrid/examples/smpi/NAS/EP-trace/README 347 +./doc/simgrid/examples/smpi/NAS/EP-trace/randlc.c 3300 +./doc/simgrid/examples/smpi/NAS/EP-trace/ep-trace.c 13850 +./doc/simgrid/examples/smpi/NAS/config/NAS.samples/README 394 +./doc/simgrid/examples/smpi/NAS/IS-trace/is-trace.c 38276 +./doc/simgrid/examples/smpi/NAS/DT-trace/README 999 +./doc/simgrid/examples/smpi/NAS/DT-trace/DGraph.c 5451 +./doc/simgrid/examples/smpi/NAS/DT-trace/dt.c 23031 +./doc/simgrid/examples/smpi/NAS/IS/is.c 38077 +./doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406 +./doc/simgrid/examples/smpi/NAS/MPI_dummy/mpi_dummy.c 5660 +./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime_sgi64.c 1700 +./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime.c 228 +./doc/simgrid/examples/smpi/NAS/common/randdp.c 1441 +./doc/simgrid/examples/smpi/NAS/common/c_timers.c 1159 +./doc/simgrid/examples/smpi/NAS/common/c_print_results.c 3086 +./doc/simgrid/examples/smpi/NAS/sys/README 1461 +./doc/simgrid/examples/smpi/NAS/sys/setparams.c 38805 +./doc/simgrid/examples/smpi/NAS/SP/README 926 +./doc/simgrid/examples/smpi/NAS/FT/README 276 +./doc/simgrid/examples/smpi/NAS/DT/README 999 +./doc/simgrid/examples/smpi/NAS/DT/DGraph.c 5451 +./doc/simgrid/examples/smpi/NAS/DT/dt.c 22620 +./doc/simgrid/examples/smpi/NAS/EP/README 347 +./doc/simgrid/examples/smpi/NAS/EP/randlc.c 3300 +./doc/simgrid/examples/smpi/NAS/EP/ep.c 13688 +./doc/simgrid/examples/smpi/NAS/DT-folding/README 999 +./doc/simgrid/examples/smpi/NAS/DT-folding/DGraph.c 5451 +./doc/simgrid/examples/smpi/NAS/DT-folding/dt.c 22704 +./doc/simgrid/examples/smpi/NAS/MG/README 5465 +./doc/simgrid/examples/smpi/bcast.c 983 +./doc/simgrid/examples/smpi/compute2.c 628 +./doc/simgrid/examples/smpi/sendrecv.c 1652 +./doc/simgrid/examples/smpi/allreduce.c 2135 +./doc/simgrid/examples/smpi/mvmul.c 7069 +./doc/simgrid/examples/smpi/alltoallv.c 4441 +./doc/simgrid/examples/smpi/smpi_traced.c 8529 +./doc/simgrid/examples/smpi/compute3.c 816 +./doc/simgrid/examples/smpi/reduce.c 3545 +./doc/simgrid/examples/smpi/bcbench.c 2466 +./doc/simgrid/examples/smpi/ttest01.c 1273 +./doc/simgrid/examples/smpi/compute.c 622 +./doc/simgrid/examples/smpi/barrier.c 766 +./doc/simgrid/examples/smpi/alltoall_basic.c 1453 +./doc/simgrid/examples/smpi/pingpong.c 2286 +./doc/simgrid/examples/smpi/alltoall2.c 2799 +./doc/simgrid/examples/smpi/split.c 705 +./doc/simgrid/examples/xbt/sem_basic.c 1970 +./doc/simgrid/examples/xbt/sem_sched.c 7207 +./doc/simgrid/examples/msg/small_platform.xml 4582 +./doc/simgrid/examples/msg/README 4805 +./doc/simgrid/examples/msg/properties/deployment_properties.xml 272 +./doc/simgrid/examples/msg/properties/msg_prop.c 3853 +./doc/simgrid/examples/msg/ns3/3links-p.xml 856 +./doc/simgrid/examples/msg/ns3/dogbone-d.xml 582 +./doc/simgrid/examples/msg/ns3/Two_clusters.xml 1817 +./doc/simgrid/examples/msg/ns3/3links-d.xml 927 +./doc/simgrid/examples/msg/ns3/3links-d-timer.xml 1280 +./doc/simgrid/examples/msg/ns3/ns3.c 5177 +./doc/simgrid/examples/msg/ns3/Two_clusters-d.xml 369 +./doc/simgrid/examples/msg/ns3/One_cluster-d.xml 367 +./doc/simgrid/examples/msg/ns3/dogbone-p.xml 1497 +./doc/simgrid/examples/msg/ns3/3hosts_2links_p.xml 566 +./doc/simgrid/examples/msg/ns3/3hosts_2links_d.xml 352 +./doc/simgrid/examples/msg/ns3/One_cluster.xml 658 +./doc/simgrid/examples/msg/migration/migration.c 2922 +./doc/simgrid/examples/msg/small_platform_with_failures.xml 4746 +./doc/simgrid/examples/msg/icomms/small_platform.xml 972 +./doc/simgrid/examples/msg/icomms/deployment_peer.xml 678 +./doc/simgrid/examples/msg/icomms/deployment_peer05.xml 891 +./doc/simgrid/examples/msg/icomms/deployment_peer02.xml 855 +./doc/simgrid/examples/msg/icomms/peer2.c 4276 +./doc/simgrid/examples/msg/icomms/deployment_peer03.xml 851 +./doc/simgrid/examples/msg/icomms/deployment_peer04.xml 852 +./doc/simgrid/examples/msg/icomms/peer.c 5102 +./doc/simgrid/examples/msg/icomms/deployment_peer01.xml 855 +./doc/simgrid/examples/msg/icomms/peer3.c 5258 +./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml 654 +./doc/simgrid/examples/msg/parallel_task/test_ptask.c 5423 +./doc/simgrid/examples/msg/parallel_task/test_ptask_platform.xml 2380 +./doc/simgrid/examples/msg/parallel_task/parallel_task.c 2708 +./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c 6217 +./doc/simgrid/examples/msg/trace/test9.xml 598 +./doc/simgrid/examples/msg/trace/test3.xml 372 +./doc/simgrid/examples/msg/trace/test_trace_integration.xml 206 +./doc/simgrid/examples/msg/trace/test2.xml 370 +./doc/simgrid/examples/msg/trace/test7.xml 501 +./doc/simgrid/examples/msg/trace/test11.xml 683 +./doc/simgrid/examples/msg/trace/test4.xml 371 +./doc/simgrid/examples/msg/trace/test10.xml 598 +./doc/simgrid/examples/msg/trace/test6.xml 372 +./doc/simgrid/examples/msg/trace/test8.xml 498 +./doc/simgrid/examples/msg/trace/test5.xml 371 +./doc/simgrid/examples/msg/trace/test_trace_integration.c 1960 +./doc/simgrid/examples/msg/trace/test1.xml 366 +./doc/simgrid/examples/msg/parallel_contexts/pcontexts_platform.xml 1002 +./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts2_4.xml 467 +./doc/simgrid/examples/msg/parallel_contexts/pcontexts2.c 2236 +./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_2.xml 242 +./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_4.xml 353 +./doc/simgrid/examples/msg/parallel_contexts/pcontexts.c 1752 +./doc/simgrid/examples/msg/tracing/deployment.xml 800 +./doc/simgrid/examples/msg/tracing/ms.c 4374 +./doc/simgrid/examples/msg/tracing/platform.xml 3930 +./doc/simgrid/examples/msg/tracing/tasks.c 3594 +./doc/simgrid/examples/msg/tracing/procmig-deploy.xml 223 +./doc/simgrid/examples/msg/tracing/procmig.c 3282 +./doc/simgrid/examples/msg/tracing/categories.c 3358 +./doc/simgrid/examples/msg/sendrecv/README 689 +./doc/simgrid/examples/msg/sendrecv/deployment_sendrecv.xml 321 +./doc/simgrid/examples/msg/sendrecv/sendrecv.c 5098 +./doc/simgrid/examples/msg/sendrecv/platform_sendrecv.xml 528 +./doc/simgrid/examples/msg/gtnets/onelink-p.xml 439 +./doc/simgrid/examples/msg/gtnets/fullduplex-p.xml 575 +./doc/simgrid/examples/msg/gtnets/dogbone-d.xml 576 +./doc/simgrid/examples/msg/gtnets/waxman-d.xml 46642 +./doc/simgrid/examples/msg/gtnets/waxman-p.xml 4964600 +./doc/simgrid/examples/msg/gtnets/fullduplex-d.xml 1029 +./doc/simgrid/examples/msg/gtnets/onelink-d.xml 356 +./doc/simgrid/examples/msg/gtnets/gtnets.c 6172 +./doc/simgrid/examples/msg/gtnets/dogbone-p.xml 1482 +./doc/simgrid/examples/msg/pmm/msg_pmm.c 9688 +./doc/simgrid/examples/msg/pmm/pmm_9_deploy.xml 786 +./doc/simgrid/examples/msg/mc/bugged1.c 1378 +./doc/simgrid/examples/msg/mc/deploy_bugged3.xml 377 +./doc/simgrid/examples/msg/mc/deploy_mutex.xml 925 +./doc/simgrid/examples/msg/mc/platform.xml 876 +./doc/simgrid/examples/msg/mc/deploy_bugged2.xml 377 +./doc/simgrid/examples/msg/mc/random_test.c 563 +./doc/simgrid/examples/msg/mc/deploy_bugged1.xml 459 +./doc/simgrid/examples/msg/mc/bugged3.c 1827 +./doc/simgrid/examples/msg/mc/deploy_random_test.xml 468 +./doc/simgrid/examples/msg/mc/bugged2.c 1957 +./doc/simgrid/examples/msg/mc/centralized_mutex.c 3375 +./doc/simgrid/examples/msg/token_ring/two_clusters.xml 1007 +./doc/simgrid/examples/msg/token_ring/ring_call.c 4205 +./doc/simgrid/examples/msg/token_ring/two_peers.xml 556 +./doc/simgrid/examples/msg/msg_platform.xml 2261806 +./doc/simgrid/examples/msg/priority/deployment_priority.xml 406 +./doc/simgrid/examples/msg/priority/priority.c 2394 +./doc/simgrid/examples/msg/actions/actions.c 19339 +./doc/simgrid/examples/msg/actions/deployment.xml 249 +./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform_flat.xml 6805 +./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform.xml 387 +./doc/simgrid/examples/msg/actions/NAS_LU_S_4/deploy_MPI_4.xml 605 +./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/toto.xml 1066 +./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/titi.xml 1066 +./doc/simgrid/examples/msg/actions/deployment_split.xml 525 +./doc/simgrid/examples/msg/actions/homogeneous_3_hosts.xml 906 +./doc/simgrid/examples/msg/actions/bcast_deployment.xml 224 +./doc/simgrid/examples/msg/actions/actions_deployment_split.xml 501 +./doc/simgrid/examples/msg/masterslave/masterslave_bypass.c 9082 +./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox.xml 990 +./doc/simgrid/examples/msg/masterslave/masterslave_cluster.c 6773 +./doc/simgrid/examples/msg/masterslave/masterslave_console.c 3952 +./doc/simgrid/examples/msg/masterslave/platform_clusters.xml 930 +./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox_multicore.xml 1078 +./doc/simgrid/examples/msg/masterslave/masterslave_failure.c 7120 +./doc/simgrid/examples/msg/masterslave/deployment_masterslave_vivaldi.xml 4170 +./doc/simgrid/examples/msg/masterslave/deployment_masterslave_forwarder.xml 1382 +./doc/simgrid/examples/msg/masterslave/masterslave_forwarder.c 6438 +./doc/simgrid/examples/msg/masterslave/platform_script.lua 2535 +./doc/simgrid/examples/msg/masterslave/deployment_masterslave.xml 998 +./doc/simgrid/examples/msg/masterslave/jumbo_deployment.xml 6805 +./doc/simgrid/examples/msg/masterslave/jumbo_deployment_masterslave_mailbox.xml 878 +./doc/simgrid/examples/msg/masterslave/masterslave_mailbox.c 4118 +./doc/simgrid/examples/msg/suspend/suspend.c 2692 +./doc/simgrid/examples/msg/suspend/deployment_suspend.xml 183 +./doc/simgrid/examples/msg/small_platform_with_routers.xml 5295 +./doc/simgrid/examples/msg/chord/chord90.xml 13992 +./doc/simgrid/examples/msg/chord/chord.xml 2236 +./doc/simgrid/examples/msg/chord/chord10k.xml 1624671 +./doc/simgrid/examples/msg/chord/chord.c 28995 +./doc/simgrid/examples/lua/multi_matrix/quicksort_platform.xml 4628 +./doc/simgrid/examples/lua/multi_matrix/mult_matrix.lua 227 +./doc/simgrid/examples/lua/multi_matrix/receiver.lua 1199 +./doc/simgrid/examples/lua/multi_matrix/quicksort_deployment.xml 524 +./doc/simgrid/examples/lua/multi_matrix/sender.lua 748 +./doc/simgrid/examples/lua/mult_matrix.lua 2196 +./doc/simgrid/examples/lua/README 1416 +./doc/simgrid/examples/lua/deploy.xml 879 +./doc/simgrid/examples/lua/splaySim/master.lua 1125 +./doc/simgrid/examples/lua/splaySim/slave.lua 729 +./doc/simgrid/examples/lua/splaySim/splay_platform.lua 1950 +./doc/simgrid/examples/lua/splaySim/splay_ctrl.lua 304 +./doc/simgrid/examples/lua/splaySim/splay_deploy_masterslave.lua 487 +./doc/simgrid/examples/lua/tracing/master.lua 1390 +./doc/simgrid/examples/lua/tracing/slave.lua 713 +./doc/simgrid/examples/lua/tracing/master_slave_trace.lua 491 +./doc/simgrid/examples/lua/SimSplay/sim_splay.lua 2298 +./doc/simgrid/examples/lua/SimSplay/splay_school.lua 402 +./doc/simgrid/examples/lua/SimSplay/chord.lua 1906 +./doc/simgrid/examples/lua/SimSplay/platform_script.lua 1706 +./doc/simgrid/examples/lua/console/master.lua 1125 +./doc/simgrid/examples/lua/console/deploy.lua 480 +./doc/simgrid/examples/lua/console/slave.lua 730 +./doc/simgrid/examples/lua/console/platform.lua 2424 +./doc/simgrid/examples/lua/console/master_slave_bypass.lua 158 +./doc/simgrid/examples/lua/masterslave/master.lua 1125 +./doc/simgrid/examples/lua/masterslave/slave.lua 730 +./doc/simgrid/examples/lua/masterslave/platform.lua 2424 +./doc/simgrid/examples/lua/masterslave/master_slave.lua 378 +./doc/simgrid/examples/simdag/properties/sd_prop.c 3012 +./doc/simgrid/examples/simdag/dax/Strassen.xml 9663 +./doc/simgrid/examples/simdag/dax/Montage_25.xml 23087 +./doc/simgrid/examples/simdag/dax/Sipht_30.xml 267014 +./doc/simgrid/examples/simdag/dax/dax_test.c 4346 +./doc/simgrid/examples/simdag/dax/Montage_50.xml 48868 +./doc/simgrid/examples/simdag/dax/Inspiral_30.xml 28774 +./doc/simgrid/examples/simdag/dax/sagittaire.xml 289 +./doc/simgrid/examples/simdag/scheduling/minmin_test.c 11328 +./doc/simgrid/examples/simdag/scheduling/Montage_25.xml 23087 +./doc/simgrid/examples/simdag/scheduling/simulacrum_7_hosts.xml 5670 +./doc/simgrid/examples/simdag/sd_seq_access.c 4153 +./doc/simgrid/examples/simdag/sd_test_console.c 6976 +./doc/simgrid/examples/simdag/metaxml/sd_meta.c 2207 +./doc/simgrid/examples/simdag/2clusters.xml 14326 +./doc/simgrid/examples/simdag/sd_test2.c 7538 +./doc/simgrid/examples/simdag/platform_script.lua 1864 +./doc/simgrid/examples/simdag/simdag_trace.c 4354 +./doc/simgrid/examples/simdag/sd_test.c 6964 +./doc/simgrid/examples/simdag/dot/dot_test2.c 1622 +./doc/simgrid/examples/simdag/dot/simulate_dot.c 3590 +./doc/simgrid/examples/simdag/dot/dot_test.c 4002 +./doc/simgrid/examples/platforms/g5k.xml 17028 +./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml 482 +./doc/simgrid/examples/platforms/g5k_cabinets.xml 22645 +./doc/simgrid/examples/platforms/nancy.xml 4028 +./doc/simgrid/examples/platforms/lcg_sept2004_grid.xml 15970 +./doc/simgrid/examples/platforms/Two_clusters.xml 930 +./doc/simgrid/examples/platforms/vivaldi.xml 3274 +./doc/simgrid/examples/platforms/gridpp_grid_2004.xml 6096 +./doc/simgrid/examples/platforms/griffon.xml 1879 +./doc/simgrid/examples/platforms/median_harvard.xml 28125 +./doc/simgrid/examples/platforms/prop.xml 1273 +./doc/simgrid/examples/platforms/One_cluster.xml 661 +./doc/simgrid/examples/platforms/gdx.xml 2323 +./doc/simgrid/examples/platforms/multicore_machine.xml 222 +./doc/simgrid/html/group__XBT__str.html 36192 +./doc/simgrid/html/group__XBT__cfg__decl.html 14505 +./doc/simgrid/html/bug.html 2130 +./doc/simgrid/html/group__MSG__C.html 10658 +./doc/simgrid/html/structs__xbt__strbuff__t.html 2512 +./doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html 4803 +./doc/simgrid/html/simgrid_modules2.png 11932 +./doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html 1519 +./doc/simgrid/html/group__SURF__actions.html 13562 +./doc/simgrid/html/publis_intra.html 435 +./doc/simgrid/html/simgrid_logo_small.png 8326 +./doc/simgrid/html/group__SURF__resources.html 4203 +./doc/simgrid/html/structsurf__cpu__model__extension__public.html 2751 +./doc/simgrid/html/tabs.css 1095 +./doc/simgrid/html/group__XBT__set.html 6991 +./doc/simgrid/html/group__XBT__set__curs.html 9653 +./doc/simgrid/html/structxbt__ex__t.html 10014 +./doc/simgrid/html/pages.html 5794 +./doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html 30160 +./doc/simgrid/html/group__XBT__API.html 6276 +./doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html 1519 +./doc/simgrid/html/todo.html 3202 +./doc/simgrid/html/nav_f.png 159 +./doc/simgrid/html/group__XBT__queue.html 23050 +./doc/simgrid/html/group__XBT__fifo__cons.html 9876 +./doc/simgrid/html/structsurf__model.html 17707 +./doc/simgrid/html/MSG_ex_asynchronous_communications.html 43212 +./doc/simgrid/html/Paje_MSG_screenshot_thn.jpg 30326 +./doc/simgrid/html/structsurf__network__model__extension__public.html 2783 +./doc/simgrid/html/structsurf__model__description.html 2621 +./doc/simgrid/html/group__m__host__management.html 19042 +./doc/simgrid/html/group__XBT__fifo__perl.html 14045 +./doc/simgrid/html/modules.html 12734 +./doc/simgrid/html/annotated.html 7707 +./doc/simgrid/html/group__XBT__fifo.html 6191 +./doc/simgrid/html/group__XBT__parmap.html 3765 +./doc/simgrid/html/tracing.html 58483 +./doc/simgrid/html/structs__surf__metric__t.html 2523 +./doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html 1519 +./doc/simgrid/html/group__XBT__swag.html 5923 +./doc/simgrid/html/functions_vars.html 11436 +./doc/simgrid/html/group__XBT__swag__type.html 8194 +./doc/simgrid/html/win_install_02.png 60084 +./doc/simgrid/html/simgrid_modules.png 8309 +./doc/simgrid/html/group__XBT__error.html 8348 +./doc/simgrid/html/group__XBT__dynar__cons.html 15743 +./doc/simgrid/html/simgrid_logo.png 21536 +./doc/simgrid/html/group__XBT__fifo__misc.html 7717 +./doc/simgrid/html/group__XBT__context.html 3460 +./doc/simgrid/html/group__m__channel__management.html 8963 +./doc/simgrid/html/structm__task.html 4188 +./doc/simgrid/html/group__XBT__swag__curs.html 8561 +./doc/simgrid/html/group__XBT__log.html 60965 +./doc/simgrid/html/open.png 118 +./doc/simgrid/html/group__msg__simulation.html 9008 +./doc/simgrid/html/group__XBT__dynar__cursor.html 11976 +./doc/simgrid/html/group__XBT__log__cats.html 5102 +./doc/simgrid/html/win_install_03.png 55802 +./doc/simgrid/html/poster_thumbnail.png 3249 +./doc/simgrid/html/group__m__datatypes__management__details.html 7557 +./doc/simgrid/html/group__XBT__set__basic.html 24314 +./doc/simgrid/html/win_install_01.png 61053 +./doc/simgrid/html/closed.png 126 +./doc/simgrid/html/group__XBT__adt.html 6958 +./doc/simgrid/html/index.html 9659 +./doc/simgrid/html/group__SD__link__management.html 17867 +./doc/simgrid/html/group__MSG__JAVA.html 5443 +./doc/simgrid/html/group__SURF__simulation.html 10385 +./doc/simgrid/html/structm__host.html 4188 +./doc/simgrid/html/group__XBT__dynar__array.html 22436 +./doc/simgrid/html/simgrid.css 386 +./doc/simgrid/html/group__SD__task__dependency__management.html 15389 +./doc/simgrid/html/group__XBT__grounding.html 7225 +./doc/simgrid/html/pls.html 11863 +./doc/simgrid/html/group__XBT__dynar__ctn.html 12693 +./doc/simgrid/html/functions.html 11564 +./doc/simgrid/html/group__XBT__dynar__speed.html 9616 +./doc/simgrid/html/installSimgrid.html 24837 +./doc/simgrid/html/triva-graph_configuration.png 59769 +./doc/simgrid/html/triva-graph_visualization.png 55335 +./doc/simgrid/html/MSG_ex_master_slave.html 51294 +./doc/simgrid/html/doxygen.png 3942 +./doc/simgrid/html/group__XBT__mallocator__cons.html 10757 +./doc/simgrid/html/group__API__index.html 125324 +./doc/simgrid/html/group__XBT__dict__cons.html 9746 +./doc/simgrid/html/group__XBT__swag__func.html 19885 +./doc/simgrid/html/group__SimGrid__API.html 4674 +./doc/simgrid/html/group__XBT__dynar__misc.html 9591 +./doc/simgrid/html/structxbt__set__elm__.html 5121 +./doc/simgrid/html/group__XBT__cfg__get.html 19320 +./doc/simgrid/html/bindings.html 23685 +./doc/simgrid/html/group__XBT__dict.html 6916 +./doc/simgrid/html/use.html 3904 +./doc/simgrid/html/group__XBT__dict__basic.html 20935 +./doc/simgrid/html/group__XBT__graph.html 23682 +./doc/simgrid/html/group__XBT__mallocator.html 6444 +./doc/simgrid/html/structsurf__workstation__model__extension__public.html 11076 +./doc/simgrid/html/publis.html 435 +./doc/simgrid/html/group__XBT__misc.html 4663 +./doc/simgrid/html/simdag.html 226 +./doc/simgrid/html/Paje_MSG_screenshot.jpg 340759 +./doc/simgrid/html/group__msg__gos__functions.html 65293 +./doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html 1519 +./doc/simgrid/html/publis_extern.html 435 +./doc/simgrid/html/group__MSG__LUA.html 5094 +./doc/simgrid/html/group__XBT__dynar.html 14081 +./doc/simgrid/html/structs__model__type.html 2480 +./doc/simgrid/html/group__XBT__synchro.html 19296 +./doc/simgrid/html/bc_s.png 677 +./doc/simgrid/html/classes.html 6934 +./doc/simgrid/html/group__XBT__fifo__direct.html 29778 +./doc/simgrid/html/group__XBT__cfg__use.html 37757 +./doc/simgrid/html/group__XBT__mallocator__objects.html 9306 +./doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html 1519 +./doc/simgrid/html/group__XBT__dict__multi.html 18525 +./doc/simgrid/html/group__m__datatypes__management.html 16459 +./doc/simgrid/html/tab_b.png 178 +./doc/simgrid/html/group__SD__simulation.html 45009 +./doc/simgrid/html/group__msg__easier__life.html 50885 +./doc/simgrid/html/group__m__task__management.html 35307 +./doc/simgrid/html/tab_a.png 140 +./doc/simgrid/html/group__XBT__config.html 16354 +./doc/simgrid/html/options.html 7629 +./doc/simgrid/html/group__XBT__dict__nnul.html 18891 +./doc/simgrid/html/win_install_04.png 52033 +./doc/simgrid/html/structsurf__action.html 8353 +./doc/simgrid/html/group__XBT__ex.html 32537 +./doc/simgrid/html/group__SURF__API.html 6659 +./doc/simgrid/html/doxygen.css 12350 +./doc/simgrid/html/group__XBT__set__cons.html 7965 +./doc/simgrid/html/group__SURF__build__api.html 7821 +./doc/simgrid/html/group__m__process__management.html 47169 +./doc/simgrid/html/group__XBT__dict__curs.html 19747 +./doc/simgrid/html/group__SD__datatypes__management.html 20816 +./doc/simgrid/html/group__SD__API.html 8379 +./doc/simgrid/html/group__SMPI__API.html 4776 +./doc/simgrid/html/group__XBT__dynar__perl.html 12131 +./doc/simgrid/html/group__XBT__cfg__register.html 15874 +./doc/simgrid/html/publis_core.html 435 +./doc/simgrid/html/group__SD__workstation__management.html 46397 +./doc/simgrid/html/MSG_ex_master_slave_lua.html 4794 +./doc/simgrid/html/group__MSG__API.html 6026 +./doc/simgrid/html/msg.html 227 +./doc/simgrid/html/group__SD__task__management.html 60347 +./doc/simgrid/html/group__XBT__syscall.html 10095 +./doc/simgrid/html/group__XBT__heap.html 18482 +./doc/simgrid/html/structsurf__action__state.html 7301 +./doc/simgrid/html/tab_s.png 189 +./doc/simgrid/html/tab_h.png 192 +./doc/simgrid/html/nav_h.png 97 +./include/smpi/mpif.h 4826 +./include/smpi/smpif.h 1139 +./include/smpi/mpi.h 510 +./include/smpi/smpi_cocci.h 3187 +./include/smpi/smpi.h 24101 +./include/xbt/fifo.h 3626 +./include/xbt/dict.h 7459 +./include/xbt/str.h 2111 +./include/xbt/log.h 25433 +./include/xbt/misc.h 8031 +./include/xbt/synchro_core.h 4477 +./include/xbt/mmalloc.h 1976 +./include/xbt/replay_trace_reader.h 917 +./include/xbt/function_types.h 1111 +./include/xbt/strbuff.h 1281 +./include/xbt/virtu.h 684 +./include/xbt/asserts.h 1871 +./include/xbt/ex.h 23255 +./include/xbt/graph.h 5668 +./include/xbt/graphxml.h 5474 +./include/xbt/queue.h 2252 +./include/xbt/matrix.h 3027 +./include/xbt/setset.h 2422 +./include/xbt/time.h 743 +./include/xbt/lib.h 2014 +./include/xbt/hash.h 1064 +./include/xbt/set.h 4383 +./include/xbt/config.h 9224 +./include/xbt/sysdep.h 4941 +./include/xbt/swag.h 5352 +./include/xbt/graphxml_parse.h 1926 +./include/xbt/peer.h 870 +./include/xbt/module.h 648 +./include/xbt/cunit.h 5523 +./include/xbt/parmap.h 1166 +./include/xbt/mallocator.h 2296 +./include/xbt/dynar.h 9553 +./include/xbt/heap.h 1444 +./include/xbt.h 876 +./include/msg/datatypes.h 4635 +./include/msg/msg.h 12038 +./include/simgrid_config.h 3641 +./include/mc/modelchecker.h 96 +./include/surf/simgrid_dtd.h 23583 +./include/surf/surf_routing.h 1167 +./include/surf/surfxml_parse.h 5343 +./include/instr/instr.h 5750 +./include/simdag/simdag.h 10325 +./include/simdag/datatypes.h 3715 +./include/simix/simix.h 13003 +./include/simix/datatypes.h 3346 +./include/simix/context.h 4040 +./lib/libsimgrid.so.3.6.2 12710497 +./bin/smpicc 918 +./bin/smpirun 7292 +./bin/smpif2c 1990 +./bin/simgrid_update_xml 5018 +./bin/graphicator 66986 +./bin/simgrid-colorizer 2993 +./bin/smpiff 820 +./bin/tesh 356434 diff --git a/examples/platforms/data_center.xml b/examples/platforms/data_center.xml index 015e93422a..009a8e1fc8 100644 --- a/examples/platforms/data_center.xml +++ b/examples/platforms/data_center.xml @@ -1,21 +1,20 @@ - - + - - + + - - - - - - + + + + + + @@ -25,12 +24,12 @@ - + - - - + + + @@ -39,18 +38,27 @@ - - - + + + + + + + + + + + + + + + + + + - - - - - - - + diff --git a/examples/platforms/g5k.xml b/examples/platforms/g5k.xml index 9d20e6c973..6e5df8f794 100644 --- a/examples/platforms/g5k.xml +++ b/examples/platforms/g5k.xml @@ -1,7 +1,6 @@ - - + @@ -14,523 +13,710 @@ - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - + + + + + + + + - - - + + + - - + + - - - - - + + + + + + + + + + + - - + + + + - - + + + + - - - - - - + + + + + + - + - - + + + + + + + + + + + + + + + + + - + + + + + + + - - - - - - - + + + + + + + - + - - + + + + + + + + + - + + + + + - - + + - - - - - + + + + + + + + + + + - - + + + + - - + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - + + + + + + + + + + + - - + + + + - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + + + + + - - - + + + - - + + - - - - - + + + + + + + + + + + - - + + + + - - + + + + diff --git a/examples/platforms/griffon.xml b/examples/platforms/griffon.xml index 1ecc49831a..b6f5d8fe3c 100644 --- a/examples/platforms/griffon.xml +++ b/examples/platforms/griffon.xml @@ -4,16 +4,16 @@ + radical="1-29,58,59,60" power="286.087kf" bw="125MBps" lat="24us" + bb_bw="1.25GBps" bb_lat="0" sharing_policy="FULLDUPLEX" bb_sharing_policy="SHARED"/> + radical="30-57" power="286.087kf" bw="125MBps" lat="24us" + bb_bw="1.25GBps" bb_lat="0" sharing_policy="FULLDUPLEX" bb_sharing_policy="SHARED"/> + radical="61-92" power="286.087kf" bw="125MBps" lat="24us" + bb_bw="1.25GBps" bb_lat="0" sharing_policy="FULLDUPLEX" bb_sharing_policy="SHARED"/> - + + power="1Gf" bw="125MBps" lat="100us" radical="1-10"/> + power="1Gf" bw="125MBps" lat="100us" radical="11-20"/> + power="1Gf" bw="125MBps" lat="100us" radical="21-30"/> - + + power="1Gf" bw="125MBps" lat="100us" radical="1-10"/> + power="1Gf" bw="125MBps" lat="100us" radical="11-20"/> + power="1Gf" bw="125MBps" lat="100us" radical="21-30"/> - + - + - + diff --git a/examples/platforms/prop.xml b/examples/platforms/prop.xml index ac206cab0c..17246bbc15 100644 --- a/examples/platforms/prop.xml +++ b/examples/platforms/prop.xml @@ -22,20 +22,20 @@ - + - + - + - + diff --git a/examples/platforms/routing_cluster.xml b/examples/platforms/routing_cluster.xml index 0b64bb7e58..52df8eb93f 100644 --- a/examples/platforms/routing_cluster.xml +++ b/examples/platforms/routing_cluster.xml @@ -18,42 +18,42 @@ l1_up / / l1_down | l3 l2_up\ \ l2_down l4_up / / l4_down | l6 l5_up\ \ - - - + + + - - + + - - + + - + - - - + + + - - + + - - + + - + - + - + - + - + - + - - - + + + diff --git a/examples/platforms/syscoord/median_harvard.xml b/examples/platforms/syscoord/median_harvard.xml index 80fab10082..a73f553609 100644 --- a/examples/platforms/syscoord/median_harvard.xml +++ b/examples/platforms/syscoord/median_harvard.xml @@ -7,682 +7,682 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/examples/platforms/syscoord/median_meridian.xml b/examples/platforms/syscoord/median_meridian.xml index 5158ac2ba3..f705d0a691 100644 --- a/examples/platforms/syscoord/median_meridian.xml +++ b/examples/platforms/syscoord/median_meridian.xml @@ -7,7504 +7,7504 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/examples/platforms/syscoord/median_p2psim.xml b/examples/platforms/syscoord/median_p2psim.xml index 70c37f9e92..80c5962c83 100644 --- a/examples/platforms/syscoord/median_p2psim.xml +++ b/examples/platforms/syscoord/median_p2psim.xml @@ -7,5224 +7,5224 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/examples/platforms/two_peers.xml b/examples/platforms/two_peers.xml index 23e48d85be..7e4abae0c0 100644 --- a/examples/platforms/two_peers.xml +++ b/examples/platforms/two_peers.xml @@ -5,16 +5,16 @@ + power="1.5Gf" + bw_in="2.25GBps" + bw_out="2.25GBps" + lat="500us" /> + power="730Mf" + bw_in="2.25GBps" + bw_out="2.25GBps" + lat="500us" /> diff --git a/examples/platforms/vivaldi.xml b/examples/platforms/vivaldi.xml index adc9b9ae54..49ada2e549 100644 --- a/examples/platforms/vivaldi.xml +++ b/examples/platforms/vivaldi.xml @@ -6,45 +6,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/scala/CMakeLists.txt b/examples/scala/CMakeLists.txt new file mode 100644 index 0000000000..90617f925e --- /dev/null +++ b/examples/scala/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 2.6) + +set(tesh_files + ${tesh_files} + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + ${CMAKE_CURRENT_SOURCE_DIR}/platform.xml + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) + diff --git a/examples/scala/master_slave_bypass/CMakeLists.txt b/examples/scala/master_slave_bypass/CMakeLists.txt new file mode 100644 index 0000000000..f5c954ad9b --- /dev/null +++ b/examples/scala/master_slave_bypass/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 2.6) + +set(example scala_master_slave_bypass) +set(sources + ${CMAKE_CURRENT_SOURCE_DIR}/FinalizeTask.scala + ${CMAKE_CURRENT_SOURCE_DIR}/Master.scala + ${CMAKE_CURRENT_SOURCE_DIR}/MsBypass.scala + ${CMAKE_CURRENT_SOURCE_DIR}/Slave.scala + ) + +if(enable_scala) + add_custom_command( + COMMENT "Building ${example}..." + OUTPUT ${example}_compiled + DEPENDS ${sources} SG_java_jar ${SIMGRID_JAR} + COMMAND ${SCALA_COMPILE} -cp ${SIMGRID_JAR} + -d ${CMAKE_CURRENT_BINARY_DIR}/.. ${sources} + COMMAND ${CMAKE_COMMAND} -E remove ${example}_compiled + COMMAND ${CMAKE_COMMAND} -E touch ${example}_compiled + ) + add_custom_target(${example} ALL DEPENDS ${example}_compiled) +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/bypass.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + ${CMAKE_CURRENT_SOURCE_DIR}/platform.xml + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${sources} + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/examples/scala/master_slave_bypass/FinalizeTask.scala b/examples/scala/master_slave_bypass/FinalizeTask.scala new file mode 100644 index 0000000000..d83759dd0e --- /dev/null +++ b/examples/scala/master_slave_bypass/FinalizeTask.scala @@ -0,0 +1,11 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package master_slave_bypass +import org.simgrid.msg.Task + +class FinalizeTask extends Task("finalize",0,0) {} diff --git a/examples/scala/master_slave_bypass/Master.scala b/examples/scala/master_slave_bypass/Master.scala new file mode 100644 index 0000000000..5e2fbee647 --- /dev/null +++ b/examples/scala/master_slave_bypass/Master.scala @@ -0,0 +1,39 @@ +/* + * Master of a basic master/slave example in Java + * + * Copyright 2006-2012 The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package master_slave_bypass + +import Stream._ +import org.simgrid.msg.HostNotFoundException +import org.simgrid.msg.Msg +import org.simgrid.msg.MsgException +import org.simgrid.msg.Process +import org.simgrid.msg.Task + +class Master(hostname:String, name:String) extends Process(hostname,name) { + + def main(args:Array[String]) { + Msg.info("Master Hello!") + + //Create a slave on host "alice" + try { + Msg.info("Create process on host 'alice'") + new Slave("alice","process2").start() + } catch { + case e:MsgException => println("Process2!") + } + + //Wait for slave "alice" + continually({Task.receive("alice")}) + .takeWhile(!_.isInstanceOf[FinalizeTask]) + .force // to force the list to be compute + + Msg.info("Received Finalize. I'm done. See you!") + } +} diff --git a/examples/scala/master_slave_bypass/MsBypass.scala b/examples/scala/master_slave_bypass/MsBypass.scala new file mode 100644 index 0000000000..563f2501c7 --- /dev/null +++ b/examples/scala/master_slave_bypass/MsBypass.scala @@ -0,0 +1,34 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package master_slave_bypass + +import org.simgrid.msg.Msg +import org.simgrid.msg.MsgException +import org.simgrid.msg.NativeException + +object MsBypass extends App { + /* This only contains the launcher. If you do nothing more than than you can run + * scala simgrid.msg.Msg + * which also contains such a launcher + */ + + /* initialize the MSG simulation. Must be done before anything else (even logging). */ + Msg.init(args) + Msg.createEnvironment(args(0)) + + /* bypass deployment */ + try { + new Master("bob","process1").start() + } + catch { + case e:MsgException => println("Create processes failed!") + } + + /* execute the simulation. */ + Msg.run() +} diff --git a/examples/scala/master_slave_bypass/Slave.scala b/examples/scala/master_slave_bypass/Slave.scala new file mode 100644 index 0000000000..d8538c43dd --- /dev/null +++ b/examples/scala/master_slave_bypass/Slave.scala @@ -0,0 +1,23 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ +package master_slave_bypass + +import org.simgrid.msg.HostFailureException +import org.simgrid.msg.HostNotFoundException +import org.simgrid.msg.Msg +import org.simgrid.msg.TimeoutException +import org.simgrid.msg.TransferFailureException +import org.simgrid.msg.Process + +class Slave(hostname:String, name:String) extends Process(hostname, name) { + def main(args:Array[String]) { + Msg.info("Slave Hello!") + val task = new FinalizeTask() + Msg.info("Send finalize!") + task.send("alice") + } +} diff --git a/examples/scala/master_slave_bypass/bypass.tesh b/examples/scala/master_slave_bypass/bypass.tesh new file mode 100644 index 0000000000..6b28603de1 --- /dev/null +++ b/examples/scala/master_slave_bypass/bypass.tesh @@ -0,0 +1,11 @@ +#! tesh + +! output sort +$ java -cp ${classpath:=.} master_slave_bypass/MsBypass ${srcdir:=.}/master_slave_bypass/platform.xml +> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up. +> [0.013010] [jmsg/INFO] MSG_main finished; Cleaning up the simulation... +> [alice:process2:(2) 0.000000] [jmsg/INFO] Slave Hello! +> [alice:process2:(2) 0.000000] [jmsg/INFO] Send finalize! +> [bob:process1:(1) 0.000000] [jmsg/INFO] Master Hello! +> [bob:process1:(1) 0.000000] [jmsg/INFO] Create process on host 'alice' +> [bob:process1:(1) 0.013010] [jmsg/INFO] Received Finalize. I'm done. See you! diff --git a/examples/scala/master_slave_bypass/platform.xml b/examples/scala/master_slave_bypass/platform.xml new file mode 100644 index 0000000000..d0faf97219 --- /dev/null +++ b/examples/scala/master_slave_bypass/platform.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/scala/master_slave_kill/CMakeLists.txt b/examples/scala/master_slave_kill/CMakeLists.txt new file mode 100644 index 0000000000..ca978c6449 --- /dev/null +++ b/examples/scala/master_slave_kill/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 2.6) + +set(example scala_master_slave_kill) +set(sources + ${CMAKE_CURRENT_SOURCE_DIR}/FinalizeTask.scala + ${CMAKE_CURRENT_SOURCE_DIR}/Master.scala + ${CMAKE_CURRENT_SOURCE_DIR}/MsKill.scala + ${CMAKE_CURRENT_SOURCE_DIR}/Slave.scala + ) + +if(enable_scala) + add_custom_command( + COMMENT "Building ${example}..." + OUTPUT ${example}_compiled + DEPENDS ${sources} SG_java_jar ${SIMGRID_JAR} + COMMAND ${SCALA_COMPILE} -cp ${SIMGRID_JAR} + -d ${CMAKE_CURRENT_BINARY_DIR}/.. ${sources} + COMMAND ${CMAKE_COMMAND} -E remove ${example}_compiled + COMMAND ${CMAKE_COMMAND} -E touch ${example}_compiled + ) + add_custom_target(${example} ALL DEPENDS ${example}_compiled) +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/kill.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + ${CMAKE_CURRENT_SOURCE_DIR}/platform.xml + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${sources} + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/examples/scala/master_slave_kill/FinalizeTask.scala b/examples/scala/master_slave_kill/FinalizeTask.scala new file mode 100644 index 0000000000..452860b88a --- /dev/null +++ b/examples/scala/master_slave_kill/FinalizeTask.scala @@ -0,0 +1,13 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package master_slave_kill + +import org.simgrid.msg.Task + +class FinalizeTask extends Task("finalize",0,0) {} + diff --git a/examples/scala/master_slave_kill/Master.scala b/examples/scala/master_slave_kill/Master.scala new file mode 100644 index 0000000000..01dca86b11 --- /dev/null +++ b/examples/scala/master_slave_kill/Master.scala @@ -0,0 +1,42 @@ +/* + * Master of a basic master/slave example in Java + * + * Copyright 2006-2012 The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package master_slave_kill + +import Stream._ +import org.simgrid.msg.HostNotFoundException +import org.simgrid.msg.Msg +import org.simgrid.msg.MsgException +import org.simgrid.msg.Process +import org.simgrid.msg.Task + +class Master(hostname:String, name:String) extends Process(hostname, name) { + def main(args:Array[String]) { + Msg.info("Master Hello!") + var process2:Slave = null + + //Create a slave on host "alice" + try { + Msg.info("Create process on host 'alice'") + process2 = new Slave("alice","slave") + process2.start() + } catch { + case e:MsgException => println("Process2!") + } + + //Wait for slave "alice" + continually({Task.receive("mail1")}) + .takeWhile(!_.isInstanceOf[FinalizeTask]) + .force // to force the list to be compute + + Msg.info("Received mail1!") + process2.kill() + Msg.info("Process2 is now killed, should exit now") + } +} diff --git a/examples/scala/master_slave_kill/MsKill.scala b/examples/scala/master_slave_kill/MsKill.scala new file mode 100644 index 0000000000..ec69031c2c --- /dev/null +++ b/examples/scala/master_slave_kill/MsKill.scala @@ -0,0 +1,37 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package master_slave_kill; + +import org.simgrid.msg.Msg; +import org.simgrid.msg.MsgException; +import org.simgrid.msg.NativeException; + +object MsKill extends App{ + + /* This only contains the launcher. If you do nothing more than than you can run + * scala simgrid.msg.Msg + * which also contains such a launcher + */ + + + /* initialize the MSG simulation. Must be done before anything else (even logging). */ + Msg.init(args) + Msg.createEnvironment(args(0)) + + /* bypass deploymemt */ + try { + val process1 = new Master("bob","master") + process1.start() + } + catch { + case e:MsgException => println("Create processes failed!") + } + + /* execute the simulation. */ + Msg.run() +} diff --git a/examples/scala/master_slave_kill/Slave.scala b/examples/scala/master_slave_kill/Slave.scala new file mode 100644 index 0000000000..38c266a00a --- /dev/null +++ b/examples/scala/master_slave_kill/Slave.scala @@ -0,0 +1,34 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ +package master_slave_kill + +import org.simgrid.msg.HostFailureException +import org.simgrid.msg.HostNotFoundException +import org.simgrid.msg.Msg +import org.simgrid.msg.MsgException +import org.simgrid.msg.Task +import org.simgrid.msg.TimeoutException +import org.simgrid.msg.TransferFailureException +import org.simgrid.msg.Process + +class Slave(hostname:String, name:String) extends Process(hostname, name) { + def main(args:Array[String]) { + Msg.info("Slave Hello!") + + val task = new FinalizeTask(); + Msg.info("Send Mail1!"); + task.send("mail1"); + + try { + Task.receive("mail2"); + } catch { + case e:MsgException => {Msg.debug("Received failed") + return} + } + Msg.info("Receive Mail2!") + } +} diff --git a/examples/scala/master_slave_kill/kill.tesh b/examples/scala/master_slave_kill/kill.tesh new file mode 100644 index 0000000000..f22d582f9e --- /dev/null +++ b/examples/scala/master_slave_kill/kill.tesh @@ -0,0 +1,13 @@ +#! tesh + +! output sort + +$ java -cp ${classpath:=.} master_slave_kill/MsKill ${srcdir:=.}/master_slave_kill/platform.xml +> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up. +> [0.013010] [jmsg/INFO] MSG_main finished; Cleaning up the simulation... +> [alice:slave:(2) 0.000000] [jmsg/INFO] Slave Hello! +> [alice:slave:(2) 0.000000] [jmsg/INFO] Send Mail1! +> [bob:master:(1) 0.000000] [jmsg/INFO] Master Hello! +> [bob:master:(1) 0.000000] [jmsg/INFO] Create process on host 'alice' +> [bob:master:(1) 0.013010] [jmsg/INFO] Received mail1! +> [bob:master:(1) 0.013010] [jmsg/INFO] Process2 is now killed, should exit now diff --git a/examples/scala/master_slave_kill/platform.xml b/examples/scala/master_slave_kill/platform.xml new file mode 100644 index 0000000000..a37f9c87fc --- /dev/null +++ b/examples/scala/master_slave_kill/platform.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/scala/masterslave/CMakeLists.txt b/examples/scala/masterslave/CMakeLists.txt new file mode 100644 index 0000000000..54b10294bf --- /dev/null +++ b/examples/scala/masterslave/CMakeLists.txt @@ -0,0 +1,49 @@ +cmake_minimum_required(VERSION 2.6) + +set(example scala_masterslave) +set(sources + ${CMAKE_CURRENT_SOURCE_DIR}/FinalizeTask.scala + ${CMAKE_CURRENT_SOURCE_DIR}/Forwarder.scala + ${CMAKE_CURRENT_SOURCE_DIR}/Master.scala + ${CMAKE_CURRENT_SOURCE_DIR}/Masterslave.scala + ${CMAKE_CURRENT_SOURCE_DIR}/Slave.scala + ) + +if(enable_scala) + add_custom_command( + COMMENT "Building ${example}..." + OUTPUT ${example}_compiled + DEPENDS ${sources} SG_java_jar ${SIMGRID_JAR} + COMMAND ${SCALA_COMPILE} -cp ${SIMGRID_JAR} + -d ${CMAKE_CURRENT_BINARY_DIR}/.. ${sources} + COMMAND ${CMAKE_COMMAND} -E remove ${example}_compiled + COMMAND ${CMAKE_COMMAND} -E touch ${example}_compiled + ) + add_custom_target(${example} ALL DEPENDS ${example}_compiled) +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/masterslave.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + ${CMAKE_CURRENT_SOURCE_DIR}/deploy.xml + ${CMAKE_CURRENT_SOURCE_DIR}/masterslaveDeployment.xml + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${sources} + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + ${CMAKE_CURRENT_SOURCE_DIR}/README + PARENT_SCOPE + ) diff --git a/examples/scala/masterslave/FinalizeTask.scala b/examples/scala/masterslave/FinalizeTask.scala new file mode 100644 index 0000000000..82027adc18 --- /dev/null +++ b/examples/scala/masterslave/FinalizeTask.scala @@ -0,0 +1,12 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package masterslave +import org.simgrid.msg.Task + +class FinalizeTask extends Task("finalize",0,0) {} + diff --git a/examples/scala/masterslave/Forwarder.scala b/examples/scala/masterslave/Forwarder.scala new file mode 100644 index 0000000000..3b9da5342a --- /dev/null +++ b/examples/scala/masterslave/Forwarder.scala @@ -0,0 +1,52 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package masterslave + +import Stream._ +import org.simgrid.msg.Host +import org.simgrid.msg.Msg +import org.simgrid.msg.MsgException +import org.simgrid.msg.Task +import org.simgrid.msg.Process + +class Forwarder(host:Host, name:String, args:Array[String]) extends Process(host,name,args) { + + def main(args: Array[String]){ + if (args.length < 3) { + Msg.info("Forwarder needs 3 arguments (input mailbox, first output mailbox, last one)") + Msg.info("Got "+args.length+" instead") + System.exit(1) + } + val input = args(0).toInt + val firstOutput = args(1).toInt + val lastOutput = args(2).toInt + + var taskCount = 0 + val slavesCount = lastOutput - firstOutput + 1 + Msg.info("Receiving on 'slave_"+input+"'") + var cont = true + + continually({Task.receive("slave_"+input)}) + .takeWhile(!_.isInstanceOf[FinalizeTask]) + .foreach(task => { + val dest = firstOutput + (taskCount % slavesCount) + Msg.info("Sending \"" + task.getName() + "\" to \"slave_" + dest + "\"") + task.send("slave_"+dest) + taskCount += 1 + }) + + Msg.info("Got a finalize task. Let's forward that we're done.") + for (cpt <- firstOutput to lastOutput) { + val tf = new FinalizeTask() + tf.send("slave_"+cpt) + } + + Msg.info("I'm done. See you!") + } +} + diff --git a/examples/scala/masterslave/Master.scala b/examples/scala/masterslave/Master.scala new file mode 100644 index 0000000000..aba2c71d69 --- /dev/null +++ b/examples/scala/masterslave/Master.scala @@ -0,0 +1,45 @@ +/* + * Master of a basic master/slave example in Java + * + * Copyright 2006-2012 The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ +package masterslave; + +import org.simgrid.msg.Host; +import org.simgrid.msg.Msg; +import org.simgrid.msg.MsgException; +import org.simgrid.msg.Task; +import org.simgrid.msg.Process;; + +class Master(host:Host, name:String, args:Array[String]) extends Process(host,name,args) { + def main(args:Array[String]) { + if (args.length < 4) { + Msg.info("Master needs 4 arguments") + System.exit(1) + } + + val tasksCount = args(0).toInt + val taskComputeSize = args(1).toDouble + val taskCommunicateSize = args(2).toDouble + val slavesCount = args(3).toInt + + Msg.info("Hello! Got " + slavesCount + " slaves and " + tasksCount + " tasks to process") + + for (i <- 0 until tasksCount) { + val task = new Task("Task_" + i, taskComputeSize, taskCommunicateSize) + task.send("slave_"+(i%slavesCount)) + } + + Msg.info("All tasks have been dispatched. Let's tell everybody the computation is over.") + + for (i <- 0 until slavesCount) { + val task = new FinalizeTask() + task.send("slave_"+(i%slavesCount)) + } + + Msg.info("Goodbye now!") + } +} diff --git a/examples/scala/masterslave/Masterslave.scala b/examples/scala/masterslave/Masterslave.scala new file mode 100644 index 0000000000..473c21a13e --- /dev/null +++ b/examples/scala/masterslave/Masterslave.scala @@ -0,0 +1,36 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ + +package masterslave + +import org.simgrid.msg.Msg +import org.simgrid.msg.NativeException +import org.simgrid.msg.Task + +object Masterslave extends App { + val TASK_COMP_SIZE = 10000000 + val TASK_COMM_SIZE = 10000000 + /* This only contains the launcher. If you do nothing more than than you can run + * scala simgrid.msg.Msg + * which also contains such a launcher + */ + + /* initialize the MSG simulation. Must be done before anything else (even logging). */ + Msg.init(args) + + if (args.length < 2) { + Msg.info("Usage : Masterslave platform_file deployment_file") + Msg.info("example : Masterslave basic_platform.xml basic_deployment.xml") + System.exit(1) + } + + /* construct the platform and deploy the application */ + Msg.createEnvironment(args(0)) + Msg.deployApplication(args(1)) + /* execute the simulation. */ + Msg.run() +} diff --git a/examples/scala/masterslave/README b/examples/scala/masterslave/README new file mode 100644 index 0000000000..9207911abc --- /dev/null +++ b/examples/scala/masterslave/README @@ -0,0 +1,11 @@ +This is a somehow basic master/slaves example. + +There is 3 kind of processes: + * Master: creates some tasks, and dispatches them to its slaves + * Forwarder: get tasks from master, and dispatch them further + * Slave: get tasks from either master or forwarder, and run them + +At the end of the execution: + - the master sends FinalizeTask to every known slave to stop them + - On reception of FT, forwarders send FT to every slave, and stop. + - On reception of FinalizeTask, slaves stop. \ No newline at end of file diff --git a/examples/scala/masterslave/Slave.scala b/examples/scala/masterslave/Slave.scala new file mode 100644 index 0000000000..07994576ac --- /dev/null +++ b/examples/scala/masterslave/Slave.scala @@ -0,0 +1,41 @@ +/* + * Copyright 2006-2012. The SimGrid Team. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. + */ +package masterslave; + +import Stream._ +import org.simgrid.msg.Host +import org.simgrid.msg.HostFailureException +import org.simgrid.msg.Msg +import org.simgrid.msg.Task +import org.simgrid.msg.TaskCancelledException +import org.simgrid.msg.TimeoutException +import org.simgrid.msg.TransferFailureException +import org.simgrid.msg.Process + +class Slave(host:Host, name:String, args:Array[String]) extends Process(host,name,args) { + def main(args:Array[String]){ + if (args.length < 1) { + Msg.info("Slave needs 1 argument (its number)") + System.exit(1) + } + + val num = args(0).toInt + + continually({Task.receive("slave_"+num)}) + .takeWhile(!_.isInstanceOf[FinalizeTask]) + .foreach(task => { + Msg.info("Received \"" + task.getName() + "\". Processing it."); + try { + task.execute(); + } catch { + case e:TaskCancelledException => {} + } + }) + + Msg.info("Received Finalize. I'm done. See you!") + } +} diff --git a/examples/scala/masterslave/deploy.xml b/examples/scala/masterslave/deploy.xml new file mode 100644 index 0000000000..70f120be0c --- /dev/null +++ b/examples/scala/masterslave/deploy.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + diff --git a/examples/scala/masterslave/masterslave.tesh b/examples/scala/masterslave/masterslave.tesh new file mode 100644 index 0000000000..77a09b54fe --- /dev/null +++ b/examples/scala/masterslave/masterslave.tesh @@ -0,0 +1,32 @@ +#! tesh + +! output sort + +$ java -cp ${classpath:=.} masterslave/Masterslave ${srcdir:=.}/platform.xml ${srcdir:=.}/masterslave/masterslaveDeployment.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (1:masterslave.Master@Jacquelin) Hello! Got 7 slaves and 5 tasks to process +> [ 0.000000] (2:masterslave.Forwarder@Jackson) Receiving on 'slave_0' +> [ 0.000000] (3:masterslave.Forwarder@Casavant) Receiving on 'slave_1' +> [ 0.851467] (2:masterslave.Forwarder@Jackson) Sending "Task_0" to "slave_7" +> [ 2.208482] (3:masterslave.Forwarder@Casavant) Sending "Task_1" to "slave_9" +> [ 2.720407] (11:masterslave.Slave@Sirois) Received "Task_1". Processing it. +> [ 3.553979] (9:masterslave.Slave@Stephen) Received "Task_0". Processing it. +> [ 5.252157] (4:masterslave.Slave@iRMX) Received "Task_2". Processing it. +> [ 6.266855] (5:masterslave.Slave@Bousquet) Received "Task_3". Processing it. +> [ 7.710549] (1:masterslave.Master@Jacquelin) All tasks have been dispatched. Let's tell everybody the computation is over. +> [ 7.710549] (6:masterslave.Slave@Soucy) Received "Task_4". Processing it. +> [ 8.562012] (2:masterslave.Forwarder@Jackson) Got a finalize task. Let's forward that we're done. +> [ 9.919019] (3:masterslave.Forwarder@Casavant) Got a finalize task. Let's forward that we're done. +> [ 10.430937] (11:masterslave.Slave@Sirois) Received Finalize. I'm done. See you! +> [ 11.264486] (9:masterslave.Slave@Stephen) Received Finalize. I'm done. See you! +> [ 11.318423] (12:masterslave.Slave@Monique) Received Finalize. I'm done. See you! +> [ 11.318423] (3:masterslave.Forwarder@Casavant) I'm done. See you! +> [ 12.962677] (4:masterslave.Slave@iRMX) Received Finalize. I'm done. See you! +> [ 13.907575] (10:masterslave.Slave@Robert) Received Finalize. I'm done. See you! +> [ 13.907575] (2:masterslave.Forwarder@Jackson) I'm done. See you! +> [ 13.977355] (5:masterslave.Slave@Bousquet) Received Finalize. I'm done. See you! +> [ 15.421041] (6:masterslave.Slave@Soucy) Received Finalize. I'm done. See you! +> [ 16.278350] (7:masterslave.Slave@Kuenning) Received Finalize. I'm done. See you! +> [ 17.251680] (0:@) MSG_main finished; Cleaning up the simulation... +> [ 17.251680] (1:masterslave.Master@Jacquelin) Goodbye now! +> [ 17.251680] (8:masterslave.Slave@Browne) Received Finalize. I'm done. See you! +> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up. diff --git a/examples/scala/masterslave/masterslaveDeployment.xml b/examples/scala/masterslave/masterslaveDeployment.xml new file mode 100644 index 0000000000..6c01ac0120 --- /dev/null +++ b/examples/scala/masterslave/masterslaveDeployment.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/scala/platform.xml b/examples/scala/platform.xml new file mode 100644 index 0000000000..84db0e240f --- /dev/null +++ b/examples/scala/platform.xml @@ -0,0 +1,8298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/simdag/2clusters.xml b/examples/simdag/2clusters.xml index 50d3651350..5fd252a307 100644 --- a/examples/simdag/2clusters.xml +++ b/examples/simdag/2clusters.xml @@ -2,31 +2,31 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/simdag/faulty_host.xml b/examples/simdag/faulty_host.xml index bc82e947ee..519ec448ea 100644 --- a/examples/simdag/faulty_host.xml +++ b/examples/simdag/faulty_host.xml @@ -2,9 +2,9 @@ - - + diff --git a/examples/simdag/goal/goal_test.c b/examples/simdag/goal/goal_test.c index be7b99e7e6..299c0b5106 100644 --- a/examples/simdag/goal/goal_test.c +++ b/examples/simdag/goal/goal_test.c @@ -71,7 +71,7 @@ int main(int argc, char **argv) { reclaimed = xbt_dynar_new(sizeof(bcast_task_t),xbt_free_ref); xbt_dynar_t done = NULL; - xbt_os_timer_start(timer); + xbt_os_cputimer_start(timer); send_one(0,SD_workstation_get_number()); do { if (done != NULL && !xbt_dynar_is_empty(done)) { @@ -97,7 +97,7 @@ int main(int argc, char **argv) { } done=SD_simulate(-1); } while(!xbt_dynar_is_empty(done)); - xbt_os_timer_stop(timer); + xbt_os_cputimer_stop(timer); printf("exec_time:%lf\n", xbt_os_timer_elapsed(timer) ); xbt_dynar_free(&done); diff --git a/examples/simdag/scheduling/simulacrum_7_hosts.xml b/examples/simdag/scheduling/simulacrum_7_hosts.xml index dc979c2bb5..0db92e86b3 100644 --- a/examples/simdag/scheduling/simulacrum_7_hosts.xml +++ b/examples/simdag/scheduling/simulacrum_7_hosts.xml @@ -2,35 +2,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/simdag/two_hosts.xml b/examples/simdag/two_hosts.xml index 408737fc42..00651923a0 100644 --- a/examples/simdag/two_hosts.xml +++ b/examples/simdag/two_hosts.xml @@ -2,11 +2,11 @@ - - + - diff --git a/examples/smpi/CMakeLists.txt b/examples/smpi/CMakeLists.txt index 58d9040926..669d3e3e60 100644 --- a/examples/smpi/CMakeLists.txt +++ b/examples/smpi/CMakeLists.txt @@ -62,11 +62,14 @@ set(txt_files ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions0.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions1.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_allReduce.txt + ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_allgatherv.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_alltoall.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_alltoallv.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_barrier.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_bcast.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_bcast_reduce_datatypes.txt + ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_gather.txt + ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_reducescatter.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_waitall.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_with_isend.txt ${CMAKE_CURRENT_SOURCE_DIR}/replay/split_traces diff --git a/examples/smpi/replay/actions_allgatherv.txt b/examples/smpi/replay/actions_allgatherv.txt new file mode 100644 index 0000000000..f0c0e58f30 --- /dev/null +++ b/examples/smpi/replay/actions_allgatherv.txt @@ -0,0 +1,14 @@ +0 init +1 init +2 init +3 init + +0 allGatherV 275427 275427 275427 275427 204020 0 275427 550854 826281 0 0 +1 allGatherV 275427 275427 275427 275427 204020 0 275427 550854 826281 0 0 +2 allGatherV 275427 275427 275427 275427 204020 0 275427 550854 826281 0 0 +3 allGatherV 204020 275427 275427 275427 204020 0 275427 550854 826281 0 0 + +0 finalize +1 finalize +2 finalize +3 finalize diff --git a/examples/smpi/replay/actions_gather.txt b/examples/smpi/replay/actions_gather.txt new file mode 100644 index 0000000000..33f7d0ac1d --- /dev/null +++ b/examples/smpi/replay/actions_gather.txt @@ -0,0 +1,14 @@ +0 init +1 init +2 init +3 init + +0 gather 68 68 0 0 0 +1 gather 68 68 0 0 0 +2 gather 68 68 0 0 0 +3 gather 68 68 0 0 0 + +0 finalize +1 finalize +2 finalize +3 finalize diff --git a/examples/smpi/replay/actions_reducescatter.txt b/examples/smpi/replay/actions_reducescatter.txt new file mode 100644 index 0000000000..6580e0628f --- /dev/null +++ b/examples/smpi/replay/actions_reducescatter.txt @@ -0,0 +1,14 @@ +0 init +1 init +2 init +3 init + +0 reduceScatter 275427 275427 275427 204020 11349173 0 +1 reduceScatter 275427 275427 275427 204020 12396024 0 +2 reduceScatter 275427 275427 275427 204020 12501522 0 +3 reduceScatter 275427 275427 275427 204020 12403123 0 +~ +0 finalize +1 finalize +2 finalize +3 finalize diff --git a/examples/smpi/replay/replay_platform.xml b/examples/smpi/replay/replay_platform.xml index 9823e34576..677a35d23b 100644 --- a/examples/smpi/replay/replay_platform.xml +++ b/examples/smpi/replay/replay_platform.xml @@ -3,25 +3,25 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/examples/smpi/replay/smpi_replay.tesh b/examples/smpi/replay/smpi_replay.tesh index 29b8acd49d..8bbb07c383 100644 --- a/examples/smpi/replay/smpi_replay.tesh +++ b/examples/smpi/replay/smpi_replay.tesh @@ -204,16 +204,17 @@ $ tail -n +3 ./simgrid.trace > 12 157.673699 2 1 6 > 13 229.403658 2 3 > 12 229.403658 2 3 4 -> 13 229.403658 2 3 -> 7 229.403658 1 3 > 13 236.510549 2 1 > 12 236.510549 2 1 4 -> 13 236.510549 2 1 -> 7 236.510549 1 1 > 13 237.966873 2 2 > 12 237.966873 2 2 4 -> 13 237.966873 2 2 -> 7 237.966873 1 2 +> 13 237.972762 2 2 +> 7 237.972762 1 2 +> 13 237.973799 2 3 +> 7 237.973799 1 3 +> 13 237.979818 2 1 +> 7 237.979818 1 1 + $ rm -f ./simgrid.trace diff --git a/include/msg/datatypes.h b/include/msg/datatypes.h index 78af98ed5f..041005d5e8 100644 --- a/include/msg/datatypes.h +++ b/include/msg/datatypes.h @@ -6,7 +6,6 @@ #ifndef MSG_DATATYPE_H #define MSG_DATATYPE_H #include "xbt/misc.h" -#include "xbt/file_stat.h" #include "xbt/lib.h" #include "simgrid/simix.h" #include "simgrid_config.h" // for HAVE_TRACING @@ -27,6 +26,8 @@ SG_BEGIN_DECL() * want to send your task, but only the name of this mailbox. */ typedef struct s_smx_rvpoint *msg_mailbox_t; +/* ******************************** Environment ************************************ */ +typedef struct s_as *msg_as_t; /* ******************************** Host ************************************ */ @@ -97,6 +98,7 @@ typedef struct simdata_file *simdata_file_t; typedef struct msg_file { char *name; /**< @brief file name */ + size_t size; simdata_file_t simdata; /**< @brief simulator data */ void *data; /**< @brief user data */ } s_msg_file_t; @@ -108,15 +110,6 @@ typedef struct msg_file { */ typedef struct msg_file *msg_file_t; - -/** @brief File datatype. - @ingroup msg_file_management - - You should consider this as an opaque object. - */ -typedef s_file_stat_t s_msg_stat_t, *msg_stat_t; - - /*************** Begin GPU ***************/ typedef struct simdata_gpu_task *simdata_gpu_task_t; diff --git a/include/msg/msg.h b/include/msg/msg.h index 8c9c4db58a..0dc3be49f9 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -69,14 +69,20 @@ XBT_PUBLIC(void) MSG_set_function(const char *host_id, XBT_PUBLIC(double) MSG_get_clock(void); XBT_PUBLIC(unsigned long int) MSG_get_sent_msg(void); +/************************** Environment ***********************************/ +XBT_PUBLIC(msg_as_t) MSG_environment_get_routing_root(void); +XBT_PUBLIC(const char *) MSG_environment_as_get_name(msg_as_t as); +XBT_PUBLIC(xbt_dict_t) MSG_environment_as_get_routing_sons(msg_as_t as); +XBT_PUBLIC(const char *) MSG_environment_as_get_property_value(msg_as_t as, const char *name); +XBT_PUBLIC(const char *) MSG_environment_as_get_model(msg_as_t as); +XBT_PUBLIC(xbt_dynar_t) MSG_environment_as_get_hosts(msg_as_t as); /************************** File handling ***********************************/ -XBT_PUBLIC(double) MSG_file_read(void* ptr, size_t size, size_t nmemb, msg_file_t stream); -XBT_PUBLIC(size_t) MSG_file_write(const void* ptr, size_t size, size_t nmemb, msg_file_t stream); -XBT_PUBLIC(msg_file_t) MSG_file_open(const char* mount, const char* path, const char* mode); -XBT_PUBLIC(int) MSG_file_close(msg_file_t fp); -XBT_PUBLIC(int) MSG_file_stat(msg_file_t fd, s_msg_stat_t *buf); -XBT_PUBLIC(void) MSG_file_free_stat(s_msg_stat_t *stat); +XBT_PUBLIC(size_t) MSG_file_read(void* ptr, size_t size, msg_file_t fd); +XBT_PUBLIC(size_t) MSG_file_write(const void* ptr, size_t size, msg_file_t fd); +XBT_PUBLIC(msg_file_t) MSG_file_open(const char* mount, const char* path); +XBT_PUBLIC(int) MSG_file_close(msg_file_t fd); +XBT_PUBLIC(size_t) MSG_file_get_size(msg_file_t fd); XBT_PUBLIC(int) MSG_file_unlink(msg_file_t fd); XBT_PUBLIC(xbt_dict_t) MSG_file_ls(const char *mount, const char *path); @@ -90,10 +96,13 @@ XBT_PUBLIC(void) MSG_as_router_set_property_value(const char* asr, const char *n XBT_PUBLIC(msg_error_t) MSG_host_set_data(msg_host_t host, void *data); XBT_PUBLIC(void *) MSG_host_get_data(msg_host_t host); XBT_PUBLIC(const char *) MSG_host_get_name(msg_host_t host); +XBT_PUBLIC(void) MSG_host_on(msg_host_t host); +XBT_PUBLIC(void) MSG_host_off(msg_host_t host); XBT_PUBLIC(msg_host_t) MSG_host_self(void); XBT_PUBLIC(int) MSG_get_host_msgload(msg_host_t host); /* int MSG_get_msgload(void); This function lacks specification; discard it */ XBT_PUBLIC(double) MSG_get_host_speed(msg_host_t h); +XBT_PUBLIC(int) MSG_get_host_core(msg_host_t h); XBT_PUBLIC(int) MSG_host_is_avail(msg_host_t h); XBT_PUBLIC(void) __MSG_host_priv_free(msg_host_priv_t priv); XBT_PUBLIC(void) __MSG_host_destroy(msg_host_t host); @@ -358,6 +367,19 @@ XBT_PUBLIC(msg_error_t) MSG_set_channel_number(int number); XBT_PUBLIC(int) MSG_get_channel_number(void); #endif +/** @brief Opaque type representing a semaphore + * @ingroup msg_synchro + * @hideinitializer + */ +typedef struct s_smx_sem *msg_sem_t; // Yeah that's a rename of the smx_sem_t which doesnt require smx_sem_t to be declared here +XBT_PUBLIC(msg_sem_t) MSG_sem_init(int initial_value); +XBT_PUBLIC(void) MSG_sem_acquire(msg_sem_t sem); +XBT_PUBLIC(msg_error_t) MSG_sem_acquire_timeout(msg_sem_t sem, double timeout); +XBT_PUBLIC(void) MSG_sem_release(msg_sem_t sem); +XBT_PUBLIC(void) MSG_sem_get_capacity(msg_sem_t sem); +XBT_PUBLIC(void) MSG_sem_destroy(msg_sem_t sem); +XBT_PUBLIC(int) MSG_sem_would_block(msg_sem_t sem); + /** @brief Opaque type describing a Virtual Machine. * @ingroup msg_VMs * diff --git a/include/simgrid/platf.h b/include/simgrid/platf.h index 27af1c3825..c0cffede9d 100644 --- a/include/simgrid/platf.h +++ b/include/simgrid/platf.h @@ -230,6 +230,7 @@ typedef struct s_sg_platf_cluster_cbarg { double loopback_bw; double loopback_lat; double limiter_link; + xbt_dict_t properties; const char* router_id; e_surf_link_sharing_policy_t sharing_policy; e_surf_link_sharing_policy_t bb_sharing_policy; @@ -238,7 +239,7 @@ typedef struct s_sg_platf_cluster_cbarg { } s_sg_platf_cluster_cbarg_t; #define SG_PLATF_CLUSTER_INITIALIZER {NULL,NULL,NULL,NULL,NULL,NULL \ - ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} + ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} typedef struct s_sg_platf_cabinet_cbarg *sg_platf_cabinet_cbarg_t; typedef struct s_sg_platf_cabinet_cbarg { diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index fe2a5c535e..301adeded9 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -10,7 +10,6 @@ #include "xbt/misc.h" #include "xbt/fifo.h" #include "xbt/dict.h" -#include "xbt/file_stat.h" #include "xbt/function_types.h" #include "xbt/parmap.h" #include "xbt/swag.h" @@ -72,7 +71,6 @@ typedef struct s_smx_sem *smx_sem_t; /********************************** File *************************************/ typedef struct s_smx_file *smx_file_t; -typedef struct s_smx_stat *smx_stat_t; /********************************** Action *************************************/ typedef struct s_smx_action *smx_action_t; /* FIXME: replace by specialized action handlers */ @@ -258,6 +256,8 @@ XBT_PUBLIC(smx_host_t) SIMIX_host_get_by_name(const char *name); XBT_PUBLIC(smx_host_t) SIMIX_host_self(void); XBT_PUBLIC(const char*) SIMIX_host_self_get_name(void); XBT_PUBLIC(const char*) SIMIX_host_get_name(smx_host_t host); /* FIXME: make private: only the name of SIMIX_host_self() should be public without request */ +XBT_PUBLIC(void) SIMIX_host_on(smx_host_t host); +XBT_PUBLIC(void) SIMIX_host_off(smx_host_t host, smx_process_t issuer); XBT_PUBLIC(void) SIMIX_host_self_set_data(void *data); XBT_PUBLIC(void*) SIMIX_host_self_get_data(void); XBT_PUBLIC(void*) SIMIX_host_get_data(smx_host_t host); @@ -297,6 +297,9 @@ XBT_PUBLIC(void) SIMIX_comm_finish(smx_action_t action); XBT_PUBLIC(smx_host_t) simcall_host_get_by_name(const char *name); XBT_PUBLIC(const char *) simcall_host_get_name(smx_host_t host); XBT_PUBLIC(xbt_dict_t) simcall_host_get_properties(smx_host_t host); +XBT_PUBLIC(void) simcall_host_on(smx_host_t host); +XBT_PUBLIC(void) simcall_host_off(smx_host_t host); +XBT_PUBLIC(int) simcall_host_get_core(smx_host_t host); XBT_PUBLIC(double) simcall_host_get_speed(smx_host_t host); XBT_PUBLIC(double) simcall_host_get_available_speed(smx_host_t host); /* Two possible states, 1 - CPU ON and 0 CPU OFF */ @@ -478,16 +481,17 @@ XBT_PUBLIC(void) simcall_sem_release(smx_sem_t sem); XBT_PUBLIC(int) simcall_sem_would_block(smx_sem_t sem); XBT_PUBLIC(void) simcall_sem_acquire(smx_sem_t sem); XBT_PUBLIC(void) simcall_sem_acquire_timeout(smx_sem_t sem, - double max_duration); + double max_duration); XBT_PUBLIC(int) simcall_sem_get_capacity(smx_sem_t sem); -XBT_PUBLIC(double) simcall_file_read(void* ptr, size_t size, size_t nmemb, smx_file_t stream); -XBT_PUBLIC(size_t) simcall_file_write(const void* ptr, size_t size, size_t nmemb, smx_file_t stream); -XBT_PUBLIC(smx_file_t) simcall_file_open(const char* storage, const char* path, const char* mode); -XBT_PUBLIC(int) simcall_file_close(smx_file_t fp); -XBT_PUBLIC(int) simcall_file_stat(smx_file_t fd, s_file_stat_t *buf); +XBT_PUBLIC(size_t) simcall_file_read(void* ptr, size_t size, smx_file_t fd); +XBT_PUBLIC(size_t) simcall_file_write(const void* ptr, size_t size, + smx_file_t fd); +XBT_PUBLIC(smx_file_t) simcall_file_open(const char* storage, const char* path); +XBT_PUBLIC(int) simcall_file_close(smx_file_t fd); XBT_PUBLIC(int) simcall_file_unlink(smx_file_t fd); XBT_PUBLIC(xbt_dict_t) simcall_file_ls(const char* mount, const char* path); +XBT_PUBLIC(size_t) simcall_file_get_size(smx_file_t fd); /************************** AS router **********************************/ XBT_PUBLIC(xbt_dict_t) SIMIX_asr_get_properties(const char *name); diff --git a/include/smpi/smpi.h b/include/smpi/smpi.h index b3cfb99f0b..74030ae422 100644 --- a/include/smpi/smpi.h +++ b/include/smpi/smpi.h @@ -43,6 +43,7 @@ SG_BEGIN_DECL() #define MPI_PROC_NULL -2 #define MPI_ANY_TAG -1 #define MPI_UNDEFINED -3 +#define MPI_IN_PLACE (void *)-4 // errorcodes #define MPI_SUCCESS 0 #define MPI_ERR_COMM 1 diff --git a/include/surf/simgrid_dtd.h b/include/surf/simgrid_dtd.h index f619d0502c..d4a8e66ff5 100644 --- a/include/surf/simgrid_dtd.h +++ b/include/surf/simgrid_dtd.h @@ -183,7 +183,7 @@ typedef int AT_surfxml_cluster_loopback___bw; #define AU_surfxml_cluster_loopback___bw NULL typedef int AT_surfxml_ASroute_gw___src; #define AU_surfxml_ASroute_gw___src NULL -typedef enum { AU_surfxml_AS_routing, A_surfxml_AS_routing_Full,A_surfxml_AS_routing_Floyd,A_surfxml_AS_routing_Dijkstra,A_surfxml_AS_routing_DijkstraCache,A_surfxml_AS_routing_None,A_surfxml_AS_routing_RuleBased,A_surfxml_AS_routing_Vivaldi,A_surfxml_AS_routing_Cluster } AT_surfxml_AS_routing; +typedef enum { AU_surfxml_AS_routing, A_surfxml_AS_routing_Full,A_surfxml_AS_routing_Floyd,A_surfxml_AS_routing_Dijkstra,A_surfxml_AS_routing_DijkstraCache,A_surfxml_AS_routing_None,A_surfxml_AS_routing_Vivaldi,A_surfxml_AS_routing_Cluster } AT_surfxml_AS_routing; typedef int AT_surfxml_link_bandwidth; #define AU_surfxml_link_bandwidth NULL typedef int AT_surfxml_cluster_id; diff --git a/include/surf/surfxml_parse.h b/include/surf/surfxml_parse.h index 3564ab7bf6..ee4b4d98d9 100644 --- a/include/surf/surfxml_parse.h +++ b/include/surf/surfxml_parse.h @@ -24,6 +24,10 @@ XBT_PUBLIC(void) surf_parse_error(const char *msg,...) _XBT_GNUC_PRINTF(1,2) _XB XBT_PUBLIC(void) surf_parse_warn(const char *msg,...) _XBT_GNUC_PRINTF(1,2); XBT_PUBLIC(double) surf_parse_get_double(const char *string); XBT_PUBLIC(int) surf_parse_get_int(const char *string); +XBT_PUBLIC(double) surf_parse_get_time(const char *string); +XBT_PUBLIC(double) surf_parse_get_bandwidth(const char *string); +XBT_PUBLIC(double) surf_parse_get_power(const char *string); + /* Prototypes of the functions offered by flex */ XBT_PUBLIC(int) surf_parse_lex(void); XBT_PUBLIC(int) surf_parse_get_lineno(void); diff --git a/include/xbt/config.h b/include/xbt/config.h index 67c25bc85f..bc1b68093f 100644 --- a/include/xbt/config.h +++ b/include/xbt/config.h @@ -103,6 +103,7 @@ XBT_PUBLIC(void) xbt_cfg_set_double(xbt_cfg_t cfg, const char *name, double val); XBT_PUBLIC(void) xbt_cfg_set_string(xbt_cfg_t cfg, const char *name, const char *val); +XBT_PUBLIC(void) xbt_cfg_set_boolean(xbt_cfg_t cfg, const char *name, const char *val); XBT_PUBLIC(void) xbt_cfg_set_peer(xbt_cfg_t cfg, const char *name, const char *peer, int port); XBT_PUBLIC(void*) xbt_cfg_set_as_string(xbt_cfg_t cfg, const char *name, const char *val); @@ -117,6 +118,8 @@ XBT_PUBLIC(void) xbt_cfg_setdefault_double(xbt_cfg_t cfg, const char *name, double val); XBT_PUBLIC(void) xbt_cfg_setdefault_string(xbt_cfg_t cfg, const char *name, const char *val); +XBT_PUBLIC(void) xbt_cfg_setdefault_boolean(xbt_cfg_t cfg, const char *name, + const char *val); XBT_PUBLIC(void) xbt_cfg_setdefault_peer(xbt_cfg_t cfg, const char *name, const char *host, int port); @@ -129,6 +132,7 @@ XBT_PUBLIC(void) xbt_cfg_rm_double(xbt_cfg_t cfg, const char *name, double val); XBT_PUBLIC(void) xbt_cfg_rm_string(xbt_cfg_t cfg, const char *name, const char *val); +XBT_PUBLIC(void) xbt_cfg_rm_boolean(xbt_cfg_t cfg, const char *name, int val); XBT_PUBLIC(void) xbt_cfg_rm_peer(xbt_cfg_t cfg, const char *name, const char *peer, int port); @@ -159,12 +163,23 @@ typedef enum { /**< double */ xbt_cfgelm_string, /**< char* */ + xbt_cfgelm_boolean, /**< int */ xbt_cfgelm_peer, /**< both a char* (representing the peername) and an integer (representing the port) */ xbt_cfgelm_any, /* not shown to users to prevent errors */ xbt_cfgelm_type_count } e_xbt_cfgelm_type_t; +/** Boolean possible values **/ + +struct xbt_boolean_couple { + const char *true_val; + const char *false_val; +}; + + + + /** \brief Callback types. They get the name of the modified entry, and the position of the changed value */ typedef void (*xbt_cfg_cb_t) (const char *, int); @@ -215,6 +230,7 @@ XBT_PUBLIC(e_xbt_cfgelm_type_t) xbt_cfg_get_type(xbt_cfg_t cfg, XBT_PUBLIC(int) xbt_cfg_get_int(xbt_cfg_t cfg, const char *name); XBT_PUBLIC(double) xbt_cfg_get_double(xbt_cfg_t cfg, const char *name); XBT_PUBLIC(char *) xbt_cfg_get_string(xbt_cfg_t cfg, const char *name); +XBT_PUBLIC(int) xbt_cfg_get_boolean(xbt_cfg_t cfg, const char *name); XBT_PUBLIC(void) xbt_cfg_get_peer(xbt_cfg_t cfg, const char *name, char **peer, int *port); XBT_PUBLIC(xbt_dynar_t) xbt_cfg_get_dynar(xbt_cfg_t cfg, const char *name); @@ -225,6 +241,8 @@ XBT_PUBLIC(double) xbt_cfg_get_double_at(xbt_cfg_t cfg, const char *name, int pos); XBT_PUBLIC(char *) xbt_cfg_get_string_at(xbt_cfg_t cfg, const char *name, int pos); +XBT_PUBLIC(int) xbt_cfg_get_boolean_at(xbt_cfg_t cfg, const char *name, + int pos); XBT_PUBLIC(void) xbt_cfg_get_peer_at(xbt_cfg_t cfg, const char *name, int pos, char **peer, int *port); diff --git a/include/xbt/file_stat.h b/include/xbt/file_stat.h deleted file mode 100644 index 4e323dc06e..0000000000 --- a/include/xbt/file_stat.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * file_stat.h - * - * Created on: 3 avr. 2012 - * Author: navarro - */ - -#ifndef _FILE_STAT_H -#define _FILE_STAT_H - -#include "xbt/sysdep.h" - -/** \ingroup msg_file_management - \brief Strucure containing information on file like stat on POSIX - */ -typedef struct file_stat { - char *user_rights; - char *user; - char *group; - char *date; /* FIXME: update to time_t or double */ - char *time; /* FIXME: update to time_t or double */ - double size; -} s_file_stat_t, *file_stat_t; - -static XBT_INLINE void file_stat_copy(s_file_stat_t *src, s_file_stat_t *dst) -{ - dst->date = xbt_strdup(src->date); - dst->group = xbt_strdup(src->group); - dst->size = src->size; - dst->time = xbt_strdup(src->time); - dst->user = xbt_strdup(src->user); - dst->user_rights = xbt_strdup(src->user_rights); -} - -#endif /* _FILE_STAT_H */ diff --git a/src/bindings/java/jmsg.c b/src/bindings/java/jmsg.c index 8a6a626e11..64b5ef5f68 100644 --- a/src/bindings/java/jmsg.c +++ b/src/bindings/java/jmsg.c @@ -16,6 +16,8 @@ #include "jmsg_process.h" +#include "jmsg_as.h" + #include "jmsg_host.h" #include "jmsg_task.h" #include "jxbt_utilities.h" @@ -170,6 +172,26 @@ Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, (*env)->ReleaseStringUTFChars(env, jplatformFile, platformFile); } + +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNIEnv * env, jclass cls) +{ + msg_as_t as = MSG_environment_get_routing_root(); + jobject jas = jas_new_instance(env); + if (!jas) { + jxbt_throw_jni(env, "java As instantiation failed"); + return NULL; + } + jas = jas_ref(env, jas); + if (!jas) { + jxbt_throw_jni(env, "new global ref allocation failed"); + return NULL; + } + jas_bind(jas, as, env); + + return (jobject) jas; +} + JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_debug(JNIEnv * env, jclass cls, jstring js) { @@ -235,7 +257,7 @@ static int create_jprocess(int argc, char *argv[]) { jclass class_Process = (*env)->FindClass(env, argv[0]); xbt_str_subst(argv[0],'/','.',0); //Retrieve the methodID for the constructor - xbt_assert((class_Process != NULL), "Class not found."); + xbt_assert((class_Process != NULL), "Class not found (%s).", argv[0]); jmethodID constructor_Process = (*env)->GetMethodID(env, class_Process, "", "(Lorg/simgrid/msg/Host;Ljava/lang/String;[Ljava/lang/String;)V"); xbt_assert((constructor_Process != NULL), "Constructor not found for class %s. Is there a (Host, String ,String[]) constructor in your class ?", argv[0]); diff --git a/src/bindings/java/jmsg.h b/src/bindings/java/jmsg.h index 73e9ad9460..4d9a5d4d91 100644 --- a/src/bindings/java/jmsg.h +++ b/src/bindings/java/jmsg.h @@ -56,6 +56,8 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_critical(JNIEnv *, jclass, JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, jstring jplatformFile); +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNIEnv * env, jclass cls); JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_deployApplication(JNIEnv * env, jclass cls, jstring jdeploymentFile); diff --git a/src/bindings/java/jmsg_as.c b/src/bindings/java/jmsg_as.c new file mode 100644 index 0000000000..30f8b0ed67 --- /dev/null +++ b/src/bindings/java/jmsg_as.c @@ -0,0 +1,174 @@ +/* Functions related to the java host instances. */ + +/* Copyright (c) 2007-2012. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "xbt/str.h" +#include "xbt/dict.h" +#include "msg/msg.h" +#include "jmsg_as.h" +#include "jxbt_utilities.h" + +XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg); + +static jmethodID jas_method_As_constructor; +static jfieldID jas_field_As_bind; + +jobject jas_new_instance(JNIEnv * env) { + jclass cls = jxbt_get_class(env, "org/simgrid/msg/As"); + return (*env)->NewObject(env, cls, jas_method_As_constructor); +} + +jobject jas_ref(JNIEnv * env, jobject jas) { + return (*env)->NewGlobalRef(env, jas); +} + +void jas_unref(JNIEnv * env, jobject jas) { + (*env)->DeleteGlobalRef(env, jas); +} + +void jas_bind(jobject jas, msg_as_t as, JNIEnv * env) { + (*env)->SetLongField(env, jas, jas_field_As_bind, (jlong) (long) (as)); +} + +msg_as_t jas_get_native(JNIEnv * env, jobject jas) { + return (msg_as_t) (long) (*env)->GetLongField(env, jas, jas_field_As_bind); +} + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_As_nativeInit(JNIEnv *env, jclass cls) { + jclass class_As = (*env)->FindClass(env, "org/simgrid/msg/As"); + jas_method_As_constructor = (*env)->GetMethodID(env, class_As, "", "()V"); + jas_field_As_bind = jxbt_get_jfield(env,class_As, "bind", "J"); + if (!class_As || !jas_method_As_constructor || !jas_field_As_bind) { + jxbt_throw_native(env,bprintf("Can't find some fields in Java class. You should report this bug.")); + } +} + +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_As_getName(JNIEnv * env, jobject jas) { + msg_as_t as = jas_get_native(env, jas); + return (*env)->NewStringUTF(env, MSG_environment_as_get_name(as)); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_simgrid_msg_As_getSons(JNIEnv * env, jobject jas) { + int index = 0; + jobjectArray jtable; + jobject tmp_jas; + msg_as_t tmp_as; + msg_as_t self_as = jas_get_native(env, jas); + + xbt_dict_t dict = MSG_environment_as_get_routing_sons(self_as); + int count = xbt_dict_length(dict); + jclass cls = (*env)->FindClass(env, "org/simgrid/msg/As"); + + if (!cls) { + return NULL; + } + + jtable = (*env)->NewObjectArray(env, (jsize) count, cls, NULL); + + if (!jtable) { + jxbt_throw_jni(env, "Hosts table allocation failed"); + return NULL; + } + + xbt_dict_cursor_t cursor=NULL; + char *key; + + xbt_dict_foreach(dict,cursor,key,tmp_as) { + tmp_jas = jas_new_instance(env); + if (!tmp_jas) { + jxbt_throw_jni(env, "java As instantiation failed"); + return NULL; + } + tmp_jas = jas_ref(env, tmp_jas); + if (!tmp_jas) { + jxbt_throw_jni(env, "new global ref allocation failed"); + return NULL; + } + jas_bind(tmp_jas, tmp_as, env); + + (*env)->SetObjectArrayElement(env, jtable, index, tmp_jas); + index++; + + } + return jtable; +} + +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobject jas, jobject jname) { + msg_as_t as = jas_get_native(env, jas); + + if (!as) { + jxbt_throw_notbound(env, "as", jas); + return NULL; + } + const char *name = (*env)->GetStringUTFChars(env, jname, 0); + + const char *property = MSG_environment_as_get_property_value(as, name); + if (!property) { + return NULL; + } + + jobject jproperty = (*env)->NewStringUTF(env, property); + + (*env)->ReleaseStringUTFChars(env, jname, name); + + return jproperty; +} + +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_As_getModel(JNIEnv * env, jobject jas) { + msg_as_t as = jas_get_native(env, jas); + return (*env)->NewStringUTF(env, MSG_environment_as_get_model(as)); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jobject jas) +{ + int index; + jobjectArray jtable; + jobject jhost; + jstring jname; + msg_host_t host; + msg_as_t as = jas_get_native(env, jas); + + xbt_dynar_t table = MSG_environment_as_get_hosts(as); + int count = xbt_dynar_length(table); + + jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host"); + + if (!cls) { + return NULL; + } + + jtable = (*env)->NewObjectArray(env, (jsize) count, cls, NULL); + + if (!jtable) { + jxbt_throw_jni(env, "Hosts table allocation failed"); + return NULL; + } + + for (index = 0; index < count; index++) { + + host = xbt_dynar_get_as(table,index,msg_host_t); + + jhost = (jobject) (MSG_host_get_data(host)); + if (!jhost) { + jname = (*env)->NewStringUTF(env, MSG_host_get_name(host)); + + jhost = Java_org_simgrid_msg_Host_getByName(env, cls, jname); + + /* FIXME: leak of jname ? */ + } + + (*env)->SetObjectArrayElement(env, jtable, index, jhost); + } + xbt_dynar_free(&table); + return jtable; +} diff --git a/src/bindings/java/jmsg_as.h b/src/bindings/java/jmsg_as.h new file mode 100644 index 0000000000..00b21fc986 --- /dev/null +++ b/src/bindings/java/jmsg_as.h @@ -0,0 +1,51 @@ +/* Functions related to the java As instances. */ + +/* Copyright (c) 2007-2012. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + + +#ifndef MSG_JAS_H +#define MSG_JAS_H +#include +#include "msg/msg.h" + +/* Functions related to the java host instances. */ + +/* Copyright (c) 2007-2012. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "msg/msg.h" +#include "jmsg.h" +#include "jmsg_host.h" + +jobject jas_new_instance(JNIEnv * env); +jobject jas_ref(JNIEnv * env, jobject jas); +void jas_unref(JNIEnv * env, jobject jas); +void jas_bind(jobject jas, msg_as_t as, JNIEnv * env); +msg_as_t jas_get_native(JNIEnv * env, jobject jas); + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_As_nativeInit(JNIEnv *env, jclass cls); + +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_As_getName(JNIEnv * env, jobject jas); + +JNIEXPORT jobjectArray JNICALL +Java_org_simgrid_msg_As_getSons(JNIEnv * env, jobject jas); + +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobject jhost, jobject jname); + +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_As_getModel(JNIEnv * env, jobject jas); + +JNIEXPORT jobjectArray JNICALL +Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jobject jas); + +#endif /*!MSG_JAS_H */ diff --git a/src/bindings/java/jmsg_file.c b/src/bindings/java/jmsg_file.c index 9266483085..d1e57c2e84 100644 --- a/src/bindings/java/jmsg_file.c +++ b/src/bindings/java/jmsg_file.c @@ -7,8 +7,8 @@ #include "jmsg_file.h" #include "jxbt_utilities.h" -void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t stream) { - (*env)->SetLongField(env, jfile, jfile_field_bind, (intptr_t)stream); +void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t fd) { + (*env)->SetLongField(env, jfile, jfile_field_bind, (intptr_t)fd); } msg_file_t jfile_get_native(JNIEnv *env, jobject jfile) { @@ -24,32 +24,30 @@ Java_org_simgrid_msg_File_nativeInit(JNIEnv *env, jclass cls) { xbt_assert((jfile_field_bind != NULL), "Can't find \"bind\" field in File class."); } JNIEXPORT void JNICALL -Java_org_simgrid_msg_File_open(JNIEnv *env, jobject jfile, jobject jstorage, jobject jpath, jobject jmode) { +Java_org_simgrid_msg_File_open(JNIEnv *env, jobject jfile, jobject jstorage, jobject jpath) { const char *storage = (*env)->GetStringUTFChars(env, jstorage, 0); const char *path = (*env)->GetStringUTFChars(env, jpath, 0); - const char *mode = (*env)->GetStringUTFChars(env, jmode, 0); msg_file_t file; - file = MSG_file_open(storage, path, mode); + file = MSG_file_open(storage, path); jfile_bind(env, jfile, file); (*env)->ReleaseStringUTFChars(env, jstorage, storage); (*env)->ReleaseStringUTFChars(env, jpath, path); - (*env)->ReleaseStringUTFChars(env, jmode, mode); } JNIEXPORT jlong JNICALL -Java_org_simgrid_msg_File_read(JNIEnv *env, jobject jfile, jlong jsize, jlong jnmemb) { +Java_org_simgrid_msg_File_read(JNIEnv *env, jobject jfile, jlong jsize) { msg_file_t file = jfile_get_native(env, jfile); size_t n; - n = MSG_file_read(NULL,(size_t)jsize, (size_t)jnmemb, file); + n = MSG_file_read(NULL,(size_t)jsize, file); return (jlong)n; } JNIEXPORT jlong JNICALL -Java_org_simgrid_msg_File_write(JNIEnv *env, jobject jfile, jlong jsize, jlong jnmemb) { +Java_org_simgrid_msg_File_write(JNIEnv *env, jobject jfile, jlong jsize) { msg_file_t file = jfile_get_native(env, jfile); size_t n; - n = MSG_file_write(NULL, (size_t)jsize, (size_t)jnmemb, file); + n = MSG_file_write(NULL, (size_t)jsize, file); return (jlong)n; } JNIEXPORT void JNICALL diff --git a/src/bindings/java/jmsg_file.h b/src/bindings/java/jmsg_file.h index 2f554f6ac1..182bef1218 100644 --- a/src/bindings/java/jmsg_file.h +++ b/src/bindings/java/jmsg_file.h @@ -12,7 +12,7 @@ jfieldID jfile_field_bind; -void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t stream); +void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t fd); msg_file_t jfile_get_native(JNIEnv *env, jobject jfile); /** * Class org_simgrid_msg_File @@ -27,19 +27,19 @@ Java_org_simgrid_msg_File_nativeInit(JNIEnv*, jclass); * Signature (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V */ JNIEXPORT void JNICALL -Java_org_simgrid_msg_File_open(JNIEnv*, jobject, jobject, jobject, jobject); +Java_org_simgrid_msg_File_open(JNIEnv*, jobject, jobject, jobject); /** * Class org_simgrid_msg_File * Method read */ JNIEXPORT jlong JNICALL -Java_org_simgrid_msg_File_read(JNIEnv*, jobject, jlong, jlong); +Java_org_simgrid_msg_File_read(JNIEnv*, jobject, jlong); /** * Class org_simgrid_msg_File * Method write */ JNIEXPORT jlong JNICALL -Java_org_simgrid_msg_File_write(JNIEnv*, jobject, jlong, jlong); +Java_org_simgrid_msg_File_write(JNIEnv*, jobject, jlong); /** * Class org_simgrid_msg_File * Method close diff --git a/src/bindings/java/jmsg_host.c b/src/bindings/java/jmsg_host.c index 8cd7da1837..07c908c25c 100644 --- a/src/bindings/java/jmsg_host.c +++ b/src/bindings/java/jmsg_host.c @@ -154,6 +154,19 @@ Java_org_simgrid_msg_Host_currentHost(JNIEnv * env, jclass cls) { return jhost; } + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Host_on(JNIEnv *env, jobject jhost) { + msg_host_t host = jhost_get_native(env, jhost); + MSG_host_on(host); +} + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Host_off(JNIEnv *env, jobject jhost) { + msg_host_t host = jhost_get_native(env, jhost); + MSG_host_off(host); +} + JNIEXPORT jint JNICALL Java_org_simgrid_msg_Host_getCount(JNIEnv * env, jclass cls) { xbt_dynar_t hosts = MSG_hosts_as_dynar(); @@ -174,6 +187,20 @@ Java_org_simgrid_msg_Host_getSpeed(JNIEnv * env, return (jdouble) MSG_get_host_speed(host); } + +JNIEXPORT jdouble JNICALL +Java_org_simgrid_msg_Host_getCore(JNIEnv * env, + jobject jhost) { + msg_host_t host = jhost_get_native(env, jhost); + + if (!host) { + jxbt_throw_notbound(env, "host", jhost); + return -1; + } + + return (jdouble) MSG_get_host_core(host); +} + JNIEXPORT jint JNICALL Java_org_simgrid_msg_Host_getLoad(JNIEnv * env, jobject jhost) { msg_host_t host = jhost_get_native(env, jhost); @@ -206,6 +233,7 @@ Java_org_simgrid_msg_Host_getProperty(JNIEnv *env, jobject jhost, jobject jname) return jproperty; } + JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_setProperty(JNIEnv *env, jobject jhost, jobject jname, jobject jvalue) { msg_host_t host = jhost_get_native(env, jhost); @@ -278,3 +306,12 @@ Java_org_simgrid_msg_Host_all(JNIEnv * env, jclass cls_arg) xbt_dynar_free(&table); return jtable; } + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Host_setAsyncMailbox(JNIEnv * env, jclass cls_arg, jobject jname){ + + const char *name = (*env)->GetStringUTFChars(env, jname, 0); + MSG_mailbox_set_async(name); + (*env)->ReleaseStringUTFChars(env, jname, name); + +} diff --git a/src/bindings/java/jmsg_host.h b/src/bindings/java/jmsg_host.h index 0dc01c25da..e132ce1bb6 100644 --- a/src/bindings/java/jmsg_host.h +++ b/src/bindings/java/jmsg_host.h @@ -112,6 +112,24 @@ Java_org_simgrid_msg_Host_nativeInit(JNIEnv *env, jclass cls); JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_getByName (JNIEnv *, jclass, jstring); +/** + * This function start the host if it is off + * + * @param jhost The host to test the validity. + * @param env The environment of the current thread + * + */ +JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_on(JNIEnv *env, jobject jhost); + +/** + * This function stop the host if it is on + * + * @param jhost The host to test the validity. + * @param env The environment of the current thread + * + */ +JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_off(JNIEnv *env, jobject jhost); + /* * Class org_simgrid_msg_Host * Method currentHost @@ -134,6 +152,13 @@ JNIEXPORT jint JNICALL Java_org_simgrid_msg_Host_getCount */ JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getSpeed (JNIEnv *, jobject); +/* + * Class org_simgrid_msg_Host + * Method getCore + * Signature ()D + */ +JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getCore + (JNIEnv *, jobject); /* * Class org_simgrid_msg_Host * Method getLoad @@ -171,4 +196,10 @@ JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_Host_isAvail JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Host_all(JNIEnv *, jclass); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Host_setAsyncMailbox(JNIEnv * env, jclass cls_arg, jobject jname); + + + #endif /*!MSG_JHOST_H */ + diff --git a/src/bindings/java/jmsg_synchro.c b/src/bindings/java/jmsg_synchro.c index cbccf4cd26..cea60307ec 100644 --- a/src/bindings/java/jmsg_synchro.c +++ b/src/bindings/java/jmsg_synchro.c @@ -5,6 +5,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include "jmsg.h" #include "xbt/synchro_core.h" #include "jmsg_synchro.h" #include "jxbt_utilities.h" @@ -56,3 +57,55 @@ Java_org_simgrid_msg_Mutex_exit(JNIEnv * env, jobject obj) { mutex = (xbt_mutex_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Mutex_bind); xbt_mutex_destroy(mutex); } + +static jfieldID jsyncro_field_Semaphore_bind; + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Semaphore_nativeInit(JNIEnv *env, jclass cls) { + jsyncro_field_Semaphore_bind = jxbt_get_sfield(env, "org/simgrid/msg/Semaphore", "bind", "J"); + if (!jsyncro_field_Semaphore_bind) { + jxbt_throw_native(env,bprintf("Can't find some fields in Semaphore Java class. You should report this bug.")); + } +} +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Semaphore_init(JNIEnv * env, jobject obj, jint capacity) { + msg_sem_t sem = MSG_sem_init((int) capacity); + + (*env)->SetLongField(env, obj, jsyncro_field_Semaphore_bind, (jlong) (long) (sem)); +} + + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Semaphore_acquire(JNIEnv * env, jobject obj, jdouble timeout) { + msg_sem_t sem; + + sem = (msg_sem_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Semaphore_bind); + msg_error_t res = MSG_sem_acquire_timeout(sem, (double) timeout); + if (res != MSG_OK) { + jmsg_throw_status(env, res); + } +} + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Semaphore_release(JNIEnv * env, jobject obj) { + msg_sem_t sem; + + sem = (msg_sem_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Semaphore_bind); + MSG_sem_release(sem); +} +JNIEXPORT jboolean JNICALL +Java_org_simgrid_msg_Semaphore_wouldBlock(JNIEnv * env, jobject obj) { + msg_sem_t sem; + + sem = (msg_sem_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Semaphore_bind); + int res = MSG_sem_would_block(sem); + return (jboolean) res; +} + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Mutex_destroy(JNIEnv * env, jobject obj) { + msg_sem_t sem; + + sem = (msg_sem_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Semaphore_bind); + MSG_sem_destroy(sem); +} diff --git a/src/bindings/java/jmsg_synchro.h b/src/bindings/java/jmsg_synchro.h index 5c3e41f239..1eb5a1d91b 100644 --- a/src/bindings/java/jmsg_synchro.h +++ b/src/bindings/java/jmsg_synchro.h @@ -28,4 +28,16 @@ Java_org_simgrid_msg_Mutex_release(JNIEnv * env, jobject obj); JNIEXPORT void JNICALL Java_org_simgrid_msg_Mutex_exit(JNIEnv * env, jobject obj); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Semaphore_nativeInit(JNIEnv *env, jclass cls); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Semaphore_init(JNIEnv * env, jobject obj, jint capacity); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Semaphore_acquire(JNIEnv * env, jobject obj, jdouble timeout); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Semaphore_release(JNIEnv * env, jobject obj); +JNIEXPORT jboolean JNICALL +Java_org_simgrid_msg_Semaphore_wouldBlock(JNIEnv * env, jobject obj); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Mutex_destroy(JNIEnv * env, jobject obj); #endif /* !MSG_JPROCESS_H */ diff --git a/src/bindings/java/jmsg_vm.c b/src/bindings/java/jmsg_vm.c index 8948b57fb0..395b8d2234 100644 --- a/src/bindings/java/jmsg_vm.c +++ b/src/bindings/java/jmsg_vm.c @@ -135,7 +135,7 @@ Java_org_simgrid_msg_VM_save(JNIEnv *env, jobject jvm) { MSG_vm_save(vm); } JNIEXPORT void JNICALL -Java_org_simgrid_msg_VM_retore(JNIEnv *env, jobject jvm) { +Java_org_simgrid_msg_VM_restore(JNIEnv *env, jobject jvm) { msg_vm_t vm = jvm_get_native(env,jvm); MSG_vm_restore(vm); } diff --git a/src/bindings/java/jmsg_vm.h b/src/bindings/java/jmsg_vm.h index 808fbd71f7..7bfe807cf1 100644 --- a/src/bindings/java/jmsg_vm.h +++ b/src/bindings/java/jmsg_vm.h @@ -146,4 +146,6 @@ Java_org_simgrid_msg_VM_save(JNIEnv *env, jobject jvm); JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_restore(JNIEnv *env, jobject jvm); +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_VM_get_pm(JNIEnv *env, jobject jvm); #endif diff --git a/src/bindings/java/org/simgrid/msg/As.java b/src/bindings/java/org/simgrid/msg/As.java new file mode 100644 index 0000000000..f895e1acb9 --- /dev/null +++ b/src/bindings/java/org/simgrid/msg/As.java @@ -0,0 +1,41 @@ +/* + * Bindings to the MSG hosts + * + * Copyright 2006-2012 The SimGrid Team + * All right reserved. + * + * This program is free software; you can redistribute + * it and/or modify it under the terms of the license + *(GNU LGPL) which comes with this package. + * + */ +package org.simgrid.msg; + +public class As { + + private long bind; + + protected As() { + }; + + public String toString (){ + return this.getName(); + } + public native String getName(); + + public native As[] getSons(); + + public native String getProperty(String name); + + public native String getModel(); + + public native Host[] getHosts(); + + /** + * Class initializer, to initialize various JNI stuff + */ + public static native void nativeInit(); + static { + nativeInit(); + } +} diff --git a/src/bindings/java/org/simgrid/msg/File.java b/src/bindings/java/org/simgrid/msg/File.java index 032a6bbce2..426ea071b6 100644 --- a/src/bindings/java/org/simgrid/msg/File.java +++ b/src/bindings/java/org/simgrid/msg/File.java @@ -18,24 +18,22 @@ public class File { private long bind = 0; /** * Constructor, opens the file. - * @param storage is the name where you can find the stream + * @param storage is the name where you can find the file descriptor * @param path is the file location on the storage - * @param mode points to a string beginning with one of the following sequences (Additional characters may follow these sequences.): r Open text file for reading. The stream is positioned at the beginning of the file. r+ Open for reading and writing. The stream is positioned at the beginning of the file. w Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file. w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file. a Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file. a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file. */ - public File(String storage, String path, String mode) { + public File(String storage, String path) { this.storage = storage; - open(storage, path, mode); + open(storage, path); } protected void finalize() { } /** * Opens the file whose name is the string pointed to by path. - * @param storage is the name where you can find the stream + * @param storage is the name where you can find the file descriptor * @param path is the file location on the storage - * @param mode points to a string beginning with one of the following sequences (Additional characters may follow these sequences.): r Open text file for reading. The stream is positioned at the beginning of the file. r+ Open for reading and writing. The stream is positioned at the beginning of the file. w Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file. w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file. a Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file. a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file. */ - protected native void open(String storage, String path, String mode); + protected native void open(String storage, String path); /** * Read elements of a file. * @param size of each element diff --git a/src/bindings/java/org/simgrid/msg/Host.java b/src/bindings/java/org/simgrid/msg/Host.java index 7f1738ded5..d8c46f35d0 100644 --- a/src/bindings/java/org/simgrid/msg/Host.java +++ b/src/bindings/java/org/simgrid/msg/Host.java @@ -106,6 +106,20 @@ public class Host { */ public native static Host[] all(); + /** + * This static method sets a mailbox to receive in asynchronous mode. + * + * All messages sent to this mailbox will be transferred to + * the receiver without waiting for the receive call. + * The receive call will still be necessary to use the received data. + * If there is a need to receive some messages asynchronously, and some not, + * two different mailboxes should be used. + * + * @param mailboxName The name of the mailbox + */ + public static native void setAsyncMailbox(String mailboxName); + + /** * This method returns the name of a host. * @return The name of the host. @@ -114,6 +128,7 @@ public class Host { public String getName() { return name; } + /** * Sets the data of the host. * @param data @@ -139,6 +154,17 @@ public class Host { return null != this.data; } + /** + * This method start the host if it is off + */ + public native void on(); + + /** + * This method stop the host if it is on + */ + public native void off(); + + /** * This method returns the number of tasks currently running on a host. * The external load is not taken in account. @@ -155,7 +181,15 @@ public class Host { * */ public native double getSpeed(); - + + /** + * This method returns the number of core of a host. + * + * @return The speed of the processor of the host in flops. + * + */ + public native double getCore(); + /** * Returns the value of a given host property. */ diff --git a/src/bindings/java/org/simgrid/msg/Msg.java b/src/bindings/java/org/simgrid/msg/Msg.java index 2cf133a523..5a08809b2a 100644 --- a/src/bindings/java/org/simgrid/msg/Msg.java +++ b/src/bindings/java/org/simgrid/msg/Msg.java @@ -37,10 +37,19 @@ public final class Msg { nativeInit(); } private static void loadLib (String name) { - String Os = System.getProperty("os.name"); - //Windows may report its name in java differently from cmake, which generated the path - if(Os.toLowerCase().indexOf("win") >= 0) Os = "Windows"; - String Path = "NATIVE/"+Os+"/"+System.getProperty("os.arch")+"/"; + String Os = System.getProperty("os.name"); + String Arch = System.getProperty("os.arch"); + // Some OS/Arch may be different between Java and Cmake, + // which generated the path + if (Os.toLowerCase().startsWith("win")) + Os = "Windows"; + else if (Os.contains("OS X")) + Os = "Darwin"; + if (Arch.equalsIgnoreCase("x86")) + Arch = "i386"; + else if (Arch.equalsIgnoreCase("x86_64")) + Arch = "amd64"; + String Path = "NATIVE/" + Os + "/" + Arch + "/"; String filename=name; InputStream in = Msg.class.getClassLoader().getResourceAsStream(Path+filename); @@ -183,6 +192,8 @@ public final class Msg { */ public final static native void createEnvironment(String platformFile); + public final static native As environmentGetRoutingRoot(); + /** * The method to deploy the simulation. * diff --git a/src/bindings/java/org/simgrid/msg/Process.java b/src/bindings/java/org/simgrid/msg/Process.java index 2b2c4b2907..d7a5109a6c 100644 --- a/src/bindings/java/org/simgrid/msg/Process.java +++ b/src/bindings/java/org/simgrid/msg/Process.java @@ -98,7 +98,7 @@ public abstract class Process implements Runnable { /** - * Default constructor (used in ApplicationHandler to initialize it) + * Default constructor */ protected Process() { this.id = nextProcessId++; diff --git a/src/bindings/java/org/simgrid/msg/Semaphore.java b/src/bindings/java/org/simgrid/msg/Semaphore.java new file mode 100644 index 0000000000..f1a276b1c3 --- /dev/null +++ b/src/bindings/java/org/simgrid/msg/Semaphore.java @@ -0,0 +1,86 @@ +/* + * Copyright 2012 The SimGrid team. All right reserved. + * + * This program is free software; you can redistribute + * it and/or modify it under the terms of the license + * (GNU LGPL) which comes with this package. + * + */ +package org.simgrid.msg; +/** A semaphore implemented on top of SimGrid synchronization mechanisms. + * You can use it exactly the same way that you use classical semaphores + * but to handle the interactions between the processes within the simulation. + * + */ + +public class Semaphore { + private long bind; // The C object -- don't touch it + /** + * Semaphore capacity, defined when the semaphore is created. At most capacity + * process can acquire this semaphore at the same time. + */ + protected final int capacity; + /** + * Creates a new semaphore with the given capacity. At most capacity + * process can acquire this semaphore at the same time. + */ + public Semaphore(int capacity) { + init(capacity); + this.capacity = capacity; + } + /** The native implementation of semaphore initialization + */ + private native void init(int capacity); + + + /** Locks on the semaphore object until the provided timeout expires + * @exception TimeoutException if the timeout expired before + * the semaphore could be acquired. + */ + public native void acquire(double timeout) throws TimeoutException; + /** Locks on the semaphore object with no timeout + */ + public void acquire() { + try { + acquire(-1); + } catch (TimeoutException e) { + // This should not happen. + assert(false); + } + } + /** Releases the semaphore object + */ + public native void release(); + /** returns a boolean indicating it this semaphore would block at this very specific time + * + * Note that the returned value may be wrong right after the + * function call, when you try to use it... But that's a + * classical semaphore issue, and SimGrid's semaphores are not + * different to usual ones here. + */ + public native boolean wouldBlock(); + + /** Returns the semaphore capacity + */ + public int getCapacity(){ + return this.capacity; + } + + + /** Deletes this semaphore + */ + protected void finalize() { + destroy(); + } + /** The native implementation for destroying a semaphore + */ + private native void destroy(); + /** + * Class initializer, to initialize various JNI stuff + */ + public static native void nativeInit(); + static { + Msg.nativeInit(); + nativeInit(); + } +} \ No newline at end of file diff --git a/src/bindings/java/smx_context_cojava.c b/src/bindings/java/smx_context_cojava.c index 5e135f21f3..a7670a0886 100644 --- a/src/bindings/java/smx_context_cojava.c +++ b/src/bindings/java/smx_context_cojava.c @@ -264,7 +264,8 @@ static void smx_ctx_cojava_create_coroutine(smx_ctx_cojava_t context) { FILE *conf= fopen("/proc/sys/vm/max_map_count","r"); if (conf) { int limit=-1; - fscanf(conf,"%d",&limit); + if(fscanf(conf,"%d",&limit) != 1) + xbt_die("Error while creating a new coroutine. Parse error."); fclose(conf); if (limit!=-1 && SIMIX_process_count() > (limit - 100) /2) xbt_die("Error while creating a new coroutine. " diff --git a/src/bindings/lua/lua_platf.c b/src/bindings/lua/lua_platf.c index 777a664b44..581b06de68 100644 --- a/src/bindings/lua/lua_platf.c +++ b/src/bindings/lua/lua_platf.c @@ -320,7 +320,6 @@ int console_AS_open(lua_State *L) { else if(!strcmp(mode,"Floyd")) mode_int = A_surfxml_AS_routing_Floyd; else if(!strcmp(mode,"Dijkstra")) mode_int = A_surfxml_AS_routing_Dijkstra; else if(!strcmp(mode,"DijkstraCache")) mode_int = A_surfxml_AS_routing_DijkstraCache; - else if(!strcmp(mode,"RuleBased")) mode_int = A_surfxml_AS_routing_RuleBased; else if(!strcmp(mode,"Vivaldi")) mode_int = A_surfxml_AS_routing_Vivaldi; else if(!strcmp(mode,"Cluster")) mode_int = A_surfxml_AS_routing_Cluster; else if(!strcmp(mode,"none")) mode_int = A_surfxml_AS_routing_None; diff --git a/src/include/mc/datatypes.h b/src/include/mc/datatypes.h index 307e3ea064..656541b87a 100644 --- a/src/include/mc/datatypes.h +++ b/src/include/mc/datatypes.h @@ -53,6 +53,10 @@ void stack_region_free_voidp(void *s); void heap_ignore_region_free(mc_heap_ignore_region_t r); void heap_ignore_region_free_voidp(void *r); +void data_bss_ignore_variable_free(mc_data_bss_ignore_variable_t v); +void data_bss_ignore_variable_free_voidp(void *v); +void stack_ignore_variable_free(mc_stack_ignore_variable_t v); +void stack_ignore_variable_free_voidp(void *v); SG_END_DECL() #endif /* _MC_MC_H */ diff --git a/src/include/simgrid/sg_config.h b/src/include/simgrid/sg_config.h index fdda707180..9952bfca13 100644 --- a/src/include/simgrid/sg_config.h +++ b/src/include/simgrid/sg_config.h @@ -7,6 +7,7 @@ XBT_PUBLIC_DATA(xbt_cfg_t) _sg_cfg_set; XBT_PUBLIC(int) sg_cfg_get_int(const char* name); XBT_PUBLIC(double) sg_cfg_get_double(const char* name); XBT_PUBLIC(char*) sg_cfg_get_string(const char* name); +XBT_PUBLIC(int) sg_cfg_get_boolean(const char* name); XBT_PUBLIC(void) sg_cfg_get_peer(const char *name, char **peer, int *port); XBT_PUBLIC(xbt_dynar_t) sg_cfg_get_dynar(const char* name); diff --git a/src/include/smpi/smpi_interface.h b/src/include/smpi/smpi_interface.h index 294cd09c96..04fc1da637 100644 --- a/src/include/smpi/smpi_interface.h +++ b/src/include/smpi/smpi_interface.h @@ -22,6 +22,15 @@ typedef struct mpi_coll_description { void *coll; } s_mpi_coll_description_t, *mpi_coll_description_t; + +/** \ingroup MPI gather + * \brief The list of all available allgather collectives + */ +XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_gather_description[]; +XBT_PUBLIC_DATA(int (*mpi_coll_gather_fun) + (void *, int, MPI_Datatype, void *, int, MPI_Datatype, + int, MPI_Comm)); + /** \ingroup MPI allgather * \brief The list of all available allgather collectives */ @@ -30,6 +39,14 @@ XBT_PUBLIC_DATA(int (*mpi_coll_allgather_fun) (void *, int, MPI_Datatype, void *, int, MPI_Datatype, MPI_Comm)); +/** \ingroup MPI allgather + * \brief The list of all available allgather collectives + */ +XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_allgatherv_description[]; +XBT_PUBLIC_DATA(int (*mpi_coll_allgatherv_fun) + (void *, int, MPI_Datatype, void *, int*, int*, MPI_Datatype, + MPI_Comm)); + /** \ingroup MPI allreduce * \brief The list of all available allgather collectives @@ -40,7 +57,7 @@ XBT_PUBLIC_DATA(int (*mpi_coll_allreduce_fun) MPI_Op op, MPI_Comm comm)); -/** \ingroup MPI alltoallcollectives +/** \ingroup MPI alltoall * \brief The list of all available alltoall collectives */ XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_alltoall_description[]; @@ -48,6 +65,14 @@ XBT_PUBLIC_DATA(int (*mpi_coll_alltoall_fun) (void *, int, MPI_Datatype, void *, int, MPI_Datatype, MPI_Comm)); +/** \ingroup MPI alltoallv + * \brief The list of all available alltoallv collectives + */ +XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_alltoallv_description[]; +XBT_PUBLIC_DATA(int (*mpi_coll_alltoallv_fun) + (void *, int*, int*, MPI_Datatype, void *, int*, int*, MPI_Datatype, + MPI_Comm)); + /** \ingroup MPI bcast * \brief The list of all available bcast collectives @@ -66,11 +91,33 @@ XBT_PUBLIC_DATA(int (*mpi_coll_reduce_fun) (void *buf, void *rbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)); +/** \ingroup MPI reduce_scatter + * \brief The list of all available allgather collectives + */ +XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_reduce_scatter_description[]; +XBT_PUBLIC_DATA(int (*mpi_coll_reduce_scatter_fun) + (void *sbuf, void *rbuf, int *rcounts, + MPI_Datatype dtype, MPI_Op op,MPI_Comm comm)); + +/** \ingroup MPI scatter + * \brief The list of all available allgather collectives + */ +XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_scatter_description[]; +XBT_PUBLIC_DATA(int (*mpi_coll_scatter_fun) + (void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int recvcount, MPI_Datatype recvtype, + int root, MPI_Comm comm)); + +/** \ingroup MPI barrier + * \brief The list of all available allgather collectives + */ +XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_barrier_description[]; +XBT_PUBLIC_DATA(int (*mpi_coll_barrier_fun) + (MPI_Comm comm)); + XBT_PUBLIC(void) coll_help(const char *category, s_mpi_coll_description_t * table); XBT_PUBLIC(int) find_coll_description(s_mpi_coll_description_t * table, - const char *name); - - + char *name); #endif /* _SMPI_INTERFAC_H */ diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 74133ae405..cb867e323b 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -12,7 +12,6 @@ #include "xbt/dict.h" #include "xbt/graph.h" #include "xbt/misc.h" -#include "xbt/file_stat.h" #include "portable.h" #include "xbt/config.h" #include "surf/datatypes.h" @@ -124,7 +123,6 @@ typedef struct surf_action { char *category; /**< tracing category for categorized resource utilization monitoring */ #endif surf_file_t file; /**< surf_file_t for storage model */ - s_file_stat_t stat; /**< surf_file_t for storage model */ xbt_dict_t ls_dict; } s_surf_action_t; @@ -208,6 +206,9 @@ typedef struct surf_cpu_model_extension_public { surf_action_t(*execute) (void *cpu, double size); surf_action_t(*sleep) (void *cpu, double duration); e_surf_resource_state_t(*get_state) (void *cpu); + void(*set_state) (void *cpu, e_surf_resource_state_t state); + + int (*get_core) (void *cpu); double (*get_speed) (void *cpu, double load); double (*get_available_speed) (void *cpu); void (*add_traces) (void); @@ -240,12 +241,13 @@ typedef struct surf_network_model_extension_public { */ typedef struct surf_storage_model_extension_public { - surf_action_t(*open) (void *storage, const char* mount, const char* path, const char* mode); - surf_action_t(*close) (void *storage, surf_file_t fp); - surf_action_t(*read) (void *storage, void* ptr, double size, size_t nmemb, surf_file_t stream); - surf_action_t(*write) (void *storage, const void* ptr, size_t size, size_t nmemb, surf_file_t stream); - surf_action_t(*stat) (void *storage, surf_file_t stream); - surf_action_t(*unlink) (void *storage, surf_file_t stream); + surf_action_t(*open) (void *storage, const char* mount, const char* path); + surf_action_t(*close) (void *storage, surf_file_t fd); + surf_action_t(*read) (void *storage, void* ptr, size_t size, + surf_file_t fd); + surf_action_t(*write) (void *storage, const void* ptr, size_t size, + surf_file_t fd); + surf_action_t(*stat) (void *storage, surf_file_t fd); surf_action_t(*ls) (void *storage, const char *path); } s_surf_model_extension_storage_t; @@ -262,6 +264,8 @@ typedef struct surf_workstation_model_extension_public { and create the corresponding action */ surf_action_t(*sleep) (void *workstation, double duration); /**< Make a workstation sleep during a given duration */ e_surf_resource_state_t(*get_state) (void *workstation); /**< Return the CPU state of a workstation */ + void(*set_state) (void *workstation, e_surf_resource_state_t state); + int (*get_core) (void *workstation); double (*get_speed) (void *workstation, double load); /**< Return the speed of a workstation */ double (*get_available_speed) (void *workstation); /**< Return tha available speed of a workstation */ surf_action_t(*communicate) (void *workstation_src, /**< Execute a communication amount between two workstations */ @@ -277,13 +281,17 @@ typedef struct surf_workstation_model_extension_public { double rate); double (*get_link_bandwidth) (const void *link); /**< Return the current bandwidth of a network link */ double (*get_link_latency) (const void *link); /**< Return the current latency of a network link */ - surf_action_t(*open) (void *workstation, const char* storage, const char* path, const char* mode); - surf_action_t(*close) (void *workstation, surf_file_t fp); - surf_action_t(*read) (void *workstation, void* ptr, size_t size, size_t nmemb, surf_file_t stream); - surf_action_t(*write) (void *workstation, const void* ptr, size_t size, size_t nmemb, surf_file_t stream); - surf_action_t(*stat) (void *workstation, surf_file_t stream); - surf_action_t(*unlink) (void *workstation, surf_file_t stream); + surf_action_t(*open) (void *workstation, const char* storage, + const char* path); + surf_action_t(*close) (void *workstation, surf_file_t fd); + surf_action_t(*read) (void *workstation, void* ptr, size_t size, + surf_file_t fd); + surf_action_t(*write) (void *workstation, const void* ptr, size_t size, + surf_file_t fd); + surf_action_t(*stat) (void *workstation, surf_file_t fd); + int(*unlink) (void *workstation, surf_file_t fd); surf_action_t(*ls) (void *workstation, const char* mount, const char *path); + size_t (*get_size) (void *workstation, surf_file_t fd); int (*link_shared) (const void *link); xbt_dict_t(*get_properties) (const void *resource); @@ -713,6 +721,17 @@ XBT_PUBLIC_DATA(s_surf_model_description_t) surf_new_model_description[]; XBT_PUBLIC_DATA(xbt_dynar_t) model_list; XBT_PUBLIC_DATA(xbt_dynar_t) model_list_invoke; +/*******************************************/ +/*** SURF Platform *************************/ +/*******************************************/ +typedef struct s_as *AS_t; + +XBT_PUBLIC_DATA(AS_t) surf_AS_get_routing_root(void); +XBT_PUBLIC_DATA(const char *) surf_AS_get_name(AS_t as); +XBT_PUBLIC_DATA(xbt_dict_t) surf_AS_get_routing_sons(AS_t as); +XBT_PUBLIC_DATA(const char *) surf_AS_get_model(AS_t as); +XBT_PUBLIC_DATA(xbt_dynar_t) surf_AS_get_hosts(AS_t as); + /*******************************************/ /*** SURF Globals **************************/ /*******************************************/ diff --git a/src/include/xbt/xbt_os_time.h b/src/include/xbt/xbt_os_time.h index a86bcdd96c..a6d848d5ae 100644 --- a/src/include/xbt/xbt_os_time.h +++ b/src/include/xbt/xbt_os_time.h @@ -22,9 +22,18 @@ XBT_PUBLIC(void) xbt_os_sleep(double sec); typedef struct s_xbt_os_timer *xbt_os_timer_t; XBT_PUBLIC(xbt_os_timer_t) xbt_os_timer_new(void); XBT_PUBLIC(void) xbt_os_timer_free(xbt_os_timer_t timer); -XBT_PUBLIC(void) xbt_os_timer_start(xbt_os_timer_t timer); -XBT_PUBLIC(void) xbt_os_timer_resume(xbt_os_timer_t timer); -XBT_PUBLIC(void) xbt_os_timer_stop(xbt_os_timer_t timer); XBT_PUBLIC(double) xbt_os_timer_elapsed(xbt_os_timer_t timer); + +XBT_PUBLIC(void) xbt_os_walltimer_start(xbt_os_timer_t timer); +XBT_PUBLIC(void) xbt_os_walltimer_resume(xbt_os_timer_t timer); +XBT_PUBLIC(void) xbt_os_walltimer_stop(xbt_os_timer_t timer); + +XBT_PUBLIC(void) xbt_os_cputimer_start(xbt_os_timer_t timer); +XBT_PUBLIC(void) xbt_os_cputimer_resume(xbt_os_timer_t timer); +XBT_PUBLIC(void) xbt_os_cputimer_stop(xbt_os_timer_t timer); + +XBT_PUBLIC(void) xbt_os_threadtimer_start(xbt_os_timer_t timer); +XBT_PUBLIC(void) xbt_os_threadtimer_resume(xbt_os_timer_t timer); +XBT_PUBLIC(void) xbt_os_threadtimer_stop(xbt_os_timer_t timer); #endif diff --git a/src/instr/instr_config.c b/src/instr/instr_config.c index f9b94801b5..7d61fef6da 100644 --- a/src/instr/instr_config.c +++ b/src/instr/instr_config.c @@ -33,6 +33,8 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration"); #define OPT_TRACING_COMMENT_FILE "tracing/comment_file" #define OPT_VIVA_UNCAT_CONF "viva/uncategorized" #define OPT_VIVA_CAT_CONF "viva/categorized" +#define OPT_TRACING_DISABLE_LINK "tracing/disable_link" +#define OPT_TRACING_DISABLE_POWER "tracing/disable_power" static int trace_enabled; static int trace_platform; @@ -49,6 +51,8 @@ static int trace_buffer; static int trace_onelink_only; static int trace_disable_destroy; static int trace_basic; +static int trace_disable_link; +static int trace_disable_power; static int trace_configured = 0; static int trace_active = 0; @@ -72,6 +76,8 @@ static void TRACE_getopts(void) trace_onelink_only = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_ONELINK_ONLY); trace_disable_destroy = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY); trace_basic = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_BASIC); + trace_disable_link = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_DISABLE_LINK); + trace_disable_power = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_DISABLE_POWER); } static xbt_dynar_t TRACE_start_functions = NULL; @@ -247,6 +253,15 @@ int TRACE_msg_vm_is_enabled(void) return trace_msg_vm_enabled && TRACE_is_enabled(); } +int TRACE_disable_link(void) +{ + return trace_disable_link && TRACE_is_enabled(); +} + +int TRACE_disable_power(void) +{ + return trace_disable_power && TRACE_is_enabled(); +} int TRACE_buffer (void) { @@ -379,6 +394,21 @@ void TRACE_global_init(int *argc, char **argv) xbt_cfgelm_int, &default_tracing_msg_vm, 0, 1, NULL, NULL); + /* disable tracing link */ + int default_tracing_disable_link = 0; + xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_LINK, + "Do not trace link bandwidth and latency.", + xbt_cfgelm_int, &default_tracing_disable_link, 0, 1, + NULL, NULL); + + /* disable tracing link */ + int default_tracing_disable_power = 0; + xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_POWER, + "Do not trace host power.", + xbt_cfgelm_int, &default_tracing_disable_power, 0, 1, + NULL, NULL); + + /* tracing buffer */ int default_buffer = 1; xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BUFFER, diff --git a/src/instr/instr_private.h b/src/instr/instr_private.h index 3598c7c1ca..24f2af342d 100644 --- a/src/instr/instr_private.h +++ b/src/instr/instr_private.h @@ -142,6 +142,8 @@ int TRACE_uncategorized (void); int TRACE_msg_process_is_enabled(void); int TRACE_msg_vm_is_enabled(void); int TRACE_buffer (void); +int TRACE_disable_link(void); +int TRACE_disable_power(void); int TRACE_onelink_only (void); int TRACE_disable_destroy (void); int TRACE_basic (void); diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index 9b0650a961..340b1b00d5 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -78,12 +78,114 @@ static void MC_snapshot_add_region(mc_snapshot_t snapshot, int type, void *start return; } -void MC_init_memory_map_info(){ +static void get_memory_regions(mc_snapshot_t snapshot){ - int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + FILE *fp; + char *line = NULL; + ssize_t read; + size_t n = 0; + + char *lfields[6] = {0}, *tok; + void *start_addr, *start_addr1, *end_addr; + size_t size; + int i; - MC_SET_RAW_MEM; + fp = fopen("/proc/self/maps", "r"); + xbt_assert(fp, + "Cannot open /proc/self/maps to investigate the memory map of the process. Please report this bug."); + + setbuf(fp, NULL); + + while((read = xbt_getline(&line, &n, fp)) != -1){ + + /* Wipeout the new line character */ + line[read - 1] = '\0'; + + /* Tokenize the line using spaces as delimiters and store each token */ + lfields[0] = strtok(line, " "); + + for (i = 1; i < 6 && lfields[i - 1] != NULL; i++) { + lfields[i] = strtok(NULL, " "); + } + + /* First get the permissions flags, need write permission */ + if(lfields[1][1] == 'w'){ + + /* Get the start address of the map */ + tok = strtok(lfields[0], "-"); + start_addr = (void *)strtoul(tok, NULL, 16); + + if(start_addr == std_heap){ /* Std_heap ? */ + tok = strtok(NULL, "-"); + end_addr = (void *)strtoul(tok, NULL, 16); + MC_snapshot_add_region(snapshot, 0, start_addr, (char*)end_addr - (char*)start_addr); + snapshot->heap_bytes_used = mmalloc_get_bytes_used(std_heap); + }else{ /* map name == libsimgrid || binary_name ? */ + if(lfields[5] != NULL){ + if(!memcmp(basename(lfields[5]), "libsimgrid", 10)){ + tok = strtok(NULL, "-"); + end_addr = (void *)strtoul(tok, NULL, 16); + size = (char*)end_addr - (char*)start_addr; + /* BSS and data segments may be separated according to the OS */ + if((read = xbt_getline(&line, &n, fp)) != -1){ + line[read - 1] = '\0'; + lfields[0] = strtok(line, " "); + for (i = 1; i < 6 && lfields[i - 1] != NULL; i++) { + lfields[i] = strtok(NULL, " "); + } + if(lfields[1][1] == 'w' && lfields[5] == NULL){ + tok = strtok(lfields[0], "-"); + start_addr1 = (void *)strtoul(tok, NULL, 16); + tok = strtok(NULL, "-"); + size += (char *)(void *)strtoul(tok, NULL, 16) - (char*)start_addr1; + } + } + MC_snapshot_add_region(snapshot, 1, start_addr, size); + }else if(!memcmp(basename(lfields[5]), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ + tok = strtok(NULL, "-"); + end_addr = (void *)strtoul(tok, NULL, 16); + size = (char*)end_addr - (char*)start_addr; + /* BSS and data segments may be separated according to the OS */ + if((read = xbt_getline(&line, &n, fp)) != -1){ + line[read - 1] = '\0'; + lfields[0] = strtok(line, " "); + for (i = 1; i < 6 && lfields[i - 1] != NULL; i++) { + lfields[i] = strtok(NULL, " "); + } + tok = strtok(lfields[0], "-"); + start_addr1 = (void *)strtoul(tok, NULL, 16); + if(lfields[1][1] == 'w' && lfields[5] == NULL){ + if(start_addr1 == std_heap){ /* Std_heap ? */ + tok = strtok(NULL, "-"); + end_addr = (void *)strtoul(tok, NULL, 16); + MC_snapshot_add_region(snapshot, 0, start_addr1, (char*)end_addr - (char*)start_addr1); + snapshot->heap_bytes_used = mmalloc_get_bytes_used(std_heap); + }else if(start_addr1 != raw_heap){ + tok = strtok(NULL, "-"); + size += (char *)(void *)strtoul(tok, NULL, 16) - (char *)start_addr1; + } + } + } + MC_snapshot_add_region(snapshot, 2, start_addr, size); + }else if (!memcmp(lfields[5], "[stack]", 7)){ + maestro_stack_start = start_addr; + tok = strtok(NULL, "-"); + maestro_stack_end = (void *)strtoul(tok, NULL, 16); + } + } + } + } + + } + + free(line); + fclose(fp); + +} + +void MC_init_memory_map_info(){ + unsigned int i = 0; s_map_region_t reg; memory_map_t maps = get_memory_map(); @@ -124,18 +226,14 @@ void MC_init_memory_map_info(){ } i++; } - + free_memory_map(maps); - MC_UNSET_RAW_MEM; - - if(raw_mem_set) - MC_SET_RAW_MEM; - } mc_snapshot_t MC_take_snapshot() { + int raw_mem = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; @@ -143,70 +241,17 @@ mc_snapshot_t MC_take_snapshot() mc_snapshot_t snapshot = xbt_new0(s_mc_snapshot_t, 1); snapshot->nb_processes = xbt_swag_size(simix_global->process_list); - unsigned int i = 0; - s_map_region_t reg; - memory_map_t maps = get_memory_map(); - void *heap = NULL; - size_t size = 0; - void *start = NULL; - - /* Save the std heap and the writable mapped pages of libsimgrid */ - while (i < maps->mapsize) { - reg = maps->regions[i]; - if ((reg.prot & PROT_WRITE)){ - if (maps->regions[i].pathname == NULL){ - if (reg.start_addr == std_heap){ // only save the std heap (and not the raw one) - MC_snapshot_add_region(snapshot, 0, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); - snapshot->heap_bytes_used = mmalloc_get_bytes_used(std_heap); - heap = snapshot->regions[0]->data; - } - i++; - } else{ - if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){ - size = (char*)reg.end_addr - (char*)reg.start_addr; - start = reg.start_addr; - i++; - reg = maps->regions[i]; - if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize){ - size += (char*)reg.end_addr - (char*)reg.start_addr; - reg = maps->regions[i]; - i++; - } - MC_snapshot_add_region(snapshot, 1, start, size); - }else if(!memcmp(maps->regions[i].pathname, "[stack]", 7)){ - maestro_stack_start = reg.start_addr; - maestro_stack_end = reg.end_addr; - i++; - } else if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ - size = (char*)reg.end_addr - (char*)reg.start_addr; - start = reg.start_addr; - i++; - reg = maps->regions[i]; - if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && reg.start_addr != std_heap && reg.start_addr != raw_heap && i < maps->mapsize){ - size += (char*)reg.end_addr - (char*)reg.start_addr; - reg = maps->regions[i]; - i++; - } - MC_snapshot_add_region(snapshot, 2, start, size); - }else{ - i++; - } - } - }else{ - i++; - } - } + /* Save the std heap and the writable mapped pages of libsimgrid and binary */ + get_memory_regions(snapshot); snapshot->to_ignore = take_snapshot_ignore(); if(_sg_mc_visited > 0 || strcmp(_sg_mc_property_file,"")){ - snapshot->stacks = take_snapshot_stacks(&snapshot, heap); + snapshot->stacks = take_snapshot_stacks(&snapshot, snapshot->regions[0]->data); get_hash_global(snapshot->hash_global, snapshot->regions[1]->data, snapshot->regions[2]->data); get_hash_local(snapshot->hash_local, snapshot->stacks); } - free_memory_map(maps); - MC_UNSET_RAW_MEM; if(raw_mem) @@ -231,6 +276,7 @@ void MC_free_snapshot(mc_snapshot_t snapshot) for(i=0; i < NB_REGIONS; i++) MC_region_destroy(snapshot->regions[i]); + xbt_free(snapshot->stack_sizes); xbt_dynar_free(&(snapshot->stacks)); xbt_dynar_free(&(snapshot->to_ignore)); xbt_free(snapshot); @@ -463,7 +509,7 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) to_append = bprintf("frame_name=%s\n", frame_name); xbt_strbuff_append(variables, to_append); xbt_free(to_append); - to_append = bprintf("ip=%lx\n", ip); + to_append = bprintf("ip=%lx\n", (unsigned long)ip); xbt_strbuff_append(variables, to_append); xbt_free(to_append); @@ -500,6 +546,7 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) if(!xbt_dynar_is_empty(compose)){ frame_pointer_address = xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address ; + xbt_dynar_reset(compose); } break; default : @@ -566,6 +613,7 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) xbt_free(to_append); } } + xbt_dynar_reset(compose); }else{ to_append = bprintf("%s=undefined\n", current_variable->name); xbt_strbuff_append(variables, to_append); diff --git a/src/mc/mc_compare.c b/src/mc/mc_compare.c index da1efaaba8..b51f045685 100644 --- a/src/mc/mc_compare.c +++ b/src/mc/mc_compare.c @@ -173,16 +173,16 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ xbt_os_timer_t global_timer = xbt_os_timer_new(); xbt_os_timer_t timer = xbt_os_timer_new(); - xbt_os_timer_start(global_timer); + xbt_os_walltimer_start(global_timer); #ifdef MC_DEBUG - xbt_os_timer_start(timer); + xbt_os_walltimer_start(timer); #endif /* Compare number of processes */ if(s1->nb_processes != s2->nb_processes){ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->nb_processes_comparison_time = xbt_os_timer_elapsed(timer); XBT_DEBUG("Different number of processes : %d - %d", s1->nb_processes, s2->nb_processes); errors++; @@ -192,7 +192,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif xbt_os_timer_free(timer); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -204,13 +204,13 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ } #ifdef MC_DEBUG - xbt_os_timer_start(timer); + xbt_os_walltimer_start(timer); #endif /* Compare number of bytes used in each heap */ if(s1->heap_bytes_used != s2->heap_bytes_used){ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->bytes_used_comparison_time = xbt_os_timer_elapsed(timer); XBT_DEBUG("Different number of bytes used in each heap : %zu - %zu", s1->heap_bytes_used, s2->heap_bytes_used); errors++; @@ -220,7 +220,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif xbt_os_timer_free(timer); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -231,12 +231,12 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif }else{ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); #endif } #ifdef MC_DEBUG - xbt_os_timer_start(timer); + xbt_os_walltimer_start(timer); #endif /* Compare size of stacks */ @@ -249,7 +249,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ if(size_used1 != size_used2){ #ifdef MC_DEBUG if(is_diff == 0){ - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->stacks_sizes_comparison_time = xbt_os_timer_elapsed(timer); } XBT_DEBUG("Different size used in stacks : %zu - %zu", size_used1, size_used2); @@ -261,7 +261,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif xbt_os_timer_free(timer); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -276,15 +276,15 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #ifdef MC_DEBUG if(is_diff == 0) - xbt_os_timer_stop(timer); - xbt_os_timer_start(timer); + xbt_os_walltimer_stop(timer); + xbt_os_walltimer_start(timer); #endif /* Compare hash of global variables */ if(s1->hash_global != NULL && s2->hash_global != NULL){ if(strcmp(s1->hash_global, s2->hash_global) != 0){ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->hash_global_variables_comparison_time = xbt_os_timer_elapsed(timer); XBT_DEBUG("Different hash of global variables : %s - %s", s1->hash_global, s2->hash_global); errors++; @@ -294,7 +294,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif xbt_os_timer_free(timer); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -307,14 +307,14 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ } #ifdef MC_DEBUG - xbt_os_timer_start(timer); + xbt_os_walltimer_start(timer); #endif /* Compare hash of local variables */ if(s1->hash_local != NULL && s2->hash_local != NULL){ if(strcmp(s1->hash_local, s2->hash_local) != 0){ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->hash_local_variables_comparison_time = xbt_os_timer_elapsed(timer); XBT_DEBUG("Different hash of local variables : %s - %s", s1->hash_local, s2->hash_local); errors++; @@ -324,7 +324,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif xbt_os_timer_free(timer); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -337,7 +337,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ } #ifdef MC_DEBUG - xbt_os_timer_start(timer); + xbt_os_walltimer_start(timer); #endif /* Init heap information used in heap comparison algorithm */ @@ -347,7 +347,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ is_diff = compare_global_variables(2, s1->regions[2]->data, s2->regions[2]->data); if(is_diff != 0){ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->binary_global_variables_comparison_time = xbt_os_timer_elapsed(timer); XBT_DEBUG("Different global variables in binary"); errors++; @@ -358,7 +358,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ reset_heap_information(); xbt_os_timer_free(timer); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -371,15 +371,15 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #ifdef MC_DEBUG if(is_diff == 0) - xbt_os_timer_stop(timer); - xbt_os_timer_start(timer); + xbt_os_walltimer_stop(timer); + xbt_os_walltimer_start(timer); #endif /* Compare libsimgrid global variables */ is_diff = compare_global_variables(1, s1->regions[1]->data, s2->regions[1]->data); if(is_diff != 0){ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->libsimgrid_global_variables_comparison_time = xbt_os_timer_elapsed(timer); XBT_DEBUG("Different global variables in libsimgrid"); errors++; @@ -390,7 +390,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ reset_heap_information(); xbt_os_timer_free(timer); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -403,8 +403,8 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #ifdef MC_DEBUG if(is_diff == 0) - xbt_os_timer_stop(timer); - xbt_os_timer_start(timer); + xbt_os_walltimer_stop(timer); + xbt_os_walltimer_start(timer); #endif /* Stacks comparison */ @@ -417,7 +417,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ if(diff_local > 0){ #ifdef MC_DEBUG if(is_diff == 0){ - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer); } XBT_DEBUG("Different local variables between stacks %d", cursor + 1); @@ -431,7 +431,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ reset_heap_information(); xbt_os_timer_free(timer); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -445,14 +445,14 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ } #ifdef MC_DEBUG - xbt_os_timer_start(timer); + xbt_os_walltimer_start(timer); #endif /* Compare heap */ if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[0]->data, (xbt_mheap_t)s2->regions[0]->data)){ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); mc_comp_times->heap_comparison_time = xbt_os_timer_elapsed(timer); XBT_DEBUG("Different heap (mmalloc_compare)"); errors++; @@ -465,7 +465,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif reset_heap_information(); - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); @@ -476,7 +476,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif }else{ #ifdef MC_DEBUG - xbt_os_timer_stop(timer); + xbt_os_walltimer_stop(timer); #endif } @@ -485,7 +485,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ xbt_os_timer_free(timer); #ifdef MC_VERBOSE - xbt_os_timer_stop(global_timer); + xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); #endif diff --git a/src/mc/mc_dpor.c b/src/mc/mc_dpor.c index 38ec8a76dd..08990a5586 100644 --- a/src/mc/mc_dpor.c +++ b/src/mc/mc_dpor.c @@ -29,7 +29,7 @@ static mc_visited_state_t visited_state_new(){ new_state->heap_bytes_used = mmalloc_get_bytes_used(std_heap); new_state->nb_processes = xbt_swag_size(simix_global->process_list); new_state->system_state = MC_take_snapshot(); - new_state->num = mc_stats->expanded_states - 1; + new_state->num = mc_stats->expanded_states; return new_state; @@ -82,11 +82,11 @@ static int is_visited_state(){ state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, cursor, mc_visited_state_t); bytes_used_test = state_test->heap_bytes_used; nb_processes_test = state_test->nb_processes; - if(nb_processes_test < current_nb_processes) + if(nb_processes_test < current_nb_processes){ start = cursor + 1; - if(nb_processes_test > current_nb_processes) - end = cursor - 1; - if(nb_processes_test == current_nb_processes){ + }else if(nb_processes_test > current_nb_processes){ + end = cursor - 1; + }else if(nb_processes_test == current_nb_processes){ if(bytes_used_test < current_bytes_used) start = cursor + 1; if(bytes_used_test > current_bytes_used) @@ -94,8 +94,6 @@ static int is_visited_state(){ if(bytes_used_test == current_bytes_used){ same_processes_and_bytes_not_found = 0; if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){ - xbt_dynar_remove_at(visited_states, cursor, NULL); - xbt_dynar_insert_at(visited_states, cursor, &new_state); XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num); if(raw_mem_set) MC_SET_RAW_MEM; @@ -111,8 +109,6 @@ static int is_visited_state(){ if(bytes_used_test != current_bytes_used) break; if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){ - xbt_dynar_remove_at(visited_states, previous_cursor, NULL); - xbt_dynar_insert_at(visited_states, previous_cursor, &new_state); XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num); if(raw_mem_set) MC_SET_RAW_MEM; @@ -129,8 +125,6 @@ static int is_visited_state(){ if(bytes_used_test != current_bytes_used) break; if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){ - xbt_dynar_remove_at(visited_states, next_cursor, NULL); - xbt_dynar_insert_at(visited_states, next_cursor, &new_state); XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num); if(raw_mem_set) MC_SET_RAW_MEM; @@ -246,7 +240,7 @@ void MC_dpor_init() void MC_dpor(void) { - char *req_str; + char *req_str = NULL; int value; smx_simcall_t req = NULL, prev_req = NULL; mc_state_t state = NULL, prev_state = NULL, next_state = NULL, restore_state=NULL; @@ -263,8 +257,8 @@ void MC_dpor(void) xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack_safety)); XBT_DEBUG("**************************************************"); - XBT_DEBUG("Exploration depth=%d (state=%p)(%u interleave)", - xbt_fifo_size(mc_stack_safety), state, + XBT_DEBUG("Exploration depth=%d (state=%p, num %d)(%u interleave)", + xbt_fifo_size(mc_stack_safety), state, state->num, MC_state_interleave_size(state)); /* Update statistics */ @@ -282,8 +276,10 @@ void MC_dpor(void) xbt_free(req_str); } + MC_SET_RAW_MEM; if(dot_output != NULL) req_str = MC_request_get_dot_output(req, value); + MC_UNSET_RAW_MEM; MC_state_set_executed_request(state, req, value); mc_stats->executed_transitions++; @@ -343,12 +339,12 @@ void MC_dpor(void) xbt_free(key); } } - - MC_UNSET_RAW_MEM; - + if(dot_output != NULL) xbt_free(req_str); + MC_UNSET_RAW_MEM; + /* Let's loop again */ /* The interleave set is empty or the maximum depth is reached, let's back-track */ @@ -378,7 +374,18 @@ void MC_dpor(void) } } - max_depth_reached = 1; + if(MC_state_interleave_size(state) > 0){ + max_depth_reached = 1; + }else{ + /* Trash the current state, no longer needed */ + MC_SET_RAW_MEM; + xbt_fifo_shift(mc_stack_safety); + MC_state_delete(state); + MC_UNSET_RAW_MEM; + + max_depth_reached = 0; + } + }else{ @@ -388,8 +395,9 @@ void MC_dpor(void) MC_SET_RAW_MEM; xbt_fifo_shift(mc_stack_safety); MC_state_delete(state); + XBT_DEBUG("Delete state %d at depth %d", state->num, xbt_fifo_size(mc_stack_safety) + 1); MC_UNSET_RAW_MEM; - + max_depth_reached = 0; } @@ -420,11 +428,11 @@ void MC_dpor(void) XBT_DEBUG("Dependent Transitions:"); prev_req = MC_state_get_executed_request(prev_state, &value); req_str = MC_request_to_string(prev_req, value); - XBT_DEBUG("%s (state=%p)", req_str, prev_state); + XBT_DEBUG("%s (state=%d)", req_str, prev_state->num); xbt_free(req_str); prev_req = MC_state_get_executed_request(state, &value); req_str = MC_request_to_string(prev_req, value); - XBT_DEBUG("%s (state=%p)", req_str, state); + XBT_DEBUG("%s (state=%d)", req_str, state->num); xbt_free(req_str); } @@ -440,13 +448,17 @@ void MC_dpor(void) XBT_DEBUG("Simcall %d and %d with same issuer", req->call, MC_state_get_internal_request(prev_state)->call); break; + }else{ + + XBT_DEBUG("Simcall %d, process %lu (state %d) and simcall %d, process %lu (state %d) are independant", req->call, req->issuer->pid, state->num, MC_state_get_internal_request(prev_state)->call, MC_state_get_internal_request(prev_state)->issuer->pid, prev_state->num); + } } } if (MC_state_interleave_size(state) && xbt_fifo_size(mc_stack_safety) < _sg_mc_max_depth) { /* We found a back-tracking point, let's loop */ - XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety) + 1); + XBT_DEBUG("Back-tracking to state %d at depth %d", state->num, xbt_fifo_size(mc_stack_safety) + 1); if(_sg_mc_checkpoint){ if(state->system_state != NULL){ MC_restore_snapshot(state->system_state); @@ -474,9 +486,10 @@ void MC_dpor(void) MC_UNSET_RAW_MEM; MC_replay(mc_stack_safety, -1); } - XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety)); + XBT_DEBUG("Back-tracking to state %d at depth %d", state->num, xbt_fifo_size(mc_stack_safety)); break; } else { + XBT_DEBUG("Delete state %d at depth %d", state->num, xbt_fifo_size(mc_stack_safety) + 1); MC_state_delete(state); } } diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 430da06f13..7469068073 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -51,7 +51,7 @@ void _mc_cfg_cb_checkpoint(const char *name, int pos) { if (_sg_init_status && !_sg_do_model_check) { xbt_die("You are specifying a checkpointing value after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry."); } - _sg_mc_checkpoint = xbt_cfg_get_int(_sg_cfg_set, name); + _sg_mc_checkpoint = xbt_cfg_get_boolean(_sg_cfg_set, name); } void _mc_cfg_cb_property(const char *name, int pos) { if (_sg_init_status && !_sg_do_model_check) { @@ -64,7 +64,7 @@ void _mc_cfg_cb_timeout(const char *name, int pos) { if (_sg_init_status && !_sg_do_model_check) { xbt_die("You are specifying a value to enable/disable timeout for wait requests after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry."); } - _sg_mc_timeout= xbt_cfg_get_int(_sg_cfg_set, name); + _sg_mc_timeout= xbt_cfg_get_boolean(_sg_cfg_set, name); } void _mc_cfg_cb_max_depth(const char *name, int pos) { @@ -120,7 +120,7 @@ extern xbt_dynar_t mc_heap_comparison_ignore; extern xbt_dynar_t stacks_areas; FILE *dot_output = NULL; -const char* colors[10]; +const char* colors[13]; xbt_automaton_t _mc_property_automaton = NULL; @@ -222,17 +222,22 @@ void MC_init(){ } -void MC_init_dot_output(){ +void MC_init_dot_output(){ /* FIXME : more colors */ colors[0] = "blue"; colors[1] = "red"; - colors[2] = "green"; - colors[3] = "pink"; + colors[2] = "green3"; + colors[3] = "goldenrod"; colors[4] = "brown"; colors[5] = "purple"; - colors[6] = "yellow"; - colors[7] = "orange"; - + colors[6] = "magenta"; + colors[7] = "turquoise4"; + colors[8] = "gray25"; + colors[9] = "forestgreen"; + colors[10] = "hotpink"; + colors[11] = "lightblue"; + colors[12] = "tan"; + dot_output = fopen(_sg_mc_dot_output_file, "w"); if(dot_output == NULL){ @@ -240,7 +245,7 @@ void MC_init_dot_output(){ xbt_abort(); } - fprintf(dot_output, "digraph graphname{\n fixedsize=true; rankdir=TB; ranksep=.20; edge [fontsize=12]; node [fontsize=10, shape=circle,width=.5 ]; graph [resolution=20, fontsize=10];\n"); + fprintf(dot_output, "digraph graphname{\n fixedsize=true; rankdir=TB; ranksep=.25; edge [fontsize=12]; node [fontsize=10, shape=circle,width=.5 ]; graph [resolution=20, fontsize=10];\n"); } @@ -654,6 +659,11 @@ void MC_dump_stack_safety(xbt_fifo_t stack) void MC_show_stack_safety(xbt_fifo_t stack) { + + int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + + MC_SET_RAW_MEM; + int value; mc_state_t state; xbt_fifo_item_t item; @@ -670,6 +680,9 @@ void MC_show_stack_safety(xbt_fifo_t stack) xbt_free(req_str); } } + + if(!raw_mem_set) + MC_UNSET_RAW_MEM; } void MC_show_deadlock(smx_simcall_t req) @@ -684,6 +697,7 @@ void MC_show_deadlock(smx_simcall_t req) xbt_free(req_str);*/ XBT_INFO("Counter-example execution trace:"); MC_dump_stack_safety(mc_stack_safety); + MC_print_statistics(mc_stats); } @@ -936,6 +950,14 @@ void MC_remove_ignore_heap(void *address, size_t size){ } +void data_bss_ignore_variable_free(mc_data_bss_ignore_variable_t v){ + xbt_free(v); +} + +void data_bss_ignore_variable_free_voidp(void *v){ + data_bss_ignore_variable_free((mc_data_bss_ignore_variable_t) * (void **) v); +} + void MC_ignore_data_bss(void *address, size_t size){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); @@ -943,7 +965,7 @@ void MC_ignore_data_bss(void *address, size_t size){ MC_SET_RAW_MEM; if(mc_data_bss_comparison_ignore == NULL) - mc_data_bss_comparison_ignore = xbt_dynar_new(sizeof(mc_data_bss_ignore_variable_t), NULL); + mc_data_bss_comparison_ignore = xbt_dynar_new(sizeof(mc_data_bss_ignore_variable_t), data_bss_ignore_variable_free_voidp); mc_data_bss_ignore_variable_t var = NULL; var = xbt_new0(s_mc_data_bss_ignore_variable_t, 1); @@ -965,6 +987,7 @@ void MC_ignore_data_bss(void *address, size_t size){ cursor = (start + end) / 2; current_var = (mc_data_bss_ignore_variable_t)xbt_dynar_get_as(mc_data_bss_comparison_ignore, cursor, mc_data_bss_ignore_variable_t); if(current_var->address == address){ + data_bss_ignore_variable_free(var); MC_UNSET_RAW_MEM; if(raw_mem_set) MC_SET_RAW_MEM; @@ -1041,7 +1064,15 @@ static size_t data_bss_ignore_size(void *address){ return 0; } +void stack_ignore_variable_free(mc_stack_ignore_variable_t v){ + xbt_free(v->var_name); + xbt_free(v->frame); + xbt_free(v); +} +void stack_ignore_variable_free_voidp(void *v){ + stack_ignore_variable_free((mc_stack_ignore_variable_t) * (void **) v); +} void MC_ignore_stack(const char *var_name, const char *frame_name){ @@ -1050,15 +1081,15 @@ void MC_ignore_stack(const char *var_name, const char *frame_name){ MC_SET_RAW_MEM; if(mc_stack_comparison_ignore == NULL) - mc_stack_comparison_ignore = xbt_dynar_new(sizeof(mc_stack_ignore_variable_t), NULL); - + mc_stack_comparison_ignore = xbt_dynar_new(sizeof(mc_stack_ignore_variable_t), stack_ignore_variable_free_voidp); + + mc_stack_ignore_variable_t var = NULL; + var = xbt_new0(s_mc_stack_ignore_variable_t, 1); + var->var_name = strdup(var_name); + var->frame = strdup(frame_name); + if(xbt_dynar_is_empty(mc_stack_comparison_ignore)){ - mc_stack_ignore_variable_t var = NULL; - var = xbt_new0(s_mc_stack_ignore_variable_t, 1); - var->var_name = strdup(var_name); - var->frame = strdup(frame_name); - xbt_dynar_insert_at(mc_stack_comparison_ignore, 0, &var); }else{ @@ -1073,6 +1104,7 @@ void MC_ignore_stack(const char *var_name, const char *frame_name){ current_var = (mc_stack_ignore_variable_t)xbt_dynar_get_as(mc_stack_comparison_ignore, cursor, mc_stack_ignore_variable_t); if(strcmp(current_var->frame, frame_name) == 0){ if(strcmp(current_var->var_name, var_name) == 0){ + stack_ignore_variable_free(var); MC_UNSET_RAW_MEM; if(raw_mem_set) MC_SET_RAW_MEM; @@ -1089,11 +1121,6 @@ void MC_ignore_stack(const char *var_name, const char *frame_name){ end = cursor - 1; } - mc_stack_ignore_variable_t var = NULL; - var = xbt_new0(s_mc_stack_ignore_variable_t, 1); - var->var_name = strdup(var_name); - var->frame = strdup(frame_name); - if(strcmp(current_var->frame, frame_name) < 0) xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor + 1, &var); else diff --git a/src/mc/mc_liveness.c b/src/mc/mc_liveness.c index 424929e3e7..561d3653b9 100644 --- a/src/mc/mc_liveness.c +++ b/src/mc/mc_liveness.c @@ -19,44 +19,34 @@ xbt_dynar_t successors; /********* Static functions *********/ -static mc_acceptance_pair_t acceptance_pair_new(int num, xbt_automaton_state_t as){ - - mc_acceptance_pair_t new_pair = NULL; - new_pair = xbt_new0(s_mc_acceptance_pair_t, 1); - new_pair->num = num; - new_pair->automaton_state = as; - new_pair->prop_ato = xbt_dynar_new(sizeof(int), NULL); - new_pair->heap_bytes_used = mmalloc_get_bytes_used(std_heap); - new_pair->nb_processes = xbt_swag_size(simix_global->process_list); - new_pair->system_state = MC_take_snapshot(); - - /* Get values of propositional symbols */ +static xbt_dynar_t get_atomic_propositions_values(){ int res; int_f_void_t f; unsigned int cursor = 0; xbt_automaton_propositional_symbol_t ps = NULL; + xbt_dynar_t values = xbt_dynar_new(sizeof(int), NULL); + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = f(); - xbt_dynar_push_as(new_pair->prop_ato, int, res); + xbt_dynar_push_as(values, int, res); } - return new_pair; - + return values; } -static int is_reached_acceptance_pair(int num, xbt_automaton_state_t as){ +static int is_reached_acceptance_pair(mc_pair_t pair){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); - - MC_SET_RAW_MEM; - mc_acceptance_pair_t new_pair = acceptance_pair_new(num, as); - MC_UNSET_RAW_MEM; - + if(xbt_dynar_is_empty(acceptance_pairs)){ MC_SET_RAW_MEM; - xbt_dynar_push(acceptance_pairs, &new_pair); + if(pair->graph_state->system_state == NULL){ + pair->graph_state->system_state = MC_take_snapshot(); + pair->heap_bytes_used = mmalloc_get_bytes_used(std_heap); + } + xbt_dynar_push(acceptance_pairs, &pair); MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -67,39 +57,44 @@ static int is_reached_acceptance_pair(int num, xbt_automaton_state_t as){ }else{ MC_SET_RAW_MEM; - - size_t current_bytes_used = new_pair->heap_bytes_used; - int current_nb_processes = new_pair->nb_processes; + + if(pair->graph_state->system_state == NULL){ + pair->graph_state->system_state = MC_take_snapshot(); + pair->heap_bytes_used = mmalloc_get_bytes_used(std_heap); + } + + size_t current_bytes_used = pair->heap_bytes_used; + int current_nb_processes = pair->nb_processes; unsigned int cursor = 0; int previous_cursor = 0, next_cursor = 0; int start = 0; int end = xbt_dynar_length(acceptance_pairs) - 1; - mc_acceptance_pair_t pair_test = NULL; + mc_pair_t pair_test = NULL; size_t bytes_used_test; int nb_processes_test; int same_processes_and_bytes_not_found = 1; while(start <= end && same_processes_and_bytes_not_found){ cursor = (start + end) / 2; - pair_test = (mc_acceptance_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_acceptance_pair_t); + pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_pair_t); bytes_used_test = pair_test->heap_bytes_used; nb_processes_test = pair_test->nb_processes; if(nb_processes_test < current_nb_processes) start = cursor + 1; - if(nb_processes_test > current_nb_processes) + else if(nb_processes_test > current_nb_processes) end = cursor - 1; - if(nb_processes_test == current_nb_processes){ + else if(nb_processes_test == current_nb_processes){ if(bytes_used_test < current_bytes_used) start = cursor + 1; - if(bytes_used_test > current_bytes_used) + else if(bytes_used_test > current_bytes_used) end = cursor - 1; - if(bytes_used_test == current_bytes_used){ + else if(bytes_used_test == current_bytes_used){ same_processes_and_bytes_not_found = 0; - if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){ - if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){ - if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){ + if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){ + if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){ + if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){ if(raw_mem_set) MC_SET_RAW_MEM; else @@ -111,13 +106,13 @@ static int is_reached_acceptance_pair(int num, xbt_automaton_state_t as){ /* Search another pair with same number of bytes used in std_heap */ previous_cursor = cursor - 1; while(previous_cursor >= 0){ - pair_test = (mc_acceptance_pair_t)xbt_dynar_get_as(acceptance_pairs, previous_cursor, mc_acceptance_pair_t); - bytes_used_test = pair_test->system_state->heap_bytes_used; + pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, previous_cursor, mc_pair_t); + bytes_used_test = pair_test->heap_bytes_used; if(bytes_used_test != current_bytes_used) break; - if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){ - if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){ - if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){ + if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){ + if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){ + if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){ if(raw_mem_set) MC_SET_RAW_MEM; else @@ -130,13 +125,13 @@ static int is_reached_acceptance_pair(int num, xbt_automaton_state_t as){ } next_cursor = cursor + 1; while(next_cursor < xbt_dynar_length(acceptance_pairs)){ - pair_test = (mc_acceptance_pair_t)xbt_dynar_get_as(acceptance_pairs, next_cursor, mc_acceptance_pair_t); - bytes_used_test = pair_test->system_state->heap_bytes_used; + pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, next_cursor, mc_pair_t); + bytes_used_test = pair_test->heap_bytes_used; if(bytes_used_test != current_bytes_used) break; - if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){ - if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){ - if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){ + if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){ + if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){ + if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){ if(raw_mem_set) MC_SET_RAW_MEM; else @@ -151,13 +146,14 @@ static int is_reached_acceptance_pair(int num, xbt_automaton_state_t as){ } } - pair_test = (mc_acceptance_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_acceptance_pair_t); + pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_pair_t); bytes_used_test = pair_test->heap_bytes_used; if(bytes_used_test < current_bytes_used) - xbt_dynar_insert_at(acceptance_pairs, cursor + 1, &new_pair); + xbt_dynar_insert_at(acceptance_pairs, cursor + 1, &pair); else - xbt_dynar_insert_at(acceptance_pairs, cursor, &new_pair); + xbt_dynar_insert_at(acceptance_pairs, cursor, &pair); + MC_UNSET_RAW_MEM; @@ -171,38 +167,43 @@ static int is_reached_acceptance_pair(int num, xbt_automaton_state_t as){ } -static void set_acceptance_pair_reached(int num, xbt_automaton_state_t as){ +static void set_acceptance_pair_reached(mc_pair_t pair){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); - - MC_SET_RAW_MEM; - mc_acceptance_pair_t new_pair = acceptance_pair_new(num, as); - MC_UNSET_RAW_MEM; if(xbt_dynar_is_empty(acceptance_pairs)){ MC_SET_RAW_MEM; - xbt_dynar_push(acceptance_pairs, &new_pair); + if(pair->graph_state->system_state == NULL){ + pair->graph_state->system_state = MC_take_snapshot(); + pair->heap_bytes_used = mmalloc_get_bytes_used(std_heap); + } + xbt_dynar_push(acceptance_pairs, &pair); MC_UNSET_RAW_MEM; }else{ MC_SET_RAW_MEM; + + if(pair->graph_state->system_state == NULL){ + pair->graph_state->system_state = MC_take_snapshot(); + pair->heap_bytes_used = mmalloc_get_bytes_used(std_heap); + } - size_t current_bytes_used = new_pair->heap_bytes_used; - int current_nb_processes = new_pair->nb_processes; + size_t current_bytes_used = pair->heap_bytes_used; + int current_nb_processes = pair->nb_processes; unsigned int cursor = 0; int start = 0; int end = xbt_dynar_length(acceptance_pairs) - 1; - mc_acceptance_pair_t pair_test = NULL; + mc_pair_t pair_test = NULL; size_t bytes_used_test = 0; int nb_processes_test; while(start <= end){ cursor = (start + end) / 2; - pair_test = (mc_acceptance_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_acceptance_pair_t); + pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_pair_t); bytes_used_test = pair_test->heap_bytes_used; nb_processes_test = pair_test->nb_processes; if(nb_processes_test < current_nb_processes) @@ -220,9 +221,9 @@ static void set_acceptance_pair_reached(int num, xbt_automaton_state_t as){ } if(bytes_used_test < current_bytes_used) - xbt_dynar_insert_at(acceptance_pairs, cursor + 1, &new_pair); + xbt_dynar_insert_at(acceptance_pairs, cursor + 1, &pair); else - xbt_dynar_insert_at(acceptance_pairs, cursor, &new_pair); + xbt_dynar_insert_at(acceptance_pairs, cursor, &pair); MC_UNSET_RAW_MEM; @@ -233,61 +234,47 @@ static void set_acceptance_pair_reached(int num, xbt_automaton_state_t as){ } -static void remove_acceptance_pair(int num_pair){ +static void remove_acceptance_pair(mc_pair_t pair){ unsigned int cursor = 0; - mc_acceptance_pair_t current_pair; + mc_pair_t pair_test; + int pair_found = 0; - xbt_dynar_foreach(acceptance_pairs, cursor, current_pair){ - if(current_pair->num == num_pair) + xbt_dynar_foreach(acceptance_pairs, cursor, pair_test){ + if(pair_test->num == pair->num){ + pair_found = 1; break; + } } - - xbt_dynar_remove_at(acceptance_pairs, cursor, NULL); -} - -static mc_visited_pair_t visited_pair_new(int num, xbt_automaton_state_t as){ - - mc_visited_pair_t new_pair = NULL; - new_pair = xbt_new0(s_mc_visited_pair_t, 1); - new_pair->automaton_state = as; - new_pair->num = num; - new_pair->prop_ato = xbt_dynar_new(sizeof(int), NULL); - new_pair->heap_bytes_used = mmalloc_get_bytes_used(std_heap); - new_pair->nb_processes = xbt_swag_size(simix_global->process_list); - new_pair->system_state = MC_take_snapshot(); + if(pair_found) + xbt_dynar_remove_at(acceptance_pairs, cursor, NULL); - /* Get values of propositional symbols */ - int res; - int_f_void_t f; - unsigned int cursor = 0; - xbt_automaton_propositional_symbol_t ps = NULL; - xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ - f = (int_f_void_t)ps->function; - res = f(); - xbt_dynar_push_as(new_pair->prop_ato, int, res); - } + pair->acceptance_removed = 1; - return new_pair; + if(pair->stack_removed && pair->acceptance_removed){ + if(_sg_mc_visited == 0){ + MC_pair_delete(pair); + }else if(pair->visited_removed){ + MC_pair_delete(pair); + } + } } -static int is_visited_pair(int num, xbt_automaton_state_t as){ +static int is_visited_pair(mc_pair_t pair){ if(_sg_mc_visited == 0) return -1; int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); - MC_SET_RAW_MEM; - mc_visited_pair_t new_pair = visited_pair_new(num, as); - MC_UNSET_RAW_MEM; - if(xbt_dynar_is_empty(visited_pairs)){ MC_SET_RAW_MEM; - xbt_dynar_push(visited_pairs, &new_pair); + if(pair->graph_state->system_state == NULL) + pair->graph_state->system_state = MC_take_snapshot(); + xbt_dynar_push(visited_pairs, &pair); MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -298,68 +285,92 @@ static int is_visited_pair(int num, xbt_automaton_state_t as){ }else{ MC_SET_RAW_MEM; + + if(pair->graph_state->system_state == NULL) + pair->graph_state->system_state = MC_take_snapshot(); - size_t current_bytes_used = new_pair->heap_bytes_used; - int current_nb_processes = new_pair->nb_processes; + size_t current_bytes_used = pair->heap_bytes_used; + int current_nb_processes = pair->nb_processes; unsigned int cursor = 0; int previous_cursor = 0, next_cursor = 0; int start = 0; int end = xbt_dynar_length(visited_pairs) - 1; - mc_visited_pair_t pair_test = NULL; + mc_pair_t pair_test = NULL; size_t bytes_used_test; int nb_processes_test; int same_processes_and_bytes_not_found = 1; + int result; while(start <= end && same_processes_and_bytes_not_found){ cursor = (start + end) / 2; - pair_test = (mc_visited_pair_t)xbt_dynar_get_as(visited_pairs, cursor, mc_visited_pair_t); + pair_test = (mc_pair_t)xbt_dynar_get_as(visited_pairs, cursor, mc_pair_t); bytes_used_test = pair_test->heap_bytes_used; nb_processes_test = pair_test->nb_processes; if(nb_processes_test < current_nb_processes) start = cursor + 1; - if(nb_processes_test > current_nb_processes) + else if(nb_processes_test > current_nb_processes) end = cursor - 1; - if(nb_processes_test == current_nb_processes){ + else if(nb_processes_test == current_nb_processes){ if(bytes_used_test < current_bytes_used) start = cursor + 1; - if(bytes_used_test > current_bytes_used) + else if(bytes_used_test > current_bytes_used) end = cursor - 1; - if(bytes_used_test == current_bytes_used){ + else if(bytes_used_test == current_bytes_used){ same_processes_and_bytes_not_found = 0; - if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){ - if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){ - if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){ + if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){ + if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){ + if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){ xbt_dynar_remove_at(visited_pairs, cursor, NULL); - xbt_dynar_insert_at(visited_pairs, cursor, &new_pair); - XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", new_pair->num, pair_test->num); + xbt_dynar_insert_at(visited_pairs, cursor, &pair); + pair_test->visited_removed = 1; + result = pair_test->num; + if(pair_test->stack_removed && pair_test->visited_removed){ + if((pair_test->automaton_state->type == 1) || (pair_test->automaton_state->type == 2)){ + if(pair_test->acceptance_removed){ + MC_pair_delete(pair_test); + } + }else{ + MC_pair_delete(pair_test); + } + } if(raw_mem_set) MC_SET_RAW_MEM; else MC_UNSET_RAW_MEM; - return pair_test->num; + return result; } } } /* Search another pair with same number of bytes used in std_heap */ previous_cursor = cursor - 1; while(previous_cursor >= 0){ - pair_test = (mc_visited_pair_t)xbt_dynar_get_as(visited_pairs, previous_cursor, mc_visited_pair_t); - bytes_used_test = pair_test->system_state->heap_bytes_used; + pair_test = (mc_pair_t)xbt_dynar_get_as(visited_pairs, previous_cursor, mc_pair_t); + bytes_used_test = pair_test->heap_bytes_used; if(bytes_used_test != current_bytes_used) break; - if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){ - if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){ - if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){ + if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){ + if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){ + if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){ xbt_dynar_remove_at(visited_pairs, previous_cursor, NULL); - xbt_dynar_insert_at(visited_pairs, previous_cursor, &new_pair); - XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", new_pair->num, pair_test->num); + xbt_dynar_insert_at(visited_pairs, previous_cursor, &pair); + pair_test->visited_removed = 1; + result = pair_test->num; + if(pair_test->stack_removed && pair_test->visited_removed){ + if((pair_test->automaton_state->type == 1) || (pair_test->automaton_state->type == 2)){ + if(pair_test->acceptance_removed){ + MC_pair_delete(pair_test); + } + }else{ + MC_pair_delete(pair_test); + } + } if(raw_mem_set) MC_SET_RAW_MEM; else MC_UNSET_RAW_MEM; - return pair_test->num; + return result; } } } @@ -367,21 +378,31 @@ static int is_visited_pair(int num, xbt_automaton_state_t as){ } next_cursor = cursor + 1; while(next_cursor < xbt_dynar_length(visited_pairs)){ - pair_test = (mc_visited_pair_t)xbt_dynar_get_as(visited_pairs, next_cursor, mc_visited_pair_t); - bytes_used_test = pair_test->system_state->heap_bytes_used; + pair_test = (mc_pair_t)xbt_dynar_get_as(visited_pairs, next_cursor, mc_pair_t); + bytes_used_test = pair_test->heap_bytes_used; if(bytes_used_test != current_bytes_used) break; - if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){ - if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){ - if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){ + if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){ + if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){ + if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){ xbt_dynar_remove_at(visited_pairs, next_cursor, NULL); - xbt_dynar_insert_at(visited_pairs, next_cursor, &new_pair); - XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", new_pair->num, pair_test->num); + xbt_dynar_insert_at(visited_pairs, next_cursor, &pair); + pair_test->visited_removed = 1; + result = pair_test->num; + if(pair_test->stack_removed && pair_test->visited_removed){ + if((pair_test->automaton_state->type == 1) || (pair_test->automaton_state->type == 2)){ + if(pair_test->acceptance_removed){ + MC_pair_delete(pair_test); + } + }else{ + MC_pair_delete(pair_test); + } + } if(raw_mem_set) MC_SET_RAW_MEM; else MC_UNSET_RAW_MEM; - return pair_test->num; + return result; } } } @@ -391,13 +412,13 @@ static int is_visited_pair(int num, xbt_automaton_state_t as){ } } - pair_test = (mc_visited_pair_t)xbt_dynar_get_as(visited_pairs, cursor, mc_visited_pair_t); + pair_test = (mc_pair_t)xbt_dynar_get_as(visited_pairs, cursor, mc_pair_t); bytes_used_test = pair_test->heap_bytes_used; if(bytes_used_test < current_bytes_used) - xbt_dynar_insert_at(visited_pairs, cursor + 1, &new_pair); + xbt_dynar_insert_at(visited_pairs, cursor + 1, &pair); else - xbt_dynar_insert_at(visited_pairs, cursor, &new_pair); + xbt_dynar_insert_at(visited_pairs, cursor, &pair); if(xbt_dynar_length(visited_pairs) > _sg_mc_visited){ int min = mc_stats->expanded_states; @@ -409,14 +430,13 @@ static int is_visited_pair(int num, xbt_automaton_state_t as){ min = pair_test->num; } } - xbt_dynar_remove_at(visited_pairs, index, NULL); + xbt_dynar_remove_at(visited_pairs, index, &pair_test); + pair_test->visited_removed = 1; + if(pair_test->stack_removed && pair_test->acceptance_removed && pair_test->visited_removed) + MC_pair_delete(pair_test); + } - /*cursor = 0; - xbt_dynar_foreach(visited_pairs, cursor, pair_test){ - fprintf(stderr, "Visited pair %d, nb_processes %d and heap_bytes_used %zu\n", pair_test->num, pair_test->nb_processes, pair_test->heap_bytes_used); - }*/ - MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -428,32 +448,29 @@ static int is_visited_pair(int num, xbt_automaton_state_t as){ } -static int MC_automaton_evaluate_label(xbt_automaton_exp_label_t l){ +static int MC_automaton_evaluate_label(xbt_automaton_exp_label_t l, xbt_dynar_t atomic_propositions_values){ switch(l->type){ case 0 : { - int left_res = MC_automaton_evaluate_label(l->u.or_and.left_exp); - int right_res = MC_automaton_evaluate_label(l->u.or_and.right_exp); + int left_res = MC_automaton_evaluate_label(l->u.or_and.left_exp, atomic_propositions_values); + int right_res = MC_automaton_evaluate_label(l->u.or_and.right_exp, atomic_propositions_values); return (left_res || right_res); } case 1 : { - int left_res = MC_automaton_evaluate_label(l->u.or_and.left_exp); - int right_res = MC_automaton_evaluate_label(l->u.or_and.right_exp); + int left_res = MC_automaton_evaluate_label(l->u.or_and.left_exp, atomic_propositions_values); + int right_res = MC_automaton_evaluate_label(l->u.or_and.right_exp, atomic_propositions_values); return (left_res && right_res); } case 2 : { - int res = MC_automaton_evaluate_label(l->u.exp_not); + int res = MC_automaton_evaluate_label(l->u.exp_not, atomic_propositions_values); return (!res); } case 3 : { unsigned int cursor = 0; xbt_automaton_propositional_symbol_t p = NULL; - int_f_void_t f; xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, p){ - if(strcmp(p->pred, l->u.predicat) == 0){ - f = (int_f_void_t)p->function; - return f(); - } + if(strcmp(p->pred, l->u.predicat) == 0) + return (int)xbt_dynar_get_as(atomic_propositions_values, cursor, int); } return -1; } @@ -466,33 +483,6 @@ static int MC_automaton_evaluate_label(xbt_automaton_exp_label_t l){ } -/********* Free functions *********/ - -static void visited_pair_free(mc_visited_pair_t pair){ - if(pair){ - xbt_dynar_free(&(pair->prop_ato)); - MC_free_snapshot(pair->system_state); - xbt_free(pair); - } -} - -static void visited_pair_free_voidp(void *p){ - visited_pair_free((mc_visited_pair_t) * (void **) p); -} - -static void acceptance_pair_free(mc_acceptance_pair_t pair){ - if(pair){ - xbt_dynar_free(&(pair->prop_ato)); - MC_free_snapshot(pair->system_state); - xbt_free(pair); - } -} - -static void acceptance_pair_free_voidp(void *p){ - acceptance_pair_free((mc_acceptance_pair_t) * (void **) p); -} - - /********* DDFS Algorithm *********/ @@ -504,28 +494,19 @@ void MC_ddfs_init(void){ XBT_DEBUG("Double-DFS init"); XBT_DEBUG("**************************************************"); - mc_pair_t mc_initial_pair = NULL; - mc_state_t initial_graph_state = NULL; + mc_pair_t initial_pair = NULL; smx_process_t process; - MC_wait_for_requests(); MC_SET_RAW_MEM; - initial_graph_state = MC_state_new(); - xbt_swag_foreach(process, simix_global->process_list){ - if(MC_process_is_enabled(process)){ - MC_state_interleave_process(initial_graph_state, process); - } - } - - acceptance_pairs = xbt_dynar_new(sizeof(mc_acceptance_pair_t), acceptance_pair_free_voidp); - visited_pairs = xbt_dynar_new(sizeof(mc_visited_pair_t), visited_pair_free_voidp); + acceptance_pairs = xbt_dynar_new(sizeof(mc_pair_t), NULL); + visited_pairs = xbt_dynar_new(sizeof(mc_pair_t), NULL); successors = xbt_dynar_new(sizeof(mc_pair_t), NULL); - /* Save the initial state */ initial_state_liveness->snapshot = MC_take_snapshot(); + initial_state_liveness->prev_pair = 0; MC_UNSET_RAW_MEM; @@ -533,37 +514,67 @@ void MC_ddfs_init(void){ xbt_automaton_state_t automaton_state; xbt_dynar_foreach(_mc_property_automaton->states, cursor, automaton_state){ - if(automaton_state->type == -1){ + if(automaton_state->type == -1){ /* Initial automaton state */ MC_SET_RAW_MEM; - mc_initial_pair = MC_pair_new(initial_graph_state, automaton_state, MC_state_interleave_size(initial_graph_state)); - xbt_fifo_unshift(mc_stack_liveness, mc_initial_pair); + + initial_pair = MC_pair_new(); + initial_pair->automaton_state = automaton_state; + initial_pair->graph_state = MC_state_new(); + initial_pair->atomic_propositions = get_atomic_propositions_values(); + + /* Get enabled process and insert it in the interleave set of the graph_state */ + xbt_swag_foreach(process, simix_global->process_list){ + if(MC_process_is_enabled(process)){ + MC_state_interleave_process(initial_pair->graph_state, process); + } + } + + initial_pair->requests = MC_state_interleave_size(initial_pair->graph_state); + initial_pair->search_cycle = 0; + + xbt_fifo_unshift(mc_stack_liveness, initial_pair); + MC_UNSET_RAW_MEM; + MC_ddfs(); + if(cursor != 0){ MC_restore_snapshot(initial_state_liveness->snapshot); MC_UNSET_RAW_MEM; } - - MC_ddfs(0); - - }else{ - if(automaton_state->type == 2){ - MC_SET_RAW_MEM; - mc_initial_pair = MC_pair_new(initial_graph_state, automaton_state, MC_state_interleave_size(initial_graph_state)); - xbt_fifo_unshift(mc_stack_liveness, mc_initial_pair); - MC_UNSET_RAW_MEM; - set_acceptance_pair_reached(mc_initial_pair->num, automaton_state); + }else if(automaton_state->type == 2){ /* Acceptance automaton state */ + + MC_SET_RAW_MEM; - if(cursor != 0){ - MC_restore_snapshot(initial_state_liveness->snapshot); - MC_UNSET_RAW_MEM; + initial_pair = MC_pair_new(); + initial_pair->automaton_state = automaton_state; + initial_pair->graph_state = MC_state_new(); + initial_pair->atomic_propositions = get_atomic_propositions_values(); + + /* Get enabled process and insert it in the interleave set of the graph_state */ + xbt_swag_foreach(process, simix_global->process_list){ + if(MC_process_is_enabled(process)){ + MC_state_interleave_process(initial_pair->graph_state, process); } + } + + initial_pair->requests = MC_state_interleave_size(initial_pair->graph_state); + initial_pair->search_cycle = 1; + + xbt_fifo_unshift(mc_stack_liveness, initial_pair); + + MC_UNSET_RAW_MEM; + + set_acceptance_pair_reached(initial_pair); - MC_ddfs(1); - + MC_ddfs(); + + if(cursor != 0){ + MC_restore_snapshot(initial_state_liveness->snapshot); + MC_UNSET_RAW_MEM; } } } @@ -577,7 +588,7 @@ void MC_ddfs_init(void){ } -void MC_ddfs(int search_cycle){ +void MC_ddfs(){ smx_process_t process; mc_pair_t current_pair = NULL; @@ -585,358 +596,332 @@ void MC_ddfs(int search_cycle){ if(xbt_fifo_size(mc_stack_liveness) == 0) return; - /* Get current pair */ current_pair = (mc_pair_t)xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack_liveness)); /* Update current state in buchi automaton */ _mc_property_automaton->current_state = current_pair->automaton_state; - - XBT_DEBUG("********************* ( Depth = %d, search_cycle = %d )", xbt_fifo_size(mc_stack_liveness), search_cycle); + XBT_DEBUG("********************* ( Depth = %d, search_cycle = %d )", xbt_fifo_size(mc_stack_liveness), current_pair->search_cycle); mc_stats->visited_pairs++; int value; - mc_state_t next_graph_state = NULL; smx_simcall_t req = NULL; char *req_str; xbt_automaton_transition_t transition_succ; unsigned int cursor = 0; int res; - int reached_num; + int reached_num, visited_num; + int new_pair = 0; mc_pair_t next_pair = NULL; - mc_pair_t pair_succ; - - mc_pair_t pair_to_remove; + xbt_dynar_t prop_values = NULL; if(xbt_fifo_size(mc_stack_liveness) < _sg_mc_max_depth){ if(current_pair->requests > 0){ - while((req = MC_state_get_request(current_pair->graph_state, &value)) != NULL){ - - /* Debug information */ - - if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){ - req_str = MC_request_to_string(req, value); - XBT_DEBUG("Execute: %s", req_str); - xbt_free(req_str); - } - - MC_state_set_executed_request(current_pair->graph_state, req, value); - mc_stats->executed_transitions++; - - /* Answer the request */ - SIMIX_simcall_pre(req, value); + if(current_pair->search_cycle){ - /* Wait for requests (schedules processes) */ - MC_wait_for_requests(); - - MC_SET_RAW_MEM; + if((current_pair->automaton_state->type == 1) || (current_pair->automaton_state->type == 2)){ + + if((reached_num = is_reached_acceptance_pair(current_pair)) != -1){ + + XBT_INFO("Pair %d already reached (equal to pair %d) !", current_pair->num, reached_num); + + MC_SET_RAW_MEM; + xbt_fifo_shift(mc_stack_liveness); + if(dot_output != NULL) + fprintf(dot_output, "\"%d\" -> \"%d\" [%s];\n", initial_state_liveness->prev_pair, reached_num, initial_state_liveness->prev_req); + MC_UNSET_RAW_MEM; - /* Create the new expanded graph_state */ - next_graph_state = MC_state_new(); + XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); + XBT_INFO("| ACCEPTANCE CYCLE |"); + XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); + XBT_INFO("Counter-example that violates formula :"); + MC_show_stack_liveness(mc_stack_liveness); + MC_dump_stack_liveness(mc_stack_liveness); + MC_print_statistics(mc_stats); + xbt_abort(); - /* Get enabled process and insert it in the interleave set of the next graph_state */ - xbt_swag_foreach(process, simix_global->process_list){ - if(MC_process_is_enabled(process)){ - XBT_DEBUG("Process %lu enabled with simcall : %d", process->pid, (&process->simcall)->call); } } + } - xbt_swag_foreach(process, simix_global->process_list){ - if(MC_process_is_enabled(process)){ - MC_state_interleave_process(next_graph_state, process); - } - } + if((visited_num = is_visited_pair(current_pair)) != -1){ - xbt_dynar_reset(successors); + XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", current_pair->num, visited_num); + MC_SET_RAW_MEM; + if(dot_output != NULL) + fprintf(dot_output, "\"%d\" -> \"%d\" [%s];\n", initial_state_liveness->prev_pair, visited_num, initial_state_liveness->prev_req); MC_UNSET_RAW_MEM; + + + }else{ + while((req = MC_state_get_request(current_pair->graph_state, &value)) != NULL){ - cursor= 0; - xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){ - - res = MC_automaton_evaluate_label(transition_succ->label); - - if(res == 1){ // enabled transition in automaton - MC_SET_RAW_MEM; - next_pair = MC_pair_new(next_graph_state, transition_succ->dst, MC_state_interleave_size(next_graph_state)); - xbt_dynar_push(successors, &next_pair); - MC_UNSET_RAW_MEM; + MC_SET_RAW_MEM; + if(dot_output != NULL){ + if(initial_state_liveness->prev_pair != 0 && initial_state_liveness->prev_pair != current_pair->num){ + fprintf(dot_output, "\"%d\" -> \"%d\" [%s];\n", initial_state_liveness->prev_pair, current_pair->num, initial_state_liveness->prev_req); + xbt_free(initial_state_liveness->prev_req); + } + initial_state_liveness->prev_pair = current_pair->num; } + MC_UNSET_RAW_MEM; - } - - cursor = 0; - - xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){ - - res = MC_automaton_evaluate_label(transition_succ->label); - - if(res == 2){ // true transition in automaton - MC_SET_RAW_MEM; - next_pair = MC_pair_new(next_graph_state, transition_succ->dst, MC_state_interleave_size(next_graph_state)); - xbt_dynar_push(successors, &next_pair); - MC_UNSET_RAW_MEM; + /* Debug information */ + if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){ + req_str = MC_request_to_string(req, value); + XBT_DEBUG("Execute: %s", req_str); + xbt_free(req_str); } - } - - cursor = 0; - - xbt_dynar_foreach(successors, cursor, pair_succ){ - - if(search_cycle == 1){ + MC_SET_RAW_MEM; + if(dot_output != NULL){ + initial_state_liveness->prev_req = MC_request_get_dot_output(req, value); + if(current_pair->search_cycle) + fprintf(dot_output, "%d [shape=doublecircle];\n", current_pair->num); + } + MC_UNSET_RAW_MEM; + + MC_state_set_executed_request(current_pair->graph_state, req, value); + mc_stats->executed_transitions++; - if((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2)){ + /* Answer the request */ + SIMIX_simcall_pre(req, value); - if((reached_num = is_reached_acceptance_pair(pair_succ->num, pair_succ->automaton_state)) != -1){ - - XBT_INFO("Next pair (depth = %d, %u interleave) already reached (equal to state %d) !", xbt_fifo_size(mc_stack_liveness) + 1, MC_state_interleave_size(pair_succ->graph_state), reached_num); + /* Wait for requests (schedules processes) */ + MC_wait_for_requests(); - XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); - XBT_INFO("| ACCEPTANCE CYCLE |"); - XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); - XBT_INFO("Counter-example that violates formula :"); - MC_show_stack_liveness(mc_stack_liveness); - MC_dump_stack_liveness(mc_stack_liveness); - MC_print_statistics(mc_stats); - xbt_abort(); + MC_SET_RAW_MEM; + prop_values = get_atomic_propositions_values(); + MC_UNSET_RAW_MEM; + + /* Evaluate enabled transition according to atomic propositions values */ + cursor= 0; + xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){ - }else{ + res = MC_automaton_evaluate_label(transition_succ->label, prop_values); - if(is_visited_pair(pair_succ->num, pair_succ->automaton_state) != -1){ + if(res == 1){ // enabled transition in automaton - XBT_DEBUG("Next pair already visited !"); - break; - - }else{ + if(new_pair) + MC_replay_liveness(mc_stack_liveness, 1); - XBT_DEBUG("Next pair (depth =%d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id); + MC_SET_RAW_MEM; - XBT_DEBUG("Acceptance pairs : %lu", xbt_dynar_length(acceptance_pairs)); + next_pair = MC_pair_new(); + next_pair->graph_state = MC_state_new(); + next_pair->automaton_state = transition_succ->dst; + next_pair->atomic_propositions = get_atomic_propositions_values(); - MC_SET_RAW_MEM; - xbt_fifo_unshift(mc_stack_liveness, pair_succ); - MC_UNSET_RAW_MEM; - - MC_ddfs(search_cycle); - + /* Get enabled process and insert it in the interleave set of the next graph_state */ + xbt_swag_foreach(process, simix_global->process_list){ + if(MC_process_is_enabled(process)){ + MC_state_interleave_process(next_pair->graph_state, process); } - } - }else{ + next_pair->requests = MC_state_interleave_size(next_pair->graph_state); + + if(next_pair->automaton_state->type == 1 || next_pair->automaton_state->type == 2 || current_pair->search_cycle) + next_pair->search_cycle = 1; + + xbt_fifo_unshift(mc_stack_liveness, next_pair); - if(is_visited_pair(pair_succ->num, pair_succ->automaton_state) != -1){ + if(mc_stats->expanded_pairs%1000000 == 0) + XBT_INFO("Expanded pairs : %lu", mc_stats->expanded_pairs); - XBT_DEBUG("Next pair already visited !"); - break; - - }else{ + MC_UNSET_RAW_MEM; - MC_SET_RAW_MEM; - xbt_fifo_unshift(mc_stack_liveness, pair_succ); - MC_UNSET_RAW_MEM; - - MC_ddfs(search_cycle); - } - - } + new_pair = 1; - }else{ + MC_ddfs(); - if(is_visited_pair(pair_succ->num, pair_succ->automaton_state) != -1){ + } - XBT_DEBUG("Next pair already visited !"); - break; - - }else{ - - if(((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2))){ + } - XBT_DEBUG("Next pair (depth =%d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id); + /* Then, evaluate true transitions (always true, whatever atomic propositions values) */ + cursor = 0; + xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){ - set_acceptance_pair_reached(pair_succ->num, pair_succ->automaton_state); + res = MC_automaton_evaluate_label(transition_succ->label, prop_values); + + if(res == 2){ // true transition in automaton - search_cycle = 1; + if(new_pair) + MC_replay_liveness(mc_stack_liveness, 1); + + MC_SET_RAW_MEM; + + next_pair = MC_pair_new(); + next_pair->graph_state = MC_state_new(); + next_pair->automaton_state = transition_succ->dst; + next_pair->atomic_propositions = get_atomic_propositions_values(); + + /* Get enabled process and insert it in the interleave set of the next graph_state */ + xbt_swag_foreach(process, simix_global->process_list){ + if(MC_process_is_enabled(process)){ + MC_state_interleave_process(next_pair->graph_state, process); + } + } - XBT_DEBUG("Acceptance pairs : %lu", xbt_dynar_length(acceptance_pairs)); + next_pair->requests = MC_state_interleave_size(next_pair->graph_state); + + if(next_pair->automaton_state->type == 1 || next_pair->automaton_state->type == 2 || current_pair->search_cycle) + next_pair->search_cycle = 1; - } + xbt_fifo_unshift(mc_stack_liveness, next_pair); - MC_SET_RAW_MEM; - xbt_fifo_unshift(mc_stack_liveness, pair_succ); - MC_UNSET_RAW_MEM; + if(mc_stats->expanded_pairs%1000000 == 0) + XBT_INFO("Expanded pairs : %lu", mc_stats->expanded_pairs); - MC_ddfs(search_cycle); + MC_UNSET_RAW_MEM; + + new_pair = 1; + + MC_ddfs(); } - + } - /* Restore system before checking others successors */ - if(cursor != (xbt_dynar_length(successors) - 1)) - MC_replay_liveness(mc_stack_liveness, 1); - + if(MC_state_interleave_size(current_pair->graph_state) > 0){ + XBT_DEBUG("Backtracking to depth %d", xbt_fifo_size(mc_stack_liveness)); + MC_replay_liveness(mc_stack_liveness, 0); + } + } - if(MC_state_interleave_size(current_pair->graph_state) > 0){ - XBT_DEBUG("Backtracking to depth %d", xbt_fifo_size(mc_stack_liveness)); - MC_replay_liveness(mc_stack_liveness, 0); - } } - }else{ mc_stats->executed_transitions++; - XBT_DEBUG("No more request to execute in this state, search evolution in Büchi Automaton."); - - MC_SET_RAW_MEM; + XBT_DEBUG("No request to execute in this state, search evolution in Büchi Automaton."); - /* Create the new expanded graph_state */ - next_graph_state = MC_state_new(); + if(current_pair->search_cycle){ - xbt_dynar_reset(successors); - - MC_UNSET_RAW_MEM; - - - cursor= 0; - xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){ + if((current_pair->automaton_state->type == 1) || (current_pair->automaton_state->type == 2)){ + + if((reached_num = is_reached_acceptance_pair(current_pair)) != -1){ + + XBT_INFO("Pair %d already reached (equal to pair %d) !", current_pair->num, reached_num); + + MC_SET_RAW_MEM; + xbt_fifo_shift(mc_stack_liveness); + MC_UNSET_RAW_MEM; - res = MC_automaton_evaluate_label(transition_succ->label); + XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); + XBT_INFO("| ACCEPTANCE CYCLE |"); + XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); + XBT_INFO("Counter-example that violates formula :"); + MC_show_stack_liveness(mc_stack_liveness); + MC_dump_stack_liveness(mc_stack_liveness); + MC_print_statistics(mc_stats); + xbt_abort(); - if(res == 1){ // enabled transition in automaton - MC_SET_RAW_MEM; - next_pair = MC_pair_new(next_graph_state, transition_succ->dst, MC_state_interleave_size(next_graph_state)); - xbt_dynar_push(successors, &next_pair); - MC_UNSET_RAW_MEM; + } } - } - cursor = 0; - - xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){ + if((visited_num = is_visited_pair(current_pair)) != -1){ + + XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", current_pair->num, visited_num); - res = MC_automaton_evaluate_label(transition_succ->label); - - if(res == 2){ // true transition in automaton - MC_SET_RAW_MEM; - next_pair = MC_pair_new(next_graph_state, transition_succ->dst, MC_state_interleave_size(next_graph_state)); - xbt_dynar_push(successors, &next_pair); - MC_UNSET_RAW_MEM; - } + }else{ + + MC_SET_RAW_MEM; + prop_values = get_atomic_propositions_values(); + MC_UNSET_RAW_MEM; - } + /* Evaluate enabled transition according to atomic propositions values */ + cursor= 0; + xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){ - cursor = 0; - - xbt_dynar_foreach(successors, cursor, pair_succ){ + res = MC_automaton_evaluate_label(transition_succ->label, prop_values); - if(search_cycle == 1){ + if(res == 1){ // enabled transition in automaton - if((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2)){ + if(new_pair) + MC_replay_liveness(mc_stack_liveness, 1); - if((reached_num = is_reached_acceptance_pair(pair_succ->num, pair_succ->automaton_state)) != -1){ - - XBT_INFO("Next pair (depth = %d) already reached (equal to state %d)!", xbt_fifo_size(mc_stack_liveness) + 1, reached_num); - - XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); - XBT_INFO("| ACCEPTANCE CYCLE |"); - XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"); - XBT_INFO("Counter-example that violates formula :"); - MC_show_stack_liveness(mc_stack_liveness); - MC_dump_stack_liveness(mc_stack_liveness); - MC_print_statistics(mc_stats); - xbt_abort(); - - }else{ - - if(is_visited_pair(pair_succ->num, pair_succ->automaton_state) != -1){ - - XBT_DEBUG("Next pair already visited !"); - break; - - }else{ - - XBT_INFO("Next pair (depth = %d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id); - - XBT_INFO("Acceptance pairs : %lu", xbt_dynar_length(acceptance_pairs)); + MC_SET_RAW_MEM; - MC_SET_RAW_MEM; - xbt_fifo_unshift(mc_stack_liveness, pair_succ); - MC_UNSET_RAW_MEM; - - MC_ddfs(search_cycle); + next_pair = MC_pair_new(); + next_pair->graph_state = MC_state_new(); + next_pair->automaton_state = transition_succ->dst; + next_pair->atomic_propositions = get_atomic_propositions_values(); + next_pair->requests = MC_state_interleave_size(next_pair->graph_state); - } + if(next_pair->automaton_state->type == 1 || next_pair->automaton_state->type == 2 || current_pair->search_cycle) + next_pair->search_cycle = 1; + + xbt_fifo_unshift(mc_stack_liveness, next_pair); - } + if(mc_stats->expanded_pairs%1000 == 0) + XBT_INFO("Expanded pairs : %lu", mc_stats->expanded_pairs); - }else{ - - if(is_visited_pair(pair_succ->num, pair_succ->automaton_state) != -1){ - - XBT_DEBUG("Next pair already visited !"); - break; - - }else{ + if(dot_output != NULL) + fprintf(dot_output, "\"%d\" -> \"%d\" [%s];\n", current_pair->num, next_pair->num, ""); - MC_SET_RAW_MEM; - xbt_fifo_unshift(mc_stack_liveness, pair_succ); - MC_UNSET_RAW_MEM; - - MC_ddfs(search_cycle); + MC_UNSET_RAW_MEM; + + new_pair = 1; + + MC_ddfs(); - } - } - - }else{ - - if(is_visited_pair(pair_succ->num, pair_succ->automaton_state) != -1){ + } - XBT_DEBUG("Next pair already visited !"); - break; - - }else{ + /* Then, evaluate true transitions (always true, whatever atomic propositions values) */ + cursor = 0; + xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){ + + res = MC_automaton_evaluate_label(transition_succ->label, prop_values); + + if(res == 2){ // true transition in automaton - if(((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2))){ + if(new_pair) + MC_replay_liveness(mc_stack_liveness, 1); - set_acceptance_pair_reached(pair_succ->num, pair_succ->automaton_state); - - search_cycle = 1; + MC_SET_RAW_MEM; + + next_pair = MC_pair_new(); + next_pair->graph_state = MC_state_new(); + next_pair->automaton_state = transition_succ->dst; + next_pair->atomic_propositions = get_atomic_propositions_values(); + next_pair->requests = MC_state_interleave_size(next_pair->graph_state); + + if(next_pair->automaton_state->type == 1 || next_pair->automaton_state->type == 2 || current_pair->search_cycle) + next_pair->search_cycle = 1; - XBT_INFO("Acceptance pairs : %lu", xbt_dynar_length(acceptance_pairs)); + xbt_fifo_unshift(mc_stack_liveness, next_pair); - } + if(mc_stats->expanded_pairs%1000 == 0) + XBT_INFO("Expanded pairs : %lu", mc_stats->expanded_pairs); + + if(dot_output != NULL) + fprintf(dot_output, "\"%d\" -> \"%d\" [%s];\n", current_pair->num, next_pair->num, ""); - MC_SET_RAW_MEM; - xbt_fifo_unshift(mc_stack_liveness, pair_succ); MC_UNSET_RAW_MEM; - - MC_ddfs(search_cycle); - - } - - } - /* Restore system before checking others successors */ - if(cursor != xbt_dynar_length(successors) - 1) - MC_replay_liveness(mc_stack_liveness, 1); + new_pair = 1; - } + MC_ddfs(); + + } + } + } } }else{ @@ -944,24 +929,30 @@ void MC_ddfs(int search_cycle){ XBT_WARN("/!\\ Max depth reached ! /!\\ "); if(MC_state_interleave_size(current_pair->graph_state) > 0){ XBT_WARN("/!\\ But, there are still processes to interleave. Model-checker will not be able to ensure the soundness of the verification from now. /!\\ "); - XBT_WARN("Notice : the default value of max depth is 1000 but you can change it with cfg=model-check/max_depth:value."); + if(_sg_mc_max_depth == 1000) + XBT_WARN("Notice : the default value of max depth is 1000 but you can change it with cfg=model-check/max_depth:value."); } } if(xbt_fifo_size(mc_stack_liveness) == _sg_mc_max_depth ){ - XBT_DEBUG("Pair (depth = %d) shifted in stack, maximum depth reached", xbt_fifo_size(mc_stack_liveness) ); + XBT_DEBUG("Pair %d (depth = %d) shifted in stack, maximum depth reached", current_pair->num, xbt_fifo_size(mc_stack_liveness) ); }else{ - XBT_DEBUG("Pair (depth = %d) shifted in stack", xbt_fifo_size(mc_stack_liveness) ); + XBT_DEBUG("Pair %d (depth = %d) shifted in stack", current_pair->num, xbt_fifo_size(mc_stack_liveness) ); } MC_SET_RAW_MEM; - pair_to_remove = xbt_fifo_shift(mc_stack_liveness); - xbt_fifo_remove(mc_stack_liveness, pair_to_remove); - pair_to_remove = NULL; - if((current_pair->automaton_state->type == 1) || (current_pair->automaton_state->type == 2)){ - remove_acceptance_pair(current_pair->num); + xbt_dynar_free(&prop_values); + current_pair = xbt_fifo_shift(mc_stack_liveness); + current_pair->stack_removed = 1; + if(current_pair->search_cycle){ + remove_acceptance_pair(current_pair); + }else{ + if(_sg_mc_visited == 0) + MC_pair_delete(current_pair); + else if(current_pair->visited_removed) + MC_pair_delete(current_pair); } MC_UNSET_RAW_MEM; diff --git a/src/mc/mc_pair.c b/src/mc/mc_pair.c index bd686f940d..6f6506e4d2 100644 --- a/src/mc/mc_pair.c +++ b/src/mc/mc_pair.c @@ -5,21 +5,22 @@ #include "mc_private.h" -mc_pair_t MC_pair_new(mc_state_t gs, xbt_automaton_state_t as, int r){ +mc_pair_t MC_pair_new(){ mc_pair_t p = NULL; p = xbt_new0(s_mc_pair_t, 1); - p->automaton_state = as; - p->graph_state = gs; - p->system_state = NULL; - p->requests = r; + p->nb_processes = xbt_swag_size(simix_global->process_list); p->num = ++mc_stats->expanded_pairs; + p->search_cycle = 0; return p; } void MC_pair_delete(mc_pair_t p){ p->automaton_state = NULL; - if(p->system_state) - MC_free_snapshot(p->system_state); MC_state_delete(p->graph_state); + p->stack_removed = 0; + p->visited_removed = 0; + p->acceptance_removed = 0; + xbt_dynar_free(&(p->atomic_propositions)); xbt_free(p); + p = NULL; } diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 55ac04692d..a348722d46 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -53,6 +53,8 @@ typedef struct s_mc_snapshot_stack{ typedef struct s_mc_global_t{ mc_snapshot_t snapshot; int raw_mem_set; + int prev_pair; + char *prev_req; }s_mc_global_t, *mc_global_t; mc_snapshot_t SIMIX_pre_mc_snapshot(smx_simcall_t simcall); @@ -66,7 +68,7 @@ int is_stack_ignore_variable(char *frame, char *var_name); extern double *mc_time; extern FILE *dot_output; -extern const char* colors[10]; +extern const char* colors[13]; int MC_deadlock_check(void); void MC_replay(xbt_fifo_t stack, int start); @@ -284,36 +286,24 @@ extern xbt_dynar_t mc_stack_comparison_ignore; extern xbt_dynar_t mc_data_bss_comparison_ignore; typedef struct s_mc_pair{ - mc_snapshot_t system_state; - mc_state_t graph_state; - xbt_automaton_state_t automaton_state; - int requests; - int num; -}s_mc_pair_t, *mc_pair_t; - -typedef struct s_mc_acceptance_pair{ int num; + int search_cycle; + mc_state_t graph_state; /* System state included */ xbt_automaton_state_t automaton_state; - xbt_dynar_t prop_ato; - mc_snapshot_t system_state; - size_t heap_bytes_used; - int nb_processes; -}s_mc_acceptance_pair_t, *mc_acceptance_pair_t; - -typedef struct s_mc_visited_pair{ - xbt_automaton_state_t automaton_state; - xbt_dynar_t prop_ato; - mc_snapshot_t system_state; - int num; + xbt_dynar_t atomic_propositions; + int requests; size_t heap_bytes_used; int nb_processes; -}s_mc_visited_pair_t, *mc_visited_pair_t; + int stack_removed; + int visited_removed; + int acceptance_removed; +}s_mc_pair_t, *mc_pair_t; -mc_pair_t MC_pair_new(mc_state_t sg, xbt_automaton_state_t st, int r); +mc_pair_t MC_pair_new(void); void MC_pair_delete(mc_pair_t); void MC_ddfs_init(void); -void MC_ddfs(int search_cycle); +void MC_ddfs(void); void MC_show_stack_liveness(xbt_fifo_t stack); void MC_dump_stack_liveness(xbt_fifo_t stack); diff --git a/src/mc/mc_request.c b/src/mc/mc_request.c index c57dc08b0c..9ce5f61b7a 100644 --- a/src/mc/mc_request.c +++ b/src/mc/mc_request.c @@ -24,39 +24,43 @@ int MC_request_depend(smx_simcall_t r1, smx_simcall_t r2) { if(r1->call == SIMCALL_COMM_IRECV && r2->call == SIMCALL_COMM_ISEND) return FALSE; - if( (r1->call == SIMCALL_COMM_ISEND || r1->call == SIMCALL_COMM_IRECV) - && r2->call == SIMCALL_COMM_WAIT){ - - if(simcall_comm_wait__get__comm(r2)->comm.rdv == NULL) - return FALSE; + if((r1->call == SIMCALL_COMM_ISEND || r1->call == SIMCALL_COMM_IRECV) + && r2->call == SIMCALL_COMM_WAIT){ smx_rdv_t rdv = r1->call == SIMCALL_COMM_ISEND ? simcall_comm_isend__get__rdv(r1) : simcall_comm_irecv__get__rdv(r1); - if(simcall_comm_wait__get__comm(r2)->comm.rdv != rdv) + if(rdv != simcall_comm_wait__get__comm(r2)->comm.rdv_cpy && simcall_comm_wait__get__timeout(r2) <= 0) + return FALSE; + + if((r1->issuer != simcall_comm_wait__get__comm(r2)->comm.src_proc) && (r1->issuer != simcall_comm_wait__get__comm(r2)->comm.dst_proc)) return FALSE; - if(simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_SEND && r1->call == SIMCALL_COMM_ISEND) + if((r1->call == SIMCALL_COMM_ISEND) && (simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_SEND) + && (simcall_comm_wait__get__comm(r2)->comm.src_buff != simcall_comm_isend__get__src_buff(r1))) return FALSE; - if(simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_RECEIVE && r1->call == SIMCALL_COMM_IRECV) + if((r1->call == SIMCALL_COMM_IRECV) && (simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_RECEIVE) + && (simcall_comm_wait__get__comm(r2)->comm.dst_buff != simcall_comm_irecv__get__dst_buff(r1))) return FALSE; } - if( (r2->call == SIMCALL_COMM_ISEND || r2->call == SIMCALL_COMM_IRECV) + if((r2->call == SIMCALL_COMM_ISEND || r2->call == SIMCALL_COMM_IRECV) && r1->call == SIMCALL_COMM_WAIT){ - if(simcall_comm_wait__get__comm(r1)->comm.rdv != NULL) - return FALSE; - smx_rdv_t rdv = r2->call == SIMCALL_COMM_ISEND ? simcall_comm_isend__get__rdv(r2) : simcall_comm_irecv__get__rdv(r2); - if(simcall_comm_wait__get__comm(r1)->comm.rdv != rdv) + if(rdv != simcall_comm_wait__get__comm(r1)->comm.rdv_cpy && simcall_comm_wait__get__timeout(r1) <= 0) return FALSE; - if(simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_SEND && r2->call == SIMCALL_COMM_ISEND) + if((r2->issuer != simcall_comm_wait__get__comm(r1)->comm.src_proc) && (r2->issuer != simcall_comm_wait__get__comm(r1)->comm.dst_proc)) + return FALSE; + + if((r2->call == SIMCALL_COMM_ISEND) && (simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_SEND) + && (simcall_comm_wait__get__comm(r1)->comm.src_buff != simcall_comm_isend__get__src_buff(r2))) return FALSE; - if(simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_RECEIVE && r2->call == SIMCALL_COMM_IRECV) + if((r2->call == SIMCALL_COMM_IRECV) && (simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_RECEIVE) + && (simcall_comm_wait__get__comm(r1)->comm.dst_buff != simcall_comm_irecv__get__dst_buff(r2))) return FALSE; } @@ -181,28 +185,36 @@ char *MC_request_to_string(smx_simcall_t req, int value) type = xbt_strdup("iSend"); p = pointer_to_string(simcall_comm_isend__get__src_buff(req)); bs = buff_size_to_string(simcall_comm_isend__get__src_buff_size(req)); - args = bprintf("src=%s, buff=%s, size=%s", req->issuer->name, p, bs); + if(req->issuer->smx_host) + args = bprintf("src=(%lu)%s (%s), buff=%s, size=%s", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), req->issuer->name, p, bs); + else + args = bprintf("src=(%lu)%s, buff=%s, size=%s", req->issuer->pid, req->issuer->name, p, bs); break; case SIMCALL_COMM_IRECV: size = simcall_comm_irecv__get__dst_buff_size(req) ? *simcall_comm_irecv__get__dst_buff_size(req) : 0; type = xbt_strdup("iRecv"); p = pointer_to_string(simcall_comm_irecv__get__dst_buff(req)); bs = buff_size_to_string(size); - args = bprintf("dst=%s, buff=%s, size=%s", req->issuer->name, p, bs); + if(req->issuer->smx_host) + args = bprintf("dst=(%lu)%s (%s), buff=%s, size=%s", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), req->issuer->name, p, bs); + else + args = bprintf("dst=(%lu)%s, buff=%s, size=%s", req->issuer->pid, req->issuer->name, p, bs); break; case SIMCALL_COMM_WAIT: act = simcall_comm_wait__get__comm(req); if(value == -1){ type = xbt_strdup("WaitTimeout"); p = pointer_to_string(act); - args = bprintf("comm=%p", p); + args = bprintf("comm=%s", p); }else{ type = xbt_strdup("Wait"); p = pointer_to_string(act); - args = bprintf("comm=%s [(%lu)%s -> (%lu)%s]", p, + args = bprintf("comm=%s [(%lu)%s (%s)-> (%lu)%s (%s)]", p, act->comm.src_proc ? act->comm.src_proc->pid : 0, + act->comm.src_proc ? MSG_host_get_name(act->comm.src_proc->smx_host) : "", act->comm.src_proc ? act->comm.src_proc->name : "", act->comm.dst_proc ? act->comm.dst_proc->pid : 0, + act->comm.dst_proc ? MSG_host_get_name(act->comm.dst_proc->smx_host) : "", act->comm.dst_proc ? act->comm.dst_proc->name : ""); } break; @@ -215,17 +227,21 @@ char *MC_request_to_string(smx_simcall_t req, int value) }else{ type = xbt_strdup("Test TRUE"); p = pointer_to_string(act); - args = bprintf("comm=%s [(%lu)%s -> (%lu)%s]", p, - act->comm.src_proc->pid, act->comm.src_proc->name, - act->comm.dst_proc->pid, act->comm.dst_proc->name); + args = bprintf("comm=%s [(%lu)%s (%s) -> (%lu)%s (%s)]", p, + act->comm.src_proc->pid, act->comm.src_proc->name, MSG_host_get_name(act->comm.src_proc->smx_host), + act->comm.dst_proc->pid, act->comm.dst_proc->name, MSG_host_get_name(act->comm.dst_proc->smx_host)); } break; case SIMCALL_COMM_WAITANY: type = xbt_strdup("WaitAny"); - p = pointer_to_string(xbt_dynar_get_as(simcall_comm_waitany__get__comms(req), value, smx_action_t)); - args = bprintf("comm=%s (%d of %lu)", p, - value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req))); + if(!xbt_dynar_is_empty(simcall_comm_waitany__get__comms(req))){ + p = pointer_to_string(xbt_dynar_get_as(simcall_comm_waitany__get__comms(req), value, smx_action_t)); + args = bprintf("comm=%s (%d of %lu)", p, + value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req))); + }else{ + args = bprintf("comm at idx %d", value); + } break; case SIMCALL_COMM_TESTANY: @@ -258,11 +274,12 @@ char *MC_request_to_string(smx_simcall_t req, int value) } if(args != NULL){ - str = bprintf("[(%lu)%s] %s (%s)", req->issuer->pid ,req->issuer->name, type, args); - xbt_free(args); + str = bprintf("[(%lu)%s (%s)] %s (%s)", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type, args); }else{ - str = bprintf("[(%lu)%s] %s ", req->issuer->pid ,req->issuer->name, type); + str = bprintf("[(%lu)%s (%s)] %s ", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type); } + + xbt_free(args); xbt_free(type); xbt_free(p); xbt_free(bs); @@ -379,48 +396,103 @@ char *MC_request_get_dot_output(smx_simcall_t req, int value){ switch(req->call){ case SIMCALL_COMM_ISEND: - label = xbt_strdup("iSend"); + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] iSend", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] iSend", req->issuer->pid); break; case SIMCALL_COMM_IRECV: - label = xbt_strdup("iRecv"); - break; - - case SIMCALL_COMM_WAIT: - if(value == -1) - label = xbt_strdup("WaitTimeout"); + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] iRecv", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); else - label = xbt_strdup("Wait"); + label = bprintf("[(%lu)] iRecv", req->issuer->pid); break; - + + case SIMCALL_COMM_WAIT: + act = simcall_comm_wait__get__comm(req); + if(value == -1){ + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] WaitTimeout", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] WaitTimeout", req->issuer->pid); + }else{ + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] Wait [(%lu)->(%lu)]", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), act->comm.src_proc ? act->comm.src_proc->pid : 0, act->comm.dst_proc ? act->comm.dst_proc->pid : 0); + else + label = bprintf("[(%lu)] Wait [(%lu)->(%lu)]", req->issuer->pid, act->comm.src_proc ? act->comm.src_proc->pid : 0, act->comm.dst_proc ? act->comm.dst_proc->pid : 0); + } + break; + case SIMCALL_COMM_TEST: act = simcall_comm_test__get__comm(req); - if(act->comm.src_proc == NULL || act->comm.dst_proc == NULL) - label = xbt_strdup("Test FALSE"); + if(act->comm.src_proc == NULL || act->comm.dst_proc == NULL){ + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] Test FALSE", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] Test FALSE", req->issuer->pid); + }else{ + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] Test TRUE", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] Test TRUE", req->issuer->pid); + } + break; + + case SIMCALL_COMM_WAITANY: + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] WaitAny [%d of %lu]", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req))); else - label = xbt_strdup("Test TRUE"); + label = bprintf("[(%lu)] WaitAny [%d of %lu]", req->issuer->pid, value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req))); + break; + + case SIMCALL_COMM_TESTANY: + if(value == -1){ + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] TestAny FALSE", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] TestAny FALSE", req->issuer->pid); + }else{ + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] TestAny TRUE [%d of %lu]", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), value+1, xbt_dynar_length(simcall_comm_testany__get__comms(req))); + else + label = bprintf("[(%lu)] TestAny TRUE [%d of %lu]", req->issuer->pid, value+1, xbt_dynar_length(simcall_comm_testany__get__comms(req))); + } break; case SIMCALL_MC_RANDOM: - if(value == 0) - label = xbt_strdup("MC_RANDOM (0)"); - else - label = xbt_strdup("MC_RANDOM (1)"); + if(value == 0){ + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] MC_RANDOM (0)", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] MC_RANDOM (0)", req->issuer->pid); + }else{ + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] MC_RANDOM (1)", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] MC_RANDOM (1)", req->issuer->pid); + } break; case SIMCALL_MC_SNAPSHOT: - label = xbt_strdup("MC_SNAPSHOT"); + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] MC_SNAPSHOT", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] MC_SNAPSHOT", req->issuer->pid); break; case SIMCALL_MC_COMPARE_SNAPSHOTS: - label = xbt_strdup("MC_COMPARE_SNAPSHOTS"); + if(req->issuer->smx_host) + label = bprintf("[(%lu)%s] MC_COMPARE_SNAPSHOTS", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host)); + else + label = bprintf("[(%lu)] MC_COMPARE_SNAPSHOTS", req->issuer->pid); break; default: THROW_UNIMPLEMENTED; } - str = bprintf("label = \"%s\", color = %s", label, colors[req->issuer->pid-1]); + str = bprintf("label = \"%s\", color = %s, fontcolor = %s", label, colors[req->issuer->pid-1], colors[req->issuer->pid-1]); xbt_free(label); return str; diff --git a/src/mc/memory_map.c b/src/mc/memory_map.c index b4315233c4..04538dda26 100644 --- a/src/mc/memory_map.c +++ b/src/mc/memory_map.c @@ -32,6 +32,8 @@ memory_map_t get_memory_map(void) xbt_assert(fp, "Cannot open /proc/self/maps to investigate the memory map of the process. Please report this bug."); + setbuf(fp, NULL); + ret = xbt_new0(s_memory_map_t, 1); /* Read one line at the time, parse it and add it to the memory map to be returned */ @@ -159,5 +161,6 @@ void free_memory_map(memory_map_t map){ for(i=0; i< map->mapsize; i++){ xbt_free(map->regions[i].pathname); } + xbt_free(map->regions); xbt_free(map); } diff --git a/src/msg/msg_environment.c b/src/msg/msg_environment.c index 497b254c37..77c876146d 100644 --- a/src/msg/msg_environment.c +++ b/src/msg/msg_environment.c @@ -48,3 +48,32 @@ void MSG_post_create_environment(void) { __MSG_host_create(xbt_dict_cursor_get_elm(cursor)); } } + +msg_as_t MSG_environment_get_routing_root() { + return surf_AS_get_routing_root(); +} + +const char *MSG_environment_as_get_name(msg_as_t as) { + return surf_AS_get_name(as); +} + +xbt_dict_t MSG_environment_as_get_routing_sons(msg_as_t as) { + xbt_dict_t res = surf_AS_get_routing_sons(as); + return res; +} + +const char *MSG_environment_as_get_property_value(msg_as_t as, const char *name) +{ + xbt_dict_t dict = xbt_lib_get_or_null(as_router_lib, MSG_environment_as_get_name(as), ROUTING_PROP_ASR_LEVEL); + if (dict==NULL) + return NULL; + return xbt_dict_get_or_null(dict, name); +} + +const char *MSG_environment_as_get_model(msg_as_t as) { + return surf_AS_get_model(as); +} + +xbt_dynar_t MSG_environment_as_get_hosts(msg_as_t as) { + return surf_AS_get_hosts(as); +} diff --git a/src/msg/msg_host.c b/src/msg/msg_host.c index 4cced2cf02..ccfc8805e4 100644 --- a/src/msg/msg_host.c +++ b/src/msg/msg_host.c @@ -116,6 +116,23 @@ msg_host_t MSG_host_self(void) return MSG_process_get_host(NULL); } + +/* + * \brief Start the host if it is off + */ +void MSG_host_on(msg_host_t host) +{ + simcall_host_on(host); +} + +/* + * \brief Stop the host if it is on + */ +void MSG_host_off(msg_host_t host) +{ + simcall_host_off(host); +} + /* * \brief Frees private data of a host (internal call only) */ @@ -220,6 +237,17 @@ double MSG_get_host_speed(msg_host_t h) return (simcall_host_get_speed(h)); } + +/** \ingroup m_host_management + * \brief Return the number of core. + */ +int MSG_get_host_core(msg_host_t h) +{ + xbt_assert((h != NULL), "Invalid parameters"); + + return (simcall_host_get_core(h)); +} + /** \ingroup m_host_management * \brief Returns the value of a given host property * diff --git a/src/msg/msg_io.c b/src/msg/msg_io.c index 1932908a44..798e7e2174 100644 --- a/src/msg/msg_io.c +++ b/src/msg/msg_io.c @@ -1,8 +1,8 @@ -/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2004 - 2013. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ + * under the terms of the license (GNU LGPL) which comes with this package. */ #include "msg_private.h" #include "xbt/log.h" @@ -23,28 +23,26 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg, * \brief Read elements of a file * * \param ptr buffer to where the data is copied - * \param size of each element - * \param nmemb is the number of elements of data to read - * \param stream to read + * \param size of the file to read + * \param fd is a the file descriptor * \return the number of items successfully read */ -double MSG_file_read(void* ptr, size_t size, size_t nmemb, msg_file_t stream) +size_t MSG_file_read(void* ptr, size_t size, msg_file_t fd) { - return simcall_file_read(ptr, size, nmemb, stream->simdata->smx_file); + return simcall_file_read(ptr, size, fd->simdata->smx_file); } /** \ingroup msg_file_management * \brief Write elements into a file * * \param ptr buffer from where the data is copied - * \param size of each element - * \param nmemb is the number of elements of data to write - * \param stream to write + * \param size of the file to write + * \param fd is a the file descriptor * \return the number of items successfully write */ -size_t MSG_file_write(const void* ptr, size_t size, size_t nmemb, msg_file_t stream) +size_t MSG_file_write(const void* ptr, size_t size, msg_file_t fd) { - return simcall_file_write(ptr, size, nmemb, stream->simdata->smx_file); + return simcall_file_write(ptr, size, fd->simdata->smx_file); } /** \ingroup msg_file_management @@ -52,83 +50,53 @@ size_t MSG_file_write(const void* ptr, size_t size, size_t nmemb, msg_file_t str * * \param mount is the mount point where find the file is located * \param path is the file location on the storage - * \param mode points to a string beginning with one of the following sequences (Additional characters may follow these sequences.): - * r Open text file for reading. The stream is positioned at the beginning of the file. - * r+ Open for reading and writing. The stream is positioned at the beginning of the file. - * w Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file. - * w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the - * beginning of the file. - * a Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file. - * a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading - * is at the beginning of the file, but output is always appended to the end of the file. * * \return An #msg_file_t associated to the file */ -msg_file_t MSG_file_open(const char* mount, const char* path, const char* mode) +msg_file_t MSG_file_open(const char* mount, const char* path) { msg_file_t file = xbt_new(s_msg_file_t,1); - file->name = strdup(path); + file->name = xbt_strdup(path); file->simdata = xbt_new0(s_simdata_file_t,1); - file->simdata->smx_file = simcall_file_open(mount, path, mode); + file->simdata->smx_file = simcall_file_open(mount, path); return file; } /** \ingroup msg_file_management * \brief Close the file * - * \param fp is the file to close + * \param fd is the file to close * \return 0 on success or 1 on error */ -int MSG_file_close(msg_file_t fp) +int MSG_file_close(msg_file_t fd) { - int res = simcall_file_close(fp->simdata->smx_file); - free(fp->name); - xbt_free(fp->simdata); - xbt_free(fp); + int res = simcall_file_close(fd->simdata->smx_file); + free(fd->name); + xbt_free(fd->simdata); + xbt_free(fd); return res; } /** \ingroup msg_file_management - * \brief Stats the file pointed by fd + * \brief Unlink the file pointed by fd * * \param fd is the file descriptor (#msg_file_t) - * \param buf is the return structure with informations * \return 0 on success or 1 on error */ -int MSG_file_stat(msg_file_t fd, s_msg_stat_t *buf) -{ - int res; - res = simcall_file_stat(fd->simdata->smx_file, buf); - return res; -} - -/** \ingroup msg_file_management - * \brief Free the stat structure - * - * \param stat the #s_msg_stat_t to free - */ -void MSG_file_free_stat(s_msg_stat_t *stat) +int MSG_file_unlink(msg_file_t fd) { - free(stat->date); - free(stat->group); - free(stat->time); - free(stat->user); - free(stat->user_rights); + return simcall_file_unlink(fd->simdata->smx_file); } /** \ingroup msg_file_management - * \brief Unlink the file pointed by fd + * \brief Return the size of a file * * \param fd is the file descriptor (#msg_file_t) - * \return 0 on success or 1 on error + * \return the size of the file (as a size_t) */ -int MSG_file_unlink(msg_file_t fd) -{ - int res = simcall_file_unlink(fd->simdata->smx_file); - free(fd->name); - xbt_free(fd->simdata); - xbt_free(fd); - return res; + +size_t MSG_file_get_size(msg_file_t fd){ + return simcall_file_get_size(fd->simdata->smx_file); } /** \ingroup msg_file_management diff --git a/src/msg/msg_process.c b/src/msg/msg_process.c index 471e2a614d..357d57c579 100644 --- a/src/msg/msg_process.c +++ b/src/msg/msg_process.c @@ -140,7 +140,7 @@ msg_process_t MSG_process_create_with_arguments(const char *name, be retrieved with the function \ref MSG_process_get_data. * \param host the location where the new process is executed. * \param argc first argument passed to \a code - * \param argv second argument passed to \a code + * \param argv second argument passed to \a code. WARNING, these strings are freed by the SimGrid kernel when the process exits, so they cannot be static nor shared between several processes. * \param properties list a properties defined for this process * \see msg_process_t * \return The new corresponding object. diff --git a/src/msg/msg_synchro.c b/src/msg/msg_synchro.c new file mode 100644 index 0000000000..f06e6bbe25 --- /dev/null +++ b/src/msg/msg_synchro.c @@ -0,0 +1,66 @@ +/* Copyright (c) 2013 Da SimGrid Team. All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "msg_private.h" +#include "xbt/sysdep.h" +#include "xbt/log.h" + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_synchro, msg, + "Logging specific to MSG (synchro)"); + + +/** @addtogroup msg_synchro + * + * @{ + */ + +/********************************* Host **************************************/ + +/** @brief creates a semaphore object of the given initial capacity */ +msg_sem_t MSG_sem_init(int initial_value) { + return simcall_sem_init(initial_value); +} + +/** @brief locks on a semaphore object */ +void MSG_sem_acquire(msg_sem_t sem) { + simcall_sem_acquire(sem); +} +/** @brief locks on a semaphore object up until the provided timeout expires */ +msg_error_t MSG_sem_acquire_timeout(msg_sem_t sem, double timeout) { + xbt_ex_t e; + msg_error_t res = MSG_OK; + TRY { + simcall_sem_acquire_timeout(sem,timeout); + } CATCH(e) { + if (e.category == timeout_error) { + res = MSG_TIMEOUT; + xbt_ex_free(e); + } else { + RETHROW; + } + } + return res; +} +/** @brief releases the semaphore object */ +void MSG_sem_release(msg_sem_t sem) { + simcall_sem_release(sem); +} +void MSG_sem_get_capacity(msg_sem_t sem) { + simcall_sem_get_capacity(sem); +} + +void MSG_sem_destroy(msg_sem_t sem) { + simcall_sem_destroy(sem); +} +/** @brief returns a boolean indicating it this semaphore would block at this very specific time + * + * Note that the returned value may be wrong right after the function call, when you try to use it... + * But that's a classical semaphore issue, and SimGrid's semaphore are not different to usual ones here. + */ +int MSG_sem_would_block(msg_sem_t sem) { + return simcall_sem_would_block(sem); +} + +/**@}*/ diff --git a/src/simdag/sd_daxloader.c b/src/simdag/sd_daxloader.c index 29803e9f75..1ef9172bc2 100644 --- a/src/simdag/sd_daxloader.c +++ b/src/simdag/sd_daxloader.c @@ -361,6 +361,16 @@ xbt_dynar_t SD_daxload(const char *filename) xbt_dynar_foreach(result, cpt, file) { if (SD_task_get_kind(file) == SD_TASK_COMM_E2E) { uniq_transfer_task_name(file); + } else if (SD_task_get_kind(file) == SD_TASK_COMP_SEQ){ + /* If some tasks do not take files as input, connect them to the root, if + * they don't produce files, connect them to the end node. + */ + if ((file != root_task) && xbt_dynar_is_empty(file->tasks_before)) { + SD_task_dependency_add(NULL, NULL, root_task, file); + } + if ((file != end_task) && xbt_dynar_is_empty(file->tasks_after)) { + SD_task_dependency_add(NULL, NULL, file, end_task); + } } } diff --git a/src/simdag/sd_dotloader.c b/src/simdag/sd_dotloader.c index 29c7b945e8..7842834a9a 100644 --- a/src/simdag/sd_dotloader.c +++ b/src/simdag/sd_dotloader.c @@ -170,7 +170,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){ char *name = agnameof(node); double amount = atof(agget(node, (char *) "size")); - double alpha; + double alpha = 0.0; if (seq_or_par == sequential){ XBT_DEBUG("See ", name, amount); diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index a8f51c2b6d..6abbd4de3c 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -248,17 +248,27 @@ static void _sg_cfg_cb__coll(const char *category, /* New Module missing */ find_coll_description(table, val); } +static void _sg_cfg_cb__coll_gather(const char *name, int pos){ + _sg_cfg_cb__coll("gather", mpi_coll_gather_description, name, pos); +} static void _sg_cfg_cb__coll_allgather(const char *name, int pos){ _sg_cfg_cb__coll("allgather", mpi_coll_allgather_description, name, pos); } +static void _sg_cfg_cb__coll_allgatherv(const char *name, int pos){ + _sg_cfg_cb__coll("allgatherv", mpi_coll_allgatherv_description, name, pos); +} static void _sg_cfg_cb__coll_allreduce(const char *name, int pos) { - _sg_cfg_cb__coll("allreduce", mpi_coll_allreduce_description, name, pos); + _sg_cfg_cb__coll("allreduce", mpi_coll_allreduce_description, name, pos); } static void _sg_cfg_cb__coll_alltoall(const char *name, int pos) { _sg_cfg_cb__coll("alltoall", mpi_coll_alltoall_description, name, pos); } +static void _sg_cfg_cb__coll_alltoallv(const char *name, int pos) +{ + _sg_cfg_cb__coll("alltoallv", mpi_coll_alltoallv_description, name, pos); +} static void _sg_cfg_cb__coll_bcast(const char *name, int pos) { _sg_cfg_cb__coll("bcast", mpi_coll_bcast_description, name, pos); @@ -267,6 +277,15 @@ static void _sg_cfg_cb__coll_reduce(const char *name, int pos) { _sg_cfg_cb__coll("reduce", mpi_coll_reduce_description, name, pos); } +static void _sg_cfg_cb__coll_reduce_scatter(const char *name, int pos){ + _sg_cfg_cb__coll("reduce_scatter", mpi_coll_reduce_scatter_description, name, pos); +} +static void _sg_cfg_cb__coll_scatter(const char *name, int pos){ + _sg_cfg_cb__coll("scatter", mpi_coll_scatter_description, name, pos); +} +static void _sg_cfg_cb__coll_barrier(const char *name, int pos){ + _sg_cfg_cb__coll("barrier", mpi_coll_barrier_description, name, pos); +} #endif /* callback of the inclusion path */ @@ -285,9 +304,9 @@ extern int _sg_do_model_check; /* this variable lives in xbt_main until I find static void _sg_cfg_cb_model_check(const char *name, int pos) { #ifdef HAVE_MC - _sg_do_model_check = xbt_cfg_get_int(_sg_cfg_set, name); + _sg_do_model_check = xbt_cfg_get_boolean(_sg_cfg_set, name); #else - if (xbt_cfg_get_int(_sg_cfg_set, name)) { + if (xbt_cfg_get_boolean(_sg_cfg_set, name)) { xbt_die("You tried to activate the model-checking from the command line, but it was not compiled in. Change your settings in cmake, recompile and try again"); } #endif @@ -297,7 +316,7 @@ extern int _sg_do_verbose_exit; static void _sg_cfg_cb_verbose_exit(const char *name, int pos) { - _sg_do_verbose_exit = xbt_cfg_get_int(_sg_cfg_set, name); + _sg_do_verbose_exit = xbt_cfg_get_boolean(_sg_cfg_set, name); } @@ -342,29 +361,21 @@ static void _sg_cfg_cb_contexts_parallel_mode(const char *name, int pos) static void _sg_cfg_cb__surf_network_coordinates(const char *name, int pos) { - char *val = xbt_cfg_get_string(_sg_cfg_set, name); - if (!strcmp(val, "yes")) { + int val = xbt_cfg_get_boolean(_sg_cfg_set, name); + if (val) { if (!COORD_HOST_LEVEL) { COORD_HOST_LEVEL = xbt_lib_add_level(host_lib,xbt_dynar_free_voidp); COORD_ASR_LEVEL = xbt_lib_add_level(as_router_lib,xbt_dynar_free_voidp); } - } else if (!strcmp(val, "no")) { + } else if (COORD_HOST_LEVEL) xbt_die("Setting of whether to use coordinate cannot be disabled once set."); - } else { - xbt_die("Command line setting of whether to use coordinates must be either \"yes\" or \"no\""); - } -} - -static void _sg_cfg_cb_surf_nthreads(const char *name, int pos) -{ - surf_set_nthreads(xbt_cfg_get_int(_sg_cfg_set, name)); } static void _sg_cfg_cb__surf_network_crosstraffic(const char *name, int pos) { - sg_network_crosstraffic = xbt_cfg_get_int(_sg_cfg_set, name); + sg_network_crosstraffic = xbt_cfg_get_boolean(_sg_cfg_set, name); } #ifdef HAVE_GTNETS @@ -530,32 +541,34 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_string, NULL, 0, 0, _sg_cfg_cb__surf_path, NULL); - default_value_int = 0; + default_value = xbt_strdup("off"); xbt_cfg_register(&_sg_cfg_set, "cpu/maxmin_selective_update", - "Update the constraint set propagating recursively to others constraints (1 by default when optim is set to lazy)", - xbt_cfgelm_int, &default_value_int, 0, 1, + "Update the constraint set propagating recursively to others constraints (off by default when optim is set to lazy)", + xbt_cfgelm_boolean, &default_value, 0, 1, NULL, NULL); - default_value_int = 0; + default_value = xbt_strdup("off"); xbt_cfg_register(&_sg_cfg_set, "network/maxmin_selective_update", - "Update the constraint set propagating recursively to others constraints (1 by default when optim is set to lazy)", - xbt_cfgelm_int, &default_value_int, 0, 1, + "Update the constraint set propagating recursively to others constraints (off by default when optim is set to lazy)", + xbt_cfgelm_boolean, &default_value, 0, 1, NULL, NULL); #ifdef HAVE_MC /* do model-checking */ + default_value = xbt_strdup("off"); xbt_cfg_register(&_sg_cfg_set, "model-check", "Verify the system through model-checking instead of simulating it (EXPERIMENTAL)", - xbt_cfgelm_int, NULL, 0, 1, + xbt_cfgelm_boolean, NULL, 0, 1, _sg_cfg_cb_model_check, NULL); - xbt_cfg_setdefault_int(_sg_cfg_set, "model-check", 0); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check", default_value); /* do stateful model-checking */ + default_value = xbt_strdup("off"); xbt_cfg_register(&_sg_cfg_set, "model-check/checkpoint", - "Specify the amount of steps between checkpoints during stateful model-checking (default: 0 => stateless verification). " - "If value=1, one checkpoint is saved for each step => faster verification, but huge memory consumption; higher values are good compromises between speed and memory consumption.", - xbt_cfgelm_int, NULL, 0, 1, + "Specify the amount of steps between checkpoints during stateful model-checking (default: off => stateless verification). " + "If value=on, one checkpoint is saved for each step => faster verification, but huge memory consumption; higher values are good compromises between speed and memory consumption.", + xbt_cfgelm_boolean, NULL, 0, 1, _mc_cfg_cb_checkpoint, NULL); - xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/checkpoint", 0); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/checkpoint", default_value); /* do liveness model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/property", @@ -572,11 +585,12 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/reduction", "dpor"); /* Enable/disable timeout for wait requests with model-checking */ + default_value = xbt_strdup("off"); xbt_cfg_register(&_sg_cfg_set, "model-check/timeout", "Enable/Disable timeout for wait requests", - xbt_cfgelm_int, NULL, 0, 1, + xbt_cfgelm_boolean, NULL, 0, 1, _mc_cfg_cb_timeout, NULL); - xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/timeout", 0); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/timeout", default_value); /* Set max depth exploration */ xbt_cfg_register(&_sg_cfg_set, "model-check/max_depth", @@ -601,10 +615,10 @@ void sg_config_init(int *argc, char **argv) #endif /* do verbose-exit */ - default_value_int = 1; + default_value = xbt_strdup("on"); xbt_cfg_register(&_sg_cfg_set, "verbose-exit", "Activate the \"do nothing\" mode in Ctrl-C", - xbt_cfgelm_int, &default_value_int, 0, 1, + xbt_cfgelm_boolean, &default_value, 0, 1, _sg_cfg_cb_verbose_exit, NULL); @@ -646,26 +660,19 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_string, &default_value, 1, 1, _sg_cfg_cb_contexts_parallel_mode, NULL); - /* number of parallel threads for Surf */ - default_value_int = surf_get_nthreads(); - xbt_cfg_register(&_sg_cfg_set, "surf/nthreads", - "Number of parallel threads used to update Surf models", - xbt_cfgelm_int, &default_value_int, 1, 1, - _sg_cfg_cb_surf_nthreads, NULL); - default_value = xbt_strdup("no"); xbt_cfg_register(&_sg_cfg_set, "network/coordinates", "\"yes\" or \"no\", specifying whether we use a coordinate-based routing (as Vivaldi)", - xbt_cfgelm_string, &default_value, 1, 1, + xbt_cfgelm_boolean, &default_value, 1, 1, _sg_cfg_cb__surf_network_coordinates, NULL); - xbt_cfg_setdefault_string(_sg_cfg_set, "network/coordinates", default_value); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/coordinates", default_value); - default_value_int = 0; + default_value = xbt_strdup("no"); xbt_cfg_register(&_sg_cfg_set, "network/crosstraffic", "Activate the interferences between uploads and downloads for fluid max-min models (LV08, CM02)", - xbt_cfgelm_int, &default_value_int, 0, 1, + xbt_cfgelm_boolean, &default_value, 0, 1, _sg_cfg_cb__surf_network_crosstraffic, NULL); - xbt_cfg_setdefault_int(_sg_cfg_set, "network/crosstraffic", default_value_int); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/crosstraffic", default_value); #ifdef HAVE_GTNETS xbt_cfg_register(&_sg_cfg_set, "gtnets/jitter", @@ -695,11 +702,12 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_double, &default_reference_speed, 1, 1, NULL, NULL); - int default_display_timing = 0; + default_value = xbt_strdup("no"); xbt_cfg_register(&_sg_cfg_set, "smpi/display_timing", "Boolean indicating whether we should display the timing after simulation.", - xbt_cfgelm_int, &default_display_timing, 1, 1, NULL, + xbt_cfgelm_boolean, &default_value, 1, 1, NULL, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "smpi/display_timing", default_value); double default_threshold = 1e-6; xbt_cfg_register(&_sg_cfg_set, "smpi/cpu_threshold", @@ -753,37 +761,70 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_string, NULL, 1, 1, NULL, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/or", "1:0:0:0:0"); - + double default_iprobe_time = 1e-4; + xbt_cfg_register(&_sg_cfg_set, "smpi/iprobe", + "Minimum time to inject inside a call to MPI_Iprobe", + xbt_cfgelm_double, &default_iprobe_time, 1, 1, NULL, + NULL); default_value = xbt_strdup("default"); + xbt_cfg_register(&_sg_cfg_set, "smpi/coll_selector", + "Which collective selector to use", + xbt_cfgelm_string, &default_value, 1, 1, NULL, + NULL); + + xbt_cfg_register(&_sg_cfg_set, "smpi/gather", + "Which collective to use for gather", + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_gather, + NULL); + xbt_cfg_register(&_sg_cfg_set, "smpi/allgather", "Which collective to use for allgather", - xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_allgather, + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_allgather, + NULL); + + xbt_cfg_register(&_sg_cfg_set, "smpi/barrier", + "Which collective to use for barrier", + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_barrier, + NULL); + + xbt_cfg_register(&_sg_cfg_set, "smpi/reduce_scatter", + "Which collective to use for reduce_scatter", + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_reduce_scatter, + NULL); + + xbt_cfg_register(&_sg_cfg_set, "smpi/scatter", + "Which collective to use for scatter", + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_scatter, + NULL); + + xbt_cfg_register(&_sg_cfg_set, "smpi/allgatherv", + "Which collective to use for allgatherv", + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_allgatherv, NULL); - default_value = xbt_strdup("default"); xbt_cfg_register(&_sg_cfg_set, "smpi/allreduce", "Which collective to use for allreduce", - xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_allreduce, + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_allreduce, NULL); - default_value = xbt_strdup("ompi"); xbt_cfg_register(&_sg_cfg_set, "smpi/alltoall", "Which collective to use for alltoall", - xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_alltoall, + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_alltoall, NULL); + xbt_cfg_register(&_sg_cfg_set, "smpi/alltoallv", + "Which collective to use for alltoallv", + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_alltoallv, + NULL); - default_value = xbt_strdup("default"); xbt_cfg_register(&_sg_cfg_set, "smpi/bcast", "Which collective to use for bcast", - xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_bcast, + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_bcast, NULL); - - default_value = xbt_strdup("default"); xbt_cfg_register(&_sg_cfg_set, "smpi/reduce", "Which collective to use for reduce", - xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_reduce, + xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_reduce, NULL); #endif // HAVE_SMPI @@ -906,6 +947,10 @@ char* sg_cfg_get_string(const char* name) { return xbt_cfg_get_string(_sg_cfg_set,name); } +int sg_cfg_get_boolean(const char* name) +{ + return xbt_cfg_get_boolean(_sg_cfg_set,name); +} void sg_cfg_get_peer(const char *name, char **peer, int *port) { xbt_cfg_get_peer(_sg_cfg_set,name, peer, port); diff --git a/src/simix/smx_context.c b/src/simix/smx_context.c index ba6d03f6aa..64891fd82a 100644 --- a/src/simix/smx_context.c +++ b/src/simix/smx_context.c @@ -36,6 +36,11 @@ static e_xbt_parmap_mode_t smx_parallel_synchronization_mode = XBT_PARMAP_DEFAUL */ void SIMIX_context_mod_init(void) { +#if defined(CONTEXT_THREADS) && !defined(HAVE_THREAD_LOCAL_STORAGE) + /* the __thread storage class is not available on this platform: + * use getspecific/setspecific instead to store the current context in each thread */ + xbt_os_thread_key_create(&smx_current_context_key); +#endif if (!simix_global->context_factory) { /* select the context factory to use to create the contexts */ if (smx_factory_initializer_to_use) { @@ -86,12 +91,6 @@ void SIMIX_context_mod_init(void) } } } - -#if defined(CONTEXT_THREADS) && !defined(HAVE_THREAD_LOCAL_STORAGE) - /* the __thread storage class is not available on this platform: - * use getspecific/setspecific instead to store the current context in each thread */ - xbt_os_thread_key_create(&smx_current_context_key); -#endif } /** @@ -138,7 +137,6 @@ XBT_INLINE int SIMIX_context_get_nthreads(void) { * \param nb_threads the number of threads to use */ XBT_INLINE void SIMIX_context_set_nthreads(int nb_threads) { - if (nb_threads<=0) { nb_threads = xbt_os_get_numcores(); XBT_INFO("Auto-setting contexts/nthreads to %d",nb_threads); @@ -149,7 +147,6 @@ XBT_INLINE void SIMIX_context_set_nthreads(int nb_threads) { THROWF(arg_error, 0, "The thread factory cannot be run in parallel"); #endif } - smx_parallel_contexts = nb_threads; } diff --git a/src/simix/smx_context_raw.c b/src/simix/smx_context_raw.c index fd9058e7ce..59533e9240 100644 --- a/src/simix/smx_context_raw.c +++ b/src/simix/smx_context_raw.c @@ -31,7 +31,7 @@ typedef struct s_smx_ctx_raw { #ifdef CONTEXT_THREADS static xbt_parmap_t raw_parmap; -static raw_stack_t* raw_workers_stacks; /* space to save the worker stack in each thread */ +static smx_ctx_raw_t* raw_workers_context; /* space to save the worker context in each thread */ static unsigned long raw_threads_working; /* number of threads that have started their work */ static xbt_os_thread_key_t raw_worker_id_key; /* thread-specific storage for the thread id */ #endif @@ -241,9 +241,11 @@ void SIMIX_ctx_raw_factory_init(smx_context_factory_t *factory) if (SIMIX_context_is_parallel()) { #ifdef CONTEXT_THREADS int nthreads = SIMIX_context_get_nthreads(); - raw_parmap = xbt_parmap_new(nthreads, SIMIX_context_get_parallel_mode()); - raw_workers_stacks = xbt_new(raw_stack_t, nthreads); xbt_os_thread_key_create(&raw_worker_id_key); + raw_parmap = xbt_parmap_new(nthreads, SIMIX_context_get_parallel_mode()); + raw_workers_context = xbt_new(smx_ctx_raw_t, nthreads); + raw_maestro_context=NULL; + #endif if (SIMIX_context_get_parallel_threshold() > 1) { /* choose dynamically */ @@ -280,7 +282,7 @@ static int smx_ctx_raw_factory_finalize(smx_context_factory_t *factory) #ifdef CONTEXT_THREADS if (raw_parmap) xbt_parmap_destroy(raw_parmap); - xbt_free(raw_workers_stacks); + xbt_free(raw_workers_context); #endif return smx_ctx_base_factory_finalize(factory); } @@ -325,7 +327,8 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv, #endif /* HAVE_VALGRIND_VALGRIND_H */ } else { - raw_maestro_context = context; + if(data != NULL && raw_maestro_context==NULL) + raw_maestro_context = context; if(MC_is_active()) MC_ignore_heap(&(raw_maestro_context->stack_top), sizeof(raw_maestro_context->stack_top)); @@ -444,9 +447,9 @@ static void smx_ctx_raw_runall_serial(xbt_dynar_t processes) time_thread_sr[t] = 0; } - xbt_os_timer_start(timer); + xbt_os_cputimer_start(timer); smx_ctx_raw_resume(process); - xbt_os_timer_stop(timer); + xbt_os_cputimer_stop(timer); elapsed = xbt_os_timer_elapsed(timer); time_thread_ssr[t] += elapsed; time_thread_sr[((smx_ctx_raw_t)process->context)->thread] += elapsed; @@ -521,12 +524,14 @@ static void smx_ctx_raw_suspend_parallel(smx_context_t context) else { /* all processes were run, go to the barrier */ XBT_DEBUG("No more processes to run"); - next_context = (smx_context_t) raw_maestro_context; + unsigned long worker_id = (unsigned long) xbt_os_thread_get_specific(raw_worker_id_key); + + next_context = (smx_context_t)raw_workers_context[worker_id]; XBT_DEBUG("Restoring worker stack %lu (working threads = %lu)", worker_id, raw_threads_working); - next_stack = raw_workers_stacks[worker_id]; + next_stack = ((smx_ctx_raw_t)next_context)->stack_top; } SIMIX_context_set_current(next_context); @@ -544,8 +549,11 @@ static void smx_ctx_raw_resume_parallel(smx_process_t first_process) #ifdef CONTEXT_THREADS unsigned long worker_id = __sync_fetch_and_add(&raw_threads_working, 1); xbt_os_thread_set_specific(raw_worker_id_key, (void*) worker_id); + smx_ctx_raw_t worker_context = (smx_ctx_raw_t)SIMIX_context_self(); + raw_workers_context[worker_id] = worker_context; XBT_DEBUG("Saving worker stack %lu", worker_id); - raw_stack_t* worker_stack = &raw_workers_stacks[worker_id]; + raw_stack_t* worker_stack = &(worker_context)->stack_top; + smx_context_t context = first_process->context; SIMIX_context_set_current(context); diff --git a/src/simix/smx_context_sysv.c b/src/simix/smx_context_sysv.c index 90e6b84df3..6a19200e9b 100644 --- a/src/simix/smx_context_sysv.c +++ b/src/simix/smx_context_sysv.c @@ -37,7 +37,7 @@ typedef struct s_smx_ctx_sysv { #ifdef CONTEXT_THREADS static xbt_parmap_t sysv_parmap; -static ucontext_t* sysv_workers_stacks; /* space to save the worker's stack in each thread */ +static smx_ctx_sysv_t* sysv_workers_context; /* space to save the worker's context in each thread */ static unsigned long sysv_threads_working; /* number of threads that have started their work */ static xbt_os_thread_key_t sysv_worker_id_key; /* thread-specific storage for the thread id */ #endif @@ -90,7 +90,8 @@ void SIMIX_ctx_sysv_factory_init(smx_context_factory_t *factory) #ifdef CONTEXT_THREADS /* To use parallel ucontexts a thread pool is needed */ int nthreads = SIMIX_context_get_nthreads(); sysv_parmap = xbt_parmap_new(nthreads, SIMIX_context_get_parallel_mode()); - sysv_workers_stacks = xbt_new(ucontext_t, nthreads); + sysv_workers_context = xbt_new(smx_ctx_sysv_t, nthreads); + sysv_maestro_context = NULL; xbt_os_thread_key_create(&sysv_worker_id_key); (*factory)->stop = smx_ctx_sysv_stop_parallel; (*factory)->suspend = smx_ctx_sysv_suspend_parallel; @@ -110,7 +111,7 @@ static int smx_ctx_sysv_factory_finalize(smx_context_factory_t *factory) #ifdef CONTEXT_THREADS if (sysv_parmap) xbt_parmap_destroy(sysv_parmap); - xbt_free(sysv_workers_stacks); + xbt_free(sysv_workers_context); #endif return smx_ctx_base_factory_finalize(factory); } @@ -165,7 +166,8 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code, sizeof(smx_ctx_sysv_t), sizeof(int), CTX_ADDR_LEN); } } else { - sysv_maestro_context = context; + if(data != NULL && sysv_maestro_context == NULL) + sysv_maestro_context = context; } if(MC_is_active() && code) @@ -289,10 +291,10 @@ static void smx_ctx_sysv_suspend_parallel(smx_context_t context) else { /* all processes were run, go to the barrier */ XBT_DEBUG("No more processes to run"); - next_context = (smx_context_t) sysv_maestro_context; unsigned long worker_id = (unsigned long) xbt_os_thread_get_specific(sysv_worker_id_key); - next_stack = &sysv_workers_stacks[worker_id]; + next_context = (smx_context_t)sysv_workers_context[worker_id]; + next_stack = &((smx_ctx_sysv_t)next_context)->uc; } SIMIX_context_set_current(next_context); @@ -305,7 +307,9 @@ static void smx_ctx_sysv_resume_parallel(smx_process_t first_process) #ifdef CONTEXT_THREADS unsigned long worker_id = __sync_fetch_and_add(&sysv_threads_working, 1); xbt_os_thread_set_specific(sysv_worker_id_key, (void*) worker_id); - ucontext_t* worker_stack = &sysv_workers_stacks[worker_id]; + smx_ctx_sysv_t worker_context = (smx_ctx_sysv_t)SIMIX_context_self(); + sysv_workers_context[worker_id] = worker_context; + ucontext_t* worker_stack = &worker_context->uc; smx_context_t context = first_process->context; SIMIX_context_set_current(context); diff --git a/src/simix/smx_deployment.c b/src/simix/smx_deployment.c index 5b34af3432..72072a3e40 100644 --- a/src/simix/smx_deployment.c +++ b/src/simix/smx_deployment.c @@ -36,6 +36,23 @@ static void parse_process(sg_platf_process_cbarg_t process) smx_process_arg_t arg = NULL; smx_process_t process_created = NULL; + arg = xbt_new0(s_smx_process_arg_t, 1); + arg->code = parse_code; + arg->data = NULL; + arg->hostname = sg_host_name(host); + arg->argc = process->argc; + arg->argv = xbt_new(char *,process->argc); + int i; + for (i=0; iargc; i++) + arg->argv[i] = xbt_strdup(process->argv[i]); + arg->name = (char*)(arg->argv)[0]; + arg->kill_time = kill_time; + arg->properties = current_property_set; + if (!SIMIX_host_priv(host)->boot_processes) { + SIMIX_host_priv(host)->boot_processes = xbt_dynar_new(sizeof(smx_process_arg_t), _SIMIX_host_free_process_arg); + } + xbt_dynar_push_as(SIMIX_host_priv(host)->boot_processes,smx_process_arg_t,arg); + if (start_time > SIMIX_get_clock()) { arg = xbt_new0(s_smx_process_arg_t, 1); arg->name = (char*)(process->argv)[0]; @@ -67,7 +84,7 @@ static void parse_process(sg_platf_process_cbarg_t process) else simcall_process_create(&process_created, (char*)(process->argv)[0], parse_code, NULL, sg_host_name(host), kill_time, process->argc, (char**)process->argv, current_property_set,auto_restart); - + /* verify if process has been created (won't be the case if the host is currently dead, but that's fine) */ if (!process_created) { return; diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index 3b227d7be9..e171cd787f 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -64,7 +64,7 @@ void SIMIX_global_init(int *argc, char **argv) #ifdef TIME_BENCH_AMDAHL simix_global->timer_seq = xbt_os_timer_new(); simix_global->timer_par = xbt_os_timer_new(); - xbt_os_timer_start(simix_global->timer_seq); + xbt_os_cputimer_start(simix_global->timer_seq); #endif simix_global->process_to_run = xbt_dynar_new(sizeof(smx_process_t), NULL); simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_process_t), NULL); @@ -156,7 +156,7 @@ static void SIMIX_clean(void) surf_exit(); #ifdef TIME_BENCH_AMDAHL - xbt_os_timer_stop(simix_global->timer_seq); + xbt_os_cputimer_stop(simix_global->timer_seq); XBT_INFO("Amdhal timing informations. Sequential time: %lf; Parallel time: %lf", xbt_os_timer_elapsed(simix_global->timer_seq), xbt_os_timer_elapsed(simix_global->timer_par)); @@ -226,13 +226,13 @@ void SIMIX_run(void) /* Run all processes that are ready to run, possibly in parallel */ #ifdef TIME_BENCH_AMDAHL - xbt_os_timer_stop(simix_global->timer_seq); - xbt_os_timer_resume(simix_global->timer_par); + xbt_os_cputimer_stop(simix_global->timer_seq); + xbt_os_cputimer_resume(simix_global->timer_par); #endif SIMIX_process_runall(); #ifdef TIME_BENCH_AMDAHL - xbt_os_timer_stop(simix_global->timer_par); - xbt_os_timer_resume(simix_global->timer_seq); + xbt_os_cputimer_stop(simix_global->timer_par); + xbt_os_cputimer_resume(simix_global->timer_seq); #endif /* Move all killing processes to the end of the list, because killing a process that have an ongoing simcall is a bad idea */ diff --git a/src/simix/smx_host.c b/src/simix/smx_host.c index 86eef31829..cf11967d1a 100644 --- a/src/simix/smx_host.c +++ b/src/simix/smx_host.c @@ -38,6 +38,88 @@ smx_host_t SIMIX_host_create(const char *name, return xbt_lib_get_elm_or_null(host_lib, name); } +void SIMIX_pre_host_on(smx_simcall_t simcall, smx_host_t h) +{ + SIMIX_host_on(h); +} + +/** + * \brief Start the host if it is off + * + */ +void SIMIX_host_on(smx_host_t h) +{ + smx_host_priv_t host = SIMIX_host_priv(h); + + xbt_assert((host != NULL), "Invalid parameters"); + + surf_model_t ws_model = surf_resource_model(h, SURF_WKS_LEVEL); + if (ws_model->extension.workstation.get_state(h)==SURF_RESOURCE_OFF) { + ws_model->extension.workstation.set_state(h, SURF_RESOURCE_ON); + unsigned int cpt; + smx_process_arg_t arg; + xbt_dynar_foreach(host->boot_processes,cpt,arg) { + smx_process_t process; + + XBT_DEBUG("Booting Process %s(%s) right now", arg->argv[0], arg->hostname); + if (simix_global->create_process_function) { + simix_global->create_process_function(&process, + arg->argv[0], + arg->code, + NULL, + arg->hostname, + arg->kill_time, + arg->argc, + arg->argv, + arg->properties, + arg->auto_restart); + } + else { + simcall_process_create(&process, + arg->argv[0], + arg->code, + NULL, + arg->hostname, + arg->kill_time, + arg->argc, + arg->argv, + arg->properties, + arg->auto_restart); + } + } + } +} + +void SIMIX_pre_host_off(smx_simcall_t simcall, smx_host_t h) +{ + SIMIX_host_off(h, simcall->issuer); +} + +/** + * \brief Stop the host if it is on + * + */ +void SIMIX_host_off(smx_host_t h, smx_process_t issuer) +{ + smx_host_priv_t host = SIMIX_host_priv(h); + + xbt_assert((host != NULL), "Invalid parameters"); + + surf_model_t ws_model = surf_resource_model(h, SURF_WKS_LEVEL); + if (ws_model->extension.workstation.get_state(h)==SURF_RESOURCE_ON) { + ws_model->extension.workstation.set_state(h, SURF_RESOURCE_OFF); + + /* Clean Simulator data */ + if (xbt_swag_size(host->process_list) != 0) { + smx_process_t process = NULL; + xbt_swag_foreach(process, host->process_list) { + SIMIX_process_kill(process, issuer); + XBT_DEBUG("Killing %s on %s by %s", process->name, sg_host_name(process->smx_host), issuer->name); + } + } + } +} + /** * \brief Internal function to destroy a SIMIX host. * @@ -64,6 +146,7 @@ void SIMIX_host_destroy(void *h) THROWF(arg_error, 0, "%s", msg); } xbt_dynar_free(&host->auto_restart_processes); + xbt_dynar_free(&host->boot_processes); xbt_swag_free(host->process_list); /* Clean host structure */ @@ -149,6 +232,18 @@ double SIMIX_host_get_speed(smx_host_t host){ return ws_model->extension.workstation.get_speed(host, 1.0); } +int SIMIX_pre_host_get_core(smx_simcall_t simcall, smx_host_t host){ + return SIMIX_host_get_core(host); +} +int SIMIX_host_get_core(smx_host_t host){ + xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); + + return surf_workstation_model->extension.workstation. + get_core(host); +} + + + double SIMIX_pre_host_get_available_speed(smx_simcall_t simcall, smx_host_t host){ return SIMIX_host_get_available_speed(host); } @@ -192,7 +287,7 @@ void* SIMIX_host_get_data(smx_host_t host){ return SIMIX_host_priv(host)->data; } -void _SIMIX_host_free_process_arg(void *); + void _SIMIX_host_free_process_arg(void *data) { smx_process_arg_t arg = *(void**)data; diff --git a/src/simix/smx_host_private.h b/src/simix/smx_host_private.h index 2c5e157b2f..7fd525e426 100644 --- a/src/simix/smx_host_private.h +++ b/src/simix/smx_host_private.h @@ -14,6 +14,7 @@ typedef struct s_smx_host_priv { xbt_swag_t process_list; xbt_dynar_t auto_restart_processes; + xbt_dynar_t boot_processes; void *data; /**< @brief user data */ } s_smx_host_priv_t; @@ -21,6 +22,7 @@ static inline smx_host_priv_t SIMIX_host_priv(smx_host_t host){ return xbt_lib_get_level(host, SIMIX_HOST_LEVEL); } +void _SIMIX_host_free_process_arg(void *); smx_host_t SIMIX_host_create(const char *name, void *workstation, void *data); void SIMIX_host_destroy(void *host); @@ -38,9 +40,12 @@ void SIMIX_host_add_auto_restart_process(smx_host_t host, void SIMIX_host_restart_processes(smx_host_t host); void SIMIX_host_autorestart(smx_host_t host); xbt_dict_t SIMIX_host_get_properties(smx_host_t host); +int SIMIX_host_get_core(smx_host_t host); double SIMIX_host_get_speed(smx_host_t host); double SIMIX_host_get_available_speed(smx_host_t host); int SIMIX_host_get_state(smx_host_t host); +void SIMIX_host_on(smx_host_t host); +void SIMIX_host_off(smx_host_t host, smx_process_t issuer); smx_action_t SIMIX_host_execute(const char *name, smx_host_t host, double computation_amount, double priority, double bound); smx_action_t SIMIX_host_parallel_execute(const char *name, @@ -59,7 +64,10 @@ void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action); smx_host_t SIMIX_pre_host_get_by_name(smx_simcall_t, const char*); const char* SIMIX_pre_host_self_get_name(smx_simcall_t); const char* SIMIX_pre_host_get_name(smx_simcall_t, smx_host_t); +void SIMIX_pre_host_on(smx_simcall_t, smx_host_t host); +void SIMIX_pre_host_off(smx_simcall_t, smx_host_t host); xbt_dict_t SIMIX_pre_host_get_properties(smx_simcall_t, smx_host_t); +int SIMIX_pre_host_get_core(smx_simcall_t, smx_host_t); double SIMIX_pre_host_get_speed(smx_simcall_t, smx_host_t); double SIMIX_pre_host_get_available_speed(smx_simcall_t, smx_host_t); int SIMIX_pre_host_get_state(smx_simcall_t, smx_host_t); diff --git a/src/simix/smx_io.c b/src/simix/smx_io.c index dfb8554c20..8e5f1cb0d6 100644 --- a/src/simix/smx_io.c +++ b/src/simix/smx_io.c @@ -5,6 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "smx_private.h" +#include "surf/storage_private.h" #include "xbt/sysdep.h" #include "xbt/log.h" #include "xbt/dict.h" @@ -16,14 +17,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_io, simix, //SIMIX FILE READ void SIMIX_pre_file_read(smx_simcall_t simcall, void *ptr, size_t size, - size_t nmemb, smx_file_t stream) + smx_file_t fd) { - smx_action_t action = SIMIX_file_read(simcall->issuer, ptr, size, nmemb, stream); + smx_action_t action = SIMIX_file_read(simcall->issuer, ptr, size, fd); xbt_fifo_push(action->simcalls, simcall); simcall->issuer->waiting_action = action; } -smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size_t nmemb, smx_file_t stream) +smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, + smx_file_t fd) { smx_action_t action; smx_host_t host = process->smx_host; @@ -43,7 +45,9 @@ smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size #endif action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.read(host, ptr, size, nmemb, stream->surf_file); + action->io.surf_io = + surf_workstation_model->extension.workstation.read(host, ptr, size, + fd->surf_file); surf_workstation_model->action_data_set(action->io.surf_io, action); XBT_DEBUG("Create io action %p", action); @@ -53,14 +57,15 @@ smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size //SIMIX FILE WRITE void SIMIX_pre_file_write(smx_simcall_t simcall, const void *ptr, size_t size, - size_t nmemb, smx_file_t stream) + smx_file_t fd) { - smx_action_t action = SIMIX_file_write(simcall->issuer, ptr, size, nmemb, stream); + smx_action_t action = SIMIX_file_write(simcall->issuer, ptr, size, fd); xbt_fifo_push(action->simcalls, simcall); simcall->issuer->waiting_action = action; } -smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t size, size_t nmemb, smx_file_t stream) +smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, + size_t size, smx_file_t fd) { smx_action_t action; smx_host_t host = process->smx_host; @@ -80,7 +85,9 @@ smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t siz #endif action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.write(host, ptr, size, nmemb, stream->surf_file); + action->io.surf_io = + surf_workstation_model->extension.workstation.write(host, ptr, size, + fd->surf_file); surf_workstation_model->action_data_set(action->io.surf_io, action); XBT_DEBUG("Create io action %p", action); @@ -90,14 +97,15 @@ smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t siz //SIMIX FILE OPEN void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount, - const char* path, const char* mode) + const char* path) { - smx_action_t action = SIMIX_file_open(simcall->issuer, mount, path, mode); + smx_action_t action = SIMIX_file_open(simcall->issuer, mount, path); xbt_fifo_push(action->simcalls, simcall); simcall->issuer->waiting_action = action; } -smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const char* path, const char* mode) +smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, + const char* path) { smx_action_t action; smx_host_t host = process->smx_host; @@ -117,7 +125,8 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const cha #endif action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.open(host, mount, path, mode); + action->io.surf_io = + surf_workstation_model->extension.workstation.open(host, mount, path); surf_workstation_model->action_data_set(action->io.surf_io, action); XBT_DEBUG("Create io action %p", action); @@ -126,14 +135,14 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const cha } //SIMIX FILE CLOSE -void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fp) +void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd) { - smx_action_t action = SIMIX_file_close(simcall->issuer, fp); + smx_action_t action = SIMIX_file_close(simcall->issuer, fd); xbt_fifo_push(action->simcalls, simcall); simcall->issuer->waiting_action = action; } -smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp) +smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd) { smx_action_t action; smx_host_t host = process->smx_host; @@ -153,7 +162,7 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp) #endif action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.close(host, fp->surf_file); + action->io.surf_io = surf_workstation_model->extension.workstation.close(host, fd->surf_file); surf_workstation_model->action_data_set(action->io.surf_io, action); XBT_DEBUG("Create io action %p", action); @@ -161,52 +170,15 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp) return action; } -//SIMIX FILE STAT -void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t *buf) -{ - smx_action_t action = SIMIX_file_stat(simcall->issuer, fd, *buf); - xbt_fifo_push(action->simcalls, simcall); - simcall->issuer->waiting_action = action; -} - -smx_action_t SIMIX_file_stat(smx_process_t process, smx_file_t fd, s_file_stat_t buf) -{ - smx_action_t action; - smx_host_t host = process->smx_host; - /* check if the host is active */ - if (surf_workstation_model->extension. - workstation.get_state(host) != SURF_RESOURCE_ON) { - THROWF(host_error, 0, "Host %s failed, you cannot call this function", - sg_host_name(host)); - } - - action = xbt_mallocator_get(simix_global->action_mallocator); - action->type = SIMIX_ACTION_IO; - action->name = NULL; -#ifdef HAVE_TRACING - action->category = NULL; -#endif - - action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.stat(host, fd->surf_file); - - surf_workstation_model->action_data_set(action->io.surf_io, action); - XBT_DEBUG("Create io action %p", action); - - return action; -} //SIMIX FILE UNLINK -void SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd) +int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd) { - smx_action_t action = SIMIX_file_unlink(simcall->issuer, fd); - xbt_fifo_push(action->simcalls, simcall); - simcall->issuer->waiting_action = action; + return SIMIX_file_unlink(simcall->issuer, fd); } -smx_action_t SIMIX_file_unlink(smx_process_t process, smx_file_t fd) +int SIMIX_file_unlink(smx_process_t process, smx_file_t fd) { - smx_action_t action; smx_host_t host = process->smx_host; /* check if the host is active */ if (surf_workstation_model->extension. @@ -215,20 +187,11 @@ smx_action_t SIMIX_file_unlink(smx_process_t process, smx_file_t fd) sg_host_name(host)); } - action = xbt_mallocator_get(simix_global->action_mallocator); - action->type = SIMIX_ACTION_IO; - action->name = NULL; -#ifdef HAVE_TRACING - action->category = NULL; -#endif - - action->io.host = host; - action->io.surf_io = surf_workstation_model->extension.workstation.unlink(host, fd->surf_file); - - surf_workstation_model->action_data_set(action->io.surf_io, action); - XBT_DEBUG("Create io action %p", action); - - return action; + if (surf_workstation_model->extension.workstation.unlink(host, fd->surf_file)){ + fd->surf_file = NULL; + return 1; + } else + return 0; } //SIMIX FILE LS @@ -264,25 +227,27 @@ smx_action_t SIMIX_file_ls(smx_process_t process, const char* mount, const char return action; } -static void free_file_stat(void *p) +size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd) { - file_stat_t fs = p; - xbt_free(fs->date); - xbt_free(fs->group); - xbt_free(fs->time); - xbt_free(fs->user); - xbt_free(fs->user_rights); - xbt_free(fs); + return SIMIX_file_get_size(simcall->issuer, fd); +} + +size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd) +{ + smx_host_t host = process->smx_host; + return surf_workstation_model->extension.workstation.get_size(host, + fd->surf_file); } + void SIMIX_post_io(smx_action_t action) { xbt_fifo_item_t i; smx_simcall_t simcall; - char* key; - xbt_dict_cursor_t cursor = NULL; - s_file_stat_t *dst = NULL; - s_file_stat_t *src = NULL; +// char* key; +// xbt_dict_cursor_t cursor = NULL; +// s_file_stat_t *dst = NULL; +// s_file_stat_t *src = NULL; xbt_fifo_foreach(action->simcalls,i,simcall,smx_simcall_t) { switch (simcall->call) { @@ -293,7 +258,7 @@ void SIMIX_post_io(smx_action_t action) break; case SIMCALL_FILE_CLOSE: - xbt_free(simcall_file_close__get__fp(simcall)); + xbt_free(simcall_file_close__get__fd(simcall)); simcall_file_close__set__result(simcall, 0); break; @@ -305,30 +270,17 @@ void SIMIX_post_io(smx_action_t action) simcall_file_read__set__result(simcall, (action->io.surf_io)->cost); break; - case SIMCALL_FILE_STAT: - simcall_file_stat__set__result(simcall, 0); - dst = simcall_file_stat__get__buf(simcall); - src = &((action->io.surf_io)->stat); - file_stat_copy(src,dst); - break; - - case SIMCALL_FILE_UNLINK: - xbt_free(simcall_file_unlink__get__fd(simcall)); - simcall_file_unlink__set__result(simcall, 0); - break; - case SIMCALL_FILE_LS: - xbt_dict_foreach((action->io.surf_io)->ls_dict,cursor,key, src){ - // if there is a stat we have to duplicate it - if(src){ - dst = xbt_new0(s_file_stat_t,1); - file_stat_copy(src, dst); - xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,free_file_stat); - } - } +// xbt_dict_foreach((action->io.surf_io)->ls_dict,cursor,key, src){ +// // if there is a stat we have to duplicate it +// if(src){ +// dst = xbt_new0(s_file_stat_t,1); +// file_stat_copy(src, dst); +// xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,xbt_free); +// } +// } simcall_file_ls__set__result(simcall, (action->io.surf_io)->ls_dict); break; - default: break; } diff --git a/src/simix/smx_io_private.h b/src/simix/smx_io_private.h index c158322e86..c4f1d6528e 100644 --- a/src/simix/smx_io_private.h +++ b/src/simix/smx_io_private.h @@ -11,24 +11,28 @@ #include "smx_smurf_private.h" void SIMIX_pre_file_read(smx_simcall_t simcall, void *ptr, size_t size, - size_t nmemb, smx_file_t stream); + smx_file_t fd); void SIMIX_pre_file_write(smx_simcall_t simcall, const void *ptr, size_t size, - size_t nmemb, smx_file_t strea); + smx_file_t fd); void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount, - const char* path, const char* mode); -void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fp); -void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t *buf); -void SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd); + const char* path); +void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd); +int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd); void SIMIX_pre_file_ls(smx_simcall_t simcall, const char* mount, const char* path); - -smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size_t nmemb, smx_file_t stream); -smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t size, size_t nmemb, smx_file_t stream); -smx_action_t SIMIX_file_open(smx_process_t process, const char* storage, const char* path, const char* mode); -smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp); -smx_action_t SIMIX_file_stat(smx_process_t process, smx_file_t fd, s_file_stat_t buf); -smx_action_t SIMIX_file_unlink(smx_process_t process, smx_file_t fd); -smx_action_t SIMIX_file_ls(smx_process_t process, const char *mount, const char *path); +size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd); + +smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, + smx_file_t fd); +smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, + size_t size, smx_file_t fd); +smx_action_t SIMIX_file_open(smx_process_t process, const char* storage, + const char* path); +smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd); +int SIMIX_file_unlink(smx_process_t process, smx_file_t fd); +smx_action_t SIMIX_file_ls(smx_process_t process, const char *mount, + const char *path); +size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd); void SIMIX_post_io(smx_action_t action); void SIMIX_io_destroy(smx_action_t action); diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index ccce24a3e8..7f90b67dac 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -199,6 +199,9 @@ smx_action_t SIMIX_fifo_get_comm(xbt_fifo_t fifo, e_smx_comm_type_t type, xbt_fifo_remove_item(fifo, item); xbt_fifo_free_item(item); action->comm.refcount++; +#ifdef HAVE_MC + action->comm.rdv_cpy = action->comm.rdv; +#endif action->comm.rdv = NULL; return action; } @@ -400,7 +403,6 @@ smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv, other_action->state = SIMIX_READY; other_action->comm.dst_proc=rdv->permanent_receiver; other_action->comm.refcount++; - other_action->comm.rdv = rdv; xbt_fifo_push(rdv->done_comm_fifo,other_action); other_action->comm.rdv=rdv; XBT_DEBUG("pushing a message into the permanent receive fifo %p, comm %p \n", rdv, &(other_action->comm)); diff --git a/src/simix/smx_private.h b/src/simix/smx_private.h index 257ea0e9d6..1130ff9329 100644 --- a/src/simix/smx_private.h +++ b/src/simix/smx_private.h @@ -75,10 +75,6 @@ typedef struct s_smx_file { surf_file_t surf_file; } s_smx_file_t; -typedef struct s_smx_stat { - s_file_stat_t surf_stat; -} s_smx_stat_t; - /*********************************** Time ************************************/ /** @brief Timer datatype */ @@ -136,6 +132,12 @@ typedef struct s_smx_action { struct { e_smx_comm_type_t type; /* Type of the communication (SIMIX_COMM_SEND or SIMIX_COMM_RECEIVE) */ smx_rdv_t rdv; /* Rendez-vous where the comm is queued */ + +#ifdef HAVE_MC + smx_rdv_t rdv_cpy; /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR + (comm.rdv set to NULL when the communication is removed from the mailbox + (used as garbage collector)) */ +#endif int refcount; /* Number of processes involved in the cond */ int detached; /* If detached or not */ diff --git a/src/simix/smx_smurf.c b/src/simix/smx_smurf.c index aec3439312..a5a3e27681 100644 --- a/src/simix/smx_smurf.c +++ b/src/simix/smx_smurf.c @@ -49,6 +49,8 @@ void SIMIX_simcall_pre(smx_simcall_t simcall, int value) { XBT_DEBUG("Handling simcall %p: %s", simcall, SIMIX_simcall_name(simcall->call)); simcall->mc_value = value; + if (simcall->issuer->context->iwannadie && simcall->call != SIMCALL_PROCESS_CLEANUP) + return; switch (simcall->call) { SIMCALL_LIST(SIMCALL_CASE, SIMCALL_SEP_NOTHING) case NUM_SIMCALLS:; diff --git a/src/simix/smx_smurf_private.h b/src/simix/smx_smurf_private.h index 6e075a9b91..ab94860b3c 100644 --- a/src/simix/smx_smurf_private.h +++ b/src/simix/smx_smurf_private.h @@ -261,7 +261,10 @@ #define SIMCALL_LIST1(ACTION, sep) \ ACTION(SIMCALL_HOST_GET_BY_NAME, host_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \ ACTION(SIMCALL_HOST_GET_NAME, host_get_name, WITH_ANSWER, TSTRING(result), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_ON, host_on, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_OFF, host_off, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t)) sep \ ACTION(SIMCALL_HOST_GET_PROPERTIES, host_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_GET_CORE, host_get_core, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \ ACTION(SIMCALL_HOST_GET_SPEED, host_get_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \ ACTION(SIMCALL_HOST_GET_AVAILABLE_SPEED, host_get_available_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \ ACTION(SIMCALL_HOST_GET_STATE, host_get_state, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \ @@ -355,13 +358,13 @@ ACTION(SIMCALL_SEM_WOULD_BLOCK, sem_would_block, WITH_ANSWER, TINT(result), TSPE ACTION(SIMCALL_SEM_ACQUIRE, sem_acquire, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \ ACTION(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem_acquire_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t), TDOUBLE(timeout)) sep \ ACTION(SIMCALL_SEM_GET_CAPACITY, sem_get_capacity, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \ -ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TDOUBLE(result), TPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \ -ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TCPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \ -ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path), TSTRING(mode)) sep \ -ACTION(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fp, smx_file_t)) sep \ -ACTION(SIMCALL_FILE_STAT, file_stat, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t), TSPEC(buf, s_file_stat_t*)) sep \ -ACTION(SIMCALL_FILE_UNLINK, file_unlink, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \ +ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TSIZE(result), TPTR(ptr), TSIZE(size), TSPEC(fd, smx_file_t)) sep \ +ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TCPTR(ptr), TSIZE(size), TSPEC(fd, smx_file_t)) sep \ +ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path)) sep \ +ACTION(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \ +ACTION(SIMCALL_FILE_UNLINK, file_unlink, WITH_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \ ACTION(SIMCALL_FILE_LS, file_ls, WITHOUT_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(mount), TSTRING(path)) sep \ +ACTION(SIMCALL_FILE_GET_SIZE, file_get_size, WITH_ANSWER, TSIZE(result), TSPEC(fd, smx_file_t)) sep \ ACTION(SIMCALL_ASR_GET_PROPERTIES, asr_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(name)) sep /* SIMCALL_COMM_IS_LATENCY_BOUNDED and SIMCALL_SET_CATEGORY make things complicated diff --git a/src/simix/smx_synchro.c b/src/simix/smx_synchro.c index 58e0b85af2..c0eba11712 100644 --- a/src/simix/smx_synchro.c +++ b/src/simix/smx_synchro.c @@ -463,7 +463,6 @@ void SIMIX_sem_release(smx_sem_t sem) XBT_DEBUG("Sem release semaphore %p", sem); if ((proc = xbt_swag_extract(sem->sleeping))) { - proc = xbt_swag_extract(sem->sleeping); SIMIX_synchro_destroy(proc->waiting_action); proc->waiting_action = NULL; SIMIX_simcall_answer(&proc->simcall); diff --git a/src/simix/smx_user.c b/src/simix/smx_user.c index 2b09caa21e..9fc7d4c976 100644 --- a/src/simix/smx_user.c +++ b/src/simix/smx_user.c @@ -44,6 +44,28 @@ const char* simcall_host_get_name(smx_host_t host) return simcall_BODY_host_get_name(host); } +/** + * \ingroup simix_host_management + * \brief Start the host if it is off + * + * \param host A SIMIX host + */ +void simcall_host_on(smx_host_t host) +{ + simcall_BODY_host_on(host); +} + +/** + * \ingroup simix_host_management + * \brief Stop the host if it is on + * + * \param host A SIMIX host + */ +void simcall_host_off(smx_host_t host) +{ + simcall_BODY_host_off(host); +} + /** * \ingroup simix_host_management * \brief Returns a dict of the properties assigned to a host. @@ -82,6 +104,20 @@ double simcall_host_get_speed(smx_host_t host) return simcall_BODY_host_get_speed(host); } +/** + * \ingroup simix_host_management + * \brief Returns the number of core of the processor. + * + * \param host A SIMIX host + * \return The number of core + */ +int simcall_host_get_core(smx_host_t host) +{ + return simcall_BODY_host_get_core(host); +} + + + /** * \ingroup simix_host_management * \brief Returns the available speed of the processor. @@ -1261,63 +1297,62 @@ int simcall_sem_get_capacity(smx_sem_t sem) * \ingroup simix_file_management * */ -double simcall_file_read(void* ptr, size_t size, size_t nmemb, smx_file_t stream) +size_t simcall_file_read(void* ptr, size_t size, smx_file_t fd) { - return simcall_BODY_file_read(ptr, size, nmemb, stream); + return simcall_BODY_file_read(ptr, size, fd); } /** * \ingroup simix_file_management * */ -size_t simcall_file_write(const void* ptr, size_t size, size_t nmemb, smx_file_t stream) +size_t simcall_file_write(const void* ptr, size_t size, + smx_file_t fd) { - return simcall_BODY_file_write(ptr, size, nmemb, stream); + return simcall_BODY_file_write(ptr, size, fd); } /** * \ingroup simix_file_management * \brief */ -smx_file_t simcall_file_open(const char* mount, const char* path, const char* mode) +smx_file_t simcall_file_open(const char* mount, const char* path) { - return simcall_BODY_file_open(mount, path, mode); + return simcall_BODY_file_open(mount, path); } /** * \ingroup simix_file_management * */ -int simcall_file_close(smx_file_t fp) +int simcall_file_close(smx_file_t fd) { - return simcall_BODY_file_close(fp); + return simcall_BODY_file_close(fd); } /** * \ingroup simix_file_management * */ -int simcall_file_stat(smx_file_t fd, s_file_stat_t *buf) +int simcall_file_unlink(smx_file_t fd) { - return simcall_BODY_file_stat(fd, buf); + return simcall_BODY_file_unlink(fd); } /** * \ingroup simix_file_management * */ -int simcall_file_unlink(smx_file_t fd) +xbt_dict_t simcall_file_ls(const char* mount, const char* path) { - return simcall_BODY_file_unlink(fd); + return simcall_BODY_file_ls(mount, path); } - /** * \ingroup simix_file_management * */ -xbt_dict_t simcall_file_ls(const char* mount, const char* path) -{ - return simcall_BODY_file_ls(mount, path); +size_t simcall_file_get_size (smx_file_t fd){ + return simcall_BODY_file_get_size(fd); } #ifdef HAVE_MC diff --git a/src/smpi/colls/allgather-2dmesh.c b/src/smpi/colls/allgather-2dmesh.c index 8fa5d40703..4e3a9c77cf 100644 --- a/src/smpi/colls/allgather-2dmesh.c +++ b/src/smpi/colls/allgather-2dmesh.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -110,18 +110,18 @@ smpi_coll_tuned_allgather_2dmesh(void *send_buff, int send_count, MPI_Datatype int i, src, dst, rank, num_procs; int X, Y, send_offset, recv_offset; int my_row_base, my_col_base, src_row_base, block_size, num_reqs; - int success = 0; - int failure = 1; int tag = 1; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); - MPI_Type_extent(send_type, &extent); + extent = smpi_datatype_get_extent(send_type); block_size = extent * send_count; - is_2dmesh(num_procs, &X, &Y); + if (!is_2dmesh(num_procs, &X, &Y)) + return MPI_ERR_COMM; + my_row_base = (rank / Y) * Y; my_col_base = rank % Y; @@ -129,18 +129,13 @@ smpi_coll_tuned_allgather_2dmesh(void *send_buff, int send_count, MPI_Datatype if (Y > X) num_reqs = Y; - req = (MPI_Request *) malloc(num_reqs * sizeof(MPI_Request)); - if (!req) { - printf("allgather-2dmesh-shoot.c:85: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } + req = (MPI_Request *) xbt_malloc(num_reqs * sizeof(MPI_Request)); req_ptr = req; // do local allgather/local copy recv_offset = rank * block_size; - MPIR_Localcopy(send_buff, send_count, send_type, (char *)recv_buff + recv_offset, + smpi_datatype_copy(send_buff, send_count, send_type, (char *)recv_buff + recv_offset, recv_count, recv_type); // do row-wise comm @@ -149,8 +144,8 @@ smpi_coll_tuned_allgather_2dmesh(void *send_buff, int send_count, MPI_Datatype if (src == rank) continue; recv_offset = src * block_size; - MPIC_Irecv((char *)recv_buff + recv_offset, recv_count, recv_type, src, tag, - comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv((char *)recv_buff + recv_offset, recv_count, recv_type, src, tag, + comm); } @@ -158,10 +153,10 @@ smpi_coll_tuned_allgather_2dmesh(void *send_buff, int send_count, MPI_Datatype dst = i + my_row_base; if (dst == rank) continue; - MPIC_Send(send_buff, send_count, send_type, dst, tag, comm); + smpi_mpi_send(send_buff, send_count, send_type, dst, tag, comm); } - MPI_Waitall(Y - 1, req, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(Y - 1, req, MPI_STATUSES_IGNORE); req_ptr = req; @@ -172,8 +167,8 @@ smpi_coll_tuned_allgather_2dmesh(void *send_buff, int send_count, MPI_Datatype continue; src_row_base = (src / Y) * Y; recv_offset = src_row_base * block_size; - MPIC_Irecv((char *)recv_buff + recv_offset, recv_count * Y, recv_type, src, tag, - comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv((char *)recv_buff + recv_offset, recv_count * Y, recv_type, src, tag, + comm); } for (i = 0; i < X; i++) { @@ -181,13 +176,13 @@ smpi_coll_tuned_allgather_2dmesh(void *send_buff, int send_count, MPI_Datatype if (dst == rank) continue; send_offset = my_row_base * block_size; - MPIC_Send((char *)recv_buff + send_offset, send_count * Y, send_type, dst, tag, + smpi_mpi_send((char *)recv_buff + send_offset, send_count * Y, send_type, dst, tag, comm); } - MPI_Waitall(X - 1, req, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(X - 1, req, MPI_STATUSES_IGNORE); free(req); - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allgather-3dmesh.c b/src/smpi/colls/allgather-3dmesh.c index 035e98103e..dfd2ace9e6 100644 --- a/src/smpi/colls/allgather-3dmesh.c +++ b/src/smpi/colls/allgather-3dmesh.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -97,13 +97,11 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count, int i, src, dst, rank, num_procs, block_size, my_z_base; int my_z, X, Y, Z, send_offset, recv_offset; int two_dsize, my_row_base, my_col_base, src_row_base, src_z_base, num_reqs; - int success = 0; - int failure = 1; int tag = 1; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &extent); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(send_type); is_3dmesh(num_procs, &X, &Y, &Z); @@ -123,18 +121,13 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count, block_size = extent * send_count; - req = (MPI_Request *) malloc(num_reqs * sizeof(MPI_Request)); - if (!req) { - printf("allgather-3dmesh-shoot.c:85: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } + req = (MPI_Request *) xbt_malloc(num_reqs * sizeof(MPI_Request)); req_ptr = req; // do local allgather/local copy recv_offset = rank * block_size; - MPIR_Localcopy(send_buff, send_count, send_type, (char *)recv_buff + recv_offset, + smpi_datatype_copy(send_buff, send_count, send_type, (char *)recv_buff + recv_offset, recv_count, recv_type); // do rowwise comm @@ -143,18 +136,18 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count, if (src == rank) continue; recv_offset = src * block_size; - MPIC_Irecv((char *)recv_buff + recv_offset, send_count, recv_type, src, tag, - comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv((char *)recv_buff + recv_offset, send_count, recv_type, src, tag, + comm); } for (i = 0; i < Y; i++) { dst = i + my_row_base; if (dst == rank) continue; - MPIC_Send(send_buff, send_count, send_type, dst, tag, comm); + smpi_mpi_send(send_buff, send_count, send_type, dst, tag, comm); } - MPI_Waitall(Y - 1, req, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(Y - 1, req, MPI_STATUSES_IGNORE); req_ptr = req; // do colwise comm, it does not matter here if i*X or i *Y since X == Y @@ -166,8 +159,8 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count, src_row_base = (src / X) * X; recv_offset = src_row_base * block_size; - MPIC_Irecv((char *)recv_buff + recv_offset, recv_count * Y, recv_type, src, tag, - comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv((char *)recv_buff + recv_offset, recv_count * Y, recv_type, src, tag, + comm); } send_offset = my_row_base * block_size; @@ -176,11 +169,11 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count, dst = (i * Y + my_col_base); if (dst == rank) continue; - MPIC_Send((char *)recv_buff + send_offset, send_count * Y, send_type, dst, tag, + smpi_mpi_send((char *)recv_buff + send_offset, send_count * Y, send_type, dst, tag, comm); } - MPI_Waitall(X - 1, req, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(X - 1, req, MPI_STATUSES_IGNORE); req_ptr = req; for (i = 1; i < Z; i++) { @@ -189,19 +182,19 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count, recv_offset = (src_z_base * block_size); - MPIC_Irecv((char *)recv_buff + recv_offset, recv_count * two_dsize, recv_type, - src, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv((char *)recv_buff + recv_offset, recv_count * two_dsize, recv_type, + src, tag, comm); } for (i = 1; i < Z; i++) { dst = (rank + i * two_dsize) % num_procs; send_offset = my_z_base * block_size; - MPIC_Send((char *)recv_buff + send_offset, send_count * two_dsize, send_type, + smpi_mpi_send((char *)recv_buff + send_offset, send_count * two_dsize, send_type, dst, tag, comm); } - MPI_Waitall(Z - 1, req, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(Z - 1, req, MPI_STATUSES_IGNORE); free(req); - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allgather-GB.c b/src/smpi/colls/allgather-GB.c index b9df40e577..f9a1e072b1 100644 --- a/src/smpi/colls/allgather-GB.c +++ b/src/smpi/colls/allgather-GB.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" // Allgather - gather/bcast algorithm int smpi_coll_tuned_allgather_GB(void *send_buff, int send_count, @@ -7,10 +7,10 @@ int smpi_coll_tuned_allgather_GB(void *send_buff, int send_count, MPI_Comm comm) { int num_procs; - MPI_Comm_size(comm, &num_procs); - MPI_Gather(send_buff, send_count, send_type, recv_buff, recv_count, recv_type, + num_procs = smpi_comm_size(comm); + smpi_mpi_gather(send_buff, send_count, send_type, recv_buff, recv_count, recv_type, 0, comm); - MPI_Bcast(recv_buff, (recv_count * num_procs), recv_type, 0, comm); + mpi_coll_bcast_fun(recv_buff, (recv_count * num_procs), recv_type, 0, comm); return MPI_SUCCESS; } diff --git a/src/smpi/colls/allgather-NTSLR-NB.c b/src/smpi/colls/allgather-NTSLR-NB.c index 26fb9707a9..d0c6ef0646 100644 --- a/src/smpi/colls/allgather-NTSLR-NB.c +++ b/src/smpi/colls/allgather-NTSLR-NB.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" // Allgather-Non-Topoloty-Scecific-Logical-Ring algorithm int @@ -12,18 +12,21 @@ smpi_coll_tuned_allgather_NTSLR_NB(void *sbuf, int scount, MPI_Datatype stype, int send_offset, recv_offset; int tag = 500; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &size); - MPI_Type_extent(rtype, &rextent); - MPI_Type_extent(stype, &sextent); + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + rextent = smpi_datatype_get_extent(rtype); + sextent = smpi_datatype_get_extent(stype); MPI_Request *rrequest_array; MPI_Request *srequest_array; - rrequest_array = (MPI_Request *) malloc(size * sizeof(MPI_Request)); - srequest_array = (MPI_Request *) malloc(size * sizeof(MPI_Request)); + rrequest_array = (MPI_Request *) xbt_malloc(size * sizeof(MPI_Request)); + srequest_array = (MPI_Request *) xbt_malloc(size * sizeof(MPI_Request)); // irregular case use default MPI fucntions - if (scount * sextent != rcount * rextent) - MPI_Allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm); + if (scount * sextent != rcount * rextent) { + XBT_WARN("MPI_allgather_NTSLR_NB use default MPI_allgather."); + smpi_mpi_allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm); + return MPI_SUCCESS; + } // topo non-specific to = (rank + 1) % size; @@ -32,7 +35,7 @@ smpi_coll_tuned_allgather_NTSLR_NB(void *sbuf, int scount, MPI_Datatype stype, //copy a single segment from sbuf to rbuf send_offset = rank * scount * sextent; - MPI_Sendrecv(sbuf, scount, stype, rank, tag, + smpi_mpi_sendrecv(sbuf, scount, stype, rank, tag, (char *)rbuf + send_offset, rcount, rtype, rank, tag, comm, &status); @@ -42,17 +45,15 @@ smpi_coll_tuned_allgather_NTSLR_NB(void *sbuf, int scount, MPI_Datatype stype, //post all irecv first for (i = 0; i < size - 1; i++) { recv_offset = ((rank - i - 1 + size) % size) * increment; - MPI_Irecv((char *)rbuf + recv_offset, rcount, rtype, from, tag + i, comm, - &rrequest_array[i]); + rrequest_array[i] = smpi_mpi_irecv((char *)rbuf + recv_offset, rcount, rtype, from, tag + i, comm); } for (i = 0; i < size - 1; i++) { send_offset = ((rank - i + size) % size) * increment; - MPI_Isend((char *)rbuf + send_offset, scount, stype, to, tag + i, comm, - &srequest_array[i]); - MPI_Wait(&rrequest_array[i], &status); - MPI_Wait(&srequest_array[i], &status2); + srequest_array[i] = smpi_mpi_isend((char *)rbuf + send_offset, scount, stype, to, tag + i, comm); + smpi_mpi_wait(&rrequest_array[i], &status); + smpi_mpi_wait(&srequest_array[i], &status2); } free(rrequest_array); diff --git a/src/smpi/colls/allgather-NTSLR.c b/src/smpi/colls/allgather-NTSLR.c index 08be50f826..bcaabfd235 100644 --- a/src/smpi/colls/allgather-NTSLR.c +++ b/src/smpi/colls/allgather-NTSLR.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" // Allgather-Non-Topoloty-Scecific-Logical-Ring algorithm int @@ -12,14 +12,17 @@ smpi_coll_tuned_allgather_NTSLR(void *sbuf, int scount, MPI_Datatype stype, int send_offset, recv_offset; int tag = 500; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &size); - MPI_Type_extent(rtype, &rextent); - MPI_Type_extent(stype, &sextent); + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + rextent = smpi_datatype_get_extent(rtype); + sextent = smpi_datatype_get_extent(stype); // irregular case use default MPI fucntions - if (scount * sextent != rcount * rextent) - MPI_Allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm); + if (scount * sextent != rcount * rextent) { + XBT_WARN("MPI_allgather_NTSLR use default MPI_allgather."); + smpi_mpi_allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm); + return MPI_SUCCESS; + } // topo non-specific to = (rank + 1) % size; @@ -28,7 +31,7 @@ smpi_coll_tuned_allgather_NTSLR(void *sbuf, int scount, MPI_Datatype stype, //copy a single segment from sbuf to rbuf send_offset = rank * scount * sextent; - MPI_Sendrecv(sbuf, scount, stype, rank, tag, + smpi_mpi_sendrecv(sbuf, scount, stype, rank, tag, (char *)rbuf + send_offset, rcount, rtype, rank, tag, comm, &status); @@ -38,7 +41,7 @@ smpi_coll_tuned_allgather_NTSLR(void *sbuf, int scount, MPI_Datatype stype, for (i = 0; i < size - 1; i++) { send_offset = ((rank - i + size) % size) * increment; recv_offset = ((rank - i - 1 + size) % size) * increment; - MPI_Sendrecv((char *) rbuf + send_offset, scount, stype, to, tag + i, + smpi_mpi_sendrecv((char *) rbuf + send_offset, scount, stype, to, tag + i, (char *) rbuf + recv_offset, rcount, rtype, from, tag + i, comm, &status); } diff --git a/src/smpi/colls/allgather-RDB.c b/src/smpi/colls/allgather-RDB.c deleted file mode 100644 index fc1b36d621..0000000000 --- a/src/smpi/colls/allgather-RDB.c +++ /dev/null @@ -1,123 +0,0 @@ -#include "colls.h" - -int -smpi_coll_tuned_allgather_rdb(void *sbuf, int send_count, - MPI_Datatype send_type, void *rbuf, - int recv_count, MPI_Datatype recv_type, - MPI_Comm comm) -{ - // MPI variables - MPI_Status status; - MPI_Aint send_chunk, recv_chunk; - - // local int variables - int i, j, k, dst, rank, num_procs, send_offset, recv_offset, tree_root; - int dst_tree_root, rank_tree_root, last_recv_count, num_procs_completed; - int offset, tmp_mask; - int tag = 1; - int mask = 1; - int success = 0; - int curr_count = recv_count; - - // local string variables - char *send_ptr = (char *) sbuf; - char *recv_ptr = (char *) rbuf; - - // get size of the communicator, followed by rank - MPI_Comm_size(comm, &num_procs); - MPI_Comm_rank(comm, &rank); - - // get size of single element's type for send buffer and recv buffer - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); - - // multiply size of each element by number of elements to send or recv - send_chunk *= send_count; - recv_chunk *= recv_count; - - // perform a local copy - MPI_Sendrecv(send_ptr, send_count, send_type, rank, tag, - recv_ptr + rank * recv_chunk, recv_count, recv_type, rank, tag, - comm, &status); - - i = 0; - while (mask < num_procs) { - dst = rank ^ mask; - dst_tree_root = dst >> i; - dst_tree_root <<= i; - rank_tree_root = rank >> i; - rank_tree_root <<= i; - send_offset = rank_tree_root * send_chunk; - recv_offset = dst_tree_root * recv_chunk; - - if (dst < num_procs) { - MPI_Sendrecv(recv_ptr + send_offset, curr_count, send_type, dst, - tag, recv_ptr + recv_offset, mask * recv_count, - recv_type, dst, tag, comm, &status); - MPI_Get_count(&status, recv_type, &last_recv_count); - curr_count += last_recv_count; - } - - if (dst_tree_root + mask > num_procs) { - num_procs_completed = num_procs - rank_tree_root - mask; - /* num_procs_completed is the number of processes in this - subtree that have all the data. Send data to others - in a tree fashion. First find root of current tree - that is being divided into two. k is the number of - least-significant bits in this process's rank that - must be zeroed out to find the rank of the root */ - - j = mask; - k = 0; - while (j) { - j >>= 1; - k++; - } - k--; - - offset = recv_chunk * (rank_tree_root + mask); - tmp_mask = mask >> 1; - - while (tmp_mask) { - dst = rank ^ tmp_mask; - - tree_root = rank >> k; - tree_root <<= k; - - /* send only if this proc has data and destination - doesn't have data. at any step, multiple processes - can send if they have the data */ - if ((dst > rank) - && (rank < tree_root + num_procs_completed) - && (dst >= tree_root + num_procs_completed)) { - MPI_Send(recv_ptr + offset, last_recv_count, recv_type, dst, - tag, comm); - - /* last_recv_cnt was set in the previous - receive. that's the amount of data to be - sent now. */ - } - /* recv only if this proc. doesn't have data and sender - has data */ - else if ((dst < rank) - && (dst < tree_root + num_procs_completed) - && (rank >= tree_root + num_procs_completed)) { - MPI_Recv(recv_ptr + offset, - recv_count * num_procs_completed, - recv_type, dst, tag, comm, &status); - // num_procs_completed is also equal to the no. of processes - // whose data we don't have - MPI_Get_count(&status, recv_type, &last_recv_count); - curr_count += last_recv_count; - } - tmp_mask >>= 1; - k--; - } - } - - mask <<= 1; - i++; - } - - return success; -} diff --git a/src/smpi/colls/allgather-SMP-NTS.c b/src/smpi/colls/allgather-SMP-NTS.c index 2f760f6312..a6b515a0c4 100644 --- a/src/smpi/colls/allgather-SMP-NTS.c +++ b/src/smpi/colls/allgather-SMP-NTS.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #ifndef NUM_CORE #define NUM_CORE 8 #endif @@ -9,15 +9,14 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount, MPI_Comm comm) { int src, dst, comm_size, rank; - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); MPI_Aint rextent, sextent; - MPI_Type_extent(rtype, &rextent); - MPI_Type_extent(stype, &sextent); + rextent = smpi_datatype_get_extent(rtype); + sextent = smpi_datatype_get_extent(stype); int tag = 50; MPI_Request request; MPI_Request rrequest_array[128]; - MPI_Request srequest_array[128]; MPI_Status status; int i, send_offset, recv_offset; @@ -29,15 +28,18 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount, /* for too small number of processes, use default implementation */ if (comm_size <= NUM_CORE) { - return MPI_Allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm); + XBT_WARN("MPI_allgather_SMP_NTS use default MPI_allgather."); + smpi_mpi_allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm); + return MPI_SUCCESS; } + // the last SMP node may have fewer number of running processes than all others if (inter_rank == (inter_comm_size - 1)) { num_core_in_current_smp = comm_size - (inter_rank * NUM_CORE); } //copy corresponding message from sbuf to rbuf recv_offset = rank * rextent * rcount; - MPI_Sendrecv(sbuf, scount, stype, rank, tag, + smpi_mpi_sendrecv(sbuf, scount, stype, rank, tag, ((char *) rbuf + recv_offset), rcount, rtype, rank, tag, comm, &status); @@ -53,7 +55,7 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount, (num_core_in_current_smp); recv_offset = src * rextent * rcount; - MPI_Sendrecv(sbuf, scount, stype, dst, tag, + smpi_mpi_sendrecv(sbuf, scount, stype, dst, tag, ((char *) rbuf + recv_offset), rcount, rtype, src, tag, comm, &status); @@ -73,28 +75,27 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount, recv_offset = ((inter_rank - i - 1 + inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount; - MPI_Irecv((char *) rbuf + recv_offset, rcount * NUM_CORE, rtype, src, - tag + i, comm, &rrequest_array[i]); + rrequest_array[i] = smpi_mpi_irecv((char *)rbuf+recv_offset, rcount * NUM_CORE, rtype, src, tag+i, comm); } // send first message send_offset = ((inter_rank + inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount; - MPI_Isend((char *) rbuf + send_offset, scount * NUM_CORE, stype, dst, tag, - comm, &srequest_array[0]); + smpi_mpi_isend((char *) rbuf + send_offset, scount * NUM_CORE, stype, + dst, tag, comm); // loop : recv-inter , send-inter, send-intra (linear-bcast) for (i = 0; i < inter_comm_size - 2; i++) { recv_offset = ((inter_rank - i - 1 + inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount; - MPI_Wait(&rrequest_array[i], &status); - MPI_Isend((char *) rbuf + recv_offset, scount * NUM_CORE, stype, dst, - tag + i + 1, comm, &srequest_array[i + 1]); + smpi_mpi_wait(&rrequest_array[i], &status); + smpi_mpi_isend((char *) rbuf + recv_offset, scount * NUM_CORE, stype, + dst, tag + i + 1, comm); if (num_core_in_current_smp > 1) { - MPI_Isend((char *) rbuf + recv_offset, scount * NUM_CORE, stype, - (rank + 1), tag + i + 1, comm, &request); + request = smpi_mpi_isend((char *) rbuf + recv_offset, scount * NUM_CORE, stype, + (rank + 1), tag + i + 1, comm); } } @@ -104,10 +105,10 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount, inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount; //recv_offset = ((inter_rank + 1) % inter_comm_size) * NUM_CORE * sextent * scount; //i=inter_comm_size-2; - MPI_Wait(&rrequest_array[i], &status); + smpi_mpi_wait(&rrequest_array[i], &status); if (num_core_in_current_smp > 1) { - MPI_Isend((char *) rbuf + recv_offset, scount * NUM_CORE, stype, - (rank + 1), tag + i + 1, comm, &request); + request = smpi_mpi_isend((char *) rbuf + recv_offset, scount * NUM_CORE, stype, + (rank + 1), tag + i + 1, comm); } } // last rank of each SMP @@ -116,9 +117,9 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount, recv_offset = ((inter_rank - i - 1 + inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount; - MPI_Irecv((char *) rbuf + recv_offset, (rcount * NUM_CORE), rtype, - rank - 1, tag + i + 1, comm, &request); - MPI_Wait(&request, &status); + request = smpi_mpi_irecv((char *) rbuf + recv_offset, (rcount * NUM_CORE), rtype, + rank - 1, tag + i + 1, comm); + smpi_mpi_wait(&request, &status); } } // intermediate rank of each SMP @@ -127,11 +128,11 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount, recv_offset = ((inter_rank - i - 1 + inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount; - MPI_Irecv((char *) rbuf + recv_offset, (rcount * NUM_CORE), rtype, - rank - 1, tag + i + 1, comm, &request); - MPI_Wait(&request, &status); - MPI_Isend((char *) rbuf + recv_offset, (scount * NUM_CORE), stype, - (rank + 1), tag + i + 1, comm, &request); + request = smpi_mpi_irecv((char *) rbuf + recv_offset, (rcount * NUM_CORE), rtype, + rank - 1, tag + i + 1, comm); + smpi_mpi_wait(&request, &status); + request = smpi_mpi_isend((char *) rbuf + recv_offset, (scount * NUM_CORE), stype, + (rank + 1), tag + i + 1, comm); } } diff --git a/src/smpi/colls/allgather-SMP-simple.c b/src/smpi/colls/allgather-SMP-simple.c deleted file mode 100644 index c8f0c68d6b..0000000000 --- a/src/smpi/colls/allgather-SMP-simple.c +++ /dev/null @@ -1,109 +0,0 @@ -#include "colls.h" -#ifndef NUM_CORE -#define NUM_CORE 8 -#endif - -int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount, - MPI_Datatype stype, void *recv_buf, - int rcount, MPI_Datatype rtype, - MPI_Comm comm) -{ - int src, dst, comm_size, rank; - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); - MPI_Aint rextent, sextent; - MPI_Type_extent(rtype, &rextent); - MPI_Type_extent(stype, &sextent); - int tag = 50; - MPI_Status status; - int i, send_offset, recv_offset; - int intra_rank, inter_rank; - int num_core = NUM_CORE; - intra_rank = rank % num_core; - inter_rank = rank / num_core; - int inter_comm_size = (comm_size + num_core - 1) / num_core; - int num_core_in_current_smp = num_core; - - // the last SMP node may have fewer number of running processes than all others - if (inter_rank == (inter_comm_size - 1)) { - num_core_in_current_smp = comm_size - (inter_rank * num_core); - } - //INTRA-SMP-ALLGATHER - recv_offset = rank * rextent * rcount; - MPI_Sendrecv(send_buf, scount, stype, rank, tag, - ((char *) recv_buf + recv_offset), rcount, rtype, rank, tag, - comm, &status); - for (i = 1; i < num_core_in_current_smp; i++) { - - dst = - (inter_rank * num_core) + (intra_rank + i) % (num_core_in_current_smp); - src = - (inter_rank * num_core) + (intra_rank - i + - num_core_in_current_smp) % - (num_core_in_current_smp); - recv_offset = src * rextent * rcount; - - MPI_Sendrecv(send_buf, scount, stype, dst, tag, - ((char *) recv_buf + recv_offset), rcount, rtype, src, tag, - comm, &status); - - } - - // INTER-SMP-ALLGATHER - // Every root of each SMP node post INTER-Sendrecv, then do INTRA-Bcast for each receiving message - - - - if (intra_rank == 0) { - MPI_Request *reqs, *req_ptr; - int num_req = (inter_comm_size - 1) * 2; - reqs = (MPI_Request *) malloc(num_req * sizeof(MPI_Request)); - req_ptr = reqs; - MPI_Status *stat; - stat = (MPI_Status *) malloc(num_req * sizeof(MPI_Status)); - - for (i = 1; i < inter_comm_size; i++) { - - //dst = ((inter_rank+i)%inter_comm_size) * num_core; - src = ((inter_rank - i + inter_comm_size) % inter_comm_size) * num_core; - //send_offset = (rank * sextent * scount); - recv_offset = (src * sextent * scount); - // MPI_Sendrecv((recv_buf+send_offset), (scount * num_core), stype, dst, tag, - // (recv_buf+recv_offset), (rcount * num_core), rtype, src, tag, comm, &status); - //MPIC_Isend((recv_buf+send_offset), (scount * num_core), stype, dst, tag, comm, req_ptr++); - MPI_Irecv(((char *) recv_buf + recv_offset), (rcount * num_core), rtype, - src, tag, comm, req_ptr++); - } - for (i = 1; i < inter_comm_size; i++) { - - dst = ((inter_rank + i) % inter_comm_size) * num_core; - //src = ((inter_rank-i+inter_comm_size)%inter_comm_size) * num_core; - send_offset = (rank * sextent * scount); - //recv_offset = (src * sextent * scount); - // MPI_Sendrecv((recv_buf+send_offset), (scount * num_core), stype, dst, tag, - // (recv_buf+recv_offset), (rcount * num_core), rtype, src, tag, comm, &status); - MPI_Isend(((char *) recv_buf + send_offset), (scount * num_core), stype, - dst, tag, comm, req_ptr++); - //MPIC_Irecv((recv_buf+recv_offset), (rcount * num_core), rtype, src, tag, comm, req_ptr++); - } - MPI_Waitall(num_req, reqs, stat); - free(reqs); - free(stat); - - } - //INTRA-BCAST (use flat tree) - - if (intra_rank == 0) { - for (i = 1; i < num_core_in_current_smp; i++) { - //printf("rank = %d, num = %d send to %d\n",rank, num_core_in_current_smp, (rank + i)); - MPI_Send(recv_buf, (scount * comm_size), stype, (rank + i), tag, comm); - } - } else { - //printf("rank = %d recv from %d\n",rank, (inter_rank * num_core)); - MPI_Recv(recv_buf, (rcount * comm_size), rtype, (inter_rank * num_core), - tag, comm, &status); - } - - - return MPI_SUCCESS; -} diff --git a/src/smpi/colls/allgather-bruck.c b/src/smpi/colls/allgather-bruck.c index 29bb9cba48..681690a63b 100644 --- a/src/smpi/colls/allgather-bruck.c +++ b/src/smpi/colls/allgather-bruck.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -71,10 +71,9 @@ int smpi_coll_tuned_allgather_bruck(void *send_buff, int send_count, MPI_Aint recv_extent; // local int variables - int i, src, dst, rank, num_procs, count, remainder; + int src, dst, rank, num_procs, count, remainder; int tag = 1; int pof2 = 1; - int success = 0; // local string variables char *tmp_buff; @@ -82,29 +81,24 @@ int smpi_coll_tuned_allgather_bruck(void *send_buff, int send_count, char *recv_ptr = (char *) recv_buff; // get size of the communicator, followed by rank - MPI_Comm_size(comm, &num_procs); - MPI_Comm_rank(comm, &rank); + num_procs = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); // get size of single element's type for recv buffer - MPI_Type_extent(recv_type, &recv_extent); + recv_extent = smpi_datatype_get_extent(recv_type); count = recv_count; - tmp_buff = (char *) malloc(num_procs * recv_count * recv_extent); - if (!tmp_buff) { - printf("allgather-bruck:54: cannot allocate memory\n"); - MPI_Finalize(); - exit(0); - } - // perform a local copy - MPIR_Localcopy(send_ptr, send_count, send_type, tmp_buff, recv_count, - recv_type); + tmp_buff = (char *) xbt_malloc(num_procs * recv_count * recv_extent); + // perform a local copy + smpi_datatype_copy(send_ptr, send_count, send_type, + tmp_buff, recv_count, recv_type); while (pof2 <= (num_procs / 2)) { src = (rank + pof2) % num_procs; dst = (rank - pof2 + num_procs) % num_procs; - MPIC_Sendrecv(tmp_buff, count, recv_type, dst, tag, + smpi_mpi_sendrecv(tmp_buff, count, recv_type, dst, tag, tmp_buff + count * recv_extent, count, recv_type, src, tag, comm, &status); count *= 2; @@ -116,76 +110,20 @@ int smpi_coll_tuned_allgather_bruck(void *send_buff, int send_count, src = (rank + pof2) % num_procs; dst = (rank - pof2 + num_procs) % num_procs; - MPIC_Sendrecv(tmp_buff, remainder * recv_count, recv_type, dst, tag, + smpi_mpi_sendrecv(tmp_buff, remainder * recv_count, recv_type, dst, tag, tmp_buff + count * recv_extent, remainder * recv_count, recv_type, src, tag, comm, &status); } - MPIC_Sendrecv(tmp_buff, (num_procs - rank) * recv_count, recv_type, rank, + smpi_mpi_sendrecv(tmp_buff, (num_procs - rank) * recv_count, recv_type, rank, tag, recv_ptr + rank * recv_count * recv_extent, (num_procs - rank) * recv_count, recv_type, rank, tag, comm, &status); if (rank) - MPIC_Sendrecv(tmp_buff + (num_procs - rank) * recv_count * recv_extent, + smpi_mpi_sendrecv(tmp_buff + (num_procs - rank) * recv_count * recv_extent, rank * recv_count, recv_type, rank, tag, recv_ptr, rank * recv_count, recv_type, rank, tag, comm, &status); free(tmp_buff); - return success; -} - -/*#include "ompi_bindings.h" - -int ompi_coll_tuned_alltoall_intra_pairwise(void *sbuf, int scount, - MPI_Datatype sdtype, - void* rbuf, int rcount, - MPI_Datatype rdtype, - MPI_Comm comm) -{ - int line = -1, err = 0; - int rank, size, step; - int sendto, recvfrom; - void * tmpsend, *tmprecv; - ptrdiff_t lb, sext, rext; - - size = ompi_comm_size(comm); - rank = ompi_comm_rank(comm); - - OPAL_OUTPUT((ompi_coll_tuned_stream, - "coll:tuned:alltoall_intra_pairwise rank %d", rank)); - - err = ompi_datatype_get_extent (sdtype, &lb, &sext); - if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } - err = ompi_datatype_get_extent (rdtype, &lb, &rext); - if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } - - - // Perform pairwise exchange - starting from 1 so the local copy is last - for (step = 1; step < size + 1; step++) { - - // Determine sender and receiver for this step. - sendto = (rank + step) % size; - recvfrom = (rank + size - step) % size; - - // Determine sending and receiving locations - tmpsend = (char*)sbuf + sendto * sext * scount; - tmprecv = (char*)rbuf + recvfrom * rext * rcount; - - // send and receive - err = ompi_coll_tuned_sendrecv( tmpsend, scount, sdtype, sendto, - MCA_COLL_BASE_TAG_ALLTOALL, - tmprecv, rcount, rdtype, recvfrom, - MCA_COLL_BASE_TAG_ALLTOALL, - comm, MPI_STATUS_IGNORE, rank); - if (err != MPI_SUCCESS) { line = __LINE__; goto err_hndl; } - } - - return MPI_SUCCESS; - - err_hndl: - OPAL_OUTPUT((ompi_coll_tuned_stream, - "%s:%4d\tError occurred %d, rank %2d", __FILE__, line, - err, rank)); - return err; + return MPI_SUCCESS; } -*/ diff --git a/src/smpi/colls/allgather-loosely-lr.c b/src/smpi/colls/allgather-loosely-lr.c index 2074e2f820..6455db135a 100644 --- a/src/smpi/colls/allgather-loosely-lr.c +++ b/src/smpi/colls/allgather-loosely-lr.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #ifndef NUM_CORE #define NUM_CORE 4 @@ -15,11 +15,11 @@ int smpi_coll_tuned_allgather_loosely_lr(void *sbuf, int scount, int intra_rank, inter_rank, inter_comm_size, intra_comm_size; int inter_dst, inter_src; - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); MPI_Aint rextent, sextent; - MPI_Type_extent(rtype, &rextent); - MPI_Type_extent(stype, &sextent); + rextent = smpi_datatype_get_extent(rtype); + sextent = smpi_datatype_get_extent(stype); MPI_Request inter_rrequest; MPI_Request rrequest_array[128]; MPI_Request srequest_array[128]; @@ -41,7 +41,7 @@ int smpi_coll_tuned_allgather_loosely_lr(void *sbuf, int scount, //copy corresponding message from sbuf to rbuf recv_offset = rank * rextent * rcount; - MPI_Sendrecv(sbuf, scount, stype, rank, tag, + smpi_mpi_sendrecv(sbuf, scount, stype, rank, tag, (char *)rbuf + recv_offset, rcount, rtype, rank, tag, comm, &status); int dst, src; @@ -74,11 +74,10 @@ int smpi_coll_tuned_allgather_loosely_lr(void *sbuf, int scount, if (intra_rank == j) { if (i != inter_comm_size - 1) { - MPI_Irecv((char *)rbuf + inter_recv_offset, rcount, rtype, inter_src, tag, - comm, &inter_rrequest); - MPI_Isend((char *)rbuf + inter_send_offset, scount, stype, inter_dst, tag, - comm, &inter_srequest_array[inter_srequest_count++]); - + inter_rrequest = smpi_mpi_irecv((char *)rbuf + inter_recv_offset, rcount, rtype, + inter_src, tag, comm); + inter_srequest_array[inter_srequest_count++] = smpi_mpi_isend((char *)rbuf + inter_send_offset, scount, stype, + inter_dst, tag, comm); } } //intra_communication @@ -98,10 +97,8 @@ int smpi_coll_tuned_allgather_loosely_lr(void *sbuf, int scount, if (j != intra_rank) { - MPI_Irecv((char *)rbuf + recv_offset, rcount, rtype, src, tag, comm, - &rrequest_array[rrequest_count++]); - MPI_Isend((char *)rbuf + send_offset, scount, stype, dst, tag, comm, - &srequest_array[srequest_count++]); + rrequest_array[rrequest_count++] = smpi_mpi_irecv((char *)rbuf + recv_offset, rcount, rtype, src, tag, comm); + srequest_array[srequest_count++] = smpi_mpi_isend((char *)rbuf + send_offset, scount, stype, dst, tag, comm); } } // intra loop @@ -109,14 +106,14 @@ int smpi_coll_tuned_allgather_loosely_lr(void *sbuf, int scount, // wait for inter communication to finish for these rounds (# of round equals NUM_CORE) if (i != inter_comm_size - 1) { - MPI_Wait(&inter_rrequest, &status); + smpi_mpi_wait(&inter_rrequest, &status); } } //inter loop - MPI_Waitall(rrequest_count, rrequest_array, MPI_STATUSES_IGNORE); - MPI_Waitall(srequest_count, srequest_array, MPI_STATUSES_IGNORE); - MPI_Waitall(inter_srequest_count, inter_srequest_array, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(rrequest_count, rrequest_array, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(srequest_count, srequest_array, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(inter_srequest_count, inter_srequest_array, MPI_STATUSES_IGNORE); return MPI_SUCCESS; } diff --git a/src/smpi/colls/allgather-lr.c b/src/smpi/colls/allgather-lr.c index 407cc25755..7656069702 100644 --- a/src/smpi/colls/allgather-lr.c +++ b/src/smpi/colls/allgather-lr.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" // Allgather-Non-Topoloty-Scecific-Logical-Ring algorithm int @@ -12,14 +12,17 @@ smpi_coll_tuned_allgather_lr(void *sbuf, int scount, MPI_Datatype stype, int send_offset, recv_offset; int tag = 500; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &size); - MPI_Type_extent(rtype, &rextent); - MPI_Type_extent(stype, &sextent); + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + rextent = smpi_datatype_get_extent(rtype); + sextent = smpi_datatype_get_extent(stype); // irregular case use default MPI fucntions - if (scount * sextent != rcount * rextent) - MPI_Allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm); + if (scount * sextent != rcount * rextent) { + XBT_WARN("MPI_allgather_lr use default MPI_allgather."); + smpi_mpi_allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm); + return MPI_SUCCESS; + } // topo non-specific to = (rank + 1) % size; @@ -27,7 +30,7 @@ smpi_coll_tuned_allgather_lr(void *sbuf, int scount, MPI_Datatype stype, //copy a single segment from sbuf to rbuf send_offset = rank * scount * sextent; - MPI_Sendrecv(sbuf, scount, stype, rank, tag, + smpi_mpi_sendrecv(sbuf, scount, stype, rank, tag, (char *) rbuf + send_offset, rcount, rtype, rank, tag, comm, &status); @@ -36,7 +39,7 @@ smpi_coll_tuned_allgather_lr(void *sbuf, int scount, MPI_Datatype stype, for (i = 0; i < size - 1; i++) { send_offset = ((rank - i + size) % size) * increment; recv_offset = ((rank - i - 1 + size) % size) * increment; - MPI_Sendrecv((char *) rbuf + send_offset, scount, stype, to, tag + i, + smpi_mpi_sendrecv((char *) rbuf + send_offset, scount, stype, to, tag + i, (char *) rbuf + recv_offset, rcount, rtype, from, tag + i, comm, &status); } diff --git a/src/smpi/colls/allgather-ompi-neighborexchange.c b/src/smpi/colls/allgather-ompi-neighborexchange.c new file mode 100644 index 0000000000..238163ebaf --- /dev/null +++ b/src/smpi/colls/allgather-ompi-neighborexchange.c @@ -0,0 +1,175 @@ +/* + * ompi_coll_tuned_allgather_intra_neighborexchange + * + * Function: allgather using N/2 steps (O(N)) + * Accepts: Same arguments as MPI_Allgather + * Returns: MPI_SUCCESS or error code + * + * Description: Neighbor Exchange algorithm for allgather. + * Described by Chen et.al. in + * "Performance Evaluation of Allgather Algorithms on + * Terascale Linux Cluster with Fast Ethernet", + * Proceedings of the Eighth International Conference on + * High-Performance Computing inn Asia-Pacific Region + * (HPCASIA'05), 2005 + * + * Rank r exchanges message with one of its neighbors and + * forwards the data further in the next step. + * + * No additional memory requirements. + * + * Limitations: Algorithm works only on even number of processes. + * For odd number of processes we switch to ring algorithm. + * + * Example on 6 nodes: + * Initial state + * # 0 1 2 3 4 5 + * [0] [ ] [ ] [ ] [ ] [ ] + * [ ] [1] [ ] [ ] [ ] [ ] + * [ ] [ ] [2] [ ] [ ] [ ] + * [ ] [ ] [ ] [3] [ ] [ ] + * [ ] [ ] [ ] [ ] [4] [ ] + * [ ] [ ] [ ] [ ] [ ] [5] + * Step 0: + * # 0 1 2 3 4 5 + * [0] [0] [ ] [ ] [ ] [ ] + * [1] [1] [ ] [ ] [ ] [ ] + * [ ] [ ] [2] [2] [ ] [ ] + * [ ] [ ] [3] [3] [ ] [ ] + * [ ] [ ] [ ] [ ] [4] [4] + * [ ] [ ] [ ] [ ] [5] [5] + * Step 1: + * # 0 1 2 3 4 5 + * [0] [0] [0] [ ] [ ] [0] + * [1] [1] [1] [ ] [ ] [1] + * [ ] [2] [2] [2] [2] [ ] + * [ ] [3] [3] [3] [3] [ ] + * [4] [ ] [ ] [4] [4] [4] + * [5] [ ] [ ] [5] [5] [5] + * Step 2: + * # 0 1 2 3 4 5 + * [0] [0] [0] [0] [0] [0] + * [1] [1] [1] [1] [1] [1] + * [2] [2] [2] [2] [2] [2] + * [3] [3] [3] [3] [3] [3] + * [4] [4] [4] [4] [4] [4] + * [5] [5] [5] [5] [5] [5] + */ + + #include "colls_private.h" + #define MCA_COLL_BASE_TAG_ALLGATHER 555 +int +smpi_coll_tuned_allgather_ompi_neighborexchange(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int rcount, + MPI_Datatype rdtype, + MPI_Comm comm +) +{ + int line = -1; + int rank, size; + int neighbor[2], offset_at_step[2], recv_data_from[2], send_data_from; + int i, even_rank; + int err = 0; + ptrdiff_t slb, rlb, sext, rext; + char *tmpsend = NULL, *tmprecv = NULL; + + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + if (size % 2) { + XBT_DEBUG( + "coll:tuned:allgather_intra_neighborexchange WARNING: odd size %d, switching to ring algorithm", + size); + return smpi_coll_tuned_allgather_ring(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } + + XBT_DEBUG( + "coll:tuned:allgather_intra_neighborexchange rank %d", rank); + + err = smpi_datatype_extent (sdtype, &slb, &sext); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + err = smpi_datatype_extent (rdtype, &rlb, &rext); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + /* Initialization step: + - if send buffer is not MPI_IN_PLACE, copy send buffer to appropriate block + of receive buffer + */ + tmprecv = (char*) rbuf + rank * rcount * rext; + if (MPI_IN_PLACE != sbuf) { + tmpsend = (char*) sbuf; + smpi_datatype_copy (tmpsend, scount, sdtype, tmprecv, rcount, rdtype); + } + + /* Determine neighbors, order in which blocks will arrive, etc. */ + even_rank = !(rank % 2); + if (even_rank) { + neighbor[0] = (rank + 1) % size; + neighbor[1] = (rank - 1 + size) % size; + recv_data_from[0] = rank; + recv_data_from[1] = rank; + offset_at_step[0] = (+2); + offset_at_step[1] = (-2); + } else { + neighbor[0] = (rank - 1 + size) % size; + neighbor[1] = (rank + 1) % size; + recv_data_from[0] = neighbor[0]; + recv_data_from[1] = neighbor[0]; + offset_at_step[0] = (-2); + offset_at_step[1] = (+2); + } + + /* Communication loop: + - First step is special: exchange a single block with neighbor[0]. + - Rest of the steps: + update recv_data_from according to offset, and + exchange two blocks with appropriate neighbor. + the send location becomes previous receve location. + */ + tmprecv = (char*)rbuf + neighbor[0] * rcount * rext; + tmpsend = (char*)rbuf + rank * rcount * rext; + /* Sendreceive */ + smpi_mpi_sendrecv(tmpsend, rcount, rdtype, neighbor[0], + MCA_COLL_BASE_TAG_ALLGATHER, + tmprecv, rcount, rdtype, neighbor[0], + MCA_COLL_BASE_TAG_ALLGATHER, + comm, MPI_STATUS_IGNORE); + + /* Determine initial sending location */ + if (even_rank) { + send_data_from = rank; + } else { + send_data_from = recv_data_from[0]; + } + + for (i = 1; i < (size / 2); i++) { + const int i_parity = i % 2; + recv_data_from[i_parity] = + (recv_data_from[i_parity] + offset_at_step[i_parity] + size) % size; + + tmprecv = (char*)rbuf + recv_data_from[i_parity] * rcount * rext; + tmpsend = (char*)rbuf + send_data_from * rcount * rext; + + /* Sendreceive */ + smpi_mpi_sendrecv(tmpsend, 2 * rcount, rdtype, + neighbor[i_parity], + MCA_COLL_BASE_TAG_ALLGATHER, + tmprecv, 2 * rcount, rdtype, + neighbor[i_parity], + MCA_COLL_BASE_TAG_ALLGATHER, + comm, MPI_STATUS_IGNORE); + + send_data_from = recv_data_from[i_parity]; + } + + return MPI_SUCCESS; + + err_hndl: + XBT_DEBUG( "%s:%4d\tError occurred %d, rank %2d", + __FILE__, line, err, rank); + return err; +} diff --git a/src/smpi/colls/allgather-pair.c b/src/smpi/colls/allgather-pair.c index a113ea9541..0dc4aec3c3 100644 --- a/src/smpi/colls/allgather-pair.c +++ b/src/smpi/colls/allgather-pair.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -73,18 +73,18 @@ smpi_coll_tuned_allgather_pair(void *send_buff, int send_count, char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &extent); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(send_type); // local send/recv - MPI_Sendrecv(send_ptr, send_count, send_type, rank, tag, + smpi_mpi_sendrecv(send_ptr, send_count, send_type, rank, tag, recv_ptr + rank * recv_count * extent, recv_count, recv_type, rank, tag, comm, &status); for (i = 1; i < num_procs; i++) { src = dst = rank ^ i; - MPI_Sendrecv(send_ptr, send_count, send_type, dst, tag, + smpi_mpi_sendrecv(send_ptr, send_count, send_type, dst, tag, recv_ptr + src * recv_count * extent, recv_count, recv_type, src, tag, comm, &status); } diff --git a/src/smpi/colls/allgather-rdb.c b/src/smpi/colls/allgather-rdb.c index fc1b36d621..520819a5f9 100644 --- a/src/smpi/colls/allgather-rdb.c +++ b/src/smpi/colls/allgather-rdb.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" int smpi_coll_tuned_allgather_rdb(void *sbuf, int send_count, @@ -12,7 +12,7 @@ smpi_coll_tuned_allgather_rdb(void *sbuf, int send_count, // local int variables int i, j, k, dst, rank, num_procs, send_offset, recv_offset, tree_root; - int dst_tree_root, rank_tree_root, last_recv_count, num_procs_completed; + int dst_tree_root, rank_tree_root, last_recv_count = 0, num_procs_completed; int offset, tmp_mask; int tag = 1; int mask = 1; @@ -24,19 +24,19 @@ smpi_coll_tuned_allgather_rdb(void *sbuf, int send_count, char *recv_ptr = (char *) rbuf; // get size of the communicator, followed by rank - MPI_Comm_size(comm, &num_procs); - MPI_Comm_rank(comm, &rank); + num_procs = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); // get size of single element's type for send buffer and recv buffer - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); // multiply size of each element by number of elements to send or recv send_chunk *= send_count; recv_chunk *= recv_count; // perform a local copy - MPI_Sendrecv(send_ptr, send_count, send_type, rank, tag, + smpi_mpi_sendrecv(send_ptr, send_count, send_type, rank, tag, recv_ptr + rank * recv_chunk, recv_count, recv_type, rank, tag, comm, &status); @@ -51,10 +51,10 @@ smpi_coll_tuned_allgather_rdb(void *sbuf, int send_count, recv_offset = dst_tree_root * recv_chunk; if (dst < num_procs) { - MPI_Sendrecv(recv_ptr + send_offset, curr_count, send_type, dst, + smpi_mpi_sendrecv(recv_ptr + send_offset, curr_count, send_type, dst, tag, recv_ptr + recv_offset, mask * recv_count, recv_type, dst, tag, comm, &status); - MPI_Get_count(&status, recv_type, &last_recv_count); + last_recv_count = smpi_mpi_get_count(&status, recv_type); curr_count += last_recv_count; } @@ -90,7 +90,7 @@ smpi_coll_tuned_allgather_rdb(void *sbuf, int send_count, if ((dst > rank) && (rank < tree_root + num_procs_completed) && (dst >= tree_root + num_procs_completed)) { - MPI_Send(recv_ptr + offset, last_recv_count, recv_type, dst, + smpi_mpi_send(recv_ptr + offset, last_recv_count, recv_type, dst, tag, comm); /* last_recv_cnt was set in the previous @@ -102,12 +102,12 @@ smpi_coll_tuned_allgather_rdb(void *sbuf, int send_count, else if ((dst < rank) && (dst < tree_root + num_procs_completed) && (rank >= tree_root + num_procs_completed)) { - MPI_Recv(recv_ptr + offset, + smpi_mpi_recv(recv_ptr + offset, recv_count * num_procs_completed, recv_type, dst, tag, comm, &status); // num_procs_completed is also equal to the no. of processes // whose data we don't have - MPI_Get_count(&status, recv_type, &last_recv_count); + last_recv_count = smpi_mpi_get_count(&status, recv_type); curr_count += last_recv_count; } tmp_mask >>= 1; diff --git a/src/smpi/colls/allgather-rhv.c b/src/smpi/colls/allgather-rhv.c index dab0e6ee64..c3db821070 100644 --- a/src/smpi/colls/allgather-rhv.c +++ b/src/smpi/colls/allgather-rhv.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" // now only work with power of two processes @@ -20,20 +20,23 @@ smpi_coll_tuned_allgather_rhv(void *sbuf, int send_count, int curr_count; // get size of the communicator, followed by rank - MPI_Comm_size(comm, &num_procs); - MPI_Comm_rank(comm, &rank); + num_procs = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); // get size of single element's type for send buffer and recv buffer - MPI_Type_extent(send_type, &s_extent); - MPI_Type_extent(recv_type, &r_extent); + s_extent = smpi_datatype_get_extent(send_type); + r_extent = smpi_datatype_get_extent(recv_type); // multiply size of each element by number of elements to send or recv send_chunk = s_extent * send_count; recv_chunk = r_extent * recv_count; - if (send_chunk != recv_chunk) - return MPI_Allgather(sbuf, send_count, send_type, rbuf, recv_count, - recv_type, comm); + if (send_chunk != recv_chunk) { + XBT_WARN("MPI_allgather_rhv use default MPI_allgather."); + smpi_mpi_allgather(sbuf, send_count, send_type, rbuf, recv_count, + recv_type, comm); + return MPI_SUCCESS; + } // compute starting offset location to perform local copy int size = num_procs / 2; @@ -52,7 +55,7 @@ smpi_coll_tuned_allgather_rhv(void *sbuf, int send_count, //perform a remote copy dst = base_offset; - MPI_Sendrecv(sbuf, send_count, send_type, dst, tag, + smpi_mpi_sendrecv(sbuf, send_count, send_type, dst, tag, (char *)rbuf + base_offset * recv_chunk, recv_count, recv_type, dst, tag, comm, &status); @@ -78,7 +81,7 @@ smpi_coll_tuned_allgather_rhv(void *sbuf, int send_count, // printf("node %d send to %d in phase %d s_offset = %d r_offset = %d count = %d\n",rank,dst,phase, send_base_offset, recv_base_offset, curr_count); - MPI_Sendrecv((char *)rbuf + send_offset, curr_count, recv_type, dst, tag, + smpi_mpi_sendrecv((char *)rbuf + send_offset, curr_count, recv_type, dst, tag, (char *)rbuf + recv_offset, curr_count, recv_type, dst, tag, comm, &status); diff --git a/src/smpi/colls/allgather-ring.c b/src/smpi/colls/allgather-ring.c index 9e143ded7b..6108ae5be8 100644 --- a/src/smpi/colls/allgather-ring.c +++ b/src/smpi/colls/allgather-ring.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -72,19 +72,19 @@ smpi_coll_tuned_allgather_ring(void *send_buff, int send_count, char *sendptr = (char *) send_buff; char *recvptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &extent); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(send_type); // local send/recv - MPI_Sendrecv(sendptr, send_count, send_type, rank, tag, + smpi_mpi_sendrecv(sendptr, send_count, send_type, rank, tag, recvptr + rank * recv_count * extent, recv_count, recv_type, rank, tag, comm, &status); for (i = 1; i < num_procs; i++) { src = (rank - i + num_procs) % num_procs; dst = (rank + i) % num_procs; - MPI_Sendrecv(sendptr, send_count, send_type, dst, tag, + smpi_mpi_sendrecv(sendptr, send_count, send_type, dst, tag, recvptr + src * recv_count * extent, recv_count, recv_type, src, tag, comm, &status); } diff --git a/src/smpi/colls/allgather-smp-simple.c b/src/smpi/colls/allgather-smp-simple.c index c8f0c68d6b..21cab26034 100644 --- a/src/smpi/colls/allgather-smp-simple.c +++ b/src/smpi/colls/allgather-smp-simple.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #ifndef NUM_CORE #define NUM_CORE 8 #endif @@ -9,11 +9,11 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount, MPI_Comm comm) { int src, dst, comm_size, rank; - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); MPI_Aint rextent, sextent; - MPI_Type_extent(rtype, &rextent); - MPI_Type_extent(stype, &sextent); + rextent = smpi_datatype_get_extent(rtype); + sextent = smpi_datatype_get_extent(stype); int tag = 50; MPI_Status status; int i, send_offset, recv_offset; @@ -30,7 +30,7 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount, } //INTRA-SMP-ALLGATHER recv_offset = rank * rextent * rcount; - MPI_Sendrecv(send_buf, scount, stype, rank, tag, + smpi_mpi_sendrecv(send_buf, scount, stype, rank, tag, ((char *) recv_buf + recv_offset), rcount, rtype, rank, tag, comm, &status); for (i = 1; i < num_core_in_current_smp; i++) { @@ -43,7 +43,7 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount, (num_core_in_current_smp); recv_offset = src * rextent * rcount; - MPI_Sendrecv(send_buf, scount, stype, dst, tag, + smpi_mpi_sendrecv(send_buf, scount, stype, dst, tag, ((char *) recv_buf + recv_offset), rcount, rtype, src, tag, comm, &status); @@ -57,10 +57,10 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount, if (intra_rank == 0) { MPI_Request *reqs, *req_ptr; int num_req = (inter_comm_size - 1) * 2; - reqs = (MPI_Request *) malloc(num_req * sizeof(MPI_Request)); + reqs = (MPI_Request *) xbt_malloc(num_req * sizeof(MPI_Request)); req_ptr = reqs; MPI_Status *stat; - stat = (MPI_Status *) malloc(num_req * sizeof(MPI_Status)); + stat = (MPI_Status *) xbt_malloc(num_req * sizeof(MPI_Status)); for (i = 1; i < inter_comm_size; i++) { @@ -68,11 +68,11 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount, src = ((inter_rank - i + inter_comm_size) % inter_comm_size) * num_core; //send_offset = (rank * sextent * scount); recv_offset = (src * sextent * scount); - // MPI_Sendrecv((recv_buf+send_offset), (scount * num_core), stype, dst, tag, + // smpi_mpi_sendrecv((recv_buf+send_offset), (scount * num_core), stype, dst, tag, // (recv_buf+recv_offset), (rcount * num_core), rtype, src, tag, comm, &status); //MPIC_Isend((recv_buf+send_offset), (scount * num_core), stype, dst, tag, comm, req_ptr++); - MPI_Irecv(((char *) recv_buf + recv_offset), (rcount * num_core), rtype, - src, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv(((char *) recv_buf + recv_offset), (rcount * num_core), rtype, + src, tag, comm); } for (i = 1; i < inter_comm_size; i++) { @@ -80,13 +80,13 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount, //src = ((inter_rank-i+inter_comm_size)%inter_comm_size) * num_core; send_offset = (rank * sextent * scount); //recv_offset = (src * sextent * scount); - // MPI_Sendrecv((recv_buf+send_offset), (scount * num_core), stype, dst, tag, + // smpi_mpi_sendrecv((recv_buf+send_offset), (scount * num_core), stype, dst, tag, // (recv_buf+recv_offset), (rcount * num_core), rtype, src, tag, comm, &status); - MPI_Isend(((char *) recv_buf + send_offset), (scount * num_core), stype, - dst, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_isend(((char *) recv_buf + send_offset), (scount * num_core), stype, + dst, tag, comm); //MPIC_Irecv((recv_buf+recv_offset), (rcount * num_core), rtype, src, tag, comm, req_ptr++); } - MPI_Waitall(num_req, reqs, stat); + smpi_mpi_waitall(num_req, reqs, stat); free(reqs); free(stat); @@ -96,11 +96,11 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount, if (intra_rank == 0) { for (i = 1; i < num_core_in_current_smp; i++) { //printf("rank = %d, num = %d send to %d\n",rank, num_core_in_current_smp, (rank + i)); - MPI_Send(recv_buf, (scount * comm_size), stype, (rank + i), tag, comm); + smpi_mpi_send(recv_buf, (scount * comm_size), stype, (rank + i), tag, comm); } } else { //printf("rank = %d recv from %d\n",rank, (inter_rank * num_core)); - MPI_Recv(recv_buf, (rcount * comm_size), rtype, (inter_rank * num_core), + smpi_mpi_recv(recv_buf, (rcount * comm_size), rtype, (inter_rank * num_core), tag, comm, &status); } diff --git a/src/smpi/colls/allgather-spreading-simple.c b/src/smpi/colls/allgather-spreading-simple.c index 3b109e4177..822ab5346d 100644 --- a/src/smpi/colls/allgather-spreading-simple.c +++ b/src/smpi/colls/allgather-spreading-simple.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -74,12 +74,12 @@ smpi_coll_tuned_allgather_spreading_simple(void *send_buff, int send_count, MPI_Status status; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &extent); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(send_type); num_reqs = (2 * num_procs) - 2; - reqs = (MPI_Request *) malloc(num_reqs * sizeof(MPI_Request)); + reqs = (MPI_Request *) xbt_malloc(num_reqs * sizeof(MPI_Request)); if (!reqs) { printf("allgather-spreading-simple.c:40: cannot allocate memory\n"); MPI_Finalize(); @@ -87,7 +87,7 @@ smpi_coll_tuned_allgather_spreading_simple(void *send_buff, int send_count, } req_ptr = reqs; - MPI_Sendrecv(send_buff, send_count, send_type, rank, tag, + smpi_mpi_sendrecv(send_buff, send_count, send_type, rank, tag, (char *) recv_buff + rank * recv_count * extent, recv_count, recv_type, rank, tag, comm, &status); @@ -95,18 +95,18 @@ smpi_coll_tuned_allgather_spreading_simple(void *send_buff, int send_count, src = (rank + i) % num_procs; if (src == rank) continue; - MPI_Irecv(recv_ptr + src * recv_count * extent, recv_count, recv_type, - src, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv(recv_ptr + src * recv_count * extent, recv_count, recv_type, + src, tag, comm); } for (i = 0; i < num_procs; i++) { dst = (rank + i) % num_procs; if (dst == rank) continue; - MPI_Isend(send_buff, send_count, send_type, dst, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_isend(send_buff, send_count, send_type, dst, tag, comm); } - MPI_Waitall(num_reqs, reqs, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(num_reqs, reqs, MPI_STATUSES_IGNORE); free(reqs); return MPI_SUCCESS; diff --git a/src/smpi/colls/allgatherv-GB.c b/src/smpi/colls/allgatherv-GB.c new file mode 100644 index 0000000000..2a60a47c09 --- /dev/null +++ b/src/smpi/colls/allgatherv-GB.c @@ -0,0 +1,21 @@ +#include "colls_private.h" + +// Allgather - gather/bcast algorithm +int smpi_coll_tuned_allgatherv_GB(void *send_buff, int send_count, + MPI_Datatype send_type, void *recv_buff, + int *recv_counts, int *recv_disps, MPI_Datatype recv_type, + MPI_Comm comm) +{ + smpi_mpi_gatherv(send_buff, send_count, send_type, recv_buff, recv_counts, + recv_disps, recv_type, 0, comm); + int num_procs, i, current, max = 0; + num_procs = smpi_comm_size(comm); + for (i = 0; i < num_procs; i++) { + current = recv_disps[i] + recv_counts[i]; + if (current > max) + max = current; + } + mpi_coll_bcast_fun(recv_buff, max, recv_type, 0, comm); + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/allgatherv-mpich-rdb.c b/src/smpi/colls/allgatherv-mpich-rdb.c new file mode 100644 index 0000000000..3a65b3058e --- /dev/null +++ b/src/smpi/colls/allgatherv-mpich-rdb.c @@ -0,0 +1,211 @@ + /* Short or medium size message and power-of-two no. of processes. Use + * recursive doubling algorithm */ +#include "colls_private.h" +#define MPIR_ALLGATHERV_TAG 222 +int smpi_coll_tuned_allgatherv_mpich_rdb ( + void *sendbuf, + int sendcount, + MPI_Datatype sendtype, + void *recvbuf, + int *recvcounts, + int *displs, + MPI_Datatype recvtype, + MPI_Comm comm) +{ + int comm_size, rank, j, i; + MPI_Status status; + MPI_Aint recvtype_extent, recvtype_true_extent, recvtype_true_lb; + int curr_cnt, dst, total_count; + void *tmp_buf; + int mask, dst_tree_root, my_tree_root, is_homogeneous, position, + send_offset, recv_offset, last_recv_cnt=0, nprocs_completed, k, + offset, tmp_mask, tree_root; + + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + total_count = 0; + for (i=0; i> i; + dst_tree_root <<= i; + + my_tree_root = rank >> i; + my_tree_root <<= i; + + if (dst < comm_size) { + send_offset = 0; + for (j=0; j comm_size) { + nprocs_completed = comm_size - my_tree_root - mask; + /* nprocs_completed is the number of processes in this + subtree that have all the data. Send data to others + in a tree fashion. First find root of current tree + that is being divided into two. k is the number of + least-significant bits in this process's rank that + must be zeroed out to find the rank of the root */ + j = mask; + k = 0; + while (j) { + j >>= 1; + k++; + } + k--; + + tmp_mask = mask >> 1; + + while (tmp_mask) { + dst = rank ^ tmp_mask; + + tree_root = rank >> k; + tree_root <<= k; + + /* send only if this proc has data and destination + doesn't have data. at any step, multiple processes + can send if they have the data */ + if ((dst > rank) && + (rank < tree_root + nprocs_completed) + && (dst >= tree_root + nprocs_completed)) { + + offset = 0; + for (j=0; j<(my_tree_root+mask); j++) + offset += recvcounts[j]; + offset *= recvtype_extent; + + smpi_mpi_send(((char *)tmp_buf + offset), + last_recv_cnt, + recvtype, dst, + MPIR_ALLGATHERV_TAG, comm); + /* last_recv_cnt was set in the previous + receive. that's the amount of data to be + sent now. */ + } + /* recv only if this proc. doesn't have data and sender + has data */ + else if ((dst < rank) && + (dst < tree_root + nprocs_completed) && + (rank >= tree_root + nprocs_completed)) { + + offset = 0; + for (j=0; j<(my_tree_root+mask); j++) + offset += recvcounts[j]; + + smpi_mpi_recv(((char *)tmp_buf + offset * recvtype_extent), + total_count - offset, recvtype, + dst, MPIR_ALLGATHERV_TAG, + comm, &status); + /* for convenience, recv is posted for a + bigger amount than will be sent */ + last_recv_cnt=smpi_mpi_get_count(&status, recvtype); + curr_cnt += last_recv_cnt; + } + tmp_mask >>= 1; + k--; + } + } + /* --END EXPERIMENTAL-- */ + + mask <<= 1; + i++; + } + + /* copy data from tmp_buf to recvbuf */ + position = 0; + for (j=0; j> 1)) { + blockcount = distance; + } else { + blockcount = size - distance; + } + + /* create send and receive datatypes */ + for (i = 0; i < blockcount; i++) { + const int tmp_srank = (rank + i) % size; + const int tmp_rrank = (recvfrom + i) % size; + new_scounts[i] = rcounts[tmp_srank]; + new_sdispls[i] = rdispls[tmp_srank]; + new_rcounts[i] = rcounts[tmp_rrank]; + new_rdispls[i] = rdispls[tmp_rrank]; + } + smpi_datatype_indexed(blockcount, new_scounts, new_sdispls, + rdtype, &new_sdtype); + smpi_datatype_indexed(blockcount, new_rcounts, new_rdispls, + rdtype, &new_rdtype); + + smpi_datatype_commit(&new_sdtype); + smpi_datatype_commit(&new_rdtype); + + /* Sendreceive */ + smpi_mpi_sendrecv(rbuf, 1, new_sdtype, sendto, + MCA_COLL_BASE_TAG_ALLGATHERV, + rbuf, 1, new_rdtype, recvfrom, + MCA_COLL_BASE_TAG_ALLGATHERV, + comm, MPI_STATUS_IGNORE); + smpi_datatype_free(&new_sdtype); + smpi_datatype_free(&new_rdtype); + + } + + free(new_rcounts); + + return MPI_SUCCESS; + +} + diff --git a/src/smpi/colls/allgatherv-ompi-neighborexchange.c b/src/smpi/colls/allgatherv-ompi-neighborexchange.c new file mode 100644 index 0000000000..f80e681f64 --- /dev/null +++ b/src/smpi/colls/allgatherv-ompi-neighborexchange.c @@ -0,0 +1,214 @@ + +/* + * ompi_coll_tuned_allgatherv_intra_neighborexchange + * + * Function: allgatherv using N/2 steps (O(N)) + * Accepts: Same arguments as MPI_Allgatherv + * Returns: MPI_SUCCESS or error code + * + * Description: Neighbor Exchange algorithm for allgather adapted for + * allgatherv. + * Described by Chen et.al. in + * "Performance Evaluation of Allgather Algorithms on + * Terascale Linux Cluster with Fast Ethernet", + * Proceedings of the Eighth International Conference on + * High-Performance Computing inn Asia-Pacific Region + * (HPCASIA'05), 2005 + * + * Rank r exchanges message with one of its neighbors and + * forwards the data further in the next step. + * + * No additional memory requirements. + * + * Limitations: Algorithm works only on even number of processes. + * For odd number of processes we switch to ring algorithm. + * + * Example on 6 nodes: + * Initial state + * # 0 1 2 3 4 5 + * [0] [ ] [ ] [ ] [ ] [ ] + * [ ] [1] [ ] [ ] [ ] [ ] + * [ ] [ ] [2] [ ] [ ] [ ] + * [ ] [ ] [ ] [3] [ ] [ ] + * [ ] [ ] [ ] [ ] [4] [ ] + * [ ] [ ] [ ] [ ] [ ] [5] + * Step 0: + * # 0 1 2 3 4 5 + * [0] [0] [ ] [ ] [ ] [ ] + * [1] [1] [ ] [ ] [ ] [ ] + * [ ] [ ] [2] [2] [ ] [ ] + * [ ] [ ] [3] [3] [ ] [ ] + * [ ] [ ] [ ] [ ] [4] [4] + * [ ] [ ] [ ] [ ] [5] [5] + * Step 1: + * # 0 1 2 3 4 5 + * [0] [0] [0] [ ] [ ] [0] + * [1] [1] [1] [ ] [ ] [1] + * [ ] [2] [2] [2] [2] [ ] + * [ ] [3] [3] [3] [3] [ ] + * [4] [ ] [ ] [4] [4] [4] + * [5] [ ] [ ] [5] [5] [5] + * Step 2: + * # 0 1 2 3 4 5 + * [0] [0] [0] [0] [0] [0] + * [1] [1] [1] [1] [1] [1] + * [2] [2] [2] [2] [2] [2] + * [3] [3] [3] [3] [3] [3] + * [4] [4] [4] [4] [4] [4] + * [5] [5] [5] [5] [5] [5] + */ + + #include "colls_private.h" + #define MCA_COLL_BASE_TAG_ALLGATHERV 444 + +int +smpi_coll_tuned_allgatherv_ompi_neighborexchange(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int *rcounts, int *rdispls, + MPI_Datatype rdtype, + MPI_Comm comm) +{ + int line = -1; + int rank, size; + int neighbor[2], offset_at_step[2], recv_data_from[2], send_data_from; + + int i, even_rank; + int err = 0; + ptrdiff_t slb, rlb, sext, rext; + char *tmpsend = NULL, *tmprecv = NULL; + + + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + if (size % 2) { + XBT_DEBUG( + "coll:tuned:allgatherv_ompi_neighborexchange WARNING: odd size %d, switching to ring algorithm", + size); + return smpi_coll_tuned_allgatherv_ring(sbuf, scount, sdtype, + rbuf, rcounts, + rdispls, rdtype, + comm); + } + + XBT_DEBUG( + "coll:tuned:allgatherv_ompi_neighborexchange rank %d", rank); + + err = smpi_datatype_extent (sdtype, &slb, &sext); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + err = smpi_datatype_extent (rdtype, &rlb, &rext); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + /* Initialization step: + - if send buffer is not MPI_IN_PLACE, copy send buffer to + the appropriate block of receive buffer + */ + tmprecv = (char*) rbuf + rdispls[rank] * rext; + if (MPI_IN_PLACE != sbuf) { + tmpsend = (char*) sbuf; + err = smpi_datatype_copy(tmpsend, scount, sdtype, + tmprecv, rcounts[rank], rdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + } + + /* Determine neighbors, order in which blocks will arrive, etc. */ + even_rank = !(rank % 2); + if (even_rank) { + neighbor[0] = (rank + 1) % size; + neighbor[1] = (rank - 1 + size) % size; + recv_data_from[0] = rank; + recv_data_from[1] = rank; + offset_at_step[0] = (+2); + offset_at_step[1] = (-2); + } else { + neighbor[0] = (rank - 1 + size) % size; + neighbor[1] = (rank + 1) % size; + recv_data_from[0] = neighbor[0]; + recv_data_from[1] = neighbor[0]; + offset_at_step[0] = (-2); + offset_at_step[1] = (+2); + } + + /* Communication loop: + - First step is special: exchange a single block with neighbor[0]. + - Rest of the steps: + update recv_data_from according to offset, and + exchange two blocks with appropriate neighbor. + the send location becomes previous receve location. + Note, we need to create indexed datatype to send and receive these + blocks properly. + */ + tmprecv = (char*)rbuf + rdispls[neighbor[0]] * rext; + tmpsend = (char*)rbuf + rdispls[rank] * rext; + smpi_mpi_sendrecv(tmpsend, rcounts[rank], rdtype, + neighbor[0], MCA_COLL_BASE_TAG_ALLGATHERV, + tmprecv, rcounts[neighbor[0]], rdtype, + neighbor[0], MCA_COLL_BASE_TAG_ALLGATHERV, + comm, MPI_STATUS_IGNORE); + + + + + + /* Determine initial sending counts and displacements*/ + if (even_rank) { + send_data_from = rank; + } else { + send_data_from = recv_data_from[0]; + } + + for (i = 1; i < (size / 2); i++) { + MPI_Datatype new_rdtype, new_sdtype; + int new_scounts[2], new_sdispls[2], new_rcounts[2], new_rdispls[2]; + const int i_parity = i % 2; + recv_data_from[i_parity] = + (recv_data_from[i_parity] + offset_at_step[i_parity] + size) % size; + + /* Create new indexed types for sending and receiving. + We are sending data from ranks (send_data_from) and (send_data_from+1) + We are receiving data from ranks (recv_data_from[i_parity]) and + (recv_data_from[i_parity]+1). + */ + + new_scounts[0] = rcounts[send_data_from]; + new_scounts[1] = rcounts[(send_data_from + 1)]; + new_sdispls[0] = rdispls[send_data_from]; + new_sdispls[1] = rdispls[(send_data_from + 1)]; + err = smpi_datatype_indexed(2, new_scounts, new_sdispls, rdtype, + &new_sdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + smpi_datatype_commit(&new_sdtype); + + new_rcounts[0] = rcounts[recv_data_from[i_parity]]; + new_rcounts[1] = rcounts[(recv_data_from[i_parity] + 1)]; + new_rdispls[0] = rdispls[recv_data_from[i_parity]]; + new_rdispls[1] = rdispls[(recv_data_from[i_parity] + 1)]; + err = smpi_datatype_indexed(2, new_rcounts, new_rdispls, rdtype, + &new_rdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + smpi_datatype_commit(&new_rdtype); + + tmprecv = (char*)rbuf; + tmpsend = (char*)rbuf; + + /* Sendreceive */ + smpi_mpi_sendrecv(tmpsend, 1, new_sdtype, neighbor[i_parity], + MCA_COLL_BASE_TAG_ALLGATHERV, + tmprecv, 1, new_rdtype, neighbor[i_parity], + MCA_COLL_BASE_TAG_ALLGATHERV, + comm, MPI_STATUS_IGNORE); + + send_data_from = recv_data_from[i_parity]; + + smpi_datatype_free(&new_sdtype); + smpi_datatype_free(&new_rdtype); + } + + return MPI_SUCCESS; + + err_hndl: + XBT_DEBUG( "%s:%4d\tError occurred %d, rank %2d", + __FILE__, line, err, rank); + return err; +} diff --git a/src/smpi/colls/allgatherv-pair.c b/src/smpi/colls/allgatherv-pair.c new file mode 100644 index 0000000000..d60e77a5ff --- /dev/null +++ b/src/smpi/colls/allgatherv-pair.c @@ -0,0 +1,92 @@ +#include "colls_private.h" + +/***************************************************************************** + +Copyright (c) 2006, Ahmad Faraj & Xin Yuan, +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the Florida State University nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ************************************************************************* + * Any results obtained from executing this software require the * + * acknowledgment and citation of the software and its owners. * + * The full citation is given below: * + * * + * A. Faraj and X. Yuan. "Automatic Generation and Tuning of MPI * + * Collective Communication Routines." The 19th ACM International * + * Conference on Supercomputing (ICS), Cambridge, Massachusetts, * + * June 20-22, 2005. * + ************************************************************************* + +*****************************************************************************/ + +/***************************************************************************** + * Function: allgather_pair + * return: int + * inputs: + * send_buff: send input buffer + * send_count: number of elements to send + * send_type: data type of elements being sent + * recv_buff: receive output buffer + * recv_count: number of elements to received + * recv_type: data type of elements being received + * comm: communication + * Descrp: Function works when P is power of two. In each phase of P - 1 + * phases, nodes in pair communicate their data. + * Auther: Ahmad Faraj + ****************************************************************************/ +int +smpi_coll_tuned_allgatherv_pair(void *send_buff, int send_count, + MPI_Datatype send_type, void *recv_buff, + int *recv_counts, int *recv_disps, MPI_Datatype recv_type, + MPI_Comm comm) +{ + + MPI_Aint extent; + int i, src, dst, rank, num_procs; + int tag = 1; + MPI_Status status; + + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(send_type); + + // local send/recv + smpi_mpi_sendrecv(send_ptr, send_count, send_type, rank, tag, + recv_ptr + recv_disps[rank] * extent, + recv_counts[rank], recv_type, rank, tag, comm, &status); + for (i = 1; i < num_procs; i++) { + src = dst = rank ^ i; + smpi_mpi_sendrecv(send_ptr, send_count, send_type, dst, tag, + recv_ptr + recv_disps[src] * extent, recv_counts[src], recv_type, + src, tag, comm, &status); + } + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/allgatherv-ring.c b/src/smpi/colls/allgatherv-ring.c new file mode 100644 index 0000000000..4c1e14f53e --- /dev/null +++ b/src/smpi/colls/allgatherv-ring.c @@ -0,0 +1,94 @@ +#include "colls_private.h" + +/***************************************************************************** + +Copyright (c) 2006, Ahmad Faraj & Xin Yuan, +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the Florida State University nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ************************************************************************* + * Any results obtained from executing this software require the * + * acknowledgment and citation of the software and its owners. * + * The full citation is given below: * + * * + * A. Faraj and X. Yuan. "Automatic Generation and Tuning of MPI * + * Collective Communication Routines." The 19th ACM International * + * Conference on Supercomputing (ICS), Cambridge, Massachusetts, * + * June 20-22, 2005. * + ************************************************************************* + +*****************************************************************************/ + +/***************************************************************************** + * Function: allgather_ring + * return: int + * inputs: + * send_buff: send input buffer + * send_count: number of elements to send + * send_type: data type of elements being sent + * recv_buff: receive output buffer + * recv_count: number of elements to received + * recv_type: data type of elements being received + * comm: communication + * Descrp: Function works in P - 1 steps. In step i, node j - i -> j -> j+ i. + * Auther: Ahmad Faraj + ****************************************************************************/ +int +smpi_coll_tuned_allgatherv_ring(void *send_buff, int send_count, + MPI_Datatype send_type, void *recv_buff, + int *recv_counts, int *recv_disps, MPI_Datatype recv_type, + MPI_Comm comm) +{ + + MPI_Aint extent; + int i, src, dst, rank, num_procs; + int tag = 1; + MPI_Status status; + + char *sendptr = (char *) send_buff; + char *recvptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(send_type); + + // local send/recv + smpi_mpi_sendrecv(sendptr, send_count, send_type, rank, tag, + recvptr + recv_disps[rank] * extent, + recv_counts[rank], recv_type, rank, tag, comm, &status); + + for (i = 1; i < num_procs; i++) { + src = (rank - i + num_procs) % num_procs; + dst = (rank + i) % num_procs; + + smpi_mpi_sendrecv(sendptr, send_count, send_type, dst, tag, + recvptr + recv_disps[src] * extent, recv_counts[src], recv_type, + src, tag, comm, &status); + } + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/allreduce-NTS.c b/src/smpi/colls/allreduce-NTS.c index eac171c176..a8cf48d0c8 100644 --- a/src/smpi/colls/allreduce-NTS.c +++ b/src/smpi/colls/allreduce-NTS.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific all-reduce operation designed bandwidth optimally */ @@ -20,26 +20,26 @@ smpi_coll_tuned_allreduce_NTS(void *sbuf, void *rbuf, int rcount, int send_offset, recv_offset; int remainder, remainder_flag, remainder_offset; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* make it compatible with all data type */ MPI_Aint extent; - MPI_Type_extent(dtype, &extent); + extent = smpi_datatype_get_extent(dtype); /* when communication size is smaller than number of process (not support) */ if (rcount < size) { - return MPI_Allreduce(sbuf, rbuf, rcount, dtype, op, comm); + return mpi_coll_allreduce_fun(sbuf, rbuf, rcount, dtype, op, comm); } /* when communication size is not divisible by number of process: call the native implementation for the remain chunk at the end of the operation */ - else if (rcount % size != 0) { + if (rcount % size != 0) { remainder = rcount % size; remainder_flag = 1; remainder_offset = (rcount / size) * size * extent; } else { - remainder_flag = remainder_offset = 0; + remainder = remainder_flag = remainder_offset = 0; } /* size of each point-to-point communication is equal to the size of the whole message @@ -56,7 +56,7 @@ smpi_coll_tuned_allreduce_NTS(void *sbuf, void *rbuf, int rcount, // copy partial data send_offset = ((rank - 1 + size) % size) * count * extent; recv_offset = ((rank - 1 + size) % size) * count * extent; - MPI_Sendrecv((char *) sbuf + send_offset, count, dtype, rank, tag - 1, + smpi_mpi_sendrecv((char *) sbuf + send_offset, count, dtype, rank, tag - 1, (char *) rbuf + recv_offset, count, dtype, rank, tag - 1, comm, &status); @@ -64,19 +64,19 @@ smpi_coll_tuned_allreduce_NTS(void *sbuf, void *rbuf, int rcount, for (i = 0; i < (size - 1); i++) { send_offset = ((rank - 1 - i + size) % size) * count * extent; recv_offset = ((rank - 2 - i + size) % size) * count * extent; - MPI_Sendrecv((char *) rbuf + send_offset, count, dtype, ((rank + 1) % size), + smpi_mpi_sendrecv((char *) rbuf + send_offset, count, dtype, ((rank + 1) % size), tag + i, (char *) rbuf + recv_offset, count, dtype, ((rank + size - 1) % size), tag + i, comm, &status); // compute result to rbuf+recv_offset - star_reduction(op, (char *)sbuf + recv_offset, (char *)rbuf + recv_offset, &count, &dtype); + smpi_op_apply(op, (char *)sbuf + recv_offset, (char *)rbuf + recv_offset, &count, &dtype); } // all-gather for (i = 0; i < (size - 1); i++) { send_offset = ((rank - i + size) % size) * count * extent; recv_offset = ((rank - 1 - i + size) % size) * count * extent; - MPI_Sendrecv((char *) rbuf + send_offset, count, dtype, ((rank + 1) % size), + smpi_mpi_sendrecv((char *) rbuf + send_offset, count, dtype, ((rank + 1) % size), tag + i, (char *) rbuf + recv_offset, count, dtype, ((rank + size - 1) % size), tag + i, comm, &status); } @@ -84,10 +84,12 @@ smpi_coll_tuned_allreduce_NTS(void *sbuf, void *rbuf, int rcount, /* when communication size is not divisible by number of process: call the native implementation for the remain chunk at the end of the operation */ if (remainder_flag) { - return MPI_Allreduce((char *) sbuf + remainder_offset, + XBT_WARN("MPI_allreduce_NTS use default MPI_allreduce."); + smpi_mpi_allreduce((char *) sbuf + remainder_offset, (char *) rbuf + remainder_offset, remainder, dtype, op, comm); + return MPI_SUCCESS; } - return 0; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allreduce-lr.c b/src/smpi/colls/allreduce-lr.c index d4bf82aae8..81cb39210c 100644 --- a/src/smpi/colls/allreduce-lr.c +++ b/src/smpi/colls/allreduce-lr.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific all-reduce operation designed bandwidth optimally @@ -23,26 +23,28 @@ smpi_coll_tuned_allreduce_lr(void *sbuf, void *rbuf, int rcount, int send_offset, recv_offset; int remainder, remainder_flag, remainder_offset; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* make it compatible with all data type */ MPI_Aint extent; - MPI_Type_extent(dtype, &extent); + extent = smpi_datatype_get_extent(dtype); /* when communication size is smaller than number of process (not support) */ if (rcount < size) { - return MPI_Allreduce(sbuf, rbuf, rcount, dtype, op, comm); + XBT_WARN("MPI_allreduce_lr use default MPI_allreduce."); + smpi_mpi_allreduce(sbuf, rbuf, rcount, dtype, op, comm); + return MPI_SUCCESS; } /* when communication size is not divisible by number of process: call the native implementation for the remain chunk at the end of the operation */ - else if (rcount % size != 0) { + if (rcount % size != 0) { remainder = rcount % size; remainder_flag = 1; remainder_offset = (rcount / size) * size * extent; } else { - remainder_flag = remainder_offset = 0; + remainder = remainder_flag = remainder_offset = 0; } /* size of each point-to-point communication is equal to the size of the whole message @@ -59,7 +61,7 @@ smpi_coll_tuned_allreduce_lr(void *sbuf, void *rbuf, int rcount, // copy partial data send_offset = ((rank - 1 + size) % size) * count * extent; recv_offset = ((rank - 1 + size) % size) * count * extent; - MPI_Sendrecv((char *) sbuf + send_offset, count, dtype, rank, tag - 1, + smpi_mpi_sendrecv((char *) sbuf + send_offset, count, dtype, rank, tag - 1, (char *) rbuf + recv_offset, count, dtype, rank, tag - 1, comm, &status); @@ -68,12 +70,12 @@ smpi_coll_tuned_allreduce_lr(void *sbuf, void *rbuf, int rcount, send_offset = ((rank - 1 - i + 2 * size) % size) * count * extent; recv_offset = ((rank - 2 - i + 2 * size) % size) * count * extent; // recv_offset = ((rank-i+2*size)%size)*count*extent; - MPI_Sendrecv((char *) rbuf + send_offset, count, dtype, ((rank + 1) % size), + smpi_mpi_sendrecv((char *) rbuf + send_offset, count, dtype, ((rank + 1) % size), tag + i, (char *) rbuf + recv_offset, count, dtype, ((rank + size - 1) % size), tag + i, comm, &status); // compute result to rbuf+recv_offset - star_reduction(op, (char *) sbuf + recv_offset, (char *) rbuf + recv_offset, + smpi_op_apply(op, (char *) sbuf + recv_offset, (char *) rbuf + recv_offset, &count, &dtype); } @@ -81,7 +83,7 @@ smpi_coll_tuned_allreduce_lr(void *sbuf, void *rbuf, int rcount, for (i = 0; i < (size - 1); i++) { send_offset = ((rank - i + 2 * size) % size) * count * extent; recv_offset = ((rank - 1 - i + 2 * size) % size) * count * extent; - MPI_Sendrecv((char *) rbuf + send_offset, count, dtype, ((rank + 1) % size), + smpi_mpi_sendrecv((char *) rbuf + send_offset, count, dtype, ((rank + 1) % size), tag + i, (char *) rbuf + recv_offset, count, dtype, ((rank + size - 1) % size), tag + i, comm, &status); } @@ -89,7 +91,7 @@ smpi_coll_tuned_allreduce_lr(void *sbuf, void *rbuf, int rcount, /* when communication size is not divisible by number of process: call the native implementation for the remain chunk at the end of the operation */ if (remainder_flag) { - return MPI_Allreduce((char *) sbuf + remainder_offset, + return mpi_coll_allreduce_fun((char *) sbuf + remainder_offset, (char *) rbuf + remainder_offset, remainder, dtype, op, comm); } diff --git a/src/smpi/colls/allreduce-ompi-ring-segmented.c b/src/smpi/colls/allreduce-ompi-ring-segmented.c new file mode 100644 index 0000000000..40343886a8 --- /dev/null +++ b/src/smpi/colls/allreduce-ompi-ring-segmented.c @@ -0,0 +1,387 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2009 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) 2009 University of Houston. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer listed + * in this license in the documentation and/or other materials + * provided with the distribution. + + * - Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + + * The copyright holders provide no reassurances that the source code + * provided does not infringe any patent, copyright, or any other + * intellectual property rights of third parties. The copyright holders + * disclaim any liability to any recipient for claims brought against + * recipient by any third party for infringement of that parties + * intellectual property rights. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + + +/* + * ompi_coll_tuned_allreduce_intra_ring_segmented + * + * Function: Pipelined ring algorithm for allreduce operation + * Accepts: Same as MPI_Allreduce(), segment size + * Returns: MPI_SUCCESS or error code + * + * Description: Implements pipelined ring algorithm for allreduce: + * user supplies suggested segment size for the pipelining of + * reduce operation. + * The segment size determines the number of phases, np, for + * the algorithm execution. + * The message is automatically divided into blocks of + * approximately (count / (np * segcount)) elements. + * At the end of reduction phase, allgather like step is + * executed. + * Algorithm requires (np + 1)*(N - 1) steps. + * + * Limitations: The algorithm DOES NOT preserve order of operations so it + * can be used only for commutative operations. + * In addition, algorithm cannot work if the total size is + * less than size * segment size. + * Example on 3 nodes with 2 phases + * Initial state + * # 0 1 2 + * [00a] [10a] [20a] + * [00b] [10b] [20b] + * [01a] [11a] [21a] + * [01b] [11b] [21b] + * [02a] [12a] [22a] + * [02b] [12b] [22b] + * + * COMPUTATION PHASE 0 (a) + * Step 0: rank r sends block ra to rank (r+1) and receives bloc (r-1)a + * from rank (r-1) [with wraparound]. + * # 0 1 2 + * [00a] [00a+10a] [20a] + * [00b] [10b] [20b] + * [01a] [11a] [11a+21a] + * [01b] [11b] [21b] + * [22a+02a] [12a] [22a] + * [02b] [12b] [22b] + * + * Step 1: rank r sends block (r-1)a to rank (r+1) and receives bloc + * (r-2)a from rank (r-1) [with wraparound]. + * # 0 1 2 + * [00a] [00a+10a] [00a+10a+20a] + * [00b] [10b] [20b] + * [11a+21a+01a] [11a] [11a+21a] + * [01b] [11b] [21b] + * [22a+02a] [22a+02a+12a] [22a] + * [02b] [12b] [22b] + * + * COMPUTATION PHASE 1 (b) + * Step 0: rank r sends block rb to rank (r+1) and receives bloc (r-1)b + * from rank (r-1) [with wraparound]. + * # 0 1 2 + * [00a] [00a+10a] [20a] + * [00b] [00b+10b] [20b] + * [01a] [11a] [11a+21a] + * [01b] [11b] [11b+21b] + * [22a+02a] [12a] [22a] + * [22b+02b] [12b] [22b] + * + * Step 1: rank r sends block (r-1)b to rank (r+1) and receives bloc + * (r-2)b from rank (r-1) [with wraparound]. + * # 0 1 2 + * [00a] [00a+10a] [00a+10a+20a] + * [00b] [10b] [0bb+10b+20b] + * [11a+21a+01a] [11a] [11a+21a] + * [11b+21b+01b] [11b] [21b] + * [22a+02a] [22a+02a+12a] [22a] + * [02b] [22b+01b+12b] [22b] + * + * + * DISTRIBUTION PHASE: ring ALLGATHER with ranks shifted by 1 (same as + * in regular ring algorithm. + * + */ + + #define COLL_TUNED_COMPUTED_SEGCOUNT(SEGSIZE, TYPELNG, SEGCOUNT) \ + if( ((SEGSIZE) >= (TYPELNG)) && \ + ((SEGSIZE) < ((TYPELNG) * (SEGCOUNT))) ) { \ + size_t residual; \ + (SEGCOUNT) = (int)((SEGSIZE) / (TYPELNG)); \ + residual = (SEGSIZE) - (SEGCOUNT) * (TYPELNG); \ + if( residual > ((TYPELNG) >> 1) ) \ + (SEGCOUNT)++; \ + } \ + +#define COLL_TUNED_COMPUTE_BLOCKCOUNT( COUNT, NUM_BLOCKS, SPLIT_INDEX, \ + EARLY_BLOCK_COUNT, LATE_BLOCK_COUNT ) \ + EARLY_BLOCK_COUNT = LATE_BLOCK_COUNT = COUNT / NUM_BLOCKS; \ + SPLIT_INDEX = COUNT % NUM_BLOCKS; \ + if (0 != SPLIT_INDEX) { \ + EARLY_BLOCK_COUNT = EARLY_BLOCK_COUNT + 1; \ + } \ + + #include "colls_private.h" +int +smpi_coll_tuned_allreduce_ompi_ring_segmented(void *sbuf, void *rbuf, int count, + MPI_Datatype dtype, + MPI_Op op, + MPI_Comm comm) +{ + int ret = MPI_SUCCESS; + int line; + int rank, size, k, recv_from, send_to; + int early_blockcount, late_blockcount, split_rank; + int segcount, max_segcount; + int num_phases, phase; + int block_count, inbi; + size_t typelng; + char *tmpsend = NULL, *tmprecv = NULL; + char *inbuf[2] = {NULL, NULL}; + ptrdiff_t true_extent, extent; + ptrdiff_t block_offset, max_real_segsize; + MPI_Request reqs[2] = {NULL, NULL}; + const size_t segsize = 1 << 20; /* 1 MB */ + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + XBT_DEBUG("coll:tuned:allreduce_intra_ring_segmented rank %d, count %d", rank, count); + + /* Special case for size == 1 */ + if (1 == size) { + if (MPI_IN_PLACE != sbuf) { + ret= smpi_datatype_copy(sbuf, count, dtype,rbuf, count, dtype); + if (ret < 0) { line = __LINE__; goto error_hndl; } + } + return MPI_SUCCESS; + } + + /* Determine segment count based on the suggested segment size */ + extent = smpi_datatype_get_extent(dtype); + if (MPI_SUCCESS != ret) { line = __LINE__; goto error_hndl; } + true_extent = smpi_datatype_get_extent(dtype); + if (MPI_SUCCESS != ret) { line = __LINE__; goto error_hndl; } + typelng = smpi_datatype_size(dtype); + if (MPI_SUCCESS != ret) { line = __LINE__; goto error_hndl; } + segcount = count; + COLL_TUNED_COMPUTED_SEGCOUNT(segsize, typelng, segcount) + + /* Special case for count less than size * segcount - use regular ring */ + if (count < size * segcount) { + XBT_DEBUG( "coll:tuned:allreduce_ring_segmented rank %d/%d, count %d, switching to regular ring", rank, size, count); + return (smpi_coll_tuned_allreduce_lr(sbuf, rbuf, count, dtype, op, + comm)); + } + + /* Determine the number of phases of the algorithm */ + num_phases = count / (size * segcount); + if ((count % (size * segcount) >= size) && + (count % (size * segcount) > ((size * segcount) / 2))) { + num_phases++; + } + + /* Determine the number of elements per block and corresponding + block sizes. + The blocks are divided into "early" and "late" ones: + blocks 0 .. (split_rank - 1) are "early" and + blocks (split_rank) .. (size - 1) are "late". + Early blocks are at most 1 element larger than the late ones. + Note, these blocks will be split into num_phases segments, + out of the largest one will have max_segcount elements. + */ + COLL_TUNED_COMPUTE_BLOCKCOUNT( count, size, split_rank, + early_blockcount, late_blockcount ) + COLL_TUNED_COMPUTE_BLOCKCOUNT( early_blockcount, num_phases, inbi, + max_segcount, k) + max_real_segsize = true_extent + (max_segcount - 1) * extent; + + /* Allocate and initialize temporary buffers */ + inbuf[0] = (char*)malloc(max_real_segsize); + if (NULL == inbuf[0]) { ret = -1; line = __LINE__; goto error_hndl; } + if (size > 2) { + inbuf[1] = (char*)malloc(max_real_segsize); + if (NULL == inbuf[1]) { ret = -1; line = __LINE__; goto error_hndl; } + } + + /* Handle MPI_IN_PLACE */ + if (MPI_IN_PLACE != sbuf) { + ret= smpi_datatype_copy(sbuf, count, dtype,rbuf, count, dtype); + if (ret < 0) { line = __LINE__; goto error_hndl; } + } + + /* Computation loop: for each phase, repeat ring allreduce computation loop */ + for (phase = 0; phase < num_phases; phase ++) { + ptrdiff_t phase_offset; + int early_phase_segcount, late_phase_segcount, split_phase, phase_count; + + /* + For each of the remote nodes: + - post irecv for block (r-1) + - send block (r) + To do this, first compute block offset and count, and use block offset + to compute phase offset. + - in loop for every step k = 2 .. n + - post irecv for block (r + n - k) % n + - wait on block (r + n - k + 1) % n to arrive + - compute on block (r + n - k + 1) % n + - send block (r + n - k + 1) % n + - wait on block (r + 1) + - compute on block (r + 1) + - send block (r + 1) to rank (r + 1) + Note that we must be careful when computing the begining of buffers and + for send operations and computation we must compute the exact block size. + */ + send_to = (rank + 1) % size; + recv_from = (rank + size - 1) % size; + + inbi = 0; + /* Initialize first receive from the neighbor on the left */ + reqs[inbi] = smpi_mpi_irecv(inbuf[inbi], max_segcount, dtype, recv_from, + 666, comm); + /* Send first block (my block) to the neighbor on the right: + - compute my block and phase offset + - send data */ + block_offset = ((rank < split_rank)? + (rank * early_blockcount) : + (rank * late_blockcount + split_rank)); + block_count = ((rank < split_rank)? early_blockcount : late_blockcount); + COLL_TUNED_COMPUTE_BLOCKCOUNT(block_count, num_phases, split_phase, + early_phase_segcount, late_phase_segcount) + phase_count = ((phase < split_phase)? + (early_phase_segcount) : (late_phase_segcount)); + phase_offset = ((phase < split_phase)? + (phase * early_phase_segcount) : + (phase * late_phase_segcount + split_phase)); + tmpsend = ((char*)rbuf) + (block_offset + phase_offset) * extent; + smpi_mpi_send(tmpsend, phase_count, dtype, send_to, + 666, comm); + + for (k = 2; k < size; k++) { + const int prevblock = (rank + size - k + 1) % size; + + inbi = inbi ^ 0x1; + + /* Post irecv for the current block */ + reqs[inbi] = smpi_mpi_irecv(inbuf[inbi], max_segcount, dtype, recv_from, + 666, comm); + if (MPI_SUCCESS != ret) { line = __LINE__; goto error_hndl; } + + /* Wait on previous block to arrive */ + smpi_mpi_wait(&reqs[inbi ^ 0x1], MPI_STATUS_IGNORE); + + /* Apply operation on previous block: result goes to rbuf + rbuf[prevblock] = inbuf[inbi ^ 0x1] (op) rbuf[prevblock] + */ + block_offset = ((prevblock < split_rank)? + (prevblock * early_blockcount) : + (prevblock * late_blockcount + split_rank)); + block_count = ((prevblock < split_rank)? + early_blockcount : late_blockcount); + COLL_TUNED_COMPUTE_BLOCKCOUNT(block_count, num_phases, split_phase, + early_phase_segcount, late_phase_segcount) + phase_count = ((phase < split_phase)? + (early_phase_segcount) : (late_phase_segcount)); + phase_offset = ((phase < split_phase)? + (phase * early_phase_segcount) : + (phase * late_phase_segcount + split_phase)); + tmprecv = ((char*)rbuf) + (block_offset + phase_offset) * extent; + smpi_op_apply(op, inbuf[inbi ^ 0x1], tmprecv, &phase_count, &dtype); + /* send previous block to send_to */ + smpi_mpi_send(tmprecv, phase_count, dtype, send_to, + 666, comm); + } + + /* Wait on the last block to arrive */ + smpi_mpi_wait(&reqs[inbi], MPI_STATUS_IGNORE); + + + /* Apply operation on the last block (from neighbor (rank + 1) + rbuf[rank+1] = inbuf[inbi] (op) rbuf[rank + 1] */ + recv_from = (rank + 1) % size; + block_offset = ((recv_from < split_rank)? + (recv_from * early_blockcount) : + (recv_from * late_blockcount + split_rank)); + block_count = ((recv_from < split_rank)? + early_blockcount : late_blockcount); + COLL_TUNED_COMPUTE_BLOCKCOUNT(block_count, num_phases, split_phase, + early_phase_segcount, late_phase_segcount) + phase_count = ((phase < split_phase)? + (early_phase_segcount) : (late_phase_segcount)); + phase_offset = ((phase < split_phase)? + (phase * early_phase_segcount) : + (phase * late_phase_segcount + split_phase)); + tmprecv = ((char*)rbuf) + (block_offset + phase_offset) * extent; + smpi_op_apply(op, inbuf[inbi], tmprecv, &phase_count, &dtype); + } + + /* Distribution loop - variation of ring allgather */ + send_to = (rank + 1) % size; + recv_from = (rank + size - 1) % size; + for (k = 0; k < size - 1; k++) { + const int recv_data_from = (rank + size - k) % size; + const int send_data_from = (rank + 1 + size - k) % size; + const int send_block_offset = + ((send_data_from < split_rank)? + (send_data_from * early_blockcount) : + (send_data_from * late_blockcount + split_rank)); + const int recv_block_offset = + ((recv_data_from < split_rank)? + (recv_data_from * early_blockcount) : + (recv_data_from * late_blockcount + split_rank)); + block_count = ((send_data_from < split_rank)? + early_blockcount : late_blockcount); + + tmprecv = (char*)rbuf + recv_block_offset * extent; + tmpsend = (char*)rbuf + send_block_offset * extent; + + smpi_mpi_sendrecv(tmpsend, block_count, dtype, send_to, + 666, + tmprecv, early_blockcount, dtype, recv_from, + 666, + comm, MPI_STATUS_IGNORE); + + } + + if (NULL != inbuf[0]) free(inbuf[0]); + if (NULL != inbuf[1]) free(inbuf[1]); + + return MPI_SUCCESS; + + error_hndl: + XBT_DEBUG("%s:%4d\tRank %d Error occurred %d\n", + __FILE__, line, rank, ret); + if (NULL != inbuf[0]) free(inbuf[0]); + if (NULL != inbuf[1]) free(inbuf[1]); + return ret; +} diff --git a/src/smpi/colls/allreduce-rab-rdb.c b/src/smpi/colls/allreduce-rab-rdb.c index 0496c87212..9d5ee9c784 100644 --- a/src/smpi/colls/allreduce-rab-rdb.c +++ b/src/smpi/colls/allreduce-rab-rdb.c @@ -1,38 +1,23 @@ -#include "colls.h" +#include "colls_private.h" int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count, MPI_Datatype dtype, MPI_Op op, MPI_Comm comm) { - int nprocs, rank, type_size, tag = 543; + int nprocs, rank, tag = 543; int mask, dst, pof2, newrank, rem, newdst, i, send_idx, recv_idx, last_idx, send_cnt, recv_cnt, *cnts, *disps; - MPI_Aint lb, extent; + MPI_Aint extent; MPI_Status status; void *tmp_buf = NULL; -#ifdef MPICH2_REDUCTION - MPI_User_function *uop = MPIR_Op_table[op % 16 - 1]; -#else - MPI_User_function *uop; - struct MPIR_OP *op_ptr; - op_ptr = (MPI_User_function *) MPIR_ToPointer(op); - uop = op_ptr->op; -#endif - - MPI_Comm_size(comm, &nprocs); - MPI_Comm_rank(comm, &rank); - - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); - if (!tmp_buf) { - printf("Could not allocate memory for tmp_buf\n"); - return 1; - } + nprocs = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); - MPIR_Localcopy(sbuff, count, dtype, rbuff, count, dtype); + extent = smpi_datatype_get_extent(dtype); + tmp_buf = (void *) xbt_malloc(count * extent); - MPI_Type_size(dtype, &type_size); + smpi_datatype_copy(sbuff, count, dtype, rbuff, count, dtype); // find nearest power-of-two less than or equal to comm_size pof2 = 1; @@ -52,7 +37,7 @@ int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count, // even if (rank % 2 == 0) { - MPI_Send(rbuff, count, dtype, rank + 1, tag, comm); + smpi_mpi_send(rbuff, count, dtype, rank + 1, tag, comm); // temporarily set the rank to -1 so that this // process does not pariticipate in recursive @@ -60,11 +45,11 @@ int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count, newrank = -1; } else // odd { - MPI_Recv(tmp_buf, count, dtype, rank - 1, tag, comm, &status); + smpi_mpi_recv(tmp_buf, count, dtype, rank - 1, tag, comm, &status); // do the reduction on received data. since the // ordering is right, it doesn't matter whether // the operation is commutative or not. - (*uop) (tmp_buf, rbuff, &count, &dtype); + smpi_op_apply(op, tmp_buf, rbuff, &count, &dtype); // change the rank newrank = rank / 2; @@ -88,8 +73,8 @@ int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count, // reduce-scatter, calculate the count that each process receives // and the displacement within the buffer - cnts = (int *) malloc(pof2 * sizeof(int)); - disps = (int *) malloc(pof2 * sizeof(int)); + cnts = (int *) xbt_malloc(pof2 * sizeof(int)); + disps = (int *) xbt_malloc(pof2 * sizeof(int)); for (i = 0; i < (pof2 - 1); i++) cnts[i] = count / pof2; @@ -123,7 +108,7 @@ int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count, } // Send data from recvbuf. Recv into tmp_buf - MPI_Sendrecv((char *) rbuff + disps[send_idx] * extent, send_cnt, + smpi_mpi_sendrecv((char *) rbuff + disps[send_idx] * extent, send_cnt, dtype, dst, tag, (char *) tmp_buf + disps[recv_idx] * extent, recv_cnt, dtype, dst, tag, comm, &status); @@ -133,8 +118,8 @@ int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count, // This algorithm is used only for predefined ops // and predefined ops are always commutative. - (*uop) ((char *) tmp_buf + disps[recv_idx] * extent, - (char *) rbuff + disps[recv_idx] * extent, &recv_cnt, &dtype); + smpi_op_apply(op, (char *) tmp_buf + disps[recv_idx] * extent, + (char *) rbuff + disps[recv_idx] * extent, &recv_cnt, &dtype); // update send_idx for next iteration send_idx = recv_idx; @@ -173,7 +158,7 @@ int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count, recv_cnt += cnts[i]; } - MPI_Sendrecv((char *) rbuff + disps[send_idx] * extent, send_cnt, + smpi_mpi_sendrecv((char *) rbuff + disps[send_idx] * extent, send_cnt, dtype, dst, tag, (char *) rbuff + disps[recv_idx] * extent, recv_cnt, dtype, dst, tag, comm, &status); @@ -194,11 +179,11 @@ int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count, if (rank < 2 * rem) { if (rank % 2) // odd - MPI_Send(rbuff, count, dtype, rank - 1, tag, comm); + smpi_mpi_send(rbuff, count, dtype, rank - 1, tag, comm); else // even - MPI_Recv(rbuff, count, dtype, rank + 1, tag, comm, &status); + smpi_mpi_recv(rbuff, count, dtype, rank + 1, tag, comm, &status); } free(tmp_buf); - return 0; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allreduce-rab-reduce-scatter.c b/src/smpi/colls/allreduce-rab-reduce-scatter.c old mode 100755 new mode 100644 index 7a9eb2a96e..5650ef233d --- a/src/smpi/colls/allreduce-rab-reduce-scatter.c +++ b/src/smpi/colls/allreduce-rab-reduce-scatter.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #ifndef REDUCE_STUFF #define REDUCE_STUFF /***************************************************************************** @@ -341,19 +341,15 @@ int smpi_coll_tuned_allreduce_rab_reduce_scatter(void *sbuff, void *rbuff, MPI_Status status; void *tmp_buf = NULL; MPI_User_function *func = get_op_func(op); - MPI_Comm_size(comm, &nprocs); - MPI_Comm_rank(comm, &rank); - - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); - if (!tmp_buf) { - printf("Could not allocate memory for tmp_buf\n"); - return 1; - } + nprocs = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + extent = smpi_datatype_get_extent(dtype); + tmp_buf = (void *) xbt_malloc(count * extent); MPIR_Localcopy(sbuff, count, dtype, rbuff, count, dtype); - MPI_Type_size(dtype, &type_size); + type_size = smpi_datatype_size(dtype); // find nearest power-of-two less than or equal to comm_size pof2 = 1; @@ -409,8 +405,8 @@ int smpi_coll_tuned_allreduce_rab_reduce_scatter(void *sbuff, void *rbuff, // reduce-scatter, calculate the count that each process receives // and the displacement within the buffer - cnts = (int *) malloc(pof2 * sizeof(int)); - disps = (int *) malloc(pof2 * sizeof(int)); + cnts = (int *) xbt_malloc(pof2 * sizeof(int)); + disps = (int *) xbt_malloc(pof2 * sizeof(int)); for (i = 0; i < (pof2 - 1); i++) cnts[i] = count / pof2; @@ -521,5 +517,5 @@ int smpi_coll_tuned_allreduce_rab_reduce_scatter(void *sbuff, void *rbuff, } free(tmp_buf); - return 0; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allreduce-rab-rsag.c b/src/smpi/colls/allreduce-rab-rsag.c index 5af05116fe..34e23d6369 100644 --- a/src/smpi/colls/allreduce-rab-rsag.c +++ b/src/smpi/colls/allreduce-rab-rsag.c @@ -1,30 +1,24 @@ -#include "colls.h" +#include "colls_private.h" //#include int smpi_coll_tuned_allreduce_rab_rsag(void *sbuff, void *rbuff, int count, MPI_Datatype dtype, MPI_Op op, MPI_Comm comm) { - int nprocs, rank, type_size, tag = 543; + int nprocs, rank, tag = 543; int mask, dst, pof2, newrank, rem, newdst, i, send_idx, recv_idx, last_idx, send_cnt, recv_cnt, *cnts, *disps; MPI_Aint extent; MPI_Status status; void *tmp_buf = NULL; - MPI_Comm_size(comm, &nprocs); - MPI_Comm_rank(comm, &rank); - - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); - if (!tmp_buf) { - printf("Could not allocate memory for tmp_buf\n"); - return 1; - } + nprocs = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); - MPI_Sendrecv(sbuff, count, dtype, rank, tag, rbuff, count, dtype, rank, tag, - comm, &status); + extent = smpi_datatype_get_extent(dtype); + tmp_buf = (void *) xbt_malloc(count * extent); - MPI_Type_size(dtype, &type_size); + smpi_mpi_sendrecv(sbuff, count, dtype, rank, tag, rbuff, count, dtype, rank, tag, + comm, &status); // find nearest power-of-two less than or equal to comm_size pof2 = 1; @@ -44,7 +38,7 @@ int smpi_coll_tuned_allreduce_rab_rsag(void *sbuff, void *rbuff, int count, // even if (rank % 2 == 0) { - MPI_Send(rbuff, count, dtype, rank + 1, tag, comm); + smpi_mpi_send(rbuff, count, dtype, rank + 1, tag, comm); // temporarily set the rank to -1 so that this // process does not pariticipate in recursive @@ -52,11 +46,11 @@ int smpi_coll_tuned_allreduce_rab_rsag(void *sbuff, void *rbuff, int count, newrank = -1; } else // odd { - MPI_Recv(tmp_buf, count, dtype, rank - 1, tag, comm, &status); + smpi_mpi_recv(tmp_buf, count, dtype, rank - 1, tag, comm, &status); // do the reduction on received data. since the // ordering is right, it doesn't matter whether // the operation is commutative or not. - star_reduction(op, tmp_buf, rbuff, &count, &dtype); + smpi_op_apply(op, tmp_buf, rbuff, &count, &dtype); // change the rank newrank = rank / 2; @@ -80,8 +74,8 @@ int smpi_coll_tuned_allreduce_rab_rsag(void *sbuff, void *rbuff, int count, // reduce-scatter, calculate the count that each process receives // and the displacement within the buffer - cnts = (int *) malloc(pof2 * sizeof(int)); - disps = (int *) malloc(pof2 * sizeof(int)); + cnts = (int *) xbt_malloc(pof2 * sizeof(int)); + disps = (int *) xbt_malloc(pof2 * sizeof(int)); for (i = 0; i < (pof2 - 1); i++) cnts[i] = count / pof2; @@ -115,7 +109,7 @@ int smpi_coll_tuned_allreduce_rab_rsag(void *sbuff, void *rbuff, int count, } // Send data from recvbuf. Recv into tmp_buf - MPI_Sendrecv((char *) rbuff + disps[send_idx] * extent, send_cnt, + smpi_mpi_sendrecv((char *) rbuff + disps[send_idx] * extent, send_cnt, dtype, dst, tag, (char *) tmp_buf + disps[recv_idx] * extent, recv_cnt, dtype, dst, tag, comm, &status); @@ -125,7 +119,7 @@ int smpi_coll_tuned_allreduce_rab_rsag(void *sbuff, void *rbuff, int count, // This algorithm is used only for predefined ops // and predefined ops are always commutative. - star_reduction(op, (char *) tmp_buf + disps[recv_idx] * extent, + smpi_op_apply(op, (char *) tmp_buf + disps[recv_idx] * extent, (char *) rbuff + disps[recv_idx] * extent, &recv_cnt, &dtype); @@ -166,7 +160,7 @@ int smpi_coll_tuned_allreduce_rab_rsag(void *sbuff, void *rbuff, int count, recv_cnt += cnts[i]; } - MPI_Sendrecv((char *) rbuff + disps[send_idx] * extent, send_cnt, + smpi_mpi_sendrecv((char *) rbuff + disps[send_idx] * extent, send_cnt, dtype, dst, tag, (char *) rbuff + disps[recv_idx] * extent, recv_cnt, dtype, dst, tag, comm, &status); @@ -187,11 +181,11 @@ int smpi_coll_tuned_allreduce_rab_rsag(void *sbuff, void *rbuff, int count, if (rank < 2 * rem) { if (rank % 2) // odd - MPI_Send(rbuff, count, dtype, rank - 1, tag, comm); + smpi_mpi_send(rbuff, count, dtype, rank - 1, tag, comm); else // even - MPI_Recv(rbuff, count, dtype, rank + 1, tag, comm, &status); + smpi_mpi_recv(rbuff, count, dtype, rank + 1, tag, comm, &status); } free(tmp_buf); - return 0; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allreduce-rab1.c b/src/smpi/colls/allreduce-rab1.c index 0dc64c15f5..ae72f7491a 100644 --- a/src/smpi/colls/allreduce-rab1.c +++ b/src/smpi/colls/allreduce-rab1.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" //#include // NP pow of 2 for now @@ -13,10 +13,10 @@ int smpi_coll_tuned_allreduce_rab1(void *sbuff, void *rbuff, void *recv, *tmp_buf; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &nprocs); + rank = smpi_comm_rank(comm); + nprocs = smpi_comm_size(comm); - MPI_Type_extent(dtype, &extent); + extent = smpi_datatype_get_extent(dtype); pof2 = 1; while (pof2 <= nprocs) @@ -31,8 +31,8 @@ int smpi_coll_tuned_allreduce_rab1(void *sbuff, void *rbuff, send_size = (count + nprocs) / nprocs; newcnt = send_size * nprocs; - recv = (void *) malloc(extent * newcnt); - tmp_buf = (void *) malloc(extent * newcnt); + recv = (void *) xbt_malloc(extent * newcnt); + tmp_buf = (void *) xbt_malloc(extent * newcnt); memcpy(recv, sbuff, extent * count); @@ -47,10 +47,10 @@ int smpi_coll_tuned_allreduce_rab1(void *sbuff, void *rbuff, else recv_idx = send_idx + (mask * share); - MPI_Sendrecv((char *) recv + send_idx * extent, send_cnt, dtype, dst, tag, + smpi_mpi_sendrecv((char *) recv + send_idx * extent, send_cnt, dtype, dst, tag, tmp_buf, recv_cnt, dtype, dst, tag, comm, &status); - star_reduction(op, tmp_buf, (char *) recv + recv_idx * extent, &recv_cnt, + smpi_op_apply(op, tmp_buf, (char *) recv + recv_idx * extent, &recv_cnt, &dtype); // update send_idx for next iteration @@ -59,7 +59,7 @@ int smpi_coll_tuned_allreduce_rab1(void *sbuff, void *rbuff, } memcpy(tmp_buf, (char *) recv + recv_idx * extent, recv_cnt * extent); - MPI_Allgather(tmp_buf, recv_cnt, dtype, recv, recv_cnt, dtype, comm); + mpi_coll_allgather_fun(tmp_buf, recv_cnt, dtype, recv, recv_cnt, dtype, comm); memcpy(rbuff, recv, count * extent); free(recv); @@ -68,7 +68,7 @@ int smpi_coll_tuned_allreduce_rab1(void *sbuff, void *rbuff, } else { - tmp_buf = (void *) malloc(extent * count); + tmp_buf = (void *) xbt_malloc(extent * count); memcpy(rbuff, sbuff, count * extent); mask = pof2 / 2; share = count / pof2; @@ -81,10 +81,10 @@ int smpi_coll_tuned_allreduce_rab1(void *sbuff, void *rbuff, else recv_idx = send_idx + (mask * share); - MPI_Sendrecv((char *) rbuff + send_idx * extent, send_cnt, dtype, dst, + smpi_mpi_sendrecv((char *) rbuff + send_idx * extent, send_cnt, dtype, dst, tag, tmp_buf, recv_cnt, dtype, dst, tag, comm, &status); - star_reduction(op, tmp_buf, (char *) rbuff + recv_idx * extent, &recv_cnt, + smpi_op_apply(op, tmp_buf, (char *) rbuff + recv_idx * extent, &recv_cnt, &dtype); // update send_idx for next iteration @@ -93,9 +93,9 @@ int smpi_coll_tuned_allreduce_rab1(void *sbuff, void *rbuff, } memcpy(tmp_buf, (char *) rbuff + recv_idx * extent, recv_cnt * extent); - MPI_Allgather(tmp_buf, recv_cnt, dtype, rbuff, recv_cnt, dtype, comm); + mpi_coll_allgather_fun(tmp_buf, recv_cnt, dtype, rbuff, recv_cnt, dtype, comm); free(tmp_buf); } - return 0; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allreduce-rab2.c b/src/smpi/colls/allreduce-rab2.c index d09cd1126a..982933c90e 100644 --- a/src/smpi/colls/allreduce-rab2.c +++ b/src/smpi/colls/allreduce-rab2.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" //#include // this requires that count >= NP @@ -20,11 +20,11 @@ int smpi_coll_tuned_allreduce_rab2(void *sbuff, void *rbuff, uop = op_ptr->op; #endif */ - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &nprocs); + rank = smpi_comm_rank(comm); + nprocs = smpi_comm_size(comm); - MPI_Type_extent(dtype, &s_extent); + s_extent = smpi_datatype_get_extent(dtype); // uneven count if (count % nprocs) { @@ -34,20 +34,20 @@ int smpi_coll_tuned_allreduce_rab2(void *sbuff, void *rbuff, send_size = (count + nprocs) / nprocs; nbytes = send_size * s_extent; - send = (void *) malloc(s_extent * send_size * nprocs); - recv = (void *) malloc(s_extent * send_size * nprocs); - tmp = (void *) malloc(nbytes); + send = (void *) xbt_malloc(s_extent * send_size * nprocs); + recv = (void *) xbt_malloc(s_extent * send_size * nprocs); + tmp = (void *) xbt_malloc(nbytes); memcpy(send, sbuff, s_extent * count); - MPI_Alltoall(send, send_size, dtype, recv, send_size, dtype, comm); + mpi_coll_alltoall_fun(send, send_size, dtype, recv, send_size, dtype, comm); memcpy(tmp, recv, nbytes); for (i = 1, s_offset = nbytes; i < nprocs; i++, s_offset = i * nbytes) - star_reduction(op, (char *) recv + s_offset, tmp, &send_size, &dtype); + smpi_op_apply(op, (char *) recv + s_offset, tmp, &send_size, &dtype); - MPI_Allgather(tmp, send_size, dtype, recv, send_size, dtype, comm); + mpi_coll_allgather_fun(tmp, send_size, dtype, recv, send_size, dtype, comm); memcpy(rbuff, recv, count * s_extent); free(recv); @@ -59,20 +59,20 @@ int smpi_coll_tuned_allreduce_rab2(void *sbuff, void *rbuff, nbytes = send_size * s_extent; r_offset = rank * nbytes; - recv = (void *) malloc(s_extent * send_size * nprocs); + recv = (void *) xbt_malloc(s_extent * send_size * nprocs); - MPI_Alltoall(send, send_size, dtype, recv, send_size, dtype, comm); + mpi_coll_alltoall_fun(send, send_size, dtype, recv, send_size, dtype, comm); memcpy((char *) rbuff + r_offset, recv, nbytes); for (i = 1, s_offset = nbytes; i < nprocs; i++, s_offset = i * nbytes) - star_reduction(op, (char *) recv + s_offset, (char *) rbuff + r_offset, + smpi_op_apply(op, (char *) recv + s_offset, (char *) rbuff + r_offset, &send_size, &dtype); - MPI_Allgather((char *) rbuff + r_offset, send_size, dtype, rbuff, send_size, + mpi_coll_allgather_fun((char *) rbuff + r_offset, send_size, dtype, rbuff, send_size, dtype, comm); free(recv); } - return 0; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allreduce-rdb.c b/src/smpi/colls/allreduce-rdb.c index 5e3cf46460..44717adf41 100644 --- a/src/smpi/colls/allreduce-rdb.c +++ b/src/smpi/colls/allreduce-rdb.c @@ -1,12 +1,12 @@ -#include "colls.h" +#include "colls_private.h" //#include int smpi_coll_tuned_allreduce_rdb(void *sbuff, void *rbuff, int count, MPI_Datatype dtype, MPI_Op op, MPI_Comm comm) { - int nprocs, rank, type_size, tag = 543; + int nprocs, rank, tag = 543; int mask, dst, pof2, newrank, rem, newdst; - MPI_Aint extent; + MPI_Aint extent, lb; MPI_Status status; void *tmp_buf = NULL; /* @@ -19,20 +19,14 @@ int smpi_coll_tuned_allreduce_rdb(void *sbuff, void *rbuff, int count, uop = op_ptr->op; #endif */ - MPI_Comm_size(comm, &nprocs); - MPI_Comm_rank(comm, &rank); - - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); - if (!tmp_buf) { - printf("Could not allocate memory for tmp_buf\n"); - return 1; - } + nprocs=smpi_comm_size(comm); + rank=smpi_comm_rank(comm); - MPI_Sendrecv(sbuff, count, dtype, rank, 500, - rbuff, count, dtype, rank, 500, comm, &status); + smpi_datatype_extent(dtype, &lb, &extent); + tmp_buf = (void *) xbt_malloc(count * extent); - MPI_Type_size(dtype, &type_size); + smpi_mpi_sendrecv(sbuff, count, dtype, rank, 500, + rbuff, count, dtype, rank, 500, comm, &status); // find nearest power-of-two less than or equal to comm_size pof2 = 1; @@ -52,7 +46,7 @@ int smpi_coll_tuned_allreduce_rdb(void *sbuff, void *rbuff, int count, // even if (rank % 2 == 0) { - MPI_Send(rbuff, count, dtype, rank + 1, tag, comm); + smpi_mpi_send(rbuff, count, dtype, rank + 1, tag, comm); // temporarily set the rank to -1 so that this // process does not pariticipate in recursive @@ -60,11 +54,11 @@ int smpi_coll_tuned_allreduce_rdb(void *sbuff, void *rbuff, int count, newrank = -1; } else // odd { - MPI_Recv(tmp_buf, count, dtype, rank - 1, tag, comm, &status); + smpi_mpi_recv(tmp_buf, count, dtype, rank - 1, tag, comm, &status); // do the reduction on received data. since the // ordering is right, it doesn't matter whether // the operation is commutative or not. - star_reduction(op, tmp_buf, rbuff, &count, &dtype); + smpi_op_apply(op, tmp_buf, rbuff, &count, &dtype); // change the rank newrank = rank / 2; @@ -92,7 +86,7 @@ int smpi_coll_tuned_allreduce_rdb(void *sbuff, void *rbuff, int count, // Send the most current data, which is in recvbuf. Recv // into tmp_buf - MPI_Sendrecv(rbuff, count, dtype, dst, tag, tmp_buf, count, dtype, + smpi_mpi_sendrecv(rbuff, count, dtype, dst, tag, tmp_buf, count, dtype, dst, tag, comm, &status); // tmp_buf contains data received in this step. @@ -102,13 +96,13 @@ int smpi_coll_tuned_allreduce_rdb(void *sbuff, void *rbuff, int count, // we assume it is commuttive op // if (op -> op_commute || (dst < rank)) if ((dst < rank)) { - star_reduction(op, tmp_buf, rbuff, &count, &dtype); + smpi_op_apply(op, tmp_buf, rbuff, &count, &dtype); } else // op is noncommutative and the order is not right { - star_reduction(op, rbuff, tmp_buf, &count, &dtype); + smpi_op_apply(op, rbuff, tmp_buf, &count, &dtype); // copy result back into recvbuf - MPI_Sendrecv(tmp_buf, count, dtype, rank, tag, rbuff, count, + smpi_mpi_sendrecv(tmp_buf, count, dtype, rank, tag, rbuff, count, dtype, rank, tag, comm, &status); } mask <<= 1; @@ -120,11 +114,11 @@ int smpi_coll_tuned_allreduce_rdb(void *sbuff, void *rbuff, int count, if (rank < 2 * rem) { if (rank % 2) // odd - MPI_Send(rbuff, count, dtype, rank - 1, tag, comm); + smpi_mpi_send(rbuff, count, dtype, rank - 1, tag, comm); else // even - MPI_Recv(rbuff, count, dtype, rank + 1, tag, comm, &status); + smpi_mpi_recv(rbuff, count, dtype, rank + 1, tag, comm, &status); } free(tmp_buf); - return 0; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allreduce-redbcast.c b/src/smpi/colls/allreduce-redbcast.c index c00fc2f025..69c552dfe2 100644 --- a/src/smpi/colls/allreduce-redbcast.c +++ b/src/smpi/colls/allreduce-redbcast.c @@ -1,10 +1,10 @@ -#include "colls.h" +#include "colls_private.h" int smpi_coll_tuned_allreduce_redbcast(void *buf, void *buf2, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) { - MPI_Reduce(buf, buf2, count, datatype, op, 0, comm); - MPI_Bcast(buf2, count, datatype, 0, comm); - return 0; + smpi_mpi_reduce(buf, buf2, count, datatype, op, 0, comm); + smpi_mpi_bcast(buf2, count, datatype, 0, comm); + return MPI_SUCCESS; } diff --git a/src/smpi/colls/allreduce-smp-binomial-pipeline.c b/src/smpi/colls/allreduce-smp-binomial-pipeline.c index b5efc1eb29..93d72bb5ca 100644 --- a/src/smpi/colls/allreduce-smp-binomial-pipeline.c +++ b/src/smpi/colls/allreduce-smp-binomial-pipeline.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific (however, number of cores/node need to be changed) all-reduce operation designed for smp clusters @@ -29,18 +29,6 @@ int allreduce_smp_binomial_pipeline_segment_size = 4096; This code assume commutative and associative reduce operator (MPI_SUM, MPI_MAX, etc). */ -#ifndef MPICH2 -extern void *MPIR_ToPointer(); - -struct MPIR_OP { - MPI_User_function *op; - int commute, permanent; -}; - -#else -extern MPI_User_function *MPIR_Op_table[]; -#endif - /* This fucntion performs all-reduce operation as follow. ** in a pipeline fashion ** 1) binomial_tree reduce inside each SMP node @@ -60,19 +48,11 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf, MPI_Status status; int num_core = NUM_CORE; - MPI_User_function *uop; -#ifndef MPICH2 - struct MPIR_OP *op_ptr = MPIR_ToPointer(op); - uop = (MPI_User_function *) op_ptr->op; -#else - uop = MPIR_Op_table[op % 16 - 1]; -#endif - - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); MPI_Aint extent; - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); + extent = smpi_datatype_get_extent(dtype); + tmp_buf = (void *) xbt_malloc(count * extent); int intra_rank, inter_rank; intra_rank = rank % num_core; @@ -91,7 +71,7 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf, int inter_comm_size = (comm_size + num_core - 1) / num_core; /* copy input buffer to output buffer */ - MPI_Sendrecv(send_buf, count, dtype, rank, tag, + smpi_mpi_sendrecv(send_buf, count, dtype, rank, tag, recv_buf, count, dtype, rank, tag, comm, &status); /* compute pipe length */ @@ -110,13 +90,13 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf, src = (inter_rank * num_core) + (intra_rank | mask); if (src < comm_size) { recv_offset = phase * pcount * extent; - MPI_Recv(tmp_buf, pcount, dtype, src, tag, comm, &status); - (*uop) (tmp_buf, (char *)recv_buf + recv_offset, &pcount, &dtype); + smpi_mpi_recv(tmp_buf, pcount, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, (char *)recv_buf + recv_offset, &pcount, &dtype); } } else { send_offset = phase * pcount * extent; dst = (inter_rank * num_core) + (intra_rank & (~mask)); - MPI_Send((char *)recv_buf + send_offset, pcount, dtype, dst, tag, comm); + smpi_mpi_send((char *)recv_buf + send_offset, pcount, dtype, dst, tag, comm); break; } mask <<= 1; @@ -134,13 +114,13 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf, src = (inter_rank | mask) * num_core; if (src < comm_size) { recv_offset = (phase - 1) * pcount * extent; - MPI_Recv(tmp_buf, pcount, dtype, src, tag, comm, &status); - (*uop) (tmp_buf, (char *)recv_buf + recv_offset, &pcount, &dtype); + smpi_mpi_recv(tmp_buf, pcount, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, (char *)recv_buf + recv_offset, &pcount, &dtype); } } else { dst = (inter_rank & (~mask)) * num_core; send_offset = (phase - 1) * pcount * extent; - MPI_Send((char *)recv_buf + send_offset, pcount, dtype, dst, tag, comm); + smpi_mpi_send((char *)recv_buf + send_offset, pcount, dtype, dst, tag, comm); break; } mask <<= 1; @@ -157,7 +137,7 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf, if (inter_rank & mask) { src = (inter_rank - mask) * num_core; recv_offset = (phase - 2) * pcount * extent; - MPI_Recv((char *)recv_buf + recv_offset, pcount, dtype, src, tag, comm, + smpi_mpi_recv((char *)recv_buf + recv_offset, pcount, dtype, src, tag, comm, &status); break; } @@ -171,7 +151,7 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf, if (dst < comm_size) { //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); send_offset = (phase - 2) * pcount * extent; - MPI_Send((char *)recv_buf + send_offset, pcount, dtype, dst, tag, comm); + smpi_mpi_send((char *)recv_buf + send_offset, pcount, dtype, dst, tag, comm); } } mask >>= 1; @@ -190,7 +170,7 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf, if (intra_rank & mask) { src = (inter_rank * num_core) + (intra_rank - mask); recv_offset = (phase - 3) * pcount * extent; - MPI_Recv((char *)recv_buf + recv_offset, pcount, dtype, src, tag, comm, + smpi_mpi_recv((char *)recv_buf + recv_offset, pcount, dtype, src, tag, comm, &status); break; } @@ -202,7 +182,7 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf, dst = (inter_rank * num_core) + (intra_rank + mask); if (dst < comm_size) { send_offset = (phase - 3) * pcount * extent; - MPI_Send((char *)recv_buf + send_offset, pcount, dtype, dst, tag, comm); + smpi_mpi_send((char *)recv_buf + send_offset, pcount, dtype, dst, tag, comm); } mask >>= 1; } diff --git a/src/smpi/colls/allreduce-smp-binomial.c b/src/smpi/colls/allreduce-smp-binomial.c index 17dbd402be..ed9b68c55d 100644 --- a/src/smpi/colls/allreduce-smp-binomial.c +++ b/src/smpi/colls/allreduce-smp-binomial.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific (however, number of cores/node need to be changed) all-reduce operation designed for smp clusters @@ -36,22 +36,12 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf, int mask, src, dst; int num_core = NUM_CORE; MPI_Status status; - /* - #ifdef MPICH2_REDUCTION - MPI_User_function * uop = MPIR_Op_table[op % 16 - 1]; - #else - MPI_User_function *uop; - struct MPIR_OP *op_ptr; - op_ptr = MPIR_ToPointer(op); - uop = op_ptr->op; - #endif - */ - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); - MPI_Aint extent; - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); + comm_size=smpi_comm_size(comm); + rank=smpi_comm_rank(comm); + MPI_Aint extent, lb; + smpi_datatype_extent(dtype, &lb, &extent); + tmp_buf = (void *) xbt_malloc(count * extent); /* compute intra and inter ranking */ int intra_rank, inter_rank; @@ -63,7 +53,7 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf, int inter_comm_size = (comm_size + num_core - 1) / num_core; /* copy input buffer to output buffer */ - MPI_Sendrecv(send_buf, count, dtype, rank, tag, + smpi_mpi_sendrecv(send_buf, count, dtype, rank, tag, recv_buf, count, dtype, rank, tag, comm, &status); /* start binomial reduce intra communication inside each SMP node */ @@ -72,12 +62,12 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf, if ((mask & intra_rank) == 0) { src = (inter_rank * num_core) + (intra_rank | mask); if (src < comm_size) { - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); - star_reduction(op, tmp_buf, recv_buf, &count, &dtype); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recv_buf, &count, &dtype); } } else { dst = (inter_rank * num_core) + (intra_rank & (~mask)); - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); break; } mask <<= 1; @@ -91,12 +81,12 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf, if ((mask & inter_rank) == 0) { src = (inter_rank | mask) * num_core; if (src < comm_size) { - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); - star_reduction(op, tmp_buf, recv_buf, &count, &dtype); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recv_buf, &count, &dtype); } } else { dst = (inter_rank & (~mask)) * num_core; - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); break; } mask <<= 1; @@ -110,7 +100,7 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf, while (mask < inter_comm_size) { if (inter_rank & mask) { src = (inter_rank - mask) * num_core; - MPI_Recv(recv_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(recv_buf, count, dtype, src, tag, comm, &status); break; } mask <<= 1; @@ -121,7 +111,7 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf, if (inter_rank < inter_comm_size) { dst = (inter_rank + mask) * num_core; if (dst < comm_size) { - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); } } mask >>= 1; @@ -137,7 +127,7 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf, while (mask < num_core_in_current_smp) { if (intra_rank & mask) { src = (inter_rank * num_core) + (intra_rank - mask); - MPI_Recv(recv_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(recv_buf, count, dtype, src, tag, comm, &status); break; } mask <<= 1; @@ -147,7 +137,7 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf, while (mask > 0) { dst = (inter_rank * num_core) + (intra_rank + mask); if (dst < comm_size) { - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); } mask >>= 1; } diff --git a/src/smpi/colls/allreduce-smp-rdb.c b/src/smpi/colls/allreduce-smp-rdb.c index 2bdfacdd67..d208584c01 100644 --- a/src/smpi/colls/allreduce-smp-rdb.c +++ b/src/smpi/colls/allreduce-smp-rdb.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /* IMPLEMENTED BY PITCH PATARASUK Non-topoloty-specific (however, number of cores/node need to be changed) all-reduce operation designed for smp clusters @@ -45,11 +45,11 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count, uop = op_ptr->op; #endif */ - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); MPI_Aint extent; - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); + extent = smpi_datatype_get_extent(dtype); + tmp_buf = (void *) xbt_malloc(count * extent); /* compute intra and inter ranking */ int intra_rank, inter_rank; @@ -61,7 +61,7 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count, int inter_comm_size = (comm_size + num_core - 1) / num_core; /* copy input buffer to output buffer */ - MPI_Sendrecv(send_buf, count, dtype, rank, tag, + smpi_mpi_sendrecv(send_buf, count, dtype, rank, tag, recv_buf, count, dtype, rank, tag, comm, &status); /* start binomial reduce intra communication inside each SMP node */ @@ -70,12 +70,12 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count, if ((mask & intra_rank) == 0) { src = (inter_rank * num_core) + (intra_rank | mask); if (src < comm_size) { - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); - star_reduction(op, tmp_buf, recv_buf, &count, &dtype); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recv_buf, &count, &dtype); } } else { dst = (inter_rank * num_core) + (intra_rank & (~mask)); - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); break; } mask <<= 1; @@ -103,12 +103,12 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count, if (inter_rank < 2 * rem) { if (inter_rank % 2 == 0) { dst = rank + num_core; - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); newrank = -1; } else { src = rank - num_core; - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); - star_reduction(op, tmp_buf, recv_buf, &count, &dtype); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recv_buf, &count, &dtype); newrank = inter_rank / 2; } } else { @@ -132,9 +132,9 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count, dst *= num_core; /* exchange data in rdb manner */ - MPI_Sendrecv(recv_buf, count, dtype, dst, tag, tmp_buf, count, dtype, + smpi_mpi_sendrecv(recv_buf, count, dtype, dst, tag, tmp_buf, count, dtype, dst, tag, comm, &status); - star_reduction(op, tmp_buf, recv_buf, &count, &dtype); + smpi_op_apply(op, tmp_buf, recv_buf, &count, &dtype); mask <<= 1; } } @@ -144,9 +144,9 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count, */ if (inter_rank < 2 * rem) { if (inter_rank % 2) { - MPI_Send(recv_buf, count, dtype, rank - num_core, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, rank - num_core, tag, comm); } else { - MPI_Recv(recv_buf, count, dtype, rank + num_core, tag, comm, &status); + smpi_mpi_recv(recv_buf, count, dtype, rank + num_core, tag, comm, &status); } } } @@ -160,7 +160,7 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count, while (mask < num_core_in_current_smp) { if (intra_rank & mask) { src = (inter_rank * num_core) + (intra_rank - mask); - MPI_Recv(recv_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(recv_buf, count, dtype, src, tag, comm, &status); break; } mask <<= 1; @@ -170,7 +170,7 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count, while (mask > 0) { dst = (inter_rank * num_core) + (intra_rank + mask); if (dst < comm_size) { - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); } mask >>= 1; } diff --git a/src/smpi/colls/allreduce-smp-rsag-lr.c b/src/smpi/colls/allreduce-smp-rsag-lr.c index 713ae314e7..fd49327c0d 100644 --- a/src/smpi/colls/allreduce-smp-rsag-lr.c +++ b/src/smpi/colls/allreduce-smp-rsag-lr.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" //#include /* change number of core per smp-node @@ -34,11 +34,11 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, uop = op_ptr->op; #endif */ - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); MPI_Aint extent; - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); + extent = smpi_datatype_get_extent(dtype); + tmp_buf = (void *) xbt_malloc(count * extent); int intra_rank, inter_rank; intra_rank = rank % num_core; @@ -54,7 +54,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, } - MPI_Sendrecv(send_buf, count, dtype, rank, tag, + smpi_mpi_sendrecv(send_buf, count, dtype, rank, tag, recv_buf, count, dtype, rank, tag, comm, &status); @@ -65,14 +65,14 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, src = (inter_rank * num_core) + (intra_rank | mask); // if (src < ((inter_rank + 1) * num_core)) { if (src < comm_size) { - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); - star_reduction(op, tmp_buf, recv_buf, &count, &dtype); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recv_buf, &count, &dtype); //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); } } else { dst = (inter_rank * num_core) + (intra_rank & (~mask)); - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); break; } @@ -119,12 +119,12 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, else recv_count = curr_size + curr_remainder; - MPI_Sendrecv((char *) recv_buf + send_offset, send_count, dtype, to, + smpi_mpi_sendrecv((char *) recv_buf + send_offset, send_count, dtype, to, tag + i, tmp_buf, recv_count, dtype, from, tag + i, comm, &status); // result is in rbuf - star_reduction(op, tmp_buf, (char *) recv_buf + recv_offset, &recv_count, + smpi_op_apply(op, tmp_buf, (char *) recv_buf + recv_offset, &recv_count, &dtype); } @@ -149,7 +149,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, else recv_count = curr_size + curr_remainder; - MPI_Sendrecv((char *) recv_buf + send_offset, send_count, dtype, to, + smpi_mpi_sendrecv((char *) recv_buf + send_offset, send_count, dtype, to, tag + i, (char *) recv_buf + recv_offset, recv_count, dtype, from, tag + i, comm, &status); @@ -169,14 +169,14 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, if ((mask & inter_rank) == 0) { src = (inter_rank | mask) * num_core; if (src < comm_size) { - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); (* uop) (tmp_buf, recv_buf, &count, &dtype); //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); } } else { dst = (inter_rank & (~mask)) * num_core; - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); break; } @@ -195,7 +195,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, if (inter_rank & mask) { src = (inter_rank - mask) * num_core; //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); - MPI_Recv(recv_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(recv_buf, count, dtype, src, tag, comm, &status); break; } mask <<= 1; @@ -209,7 +209,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, dst = (inter_rank + mask) * num_core; if (dst < comm_size) { //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); } } mask >>= 1; @@ -230,7 +230,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, if (intra_rank & mask) { src = (inter_rank * num_core) + (intra_rank - mask); //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); - MPI_Recv(recv_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(recv_buf, count, dtype, src, tag, comm, &status); break; } mask <<= 1; @@ -243,7 +243,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf, dst = (inter_rank * num_core) + (intra_rank + mask); if (dst < comm_size) { //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); } mask >>= 1; } diff --git a/src/smpi/colls/allreduce-smp-rsag-rab.c b/src/smpi/colls/allreduce-smp-rsag-rab.c index 8ccb479e18..c98b78d84e 100644 --- a/src/smpi/colls/allreduce-smp-rsag-rab.c +++ b/src/smpi/colls/allreduce-smp-rsag-rab.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /* * implemented by Pitch Patarasuk, 07/01/2007 */ @@ -28,11 +28,11 @@ int smpi_coll_tuned_allreduce_smp_rsag_rab(void *sbuf, void *rbuf, int count, MPI_Status status; int num_core = NUM_CORE; - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); MPI_Aint extent; - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); + extent = smpi_datatype_get_extent(dtype); + tmp_buf = (void *) xbt_malloc(count * extent); int intra_rank, inter_rank; intra_rank = rank % num_core; @@ -42,7 +42,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_rab(void *sbuf, void *rbuf, int count, int inter_comm_size = (comm_size + num_core - 1) / num_core; - MPI_Sendrecv(sbuf, count, dtype, rank, tag, + smpi_mpi_sendrecv(sbuf, count, dtype, rank, tag, rbuf, count, dtype, rank, tag, comm, &status); // SMP_binomial_reduce @@ -52,14 +52,14 @@ int smpi_coll_tuned_allreduce_smp_rsag_rab(void *sbuf, void *rbuf, int count, src = (inter_rank * num_core) + (intra_rank | mask); // if (src < ((inter_rank + 1) * num_core)) { if (src < comm_size) { - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); - star_reduction(op, tmp_buf, rbuf, &count, &dtype); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, rbuf, &count, &dtype); //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); } } else { dst = (inter_rank * num_core) + (intra_rank & (~mask)); - MPI_Send(rbuf, count, dtype, dst, tag, comm); + smpi_mpi_send(rbuf, count, dtype, dst, tag, comm); //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); break; } @@ -108,11 +108,11 @@ int smpi_coll_tuned_allreduce_smp_rsag_rab(void *sbuf, void *rbuf, int count, // if (rank==7) // printf("node %d send to %d in phase %d s_offset = %d r_offset = %d count = %d\n",rank,dst,phase, send_offset, recv_offset, curr_count); - MPI_Sendrecv((char *)rbuf + send_offset, curr_count, dtype, (dst * num_core), tag, + smpi_mpi_sendrecv((char *)rbuf + send_offset, curr_count, dtype, (dst * num_core), tag, tmp_buf, curr_count, dtype, (dst * num_core), tag, comm, &status); - star_reduction(op, tmp_buf, (char *)rbuf + recv_offset, &curr_count, &dtype); + smpi_op_apply(op, tmp_buf, (char *)rbuf + recv_offset, &curr_count, &dtype); mask *= 2; curr_count /= 2; @@ -155,7 +155,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_rab(void *sbuf, void *rbuf, int count, // if (rank==7) //printf("node %d send to %d in phase %d s_offset = %d r_offset = %d count = %d\n",rank,dst,phase, send_offset, recv_offset, curr_count); - MPI_Sendrecv((char *)rbuf + send_offset, curr_count, dtype, (dst * num_core), tag, + smpi_mpi_sendrecv((char *)rbuf + send_offset, curr_count, dtype, (dst * num_core), tag, (char *)rbuf + recv_offset, curr_count, dtype, (dst * num_core), tag, comm, &status); @@ -181,7 +181,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_rab(void *sbuf, void *rbuf, int count, if (intra_rank & mask) { src = (inter_rank * num_core) + (intra_rank - mask); //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); - MPI_Recv(rbuf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(rbuf, count, dtype, src, tag, comm, &status); break; } mask <<= 1; @@ -194,7 +194,7 @@ int smpi_coll_tuned_allreduce_smp_rsag_rab(void *sbuf, void *rbuf, int count, dst = (inter_rank * num_core) + (intra_rank + mask); if (dst < comm_size) { //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); - MPI_Send(rbuf, count, dtype, dst, tag, comm); + smpi_mpi_send(rbuf, count, dtype, dst, tag, comm); } mask >>= 1; } diff --git a/src/smpi/colls/allreduce-smp-rsag.c b/src/smpi/colls/allreduce-smp-rsag.c index a40f18979d..24ccaa0041 100644 --- a/src/smpi/colls/allreduce-smp-rsag.c +++ b/src/smpi/colls/allreduce-smp-rsag.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /* change number of core per smp-node we assume that number of core per process will be the same for all implementations */ @@ -33,11 +33,11 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, uop = op_ptr->op; #endif */ - MPI_Comm_size(comm, &comm_size); - MPI_Comm_rank(comm, &rank); + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); MPI_Aint extent; - MPI_Type_extent(dtype, &extent); - tmp_buf = (void *) malloc(count * extent); + extent = smpi_datatype_get_extent(dtype); + tmp_buf = (void *) xbt_malloc(count * extent); int intra_rank, inter_rank; intra_rank = rank % num_core; @@ -53,7 +53,7 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, } - MPI_Sendrecv(send_buf, count, dtype, rank, tag, + smpi_mpi_sendrecv(send_buf, count, dtype, rank, tag, recv_buf, count, dtype, rank, tag, comm, &status); @@ -64,14 +64,14 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, src = (inter_rank * num_core) + (intra_rank | mask); // if (src < ((inter_rank + 1) * num_core)) { if (src < comm_size) { - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); - star_reduction(op, tmp_buf, recv_buf, &count, &dtype); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recv_buf, &count, &dtype); //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); } } else { dst = (inter_rank * num_core) + (intra_rank & (~mask)); - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); break; } @@ -100,12 +100,12 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, ((inter_rank - 2 - i + inter_comm_size) % inter_comm_size) * seg_count * extent; - MPI_Sendrecv((char *) recv_buf + send_offset, seg_count, dtype, to, + smpi_mpi_sendrecv((char *) recv_buf + send_offset, seg_count, dtype, to, tag + i, tmp_buf, seg_count, dtype, from, tag + i, comm, &status); // result is in rbuf - star_reduction(op, tmp_buf, (char *) recv_buf + recv_offset, &seg_count, + smpi_op_apply(op, tmp_buf, (char *) recv_buf + recv_offset, &seg_count, &dtype); } @@ -119,7 +119,7 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, ((inter_rank - 1 - i + inter_comm_size) % inter_comm_size) * seg_count * extent; - MPI_Sendrecv((char *) recv_buf + send_offset, seg_count, dtype, to, + smpi_mpi_sendrecv((char *) recv_buf + send_offset, seg_count, dtype, to, tag + i, (char *) recv_buf + recv_offset, seg_count, dtype, from, tag + i, comm, &status); @@ -139,14 +139,14 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, if ((mask & inter_rank) == 0) { src = (inter_rank | mask) * num_core; if (src < comm_size) { - MPI_Recv(tmp_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(tmp_buf, count, dtype, src, tag, comm, &status); (* uop) (tmp_buf, recv_buf, &count, &dtype); //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); } } else { dst = (inter_rank & (~mask)) * num_core; - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); break; } @@ -165,7 +165,7 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, if (inter_rank & mask) { src = (inter_rank - mask) * num_core; //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); - MPI_Recv(recv_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(recv_buf, count, dtype, src, tag, comm, &status); break; } mask <<= 1; @@ -179,7 +179,7 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, dst = (inter_rank + mask) * num_core; if (dst < comm_size) { //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); } } mask >>= 1; @@ -200,7 +200,7 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, if (intra_rank & mask) { src = (inter_rank * num_core) + (intra_rank - mask); //printf("Node %d recv from node %d when mask is %d\n", rank, src, mask); - MPI_Recv(recv_buf, count, dtype, src, tag, comm, &status); + smpi_mpi_recv(recv_buf, count, dtype, src, tag, comm, &status); break; } mask <<= 1; @@ -213,7 +213,7 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf, dst = (inter_rank * num_core) + (intra_rank + mask); if (dst < comm_size) { //printf("Node %d send to node %d when mask is %d\n", rank, dst, mask); - MPI_Send(recv_buf, count, dtype, dst, tag, comm); + smpi_mpi_send(recv_buf, count, dtype, dst, tag, comm); } mask >>= 1; } diff --git a/src/smpi/colls/alltoall-2dmesh.c b/src/smpi/colls/alltoall-2dmesh.c index b1ac1ebe80..61ea21efe8 100644 --- a/src/smpi/colls/alltoall-2dmesh.c +++ b/src/smpi/colls/alltoall-2dmesh.c @@ -1,9 +1,6 @@ -#include "colls.h" +#include "colls_private.h" #include -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_colls, smpi, - "Logging specific to SMPI collectives"); - /***************************************************************************** * Function: alltoall_2dmesh_shoot @@ -63,47 +60,29 @@ int smpi_coll_tuned_alltoall_2dmesh(void *send_buff, int send_count, int i, j, src, dst, rank, num_procs, count, num_reqs; int X, Y, send_offset, recv_offset; int my_row_base, my_col_base, src_row_base, block_size; - int tag = 1, failure = 0, success = 1; + int tag = 1; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &extent); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(send_type); if (!alltoall_check_is_2dmesh(num_procs, &X, &Y)) - return failure; + return MPI_ERR_OTHER; my_row_base = (rank / Y) * Y; my_col_base = rank % Y; block_size = extent * send_count; - tmp_buff1 = (char *) malloc(block_size * num_procs * Y); - if (!tmp_buff1) { - XBT_DEBUG("alltoall-2dmesh_shoot.c:88: cannot allocate memory"); - MPI_Finalize(); - exit(failure); - } - - tmp_buff2 = (char *) malloc(block_size * Y); - if (!tmp_buff2) { - XBT_WARN("alltoall-2dmesh_shoot.c:88: cannot allocate memory"); - MPI_Finalize(); - exit(failure); - } - - + tmp_buff1 = (char *) xbt_malloc(block_size * num_procs * Y); + tmp_buff2 = (char *) xbt_malloc(block_size * Y); num_reqs = X; if (Y > X) num_reqs = Y; - statuses = (MPI_Status *) malloc(num_reqs * sizeof(MPI_Status)); - reqs = (MPI_Request *) malloc(num_reqs * sizeof(MPI_Request)); - if (!reqs) { - XBT_WARN("alltoall-2dmesh_shoot.c:88: cannot allocate memory"); - MPI_Finalize(); - exit(failure); - } + statuses = (MPI_Status *) xbt_malloc(num_reqs * sizeof(MPI_Status)); + reqs = (MPI_Request *) xbt_malloc(num_reqs * sizeof(MPI_Request)); req_ptr = reqs; @@ -117,18 +96,17 @@ int smpi_coll_tuned_alltoall_2dmesh(void *send_buff, int send_count, continue; recv_offset = (src % Y) * block_size * num_procs; - MPI_Irecv(tmp_buff1 + recv_offset, count, recv_type, src, tag, comm, - req_ptr++); + *(req_ptr++) = smpi_mpi_irecv(tmp_buff1 + recv_offset, count, recv_type, src, tag, comm); } for (i = 0; i < Y; i++) { dst = i + my_row_base; if (dst == rank) continue; - MPI_Send(send_buff, count, send_type, dst, tag, comm); + smpi_mpi_send(send_buff, count, send_type, dst, tag, comm); } - MPI_Waitall(Y - 1, reqs, statuses); + smpi_mpi_waitall(Y - 1, reqs, statuses); req_ptr = reqs; for (i = 0; i < Y; i++) { @@ -136,13 +114,13 @@ int smpi_coll_tuned_alltoall_2dmesh(void *send_buff, int send_count, recv_offset = (my_row_base * block_size) + (i * block_size); if (i + my_row_base == rank) - MPI_Sendrecv((char *) send_buff + recv_offset, send_count, send_type, + smpi_mpi_sendrecv((char *) send_buff + recv_offset, send_count, send_type, rank, tag, (char *) recv_buff + recv_offset, recv_count, recv_type, rank, tag, comm, &s); else - MPI_Sendrecv(tmp_buff1 + send_offset, send_count, send_type, + smpi_mpi_sendrecv(tmp_buff1 + send_offset, send_count, send_type, rank, tag, (char *) recv_buff + recv_offset, recv_count, recv_type, rank, tag, comm, &s); @@ -155,8 +133,8 @@ int smpi_coll_tuned_alltoall_2dmesh(void *send_buff, int send_count, continue; src_row_base = (src / Y) * Y; - MPI_Irecv((char *) recv_buff + src_row_base * block_size, recv_count * Y, - recv_type, src, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv((char *) recv_buff + src_row_base * block_size, recv_count * Y, + recv_type, src, tag, comm); } for (i = 0; i < X; i++) { @@ -169,11 +147,11 @@ int smpi_coll_tuned_alltoall_2dmesh(void *send_buff, int send_count, send_offset = (dst + j * num_procs) * block_size; if (j + my_row_base == rank) - MPI_Sendrecv((char *) send_buff + dst * block_size, send_count, + smpi_mpi_sendrecv((char *) send_buff + dst * block_size, send_count, send_type, rank, tag, tmp_buff2 + recv_offset, recv_count, recv_type, rank, tag, comm, &s); else - MPI_Sendrecv(tmp_buff1 + send_offset, send_count, send_type, + smpi_mpi_sendrecv(tmp_buff1 + send_offset, send_count, send_type, rank, tag, tmp_buff2 + recv_offset, recv_count, recv_type, rank, tag, comm, &s); @@ -181,12 +159,12 @@ int smpi_coll_tuned_alltoall_2dmesh(void *send_buff, int send_count, recv_offset += block_size; } - MPI_Send(tmp_buff2, send_count * Y, send_type, dst, tag, comm); + smpi_mpi_send(tmp_buff2, send_count * Y, send_type, dst, tag, comm); } - MPI_Waitall(X - 1, reqs, statuses); + smpi_mpi_waitall(X - 1, reqs, statuses); free(reqs); free(statuses); free(tmp_buff1); free(tmp_buff2); - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-3dmesh.c b/src/smpi/colls/alltoall-3dmesh.c index cae32a23b0..ca10de7191 100644 --- a/src/smpi/colls/alltoall-3dmesh.c +++ b/src/smpi/colls/alltoall-3dmesh.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #include /***************************************************************************** @@ -50,16 +50,16 @@ int smpi_coll_tuned_alltoall_3dmesh(void *send_buff, int send_count, MPI_Status status, *statuses; int i, j, src, dst, rank, num_procs, num_reqs, X, Y, Z, block_size, count; int my_z, two_dsize, my_row_base, my_col_base, my_z_base, src_row_base; - int src_z_base, send_offset, recv_offset, tag = 1, failure = 0, success = 1; + int src_z_base, send_offset, recv_offset, tag = 1; char *tmp_buff1, *tmp_buff2; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &extent); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(send_type); if (!alltoall_check_is_3dmesh(num_procs, &X, &Y, &Z)) - return failure; + return MPI_ERR_OTHER; num_reqs = X; if (Y > X) @@ -76,33 +76,17 @@ int smpi_coll_tuned_alltoall_3dmesh(void *send_buff, int send_count, block_size = extent * send_count; - tmp_buff1 = (char *) malloc(block_size * num_procs * two_dsize); - if (!tmp_buff1) { - printf("alltoall-3Dmesh:97: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } - - tmp_buff2 = (char *) malloc(block_size * two_dsize); - if (!tmp_buff2) { - printf("alltoall-3Dmesh:105: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } + tmp_buff1 = (char *) xbt_malloc(block_size * num_procs * two_dsize); + tmp_buff2 = (char *) xbt_malloc(block_size * two_dsize); - statuses = (MPI_Status *) malloc(num_reqs * sizeof(MPI_Status)); - reqs = (MPI_Request *) malloc(num_reqs * sizeof(MPI_Request)); - if (!reqs) { - printf("alltoall-3Dmesh:113: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } + statuses = (MPI_Status *) xbt_malloc(num_reqs * sizeof(MPI_Status)); + reqs = (MPI_Request *) xbt_malloc(num_reqs * sizeof(MPI_Request)); req_ptr = reqs; send_offset = recv_offset = (rank % two_dsize) * block_size * num_procs; - MPI_Sendrecv(send_buff, send_count * num_procs, send_type, rank, tag, + smpi_mpi_sendrecv(send_buff, send_count * num_procs, send_type, rank, tag, tmp_buff1 + recv_offset, num_procs * recv_count, recv_type, rank, tag, comm, &status); @@ -113,18 +97,17 @@ int smpi_coll_tuned_alltoall_3dmesh(void *send_buff, int send_count, if (src == rank) continue; recv_offset = (src % two_dsize) * block_size * num_procs; - MPI_Irecv(tmp_buff1 + recv_offset, count, recv_type, src, tag, comm, - req_ptr++); + *(req_ptr++) = smpi_mpi_irecv(tmp_buff1 + recv_offset, count, recv_type, src, tag, comm); } for (i = 0; i < Y; i++) { dst = i + my_row_base; if (dst == rank) continue; - MPI_Send(send_buff, count, send_type, dst, tag, comm); + smpi_mpi_send(send_buff, count, send_type, dst, tag, comm); } - MPI_Waitall(Y - 1, reqs, statuses); + smpi_mpi_waitall(Y - 1, reqs, statuses); req_ptr = reqs; @@ -136,8 +119,8 @@ int smpi_coll_tuned_alltoall_3dmesh(void *send_buff, int send_count, src_row_base = (src / X) * X; recv_offset = (src_row_base % two_dsize) * block_size * num_procs; - MPI_Irecv(tmp_buff1 + recv_offset, recv_count * num_procs * Y, - recv_type, src, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv(tmp_buff1 + recv_offset, recv_count * num_procs * Y, + recv_type, src, tag, comm); } send_offset = (my_row_base % two_dsize) * block_size * num_procs; @@ -145,17 +128,17 @@ int smpi_coll_tuned_alltoall_3dmesh(void *send_buff, int send_count, dst = (i * Y + my_col_base); if (dst == rank) continue; - MPI_Send(tmp_buff1 + send_offset, send_count * num_procs * Y, send_type, + smpi_mpi_send(tmp_buff1 + send_offset, send_count * num_procs * Y, send_type, dst, tag, comm); } - MPI_Waitall(X - 1, reqs, statuses); + smpi_mpi_waitall(X - 1, reqs, statuses); req_ptr = reqs; for (i = 0; i < two_dsize; i++) { send_offset = (rank * block_size) + (i * block_size * num_procs); recv_offset = (my_z_base * block_size) + (i * block_size); - MPI_Sendrecv(tmp_buff1 + send_offset, send_count, send_type, rank, tag, + smpi_mpi_sendrecv(tmp_buff1 + send_offset, send_count, send_type, rank, tag, (char *) recv_buff + recv_offset, recv_count, recv_type, rank, tag, comm, &status); } @@ -166,8 +149,8 @@ int smpi_coll_tuned_alltoall_3dmesh(void *send_buff, int send_count, recv_offset = (src_z_base * block_size); - MPI_Irecv((char *) recv_buff + recv_offset, recv_count * two_dsize, - recv_type, src, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_irecv((char *) recv_buff + recv_offset, recv_count * two_dsize, + recv_type, src, tag, comm); } for (i = 1; i < Z; i++) { @@ -176,22 +159,22 @@ int smpi_coll_tuned_alltoall_3dmesh(void *send_buff, int send_count, recv_offset = 0; for (j = 0; j < two_dsize; j++) { send_offset = (dst + j * num_procs) * block_size; - MPI_Sendrecv(tmp_buff1 + send_offset, send_count, send_type, + smpi_mpi_sendrecv(tmp_buff1 + send_offset, send_count, send_type, rank, tag, tmp_buff2 + recv_offset, recv_count, recv_type, rank, tag, comm, &status); recv_offset += block_size; } - MPI_Send(tmp_buff2, send_count * two_dsize, send_type, dst, tag, comm); + smpi_mpi_send(tmp_buff2, send_count * two_dsize, send_type, dst, tag, comm); } - MPI_Waitall(Z - 1, reqs, statuses); + smpi_mpi_waitall(Z - 1, reqs, statuses); free(reqs); free(statuses); free(tmp_buff1); free(tmp_buff2); - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-bruck.c b/src/smpi/colls/alltoall-bruck.c index d6e12c25e0..d38b3e59cc 100644 --- a/src/smpi/colls/alltoall-bruck.c +++ b/src/smpi/colls/alltoall-bruck.c @@ -30,46 +30,28 @@ smpi_coll_tuned_alltoall_bruck(void *send_buff, int send_count, int *blocks_length, *disps; int i, src, dst, rank, num_procs, count, remainder, block, position; - int pack_size, tag = 1, pof2 = 1, success = 1, failure = 0; + int pack_size, tag = 1, pof2 = 1; char *tmp_buff; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_size(comm, &num_procs); - MPI_Comm_rank(comm, &rank); + num_procs = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); - MPI_Type_extent(recv_type, &extent); - - tmp_buff = (char *) malloc(num_procs * recv_count * extent); - if (!tmp_buff) { - printf("alltoall-bruck:53: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } - - disps = (int *) malloc(sizeof(int) * num_procs); - if (!disps) { - printf("alltoall-bruck:61: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } - - blocks_length = (int *) malloc(sizeof(int) * num_procs); - if (!blocks_length) { - printf("alltoall-bruck:69: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } + extent = smpi_datatype_get_extent(recv_type); + tmp_buff = (char *) xbt_malloc(num_procs * recv_count * extent); + disps = (int *) xbt_malloc(sizeof(int) * num_procs); + blocks_length = (int *) xbt_malloc(sizeof(int) * num_procs); - MPI_Sendrecv(send_ptr + rank * send_count * extent, + smpi_mpi_sendrecv(send_ptr + rank * send_count * extent, (num_procs - rank) * send_count, send_type, rank, tag, recv_ptr, (num_procs - rank) * recv_count, recv_type, rank, tag, comm, &status); - MPI_Sendrecv(send_ptr, rank * send_count, send_type, rank, tag, + smpi_mpi_sendrecv(send_ptr, rank * send_count, send_type, rank, tag, recv_ptr + (num_procs - rank) * recv_count * extent, rank * recv_count, recv_type, rank, tag, comm, &status); @@ -91,14 +73,14 @@ smpi_coll_tuned_alltoall_bruck(void *send_buff, int send_count, } MPI_Type_indexed(count, blocks_length, disps, recv_type, &new_type); - MPI_Type_commit(&new_type); + smpi_datatype_commit(&new_type); position = 0; MPI_Pack(recv_buff, 1, new_type, tmp_buff, pack_size, &position, comm); - MPI_Sendrecv(tmp_buff, position, MPI_PACKED, dst, tag, recv_buff, 1, + smpi_mpi_sendrecv(tmp_buff, position, MPI_PACKED, dst, tag, recv_buff, 1, new_type, src, tag, comm, &status); - MPI_Type_free(&new_type); + smpi_datatype_free(&new_type); pof2 *= 2; } @@ -106,22 +88,22 @@ smpi_coll_tuned_alltoall_bruck(void *send_buff, int send_count, free(disps); free(blocks_length); - MPI_Sendrecv(recv_ptr + (rank + 1) * recv_count * extent, + smpi_mpi_sendrecv(recv_ptr + (rank + 1) * recv_count * extent, (num_procs - rank - 1) * recv_count, send_type, rank, tag, tmp_buff, (num_procs - rank - 1) * recv_count, recv_type, rank, tag, comm, &status); - MPI_Sendrecv(recv_ptr, (rank + 1) * recv_count, send_type, rank, tag, + smpi_mpi_sendrecv(recv_ptr, (rank + 1) * recv_count, send_type, rank, tag, tmp_buff + (num_procs - rank - 1) * recv_count * extent, (rank + 1) * recv_count, recv_type, rank, tag, comm, &status); for (i = 0; i < num_procs; i++) - MPI_Sendrecv(tmp_buff + i * recv_count * extent, recv_count, send_type, + smpi_mpi_sendrecv(tmp_buff + i * recv_count * extent, recv_count, send_type, rank, tag, recv_ptr + (num_procs - i - 1) * recv_count * extent, recv_count, recv_type, rank, tag, comm, &status); free(tmp_buff); - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-pair-light-barrier.c b/src/smpi/colls/alltoall-pair-light-barrier.c index c26f57ed6f..96cf68d0f9 100644 --- a/src/smpi/colls/alltoall-pair-light-barrier.c +++ b/src/smpi/colls/alltoall-pair-light-barrier.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** * Function: alltoall_pair_light_barrier @@ -31,36 +31,36 @@ smpi_coll_tuned_alltoall_pair_light_barrier(void *send_buff, int send_count, MPI_Aint send_chunk, recv_chunk; MPI_Status s; int i, src, dst, rank, num_procs, next_partner; - int tag = 1, success = 1; /*, failure = 0; */ + int tag = 1; /*, failure = 0; */ char send_sync = 'a', recv_sync = 'b'; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); send_chunk *= send_count; recv_chunk *= recv_count; - MPI_Sendrecv(send_ptr + rank * send_chunk, send_count, send_type, rank, tag, + smpi_mpi_sendrecv(send_ptr + rank * send_chunk, send_count, send_type, rank, tag, recv_ptr + rank * recv_chunk, recv_count, recv_type, rank, tag, comm, &s); for (i = 1; i < num_procs; i++) { src = dst = rank ^ i; - MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, + smpi_mpi_sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, tag, recv_ptr + src * recv_chunk, recv_count, recv_type, src, tag, comm, &s); if ((i + 1) < num_procs) { next_partner = rank ^ (i + 1); - MPI_Sendrecv(&send_sync, 1, MPI_CHAR, next_partner, tag, + smpi_mpi_sendrecv(&send_sync, 1, MPI_CHAR, next_partner, tag, &recv_sync, 1, MPI_CHAR, next_partner, tag, comm, &s); } } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-pair-mpi-barrier.c b/src/smpi/colls/alltoall-pair-mpi-barrier.c index bbd6286487..f12c3f92a6 100644 --- a/src/smpi/colls/alltoall-pair-mpi-barrier.c +++ b/src/smpi/colls/alltoall-pair-mpi-barrier.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** * Function: alltoall_pair_mpi_barrier @@ -30,24 +30,24 @@ smpi_coll_tuned_alltoall_pair_mpi_barrier(void *send_buff, int send_count, MPI_Status s; MPI_Aint send_chunk, recv_chunk; int i, src, dst, rank, num_procs; - int tag = 101, success = 1; /*, failure = 0, pof2 = 1; */ + int tag = 101; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); send_chunk *= send_count; recv_chunk *= recv_count; for (i = 0; i < num_procs; i++) { src = dst = rank ^ i; - MPI_Barrier(comm); - MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, + smpi_mpi_barrier(comm); + smpi_mpi_sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, tag, recv_ptr + src * recv_chunk, recv_count, recv_type, src, tag, comm, &s); } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-pair-one-barrier.c b/src/smpi/colls/alltoall-pair-one-barrier.c index 3de912a13f..19e693d447 100644 --- a/src/smpi/colls/alltoall-pair-one-barrier.c +++ b/src/smpi/colls/alltoall-pair-one-barrier.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** * Function: alltoall_pair @@ -30,26 +30,26 @@ smpi_coll_tuned_alltoall_pair_one_barrier(void *send_buff, int send_count, MPI_Aint send_chunk, recv_chunk; MPI_Status s; int i, src, dst, rank, num_procs; - int tag = 1, success = 1; /*, failure = 0, pof2 = 1; */ + int tag = 1; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); send_chunk *= send_count; recv_chunk *= recv_count; - MPI_Barrier(comm); + smpi_mpi_barrier(comm); for (i = 0; i < num_procs; i++) { src = dst = rank ^ i; - MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, + smpi_mpi_sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, tag, recv_ptr + src * recv_chunk, recv_count, recv_type, src, tag, comm, &s); } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-pair.c b/src/smpi/colls/alltoall-pair.c index f5c5a94dec..24ef5f769c 100644 --- a/src/smpi/colls/alltoall-pair.c +++ b/src/smpi/colls/alltoall-pair.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -37,10 +37,10 @@ int alltoall_pair(void *send_buff, int send_count, MPI_Datatype send_type, char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); MPI_Win_create(recv_buff, num_procs * recv_chunk * send_count, recv_chunk, 0, comm, &win); @@ -68,25 +68,24 @@ int smpi_coll_tuned_alltoall_pair(void *send_buff, int send_count, MPI_Aint send_chunk, recv_chunk; MPI_Status s; int i, src, dst, rank, num_procs; - int tag = 1, success = 1; - + int tag = 1; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); send_chunk *= send_count; recv_chunk *= recv_count; for (i = 0; i < num_procs; i++) { src = dst = rank ^ i; - MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, - tag, recv_ptr + src * recv_chunk, recv_count, recv_type, - src, tag, comm, &s); + smpi_mpi_sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, tag, + recv_ptr + src * recv_chunk, recv_count, recv_type, src, tag, + comm, &s); } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-rdb.c b/src/smpi/colls/alltoall-rdb.c index 406d98ded9..45b529f16a 100644 --- a/src/smpi/colls/alltoall-rdb.c +++ b/src/smpi/colls/alltoall-rdb.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -32,34 +32,29 @@ int smpi_coll_tuned_alltoall_rdb(void *send_buff, int send_count, int dst_tree_root, rank_tree_root, send_offset, recv_offset; int rank, num_procs, j, k, dst, curr_size, max_size; - int last_recv_count, tmp_mask, tree_root, num_procs_completed; - int tag = 1, mask = 1, success = 1, failure = 0, i = 0; + int last_recv_count = 0, tmp_mask, tree_root, num_procs_completed; + int tag = 1, mask = 1, i = 0; char *tmp_buff; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_size(comm, &num_procs); - MPI_Comm_rank(comm, &rank); - MPI_Type_extent(send_type, &send_increment); - MPI_Type_extent(recv_type, &recv_increment); - MPI_Type_extent(recv_type, &extent); + num_procs = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + send_increment = smpi_datatype_get_extent(send_type); + recv_increment = smpi_datatype_get_extent(recv_type); + extent = smpi_datatype_get_extent(recv_type); send_increment *= (send_count * num_procs); recv_increment *= (recv_count * num_procs); max_size = num_procs * recv_increment; - tmp_buff = (char *) malloc(max_size); - if (!tmp_buff) { - printf("alltoall-rdb:56: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } + tmp_buff = (char *) xbt_malloc(max_size); curr_size = send_count * num_procs; - MPI_Sendrecv(send_ptr, curr_size, send_type, rank, tag, + smpi_mpi_sendrecv(send_ptr, curr_size, send_type, rank, tag, tmp_buff + (rank * recv_increment), curr_size, recv_type, rank, tag, comm, &status); @@ -73,11 +68,11 @@ int smpi_coll_tuned_alltoall_rdb(void *send_buff, int send_count, recv_offset = dst_tree_root * recv_increment; if (dst < num_procs) { - MPI_Sendrecv(tmp_buff + send_offset, curr_size, send_type, dst, tag, + smpi_mpi_sendrecv(tmp_buff + send_offset, curr_size, send_type, dst, tag, tmp_buff + recv_offset, mask * recv_count * num_procs, recv_type, dst, tag, comm, &status); - MPI_Get_count(&status, recv_type, &last_recv_count); + last_recv_count = smpi_mpi_get_count(&status, recv_type); curr_size += last_recv_count; } @@ -115,7 +110,7 @@ int smpi_coll_tuned_alltoall_rdb(void *send_buff, int send_count, if ((dst > rank) && (rank < tree_root + num_procs_completed) && (dst >= tree_root + num_procs_completed)) { - MPI_Send(tmp_buff + dst_tree_root * send_increment, + smpi_mpi_send(tmp_buff + dst_tree_root * send_increment, last_recv_count, send_type, dst, tag, comm); } @@ -126,11 +121,11 @@ int smpi_coll_tuned_alltoall_rdb(void *send_buff, int send_count, else if ((dst < rank) && (dst < tree_root + num_procs_completed) && (rank >= tree_root + num_procs_completed)) { - MPI_Recv(tmp_buff + dst_tree_root * send_increment, + smpi_mpi_recv(tmp_buff + dst_tree_root * send_increment, mask * num_procs * send_count, send_type, dst, tag, comm, &status); - MPI_Get_count(&status, send_type, &last_recv_count); + last_recv_count = smpi_mpi_get_count(&status, send_type); curr_size += last_recv_count; } @@ -144,10 +139,10 @@ int smpi_coll_tuned_alltoall_rdb(void *send_buff, int send_count, } for (i = 0; i < num_procs; i++) - MPI_Sendrecv(tmp_buff + (rank + i * num_procs) * send_count * extent, + smpi_mpi_sendrecv(tmp_buff + (rank + i * num_procs) * send_count * extent, send_count, send_type, rank, tag, recv_ptr + (i * recv_count * extent), recv_count, recv_type, rank, tag, comm, &status); free(tmp_buff); - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-ring-light-barrier.c b/src/smpi/colls/alltoall-ring-light-barrier.c index f90144525a..d45912bc6a 100644 --- a/src/smpi/colls/alltoall-ring-light-barrier.c +++ b/src/smpi/colls/alltoall-ring-light-barrier.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** * Function: alltoall_ring_light_barrier @@ -31,21 +31,21 @@ smpi_coll_tuned_alltoall_ring_light_barrier(void *send_buff, int send_count, MPI_Aint send_chunk, recv_chunk; MPI_Status s; int i, src, dst, rank, num_procs, next_dst, next_src; - int tag = 1, success = 1; /*, failure = 0; */ + int tag = 1; char send_sync = 'a', recv_sync = 'b'; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); send_chunk *= send_count; recv_chunk *= recv_count; - MPI_Sendrecv(send_ptr + rank * send_chunk, send_count, send_type, rank, tag, + smpi_mpi_sendrecv(send_ptr + rank * send_chunk, send_count, send_type, rank, tag, recv_ptr + rank * recv_chunk, recv_count, recv_type, rank, tag, comm, &s); @@ -53,18 +53,18 @@ smpi_coll_tuned_alltoall_ring_light_barrier(void *send_buff, int send_count, src = (rank - i + num_procs) % num_procs; dst = (rank + i) % num_procs; - MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, + smpi_mpi_sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, tag, recv_ptr + src * recv_chunk, recv_count, recv_type, src, tag, comm, &s); if ((i + 1) < num_procs) { next_src = (rank - (i + 1) + num_procs) % num_procs; next_dst = (rank + (i + 1) + num_procs) % num_procs; - MPI_Sendrecv(&send_sync, 1, MPI_CHAR, next_src, tag, + smpi_mpi_sendrecv(&send_sync, 1, MPI_CHAR, next_src, tag, &recv_sync, 1, MPI_CHAR, next_dst, tag, comm, &s); } } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-ring-mpi-barrier.c b/src/smpi/colls/alltoall-ring-mpi-barrier.c index aaa6ac73d6..e3a3f2da8f 100644 --- a/src/smpi/colls/alltoall-ring-mpi-barrier.c +++ b/src/smpi/colls/alltoall-ring-mpi-barrier.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** * Function: alltoall_ring_mpi_barrier @@ -29,15 +29,15 @@ smpi_coll_tuned_alltoall_ring_mpi_barrier(void *send_buff, int send_count, MPI_Status s; MPI_Aint send_chunk, recv_chunk; int i, src, dst, rank, num_procs; - int tag = 1, success = 1; /*, failure = 0, pof2 = 1; */ + int tag = 1; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); send_chunk *= send_count; recv_chunk *= recv_count; @@ -46,11 +46,11 @@ smpi_coll_tuned_alltoall_ring_mpi_barrier(void *send_buff, int send_count, src = (rank - i + num_procs) % num_procs; dst = (rank + i) % num_procs; - MPI_Barrier(comm); - MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, + smpi_mpi_barrier(comm); + smpi_mpi_sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, tag, recv_ptr + src * recv_chunk, recv_count, recv_type, src, tag, comm, &s); } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-ring-one-barrier.c b/src/smpi/colls/alltoall-ring-one-barrier.c index e008cfb635..97b912b28c 100644 --- a/src/smpi/colls/alltoall-ring-one-barrier.c +++ b/src/smpi/colls/alltoall-ring-one-barrier.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** * Function: alltoall_ring @@ -28,27 +28,27 @@ smpi_coll_tuned_alltoall_ring_one_barrier(void *send_buff, int send_count, MPI_Status s; MPI_Aint send_chunk, recv_chunk; int i, src, dst, rank, num_procs; - int tag = 1, success = 1; /*, failure = 0, pof2 = 1; */ + int tag = 1; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); send_chunk *= send_count; recv_chunk *= recv_count; - MPI_Barrier(comm); + smpi_mpi_barrier(comm); for (i = 0; i < num_procs; i++) { src = (rank - i + num_procs) % num_procs; dst = (rank + i) % num_procs; - MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, + smpi_mpi_sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, tag, recv_ptr + src * recv_chunk, recv_count, recv_type, src, tag, comm, &s); } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-ring.c b/src/smpi/colls/alltoall-ring.c index 91976090bb..622fd9dbda 100644 --- a/src/smpi/colls/alltoall-ring.c +++ b/src/smpi/colls/alltoall-ring.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** * Function: alltoall_ring @@ -28,15 +28,15 @@ smpi_coll_tuned_alltoall_ring(void *send_buff, int send_count, MPI_Status s; MPI_Aint send_chunk, recv_chunk; int i, src, dst, rank, num_procs; - int tag = 1, success = 1; /*, failure = 0, pof2 = 1 */ ; + int tag = 11; char *send_ptr = (char *) send_buff; char *recv_ptr = (char *) recv_buff; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(send_type, &send_chunk); - MPI_Type_extent(recv_type, &recv_chunk); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); send_chunk *= send_count; recv_chunk *= recv_count; @@ -45,9 +45,9 @@ smpi_coll_tuned_alltoall_ring(void *send_buff, int send_count, src = (rank - i + num_procs) % num_procs; dst = (rank + i) % num_procs; - MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, + smpi_mpi_sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst, tag, recv_ptr + src * recv_chunk, recv_count, recv_type, src, tag, comm, &s); } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoall-simple.c b/src/smpi/colls/alltoall-simple.c index dd64a1d208..fa50a8c2eb 100644 --- a/src/smpi/colls/alltoall-simple.c +++ b/src/smpi/colls/alltoall-simple.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -27,7 +27,7 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count, void *recv_buff, int recv_count, MPI_Datatype recv_type, MPI_Comm comm) { - int i, rank, size, nreqs, err, src, dst, tag = 101; + int i, rank, size, nreqs, src, dst, tag = 101; char *psnd; char *prcv; MPI_Aint sndinc; @@ -38,10 +38,10 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count, MPI_Status s, *statuses; - MPI_Comm_size(comm, &size); - MPI_Comm_rank(comm, &rank); - MPI_Type_extent(send_type, &sndinc); - MPI_Type_extent(recv_type, &rcvinc); + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + sndinc = smpi_datatype_get_extent(send_type); + rcvinc = smpi_datatype_get_extent(recv_type); sndinc *= send_count; rcvinc *= recv_count; @@ -49,13 +49,8 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count, nreqs = 2 * (size - 1); if (nreqs > 0) { - req = (MPI_Request *) malloc(nreqs * sizeof(MPI_Request)); - statuses = (MPI_Status *) malloc(nreqs * sizeof(MPI_Status)); - if (!req || !statuses) { - free(req); - free(statuses); - return 0; - } + req = (MPI_Request *) xbt_malloc(nreqs * sizeof(MPI_Request)); + statuses = (MPI_Status *) xbt_malloc(nreqs * sizeof(MPI_Status)); } else { req = NULL; statuses = NULL; @@ -65,7 +60,7 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count, psnd = ((char *) send_buff) + (rank * sndinc); prcv = ((char *) recv_buff) + (rank * rcvinc); - MPI_Sendrecv(psnd, send_count, send_type, rank, tag, + smpi_mpi_sendrecv(psnd, send_count, send_type, rank, tag, prcv, recv_count, recv_type, rank, tag, comm, &s); @@ -81,42 +76,26 @@ int smpi_coll_tuned_alltoall_simple(void *send_buff, int send_count, continue; if (dst == rank) continue; - MPI_Recv_init(prcv + (src * rcvinc), recv_count, recv_type, src, - tag, comm, preq++); - MPI_Send_init(psnd + (dst * sndinc), send_count, send_type, dst, - tag, comm, qreq++); + *(preq++) = smpi_mpi_recv_init(prcv + (src * rcvinc), recv_count, recv_type, src, + tag, comm); + *(qreq++) = smpi_mpi_send_init(psnd + (dst * sndinc), send_count, send_type, dst, + tag, comm); } /* Start all the requests. */ - err = MPI_Startall(nreqs, req); + smpi_mpi_startall(nreqs, req); /* Wait for them all. */ - err = MPI_Waitall(nreqs, req, statuses); + smpi_mpi_waitall(nreqs, req, statuses); - if (err != MPI_SUCCESS) { - if (req) - free((char *) req); - return err; - } - - for (i = 0, preq = req; i < nreqs; ++i, ++preq) { - err = MPI_Request_free(preq); - if (err != MPI_SUCCESS) { - if (req) - free((char *) req); - if (statuses) - free(statuses); - return err; - } - } /* All done */ if (req) - free((char *) req); + xbt_free((char *) req); if (statuses) - free(statuses); - return (1); + xbt_free(statuses); + return MPI_SUCCESS; } diff --git a/src/smpi/colls/alltoallv-bruck.c b/src/smpi/colls/alltoallv-bruck.c new file mode 100644 index 0000000000..02967980a0 --- /dev/null +++ b/src/smpi/colls/alltoallv-bruck.c @@ -0,0 +1,70 @@ +#include "colls_private.h" + +/** + * Alltoall Bruck + * + * Openmpi calls this routine when the message size sent to each rank < 2000 bytes and size < 12 + * FIXME: uh, check smpi_pmpi again, but this routine is called for > 12, not + * less... + **/ +int smpi_coll_tuned_alltoallv_bruck(void *sendbuf, int *sendcounts, int *senddisps, + MPI_Datatype sendtype, void *recvbuf, + int *recvcounts, int *recvdisps, MPI_Datatype recvtype, + MPI_Comm comm) +{ + int system_tag = 777; + int i, rank, size, err, count; + MPI_Aint lb; + MPI_Aint sendext = 0; + MPI_Aint recvext = 0; + MPI_Request *requests; + + // FIXME: check implementation + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + XBT_DEBUG("<%d> algorithm alltoall_bruck() called.", rank); + + err = smpi_datatype_extent(sendtype, &lb, &sendext); + err = smpi_datatype_extent(recvtype, &lb, &recvext); + /* Local copy from self */ + err = + smpi_datatype_copy((char *)sendbuf + senddisps[rank] * sendext, + sendcounts[rank], sendtype, + (char *)recvbuf + recvdisps[rank] * recvext, + recvcounts[rank], recvtype); + if (err == MPI_SUCCESS && size > 1) { + /* Initiate all send/recv to/from others. */ + requests = xbt_new(MPI_Request, 2 * (size - 1)); + count = 0; + /* Create all receives that will be posted first */ + for (i = 0; i < size; ++i) { + if (i == rank) { + XBT_DEBUG("<%d> skip request creation [src = %d, recvcount = %d]", + rank, i, recvcounts[i]); + continue; + } + requests[count] = + smpi_irecv_init((char *)recvbuf + recvdisps[i] * recvext, recvcounts[i], + recvtype, i, system_tag, comm); + count++; + } + /* Now create all sends */ + for (i = 0; i < size; ++i) { + if (i == rank) { + XBT_DEBUG("<%d> skip request creation [dst = %d, sendcount = %d]", + rank, i, sendcounts[i]); + continue; + } + requests[count] = + smpi_isend_init((char *)sendbuf + senddisps[i] * sendext, sendcounts[i], + sendtype, i, system_tag, comm); + count++; + } + /* Wait for them all. */ + smpi_mpi_startall(count, requests); + XBT_DEBUG("<%d> wait for %d requests", rank, count); + smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE); + xbt_free(requests); + } + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/alltoallv-pair-light-barrier.c b/src/smpi/colls/alltoallv-pair-light-barrier.c new file mode 100644 index 0000000000..45a864b0c5 --- /dev/null +++ b/src/smpi/colls/alltoallv-pair-light-barrier.c @@ -0,0 +1,63 @@ +#include "colls_private.h" +/***************************************************************************** + + * Function: alltoall_pair_light_barrier + + * Return: int + + * Inputs: + send_buff: send input buffer + send_count: number of elements to send + send_type: data type of elements being sent + recv_buff: receive output buffer + recv_count: number of elements to received + recv_type: data type of elements being received + comm: communicator + + * Descrp: Function works in P - 1 steps. In step i, node j exchanges data + with node i ^ j. Light barriers are inserted between + communications in different phases. + + * Auther: Ahmad Faraj + + ****************************************************************************/ +int +smpi_coll_tuned_alltoallv_pair_light_barrier(void *send_buff, int *send_counts, int *send_disps, + MPI_Datatype send_type, + void *recv_buff, int *recv_counts, int *recv_disps, + MPI_Datatype recv_type, + MPI_Comm comm) +{ + MPI_Aint send_chunk, recv_chunk; + MPI_Status s; + int i, src, dst, rank, num_procs, next_partner; + int tag = 1; /*, failure = 0; */ + + char send_sync = 'a', recv_sync = 'b'; + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); + + smpi_mpi_sendrecv(send_ptr + send_disps[rank] * send_chunk, send_counts[rank], send_type, rank, tag, + recv_ptr + recv_disps[rank] * recv_chunk, recv_counts[rank], recv_type, rank, tag, + comm, &s); + + for (i = 1; i < num_procs; i++) { + src = dst = rank ^ i; + + smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, + dst, tag, recv_ptr + recv_disps[src] *recv_chunk, recv_counts[dst], + recv_type, src, tag, comm, &s); + + if ((i + 1) < num_procs) { + next_partner = rank ^ (i + 1); + smpi_mpi_sendrecv(&send_sync, 1, MPI_CHAR, next_partner, tag, + &recv_sync, 1, MPI_CHAR, next_partner, tag, comm, &s); + } + } + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/alltoallv-pair-mpi-barrier.c b/src/smpi/colls/alltoallv-pair-mpi-barrier.c new file mode 100644 index 0000000000..9944493844 --- /dev/null +++ b/src/smpi/colls/alltoallv-pair-mpi-barrier.c @@ -0,0 +1,50 @@ +#include "colls_private.h" +/***************************************************************************** + + * Function: alltoall_pair_mpi_barrier + + * Return: int + + * Inputs: + send_buff: send input buffer + send_count: number of elements to send + send_type: data type of elements being sent + recv_buff: receive output buffer + recv_count: number of elements to received + recv_type: data type of elements being received + comm: communicator + + * Descrp: Function works when P is power of two. In each phase of P - 1 + phases, nodes in pair communicate their data. MPI barriers are + inserted between each two phases. + + * Auther: Ahmad Faraj + + ****************************************************************************/ +int +smpi_coll_tuned_alltoallv_pair_mpi_barrier(void *send_buff, int *send_counts, int *send_disps, + MPI_Datatype send_type, + void *recv_buff, int *recv_counts, int *recv_disps, + MPI_Datatype recv_type, MPI_Comm comm) +{ + MPI_Status s; + MPI_Aint send_chunk, recv_chunk; + int i, src, dst, rank, num_procs; + int tag = 101; + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); + + for (i = 0; i < num_procs; i++) { + src = dst = rank ^ i; + smpi_mpi_barrier(comm); + smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, dst, + tag, recv_ptr + recv_disps[src] * recv_chunk, recv_counts[src], recv_type, + src, tag, comm, &s); + } + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/alltoallv-pair-one-barrier.c b/src/smpi/colls/alltoallv-pair-one-barrier.c new file mode 100644 index 0000000000..ab1f48ec32 --- /dev/null +++ b/src/smpi/colls/alltoallv-pair-one-barrier.c @@ -0,0 +1,51 @@ +#include "colls_private.h" +/***************************************************************************** + + * Function: alltoall_pair + + * Return: int + + * Inputs: + send_buff: send input buffer + send_count: number of elements to send + send_type: data type of elements being sent + recv_buff: receive output buffer + recv_count: number of elements to received + recv_type: data type of elements being received + comm: communicator + + * Descrp: Function works when P is power of two. In each phase of P - 1 + phases, nodes in pair communicate their data. + + * Auther: Ahmad Faraj + + ****************************************************************************/ +int +smpi_coll_tuned_alltoallv_pair_one_barrier(void *send_buff, int *send_counts, int *send_disps, + MPI_Datatype send_type, + void *recv_buff, int *recv_counts, int *recv_disps, MPI_Datatype recv_type, MPI_Comm comm) +{ + + MPI_Aint send_chunk, recv_chunk; + MPI_Status s; + int i, src, dst, rank, num_procs; + int tag = 1; + + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); + + smpi_mpi_barrier(comm); + for (i = 0; i < num_procs; i++) { + src = dst = rank ^ i; + smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, dst, + tag, recv_ptr + recv_disps[src] * recv_chunk, recv_counts[src], recv_type, + src, tag, comm, &s); + } + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/alltoallv-pair.c b/src/smpi/colls/alltoallv-pair.c new file mode 100644 index 0000000000..50839dffdc --- /dev/null +++ b/src/smpi/colls/alltoallv-pair.c @@ -0,0 +1,49 @@ +#include "colls_private.h" + +/***************************************************************************** + + * Function: alltoall_pair + + * Return: int + + * Inputs: + send_buff: send input buffer + send_count: number of elements to send + send_type: data type of elements being sent + recv_buff: receive output buffer + recv_count: number of elements to received + recv_type: data type of elements being received + comm: communicator + + * Descrp: Function works when P is power of two. In each phase of P - 1 + phases, nodes in pair communicate their data. + + * Auther: Ahmad Faraj + + ****************************************************************************/ +int smpi_coll_tuned_alltoallv_pair(void *send_buff, int *send_counts, int *send_disps, + MPI_Datatype send_type, + void *recv_buff, int *recv_counts, int *recv_disps, + MPI_Datatype recv_type, MPI_Comm comm) +{ + + MPI_Aint send_chunk, recv_chunk; + MPI_Status s; + int i, src, dst, rank, num_procs; + int tag = 1; + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); + + for (i = 0; i < num_procs; i++) { + src = dst = rank ^ i; + smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, dst, tag, + recv_ptr + recv_disps[src] * recv_chunk, recv_counts[src], recv_type, src, tag, + comm, &s); + } + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/alltoallv-ring-light-barrier.c b/src/smpi/colls/alltoallv-ring-light-barrier.c new file mode 100644 index 0000000000..7a42ab90d6 --- /dev/null +++ b/src/smpi/colls/alltoallv-ring-light-barrier.c @@ -0,0 +1,67 @@ +#include "colls_private.h" +/***************************************************************************** + + * Function: alltoall_ring_light_barrier + + * Return: int + + * Inputs: + send_buff: send input buffer + send_count: number of elements to send + send_type: data type of elements being sent + recv_buff: receive output buffer + recv_count: number of elements to received + recv_type: data type of elements being received + comm: communicator + + * Descrp: Function works in P - 1 steps. In step i, node j - i -> j -> j + i. + Light barriers are inserted between communications in different + phases. + + * Auther: Ahmad Faraj + + ****************************************************************************/ +int +smpi_coll_tuned_alltoallv_ring_light_barrier(void *send_buff, int *send_counts, int *send_disps, + MPI_Datatype send_type, + void *recv_buff, int *recv_counts, int *recv_disps, + MPI_Datatype recv_type, + MPI_Comm comm) +{ + MPI_Aint send_chunk, recv_chunk; + MPI_Status s; + int i, src, dst, rank, num_procs, next_dst, next_src; + int tag = 1; + + char send_sync = 'a', recv_sync = 'b'; + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); + + smpi_mpi_sendrecv(send_ptr + send_disps[rank] * send_chunk, send_counts[rank], send_type, rank, tag, + recv_ptr + recv_disps[rank] * recv_chunk, recv_counts[rank], recv_type, rank, tag, + comm, &s); + + for (i = 1; i < num_procs; i++) { + src = (rank - i + num_procs) % num_procs; + dst = (rank + i) % num_procs; + + smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, + dst, tag, recv_ptr + recv_disps[src] * recv_chunk, recv_counts[src], + recv_type, src, tag, comm, &s); + + if ((i + 1) < num_procs) { + next_src = (rank - (i + 1) + num_procs) % num_procs; + next_dst = (rank + (i + 1) + num_procs) % num_procs; + smpi_mpi_sendrecv(&send_sync, 1, MPI_CHAR, next_src, tag, + &recv_sync, 1, MPI_CHAR, next_dst, tag, comm, &s); + + } + } + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/alltoallv-ring-mpi-barrier.c b/src/smpi/colls/alltoallv-ring-mpi-barrier.c new file mode 100644 index 0000000000..273f15c263 --- /dev/null +++ b/src/smpi/colls/alltoallv-ring-mpi-barrier.c @@ -0,0 +1,53 @@ +#include "colls_private.h" +/***************************************************************************** + + * Function: alltoall_ring_mpi_barrier + + * Return: int + + * Inputs: + send_buff: send input buffer + send_count: number of elements to send + send_type: data type of elements being sent + recv_buff: receive output buffer + recv_count: number of elements to received + recv_type: data type of elements being received + comm: communicator + + * Descrp: Function works in P - 1 steps. In step i, node j - i -> j -> j + i. + MPI barriers are added between each two phases. + + * Auther: Ahmad Faraj + + ****************************************************************************/ +int +smpi_coll_tuned_alltoallv_ring_mpi_barrier(void *send_buff, int *send_counts, int *send_disps, + MPI_Datatype send_type, + void *recv_buff, int *recv_counts, int *recv_disps, + MPI_Datatype recv_type, MPI_Comm comm) +{ + MPI_Status s; + MPI_Aint send_chunk, recv_chunk; + int i, src, dst, rank, num_procs; + int tag = 1; + + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); + + for (i = 0; i < num_procs; i++) { + src = (rank - i + num_procs) % num_procs; + dst = (rank + i) % num_procs; + + smpi_mpi_barrier(comm); + smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, dst, + tag, recv_ptr + recv_disps[src] * recv_chunk, recv_counts[src], recv_type, + src, tag, comm, &s); + } + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/alltoallv-ring-one-barrier.c b/src/smpi/colls/alltoallv-ring-one-barrier.c new file mode 100644 index 0000000000..8e2d0cdb38 --- /dev/null +++ b/src/smpi/colls/alltoallv-ring-one-barrier.c @@ -0,0 +1,51 @@ +#include "colls_private.h" +/***************************************************************************** + + * Function: alltoall_ring + + * Return: int + + * Inputs: + send_buff: send input buffer + send_count: number of elements to send + send_type: data type of elements being sent + recv_buff: receive output buffer + recv_count: number of elements to received + recv_type: data type of elements being received + comm: communicator + + * Descrp: Function works in P - 1 steps. In step i, node j - i -> j -> j + i. + + * Auther: Ahmad Faraj + + ****************************************************************************/ +int +smpi_coll_tuned_alltoallv_ring_one_barrier(void *send_buff, int *send_counts, int *send_disps, + MPI_Datatype send_type, + void *recv_buff, int *recv_counts, int *recv_disps, + MPI_Datatype recv_type, MPI_Comm comm) +{ + MPI_Status s; + MPI_Aint send_chunk, recv_chunk; + int i, src, dst, rank, num_procs; + int tag = 1; + + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); + + smpi_mpi_barrier(comm); + for (i = 0; i < num_procs; i++) { + src = (rank - i + num_procs) % num_procs; + dst = (rank + i) % num_procs; + + smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, dst, + tag, recv_ptr + recv_disps[src] * recv_chunk, recv_counts[src], recv_type, + src, tag, comm, &s); + } + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/alltoallv-ring.c b/src/smpi/colls/alltoallv-ring.c new file mode 100644 index 0000000000..dcd4b35376 --- /dev/null +++ b/src/smpi/colls/alltoallv-ring.c @@ -0,0 +1,51 @@ +#include "colls_private.h" +/***************************************************************************** + + * Function: alltoall_ring + + * Return: int + + * Inputs: + send_buff: send input buffer + send_count: number of elements to send + send_type: data type of elements being sent + recv_buff: receive output buffer + recv_count: number of elements to received + recv_type: data type of elements being received + comm: communicator + + * Descrp: Function works in P - 1 steps. In step i, node j - i -> j -> j + i. + + * Auther: Ahmad Faraj + + ****************************************************************************/ +int +smpi_coll_tuned_alltoallv_ring(void *send_buff, int *send_counts, int *send_disps, + MPI_Datatype send_type, + void *recv_buff, int *recv_counts, int *recv_disps, + MPI_Datatype recv_type, + MPI_Comm comm) +{ + MPI_Status s; + MPI_Aint send_chunk, recv_chunk; + int i, src, dst, rank, num_procs; + int tag = 11; + + char *send_ptr = (char *) send_buff; + char *recv_ptr = (char *) recv_buff; + + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + send_chunk = smpi_datatype_get_extent(send_type); + recv_chunk = smpi_datatype_get_extent(recv_type); + + for (i = 0; i < num_procs; i++) { + src = (rank - i + num_procs) % num_procs; + dst = (rank + i) % num_procs; + + smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, dst, + tag, recv_ptr + recv_disps[src] * recv_chunk, recv_counts[src], recv_type, + src, tag, comm, &s); + } + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/barrier-ompi.c b/src/smpi/colls/barrier-ompi.c new file mode 100644 index 0000000000..ad5b748042 --- /dev/null +++ b/src/smpi/colls/barrier-ompi.c @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2006 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) 2008 Sun Microsystems, Inc. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "colls_private.h" +#include "coll_tuned_topo.h" + + +#define MCA_COLL_BASE_TAG_BARRIER 100 +/* + * Barrier is ment to be a synchronous operation, as some BTLs can mark + * a request done before its passed to the NIC and progress might not be made + * elsewhere we cannot allow a process to exit the barrier until its last + * [round of] sends are completed. + * + * It is last round of sends rather than 'last' individual send as each pair of + * peers can use different channels/devices/btls and the receiver of one of + * these sends might be forced to wait as the sender + * leaves the collective and does not make progress until the next mpi call + * + */ + +/* + * Simple double ring version of barrier + * + * synchronous gurantee made by last ring of sends are synchronous + * + */ +int smpi_coll_tuned_barrier_ompi_doublering(MPI_Comm comm + ) +{ + int rank, size; + int left, right; + + + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + + XBT_DEBUG("ompi_coll_tuned_barrier_ompi_doublering rank %d", rank); + + left = ((rank-1)%size); + right = ((rank+1)%size); + + if (rank > 0) { /* receive message from the left */ + smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, left, + MCA_COLL_BASE_TAG_BARRIER, comm, + MPI_STATUS_IGNORE); + } + + /* Send message to the right */ + smpi_mpi_send((void*)NULL, 0, MPI_BYTE, right, + MCA_COLL_BASE_TAG_BARRIER, + comm); + + /* root needs to receive from the last node */ + if (rank == 0) { + smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, left, + MCA_COLL_BASE_TAG_BARRIER, comm, + MPI_STATUS_IGNORE); + } + + /* Allow nodes to exit */ + if (rank > 0) { /* post Receive from left */ + smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, left, + MCA_COLL_BASE_TAG_BARRIER, comm, + MPI_STATUS_IGNORE); + } + + /* send message to the right one */ + smpi_mpi_send((void*)NULL, 0, MPI_BYTE, right, + MCA_COLL_BASE_TAG_BARRIER, + comm); + + /* rank 0 post receive from the last node */ + if (rank == 0) { + smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, left, + MCA_COLL_BASE_TAG_BARRIER, comm, + MPI_STATUS_IGNORE); + } + + return MPI_SUCCESS; + +} + + +/* + * To make synchronous, uses sync sends and sync sendrecvs + */ + +int smpi_coll_tuned_barrier_ompi_recursivedoubling(MPI_Comm comm + ) +{ + int rank, size, adjsize; + int mask, remote; + + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + XBT_DEBUG( + "ompi_coll_tuned_barrier_ompi_recursivedoubling rank %d", + rank); + + /* do nearest power of 2 less than size calc */ + for( adjsize = 1; adjsize <= size; adjsize <<= 1 ); + adjsize >>= 1; + + /* if size is not exact power of two, perform an extra step */ + if (adjsize != size) { + if (rank >= adjsize) { + /* send message to lower ranked node */ + remote = rank - adjsize; + smpi_mpi_sendrecv(NULL, 0, MPI_BYTE, remote, + MCA_COLL_BASE_TAG_BARRIER, + NULL, 0, MPI_BYTE, remote, + MCA_COLL_BASE_TAG_BARRIER, + comm, MPI_STATUS_IGNORE); + + } else if (rank < (size - adjsize)) { + + /* receive message from high level rank */ + smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, rank+adjsize, + MCA_COLL_BASE_TAG_BARRIER, comm, + MPI_STATUS_IGNORE); + + } + } + + /* exchange messages */ + if ( rank < adjsize ) { + mask = 0x1; + while ( mask < adjsize ) { + remote = rank ^ mask; + mask <<= 1; + if (remote >= adjsize) continue; + + /* post receive from the remote node */ + smpi_mpi_sendrecv(NULL, 0, MPI_BYTE, remote, + MCA_COLL_BASE_TAG_BARRIER, + NULL, 0, MPI_BYTE, remote, + MCA_COLL_BASE_TAG_BARRIER, + comm, MPI_STATUS_IGNORE); + } + } + + /* non-power of 2 case */ + if (adjsize != size) { + if (rank < (size - adjsize)) { + /* send enter message to higher ranked node */ + remote = rank + adjsize; + smpi_mpi_send((void*)NULL, 0, MPI_BYTE, remote, + MCA_COLL_BASE_TAG_BARRIER, + comm); + + } + } + + return MPI_SUCCESS; + +} + + +/* + * To make synchronous, uses sync sends and sync sendrecvs + */ + +int smpi_coll_tuned_barrier_ompi_bruck(MPI_Comm comm + ) +{ + int rank, size; + int distance, to, from; + + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + XBT_DEBUG( + "ompi_coll_tuned_barrier_ompi_bruck rank %d", rank); + + /* exchange data with rank-2^k and rank+2^k */ + for (distance = 1; distance < size; distance <<= 1) { + from = (rank + size - distance) % size; + to = (rank + distance) % size; + + /* send message to lower ranked node */ + smpi_mpi_sendrecv(NULL, 0, MPI_BYTE, to, + MCA_COLL_BASE_TAG_BARRIER, + NULL, 0, MPI_BYTE, from, + MCA_COLL_BASE_TAG_BARRIER, + comm, MPI_STATUS_IGNORE); + } + + return MPI_SUCCESS; + +} + + +/* + * To make synchronous, uses sync sends and sync sendrecvs + */ +/* special case for two processes */ +int smpi_coll_tuned_barrier_ompi_two_procs(MPI_Comm comm + ) +{ + int remote; + + remote = smpi_comm_rank(comm); + XBT_DEBUG( + "ompi_coll_tuned_barrier_ompi_two_procs rank %d", remote); + remote = (remote + 1) & 0x1; + + smpi_mpi_sendrecv(NULL, 0, MPI_BYTE, remote, + MCA_COLL_BASE_TAG_BARRIER, + NULL, 0, MPI_BYTE, remote, + MCA_COLL_BASE_TAG_BARRIER, + comm, MPI_STATUS_IGNORE); + return (MPI_SUCCESS); +} + + +/* + * Linear functions are copied from the BASIC coll module + * they do not segment the message and are simple implementations + * but for some small number of nodes and/or small data sizes they + * are just as fast as tuned/tree based segmenting operations + * and as such may be selected by the decision functions + * These are copied into this module due to the way we select modules + * in V1. i.e. in V2 we will handle this differently and so will not + * have to duplicate code. + * GEF Oct05 after asking Jeff. + */ + +/* copied function (with appropriate renaming) starts here */ + +int smpi_coll_tuned_barrier_ompi_basic_linear(MPI_Comm comm) +{ + int i; + int size = smpi_comm_size(comm); + int rank = smpi_comm_rank(comm); + + /* All non-root send & receive zero-length message. */ + + if (rank > 0) { + smpi_mpi_send (NULL, 0, MPI_BYTE, 0, + MCA_COLL_BASE_TAG_BARRIER, + comm); + + smpi_mpi_recv (NULL, 0, MPI_BYTE, 0, + MCA_COLL_BASE_TAG_BARRIER, + comm, MPI_STATUS_IGNORE); + } + + /* The root collects and broadcasts the messages. */ + + else { + MPI_Request* requests; + + requests = (MPI_Request*)malloc( size * sizeof(MPI_Request) ); + for (i = 1; i < size; ++i) { + requests[i] = smpi_mpi_irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE, + MCA_COLL_BASE_TAG_BARRIER, comm + ); + } + smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE ); + + for (i = 1; i < size; ++i) { + requests[i] = smpi_mpi_isend(NULL, 0, MPI_BYTE, i, + MCA_COLL_BASE_TAG_BARRIER, + comm + ); + } + smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE ); + free( requests ); + } + + /* All done */ + + return MPI_SUCCESS; + +} +/* copied function (with appropriate renaming) ends here */ + +/* + * Another recursive doubling type algorithm, but in this case + * we go up the tree and back down the tree. + */ +int smpi_coll_tuned_barrier_ompi_tree(MPI_Comm comm) +{ + int rank, size, depth; + int jump, partner; + + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + XBT_DEBUG( + "ompi_coll_tuned_barrier_ompi_tree %d", + rank); + + /* Find the nearest power of 2 of the communicator size. */ + for(depth = 1; depth < size; depth <<= 1 ); + + for (jump=1; jump rank) { + smpi_mpi_recv (NULL, 0, MPI_BYTE, partner, + MCA_COLL_BASE_TAG_BARRIER, comm, + MPI_STATUS_IGNORE); + } else if (partner < rank) { + smpi_mpi_send (NULL, 0, MPI_BYTE, partner, + MCA_COLL_BASE_TAG_BARRIER, + comm); + } + } + } + + depth>>=1; + for (jump = depth; jump>0; jump>>=1) { + partner = rank ^ jump; + if (!(partner & (jump-1)) && partner < size) { + if (partner > rank) { + smpi_mpi_send (NULL, 0, MPI_BYTE, partner, + MCA_COLL_BASE_TAG_BARRIER, + comm); + } else if (partner < rank) { + smpi_mpi_recv (NULL, 0, MPI_BYTE, partner, + MCA_COLL_BASE_TAG_BARRIER, comm, + MPI_STATUS_IGNORE); + } + } + } + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/bcast-NTSB.c b/src/smpi/colls/bcast-NTSB.c index f7a7e4e73d..93ace1d3e8 100644 --- a/src/smpi/colls/bcast-NTSB.c +++ b/src/smpi/colls/bcast-NTSB.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" int bcast_NTSB_segment_size_in_byte = 8192; @@ -16,10 +16,10 @@ int smpi_coll_tuned_bcast_NTSB(void *buf, int count, MPI_Datatype datatype, MPI_Status *recv_status_array; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* source node and destination nodes (same through out the functions) */ int from = (rank - 1) / 2; @@ -46,9 +46,9 @@ int smpi_coll_tuned_bcast_NTSB(void *buf, int count, MPI_Datatype datatype, /* if root is not zero send to rank zero first */ if (root != 0) { if (rank == root) { - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); } else if (rank == 0) { - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } } @@ -59,31 +59,31 @@ int smpi_coll_tuned_bcast_NTSB(void *buf, int count, MPI_Datatype datatype, if (rank == 0) { /* case root has only a left child */ if (to_right == -1) { - MPI_Send(buf, count, datatype, to_left, tag, comm); + smpi_mpi_send(buf, count, datatype, to_left, tag, comm); } /* case root has both left and right children */ else { - MPI_Send(buf, count, datatype, to_left, tag, comm); - MPI_Send(buf, count, datatype, to_right, tag, comm); + smpi_mpi_send(buf, count, datatype, to_left, tag, comm); + smpi_mpi_send(buf, count, datatype, to_right, tag, comm); } } /* case: leaf ==> receive only */ else if (to_left == -1) { - MPI_Recv(buf, count, datatype, from, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, from, tag, comm, &status); } /* case: intermidiate node with only left child ==> relay message */ else if (to_right == -1) { - MPI_Recv(buf, count, datatype, from, tag, comm, &status); - MPI_Send(buf, count, datatype, to_left, tag, comm); + smpi_mpi_recv(buf, count, datatype, from, tag, comm, &status); + smpi_mpi_send(buf, count, datatype, to_left, tag, comm); } /* case: intermidiate node with both left and right children ==> relay message */ else { - MPI_Recv(buf, count, datatype, from, tag, comm, &status); - MPI_Send(buf, count, datatype, to_left, tag, comm); - MPI_Send(buf, count, datatype, to_right, tag, comm); + smpi_mpi_recv(buf, count, datatype, from, tag, comm, &status); + smpi_mpi_send(buf, count, datatype, to_left, tag, comm); + smpi_mpi_send(buf, count, datatype, to_right, tag, comm); } return MPI_SUCCESS; } @@ -91,13 +91,13 @@ int smpi_coll_tuned_bcast_NTSB(void *buf, int count, MPI_Datatype datatype, else { send_request_array = - (MPI_Request *) malloc(2 * (size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc(2 * (size + pipe_length) * sizeof(MPI_Request)); recv_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); send_status_array = - (MPI_Status *) malloc(2 * (size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc(2 * (size + pipe_length) * sizeof(MPI_Status)); recv_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); @@ -106,60 +106,60 @@ int smpi_coll_tuned_bcast_NTSB(void *buf, int count, MPI_Datatype datatype, /* case root has only a left child */ if (to_right == -1) { for (i = 0; i < pipe_length; i++) { - MPI_Isend((char *) buf + (i * increment), segment, datatype, to_left, - tag + i, comm, &send_request_array[i]); + send_request_array[i] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to_left, + tag + i, comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } /* case root has both left and right children */ else { for (i = 0; i < pipe_length; i++) { - MPI_Isend((char *) buf + (i * increment), segment, datatype, to_left, - tag + i, comm, &send_request_array[i]); - MPI_Isend((char *) buf + (i * increment), segment, datatype, to_right, - tag + i, comm, &send_request_array[i + pipe_length]); + send_request_array[i] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to_left, + tag + i, comm); + send_request_array[i + pipe_length] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to_right, + tag + i, comm); } - MPI_Waitall((2 * pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((2 * pipe_length), send_request_array, send_status_array); } } /* case: leaf ==> receive only */ else if (to_left == -1) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, from, - tag + i, comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, from, + tag + i, comm); } - MPI_Waitall((pipe_length), recv_request_array, recv_status_array); + smpi_mpi_waitall((pipe_length), recv_request_array, recv_status_array); } /* case: intermidiate node with only left child ==> relay message */ else if (to_right == -1) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, from, - tag + i, comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, from, + tag + i, comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], &status); - MPI_Isend((char *) buf + (i * increment), segment, datatype, to_left, - tag + i, comm, &send_request_array[i]); + smpi_mpi_wait(&recv_request_array[i], &status); + send_request_array[i] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to_left, + tag + i, comm); } - MPI_Waitall(pipe_length, send_request_array, send_status_array); + smpi_mpi_waitall(pipe_length, send_request_array, send_status_array); } /* case: intermidiate node with both left and right children ==> relay message */ else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, from, - tag + i, comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, from, + tag + i, comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], &status); - MPI_Isend((char *) buf + (i * increment), segment, datatype, to_left, - tag + i, comm, &send_request_array[i]); - MPI_Isend((char *) buf + (i * increment), segment, datatype, to_right, - tag + i, comm, &send_request_array[i + pipe_length]); + smpi_mpi_wait(&recv_request_array[i], &status); + send_request_array[i] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to_left, + tag + i, comm); + send_request_array[i + pipe_length] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to_right, + tag + i, comm); } - MPI_Waitall((2 * pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((2 * pipe_length), send_request_array, send_status_array); } free(send_request_array); @@ -170,7 +170,8 @@ int smpi_coll_tuned_bcast_NTSB(void *buf, int count, MPI_Datatype datatype, /* when count is not divisible by block size, use default BCAST for the remainder */ if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *) buf + (pipe_length * increment), remainder, datatype, + XBT_WARN("MPI_bcast_NTSB use default MPI_bcast."); + smpi_mpi_bcast((char *) buf + (pipe_length * increment), remainder, datatype, root, comm); } diff --git a/src/smpi/colls/bcast-NTSL-Isend.c b/src/smpi/colls/bcast-NTSL-Isend.c index c817759c57..89f8f5c351 100644 --- a/src/smpi/colls/bcast-NTSL-Isend.c +++ b/src/smpi/colls/bcast-NTSL-Isend.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" static int bcast_NTSL_segment_size_in_byte = 8192; @@ -18,10 +18,10 @@ int smpi_coll_tuned_bcast_NTSL_Isend(void *buf, int count, MPI_Datatype datatype int rank, size; int i; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* source node and destination nodes (same through out the functions) */ int to = (rank + 1) % size; @@ -45,23 +45,23 @@ int smpi_coll_tuned_bcast_NTSL_Isend(void *buf, int count, MPI_Datatype datatype */ if (root != 0) { if (rank == root) { - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); } else if (rank == 0) { - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } } /* when a message is smaller than a block size => no pipeline */ if (count <= segment) { if (rank == 0) { - MPI_Send(buf, count, datatype, to, tag, comm); + smpi_mpi_send(buf, count, datatype, to, tag, comm); } else if (rank == (size - 1)) { - MPI_Irecv(buf, count, datatype, from, tag, comm, &request); - MPI_Wait(&request, &status); + request = smpi_mpi_irecv(buf, count, datatype, from, tag, comm); + smpi_mpi_wait(&request, &status); } else { - MPI_Irecv(buf, count, datatype, from, tag, comm, &request); - MPI_Wait(&request, &status); - MPI_Send(buf, count, datatype, to, tag, comm); + request = smpi_mpi_irecv(buf, count, datatype, from, tag, comm); + smpi_mpi_wait(&request, &status); + smpi_mpi_send(buf, count, datatype, to, tag, comm); } return MPI_SUCCESS; } @@ -69,44 +69,44 @@ int smpi_coll_tuned_bcast_NTSL_Isend(void *buf, int count, MPI_Datatype datatype /* pipeline bcast */ else { send_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); recv_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); send_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); recv_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); /* root send data */ if (rank == 0) { for (i = 0; i < pipe_length; i++) { - MPI_Isend((char *) buf + (i * increment), segment, datatype, to, - (tag + i), comm, &send_request_array[i]); + send_request_array[i] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to, + (tag + i), comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } /* last node only receive data */ else if (rank == (size - 1)) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, from, - (tag + i), comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, from, + (tag + i), comm); } - MPI_Waitall((pipe_length), recv_request_array, recv_status_array); + smpi_mpi_waitall((pipe_length), recv_request_array, recv_status_array); } /* intermediate nodes relay (receive, then send) data */ else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, from, - (tag + i), comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, from, + (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], &status); - MPI_Isend((char *) buf + (i * increment), segment, datatype, to, - (tag + i), comm, &send_request_array[i]); + smpi_mpi_wait(&recv_request_array[i], &status); + send_request_array[i] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to, + (tag + i), comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } free(send_request_array); @@ -117,7 +117,8 @@ int smpi_coll_tuned_bcast_NTSL_Isend(void *buf, int count, MPI_Datatype datatype /* when count is not divisible by block size, use default BCAST for the remainder */ if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *) buf + (pipe_length * increment), remainder, datatype, + XBT_WARN("MPI_bcast_NTSL_Isend_nb use default MPI_bcast."); + smpi_mpi_bcast((char *) buf + (pipe_length * increment), remainder, datatype, root, comm); } diff --git a/src/smpi/colls/bcast-NTSL.c b/src/smpi/colls/bcast-NTSL.c index 23293f1c60..090edc7595 100644 --- a/src/smpi/colls/bcast-NTSL.c +++ b/src/smpi/colls/bcast-NTSL.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" static int bcast_NTSL_segment_size_in_byte = 8192; @@ -18,10 +18,10 @@ int smpi_coll_tuned_bcast_NTSL(void *buf, int count, MPI_Datatype datatype, int rank, size; int i; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* source node and destination nodes (same through out the functions) */ int to = (rank + 1) % size; @@ -45,23 +45,23 @@ int smpi_coll_tuned_bcast_NTSL(void *buf, int count, MPI_Datatype datatype, */ if (root != 0) { if (rank == root) { - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); } else if (rank == 0) { - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } } /* when a message is smaller than a block size => no pipeline */ if (count <= segment) { if (rank == 0) { - MPI_Send(buf, count, datatype, to, tag, comm); + smpi_mpi_send(buf, count, datatype, to, tag, comm); } else if (rank == (size - 1)) { - MPI_Irecv(buf, count, datatype, from, tag, comm, &request); - MPI_Wait(&request, &status); + request = smpi_mpi_irecv(buf, count, datatype, from, tag, comm); + smpi_mpi_wait(&request, &status); } else { - MPI_Irecv(buf, count, datatype, from, tag, comm, &request); - MPI_Wait(&request, &status); - MPI_Send(buf, count, datatype, to, tag, comm); + request = smpi_mpi_irecv(buf, count, datatype, from, tag, comm); + smpi_mpi_wait(&request, &status); + smpi_mpi_send(buf, count, datatype, to, tag, comm); } return MPI_SUCCESS; } @@ -69,44 +69,44 @@ int smpi_coll_tuned_bcast_NTSL(void *buf, int count, MPI_Datatype datatype, /* pipeline bcast */ else { send_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); recv_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); send_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); recv_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); /* root send data */ if (rank == 0) { for (i = 0; i < pipe_length; i++) { - MPI_Isend((char *) buf + (i * increment), segment, datatype, to, - (tag + i), comm, &send_request_array[i]); + send_request_array[i] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to, + (tag + i), comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } /* last node only receive data */ else if (rank == (size - 1)) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, from, - (tag + i), comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, from, + (tag + i), comm); } - MPI_Waitall((pipe_length), recv_request_array, recv_status_array); + smpi_mpi_waitall((pipe_length), recv_request_array, recv_status_array); } /* intermediate nodes relay (receive, then send) data */ else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, from, - (tag + i), comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, from, + (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], &status); - MPI_Isend((char *) buf + (i * increment), segment, datatype, to, - (tag + i), comm, &send_request_array[i]); + smpi_mpi_wait(&recv_request_array[i], &status); + send_request_array[i] = smpi_mpi_isend((char *) buf + (i * increment), segment, datatype, to, + (tag + i), comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } free(send_request_array); @@ -117,7 +117,8 @@ int smpi_coll_tuned_bcast_NTSL(void *buf, int count, MPI_Datatype datatype, /* when count is not divisible by block size, use default BCAST for the remainder */ if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *) buf + (pipe_length * increment), remainder, datatype, + XBT_WARN("MPI_bcast_arrival_NTSL use default MPI_bcast."); + smpi_mpi_bcast((char *) buf + (pipe_length * increment), remainder, datatype, root, comm); } diff --git a/src/smpi/colls/bcast-SMP-binary.c b/src/smpi/colls/bcast-SMP-binary.c index 68ce0fe694..ec717e276b 100644 --- a/src/smpi/colls/bcast-SMP-binary.c +++ b/src/smpi/colls/bcast-SMP-binary.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #ifndef NUM_CORE #define NUM_CORE 8 #endif @@ -17,10 +17,10 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, int rank, size; int i; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &size); + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); int segment = bcast_SMP_binary_segment_byte / extent; int pipe_length = count / segment; @@ -42,9 +42,9 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, // if root is not zero send to rank zero first if (root != 0) { if (rank == root) - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); else if (rank == 0) - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } // when a message is smaller than a block size => no pipeline if (count <= segment) { @@ -54,52 +54,52 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, if (rank == 0) { //printf("node %d left %d right %d\n",rank,to_inter_left,to_inter_right); if (to_inter_left < size) - MPI_Send(buf, count, datatype, to_inter_left, tag, comm); + smpi_mpi_send(buf, count, datatype, to_inter_left, tag, comm); if (to_inter_right < size) - MPI_Send(buf, count, datatype, to_inter_right, tag, comm); + smpi_mpi_send(buf, count, datatype, to_inter_right, tag, comm); if ((to_intra_left - base) < num_core) - MPI_Send(buf, count, datatype, to_intra_left, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra_left, tag, comm); if ((to_intra_right - base) < num_core) - MPI_Send(buf, count, datatype, to_intra_right, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra_right, tag, comm); } // case LEAVES ROOT-of-eash-SMP else if (to_inter_left >= size) { //printf("node %d from %d\n",rank,from_inter); - MPI_Irecv(buf, count, datatype, from_inter, tag, comm, &request); - MPI_Wait(&request, &status); + request = smpi_mpi_irecv(buf, count, datatype, from_inter, tag, comm); + smpi_mpi_wait(&request, &status); if ((to_intra_left - base) < num_core) - MPI_Send(buf, count, datatype, to_intra_left, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra_left, tag, comm); if ((to_intra_right - base) < num_core) - MPI_Send(buf, count, datatype, to_intra_right, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra_right, tag, comm); } // case INTERMEDIAT ROOT-of-each-SMP else { //printf("node %d left %d right %d from %d\n",rank,to_inter_left,to_inter_right,from_inter); - MPI_Irecv(buf, count, datatype, from_inter, tag, comm, &request); - MPI_Wait(&request, &status); - MPI_Send(buf, count, datatype, to_inter_left, tag, comm); + request = smpi_mpi_irecv(buf, count, datatype, from_inter, tag, comm); + smpi_mpi_wait(&request, &status); + smpi_mpi_send(buf, count, datatype, to_inter_left, tag, comm); if (to_inter_right < size) - MPI_Send(buf, count, datatype, to_inter_right, tag, comm); + smpi_mpi_send(buf, count, datatype, to_inter_right, tag, comm); if ((to_intra_left - base) < num_core) - MPI_Send(buf, count, datatype, to_intra_left, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra_left, tag, comm); if ((to_intra_right - base) < num_core) - MPI_Send(buf, count, datatype, to_intra_right, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra_right, tag, comm); } } // case non ROOT-of-each-SMP else { // case leaves if ((to_intra_left - base) >= num_core) { - MPI_Irecv(buf, count, datatype, from_intra, tag, comm, &request); - MPI_Wait(&request, &status); + request = smpi_mpi_irecv(buf, count, datatype, from_intra, tag, comm); + smpi_mpi_wait(&request, &status); } // case intermediate else { - MPI_Irecv(buf, count, datatype, from_intra, tag, comm, &request); - MPI_Wait(&request, &status); - MPI_Send(buf, count, datatype, to_intra_left, tag, comm); + request = smpi_mpi_irecv(buf, count, datatype, from_intra, tag, comm); + smpi_mpi_wait(&request, &status); + smpi_mpi_send(buf, count, datatype, to_intra_left, tag, comm); if ((to_intra_right - base) < num_core) - MPI_Send(buf, count, datatype, to_intra_right, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra_right, tag, comm); } } @@ -109,9 +109,9 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, // pipeline bcast else { request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); // case ROOT-of-each-SMP if (rank % NUM_CORE == 0) { @@ -120,16 +120,16 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, for (i = 0; i < pipe_length; i++) { //printf("node %d left %d right %d\n",rank,to_inter_left,to_inter_right); if (to_inter_left < size) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_inter_left, (tag + i), comm); if (to_inter_right < size) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_inter_right, (tag + i), comm); if ((to_intra_left - base) < num_core) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra_left, (tag + i), comm); if ((to_intra_right - base) < num_core) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra_right, (tag + i), comm); } } @@ -137,16 +137,16 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, else if (to_inter_left >= size) { //printf("node %d from %d\n",rank,from_inter); for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, - from_inter, (tag + i), comm, &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, + from_inter, (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&request_array[i], &status); + smpi_mpi_wait(&request_array[i], &status); if ((to_intra_left - base) < num_core) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra_left, (tag + i), comm); if ((to_intra_right - base) < num_core) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra_right, (tag + i), comm); } } @@ -154,21 +154,21 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, else { //printf("node %d left %d right %d from %d\n",rank,to_inter_left,to_inter_right,from_inter); for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, - from_inter, (tag + i), comm, &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, + from_inter, (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&request_array[i], &status); - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_wait(&request_array[i], &status); + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_inter_left, (tag + i), comm); if (to_inter_right < size) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_inter_right, (tag + i), comm); if ((to_intra_left - base) < num_core) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra_left, (tag + i), comm); if ((to_intra_right - base) < num_core) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra_right, (tag + i), comm); } } @@ -178,23 +178,23 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, // case leaves if ((to_intra_left - base) >= num_core) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, - from_intra, (tag + i), comm, &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, + from_intra, (tag + i), comm); } - MPI_Waitall((pipe_length), request_array, status_array); + smpi_mpi_waitall((pipe_length), request_array, status_array); } // case intermediate else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, - from_intra, (tag + i), comm, &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, + from_intra, (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&request_array[i], &status); - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_wait(&request_array[i], &status); + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra_left, (tag + i), comm); if ((to_intra_right - base) < num_core) - MPI_Send((char *) buf + (i * increment), segment, datatype, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra_right, (tag + i), comm); } } @@ -206,7 +206,8 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count, // when count is not divisible by block size, use default BCAST for the remainder if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *) buf + (pipe_length * increment), remainder, datatype, + XBT_WARN("MPI_bcast_SMP_binary use default MPI_bcast."); + smpi_mpi_bcast((char *) buf + (pipe_length * increment), remainder, datatype, root, comm); } diff --git a/src/smpi/colls/bcast-SMP-binomial.c b/src/smpi/colls/bcast-SMP-binomial.c index 0e26eef54b..99193022b1 100644 --- a/src/smpi/colls/bcast-SMP-binomial.c +++ b/src/smpi/colls/bcast-SMP-binomial.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #ifndef NUM_CORE #define NUM_CORE 8 #endif @@ -13,8 +13,8 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count, MPI_Status status; int tag = 50; - MPI_Comm_size(comm, &size); - MPI_Comm_rank(comm, &rank); + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); int to_intra, to_inter; int from_intra, from_inter; @@ -28,9 +28,9 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count, // if root is not zero send to rank zero first if (root != 0) { if (rank == root) - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); else if (rank == 0) - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } //FIRST STEP node 0 send to every root-of-each-SMP with binomial tree @@ -42,7 +42,7 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count, if (inter_rank & mask) { from_inter = (inter_rank - mask) * NUM_CORE; //printf("Node %d recv from node %d when mask is %d\n", rank, from_inter, mask); - MPI_Recv(buf, count, datatype, from_inter, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, from_inter, tag, comm, &status); break; } mask <<= 1; @@ -56,7 +56,7 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count, to_inter = (inter_rank + mask) * NUM_CORE; if (to_inter < size) { //printf("Node %d send to node %d when mask is %d\n", rank, to_inter, mask); - MPI_Send(buf, count, datatype, to_inter, tag, comm); + smpi_mpi_send(buf, count, datatype, to_inter, tag, comm); } } mask >>= 1; @@ -70,7 +70,7 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count, if (intra_rank & mask) { from_intra = base + (intra_rank - mask); //printf("Node %d recv from node %d when mask is %d\n", rank, from_inter, mask); - MPI_Recv(buf, count, datatype, from_intra, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, from_intra, tag, comm, &status); break; } mask <<= 1; @@ -85,7 +85,7 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count, to_intra = base + (intra_rank + mask); if (to_intra < size) { //printf("Node %d send to node %d when mask is %d\n", rank, to_inter, mask); - MPI_Send(buf, count, datatype, to_intra, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra, tag, comm); } } mask >>= 1; diff --git a/src/smpi/colls/bcast-SMP-linear.c b/src/smpi/colls/bcast-SMP-linear.c index 9320464dd4..673f6cf392 100644 --- a/src/smpi/colls/bcast-SMP-linear.c +++ b/src/smpi/colls/bcast-SMP-linear.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #ifndef NUM_CORE #define NUM_CORE 8 #endif @@ -17,10 +17,10 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count, int rank, size; int i; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &size); + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); int segment = bcast_SMP_linear_segment_byte / extent; int pipe_length = count / segment; @@ -37,111 +37,113 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count, // call native when MPI communication size is too small if (size <= NUM_CORE) { - return MPI_Bcast(buf, count, datatype, root, comm); + XBT_WARN("MPI_bcast_SMP_linear use default MPI_bcast."); + smpi_mpi_bcast(buf, count, datatype, root, comm); + return MPI_SUCCESS; } // if root is not zero send to rank zero first if (root != 0) { if (rank == root) - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); else if (rank == 0) - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } // when a message is smaller than a block size => no pipeline if (count <= segment) { // case ROOT if (rank == 0) { - MPI_Send(buf, count, datatype, to_inter, tag, comm); - MPI_Send(buf, count, datatype, to_intra, tag, comm); + smpi_mpi_send(buf, count, datatype, to_inter, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra, tag, comm); } // case last ROOT of each SMP else if (rank == (((size - 1) / NUM_CORE) * NUM_CORE)) { - MPI_Irecv(buf, count, datatype, from_inter, tag, comm, &request); - MPI_Wait(&request, &status); - MPI_Send(buf, count, datatype, to_intra, tag, comm); + request = smpi_mpi_irecv(buf, count, datatype, from_inter, tag, comm); + smpi_mpi_wait(&request, &status); + smpi_mpi_send(buf, count, datatype, to_intra, tag, comm); } // case intermediate ROOT of each SMP else if (rank % NUM_CORE == 0) { - MPI_Irecv(buf, count, datatype, from_inter, tag, comm, &request); - MPI_Wait(&request, &status); - MPI_Send(buf, count, datatype, to_inter, tag, comm); - MPI_Send(buf, count, datatype, to_intra, tag, comm); + request = smpi_mpi_irecv(buf, count, datatype, from_inter, tag, comm); + smpi_mpi_wait(&request, &status); + smpi_mpi_send(buf, count, datatype, to_inter, tag, comm); + smpi_mpi_send(buf, count, datatype, to_intra, tag, comm); } // case last non-ROOT of each SMP else if (((rank + 1) % NUM_CORE == 0) || (rank == (size - 1))) { - MPI_Irecv(buf, count, datatype, from_intra, tag, comm, &request); - MPI_Wait(&request, &status); + request = smpi_mpi_irecv(buf, count, datatype, from_intra, tag, comm); + smpi_mpi_wait(&request, &status); } // case intermediate non-ROOT of each SMP else { - MPI_Irecv(buf, count, datatype, from_intra, tag, comm, &request); - MPI_Wait(&request, &status); - MPI_Send(buf, count, datatype, to_intra, tag, comm); + request = smpi_mpi_irecv(buf, count, datatype, from_intra, tag, comm); + smpi_mpi_wait(&request, &status); + smpi_mpi_send(buf, count, datatype, to_intra, tag, comm); } return MPI_SUCCESS; } // pipeline bcast else { request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); // case ROOT of each SMP if (rank % NUM_CORE == 0) { // case real root if (rank == 0) { for (i = 0; i < pipe_length; i++) { - MPI_Send((char *) buf + (i * increment), segment, datatype, to_inter, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_inter, (tag + i), comm); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_intra, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra, (tag + i), comm); } } // case last ROOT of each SMP else if (rank == (((size - 1) / NUM_CORE) * NUM_CORE)) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, - from_inter, (tag + i), comm, &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, + from_inter, (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&request_array[i], &status); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_intra, + smpi_mpi_wait(&request_array[i], &status); + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra, (tag + i), comm); } } // case intermediate ROOT of each SMP else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, - from_inter, (tag + i), comm, &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, + from_inter, (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&request_array[i], &status); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_inter, + smpi_mpi_wait(&request_array[i], &status); + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_inter, (tag + i), comm); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_intra, + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra, (tag + i), comm); } } } else { // case last non-ROOT of each SMP if (((rank + 1) % NUM_CORE == 0) || (rank == (size - 1))) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, - from_intra, (tag + i), comm, &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, + from_intra, (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&request_array[i], &status); + smpi_mpi_wait(&request_array[i], &status); } } // case intermediate non-ROOT of each SMP else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) buf + (i * increment), segment, datatype, - from_intra, (tag + i), comm, &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype, + from_intra, (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&request_array[i], &status); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_intra, + smpi_mpi_wait(&request_array[i], &status); + smpi_mpi_send((char *) buf + (i * increment), segment, datatype, to_intra, (tag + i), comm); } } @@ -152,9 +154,10 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count, // when count is not divisible by block size, use default BCAST for the remainder if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *) buf + (pipe_length * increment), remainder, datatype, + XBT_WARN("MPI_bcast_SMP_linear use default MPI_bcast."); + smpi_mpi_bcast((char *) buf + (pipe_length * increment), remainder, datatype, root, comm); } - return 1; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/bcast-TSB.c b/src/smpi/colls/bcast-TSB.c deleted file mode 100644 index d701522cee..0000000000 --- a/src/smpi/colls/bcast-TSB.c +++ /dev/null @@ -1,174 +0,0 @@ -#include "colls.h" -int binary_pipeline_bcast_tree_height = 10; - -int binary_pipeline_bcast_send_to[2][128] = { - {1, 2, 3, -1, -1, 6, -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, 17, 18, 19, -1, - -1, 22, -1, 24, 25, 26, 27, -1, -1, 30, -1, -1, 33, 34, 35, -1, -1, 38, -1, - -1, 41, 42, 43, -1, -1, 46, -1, -1, 49, 50, 51, -1, -1, 54, -1, -1, 57, 58, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, 70, -1, -1, 73, 74, 75, -1, -1, - 78, -1, 80, 81, 82, 83, -1, -1, 86, -1, -1, 89, 90, 91, -1, -1, 94, -1, -1, - 97, 98, 99, -1, -1, 102, -1, -1, 105, 106, 107, -1, -1, 110, -1, -1, 113, - 114, 115, -1, -1, 118, -1, -1, 121, 122, 123, -1, -1, 126, -1, -1}, - {8, 5, 4, -1, -1, 7, -1, -1, 15, 13, 12, -1, -1, -1, -1, 72, 23, 21, 20, -1, - -1, -1, -1, 48, 32, 29, 28, -1, -1, 31, -1, -1, 40, 37, 36, -1, -1, 39, -1, - -1, -1, 45, 44, -1, -1, 47, -1, -1, 56, 53, 52, -1, -1, 55, -1, -1, 64, 61, - 60, -1, -1, 63, -1, -1, -1, 69, 68, -1, -1, 71, -1, -1, 79, 77, 76, -1, -1, - -1, -1, 104, 88, 85, 84, -1, -1, 87, -1, -1, 96, 93, 92, -1, -1, 95, -1, -1, - -1, 101, 100, -1, -1, 103, -1, -1, 112, 109, 108, -1, -1, 111, -1, -1, 120, - 117, 116, -1, -1, 119, -1, -1, -1, 125, 124, -1, -1, 127, -1, -1} -}; - -int binary_pipeline_bcast_recv_from[128] = - { -1, 0, 1, 2, 2, 1, 5, 5, 0, 8, 9, 10, 10, 9, 13, 8, 15, 16, 17, 18, 18, -17, 21, 16, 23, 24, 25, 26, 26, 25, 29, 29, 24, 32, 33, 34, 34, 33, 37, 37, 32, 40, 41, 42, 42, 41, 45, 45, 23, -48, 49, 50, 50, 49, 53, 53, 48, 56, 57, 58, 58, 57, 61, 61, 56, 64, 65, 66, 66, 65, 69, 69, 15, 72, 73, 74, 74, -73, 77, 72, 79, 80, 81, 82, 82, 81, 85, 85, 80, 88, 89, 90, 90, 89, 93, 93, 88, 96, 97, 98, 98, 97, 101, 101, 79, -104, 105, 106, 106, 105, 109, 109, 104, 112, 113, 114, 114, 113, 117, 117, 112, 120, 121, 122, 122, 121, 125, -125 }; - -int binary_pipeline_bcast_sequence[128] = - { 0, 1, 2, 3, 3, 2, 3, 3, 1, 2, 3, 4, 4, 3, 4, 2, 3, 4, 5, 6, 6, 5, 6, 4, 5, -6, 7, 8, 8, 7, 8, 8, 6, 7, 8, 9, 9, 8, 9, 9, 7, 8, 9, 10, 10, 9, 10, 10, 5, 6, 7, 8, 8, 7, 8, 8, 6, 7, 8, 9, 9, -8, 9, 9, 7, 8, 9, 10, 10, 9, 10, 10, 3, 4, 5, 6, 6, 5, 6, 4, 5, 6, 7, 8, 8, 7, 8, 8, 6, 7, 8, 9, 9, 8, 9, 9, 7, -8, 9, 10, 10, 9, 10, 10, 5, 6, 7, 8, 8, 7, 8, 8, 6, 7, 8, 9, 9, 8, 9, 9, 7, 8, 9, 10, 10, 9, 10, 10 }; - - -int bcast_TSB_segment_size_in_byte = 8192; - -int smpi_coll_tuned_bcast_TSB(void *buf, int count, MPI_Datatype datatype, - int root, MPI_Comm comm) -{ - int tag = 5000; - MPI_Status status; - int rank, size; - int i; - - MPI_Aint extent; - MPI_Type_extent(datatype, &extent); - - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - /* source node and destination nodes (same through out the functions) */ - int to_left = binary_pipeline_bcast_send_to[0][rank]; - int to_right = binary_pipeline_bcast_send_to[1][rank]; - int from = binary_pipeline_bcast_recv_from[rank]; - - /* segment is segment size in number of elements (not bytes) */ - int segment = bcast_TSB_segment_size_in_byte / extent; - - /* pipeline length */ - int pipe_length = count / segment; - - /* use for buffer offset for sending and receiving data = segment size in byte */ - int increment = segment * extent; - - /* if the input size is not divisible by segment size => - the small remainder will be done with native implementation */ - int remainder = count % segment; - - /* if root is not zero send to rank zero first */ - if (root != 0) { - if (rank == root) { - MPI_Send(buf, count, datatype, 0, tag, comm); - } else if (rank == 0) { - MPI_Recv(buf, count, datatype, root, tag, comm, &status); - } - } - - /* when a message is smaller than a block size => no pipeline */ - if (count <= segment) { - - /* case: root */ - if (rank == 0) { - /* case root has only a left child */ - if (to_right == -1) { - MPI_Send(buf, count, datatype, to_left, tag, comm); - } - /* case root has both left and right children */ - else { - MPI_Send(buf, count, datatype, to_left, tag, comm); - MPI_Send(buf, count, datatype, to_right, tag, comm); - } - } - - /* case: leaf ==> receive only */ - else if (to_left == -1) { - MPI_Recv(buf, count, datatype, from, tag, comm, &status); - } - - /* case: intermidiate node with only left child ==> relay message */ - else if (to_right == -1) { - MPI_Recv(buf, count, datatype, from, tag, comm, &status); - MPI_Send(buf, count, datatype, to_left, tag, comm); - } - - /* case: intermidiate node with both left and right children ==> relay message */ - else { - MPI_Recv(buf, count, datatype, from, tag, comm, &status); - MPI_Send(buf, count, datatype, to_left, tag, comm); - MPI_Send(buf, count, datatype, to_right, tag, comm); - } - return MPI_SUCCESS; - } - // pipelining - else { - - /* case: root */ - if (rank == 0) { - /* case root has only a left child */ - if (to_right == -1) { - for (i = 0; i < pipe_length; i++) { - MPI_Send((char *) buf + (i * increment), segment, datatype, to_left, - tag + i, comm); - } - } - /* case root has both left and right children */ - else { - for (i = 0; i < pipe_length; i++) { - MPI_Send((char *) buf + (i * increment), segment, datatype, to_left, - tag + i, comm); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_right, - tag + i, comm); - } - } - } - - /* case: leaf ==> receive only */ - else if (to_left == -1) { - for (i = 0; i < pipe_length; i++) { - MPI_Recv((char *) buf + (i * increment), segment, datatype, from, - tag + i, comm, &status); - } - } - - /* case: intermidiate node with only left child ==> relay message */ - else if (to_right == -1) { - for (i = 0; i < pipe_length; i++) { - MPI_Recv((char *) buf + (i * increment), segment, datatype, from, - tag + i, comm, &status); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_left, - tag + i, comm); - } - } - /* case: intermidiate node with both left and right children ==> relay message */ - else { - for (i = 0; i < pipe_length; i++) { - MPI_Recv((char *) buf + (i * increment), segment, datatype, from, - tag + i, comm, &status); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_left, - tag + i, comm); - MPI_Send((char *) buf + (i * increment), segment, datatype, to_right, - tag + i, comm); - } - } - } - - /* when count is not divisible by block size, use default BCAST for the remainder */ - if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *) buf + (pipe_length * increment), remainder, datatype, - root, comm); - } - - return MPI_SUCCESS; -} diff --git a/src/smpi/colls/bcast-arrival-nb.c b/src/smpi/colls/bcast-arrival-nb.c index a4246c4656..9ff27b4607 100644 --- a/src/smpi/colls/bcast-arrival-nb.c +++ b/src/smpi/colls/bcast-arrival-nb.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" static int bcast_NTSL_segment_size_in_byte = 8192; @@ -32,15 +32,15 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, char temp_buf[MAX_NODE]; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); /* destination */ int to; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* segment is segment size in number of elements (not bytes) */ @@ -61,9 +61,9 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, */ if (root != 0) { if (rank == root) { - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); } else if (rank == 0) { - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } } @@ -83,7 +83,7 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, // for (j=0;j<1000;j++) { for (i = 1; i < size; i++) { if (already_sent[i] == 0) - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], MPI_STATUSES_IGNORE); } //} @@ -94,7 +94,7 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, /* message arrive */ if ((flag_array[i] == 1) && (already_sent[i] == 0)) { - MPI_Recv(temp_buf, 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); + smpi_mpi_recv(temp_buf, 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); header_buf[header_index] = i; header_index++; sent_count++; @@ -108,8 +108,8 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, if (header_index != 0) { header_buf[header_index] = -1; to = header_buf[0]; - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); - MPI_Send(buf, count, datatype, to, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); + smpi_mpi_send(buf, count, datatype, to, tag, comm); } /* randomly MPI_Send to one */ @@ -119,8 +119,8 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, if (already_sent[i] == 0) { header_buf[0] = i; header_buf[1] = -1; - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, i, tag, comm); - MPI_Send(buf, count, datatype, i, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, i, tag, comm); + smpi_mpi_send(buf, count, datatype, i, tag, comm); already_sent[i] = 1; sent_count++; break; @@ -136,12 +136,12 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, else { /* send 1-byte message to root */ - MPI_Send(temp_buf, 1, MPI_CHAR, 0, tag, comm); + smpi_mpi_send(temp_buf, 1, MPI_CHAR, 0, tag, comm); /* wait for header and data, forward when required */ - MPI_Recv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, + smpi_mpi_recv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, &status); - MPI_Recv(buf, count, datatype, MPI_ANY_SOURCE, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, MPI_ANY_SOURCE, tag, comm, &status); /* search for where it is */ int myordering = 0; @@ -151,22 +151,22 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, /* send header followed by data */ if (header_buf[myordering + 1] != -1) { - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], tag, comm); - MPI_Send(buf, count, datatype, header_buf[myordering + 1], tag, comm); + smpi_mpi_send(buf, count, datatype, header_buf[myordering + 1], tag, comm); } } } /* pipeline bcast */ else { send_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); recv_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); send_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); recv_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); if (rank == 0) { sent_count = 0; @@ -183,11 +183,11 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, for (k = 0; k < 3; k++) { for (i = 1; i < size; i++) { if ((already_sent[i] == 0) && (will_send[i] == 0)) { - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], &temp_status_array[i]); if (flag_array[i] == 1) { will_send[i] = 1; - MPI_Recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, + smpi_mpi_recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); i = 1; } @@ -238,7 +238,7 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, //start = MPI_Wtime(); /* send header */ - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); //total = MPI_Wtime() - start; //total *= 1000; @@ -250,16 +250,16 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, if (0 == 1) { //if (header_index == 1) { - MPI_Send(buf, count, datatype, to, tag, comm); + smpi_mpi_send(buf, count, datatype, to, tag, comm); } /* send data - pipeline */ else { for (i = 0; i < pipe_length; i++) { - MPI_Send((char *)buf + (i * increment), segment, datatype, to, tag, comm); + smpi_mpi_send((char *)buf + (i * increment), segment, datatype, to, tag, comm); } - //MPI_Waitall((pipe_length), send_request_array, send_status_array); + //smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } //total = MPI_Wtime() - start; //total *= 1000; @@ -279,16 +279,16 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, to = i; //start = MPI_Wtime(); - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); /* still need to chop data so that we can use the same non-root code */ for (j = 0; j < pipe_length; j++) { - MPI_Send((char *)buf + (j * increment), segment, datatype, to, tag, + smpi_mpi_send((char *)buf + (j * increment), segment, datatype, to, tag, comm); } - //MPI_Send(buf,count,datatype,to,tag,comm); - //MPI_Wait(&request,MPI_STATUS_IGNORE); + //smpi_mpi_send(buf,count,datatype,to,tag,comm); + //smpi_mpi_wait(&request,MPI_STATUS_IGNORE); //total = MPI_Wtime() - start; //total *= 1000; @@ -310,10 +310,10 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, /* probe before exit in case there are messages to recv */ for (i = 1; i < size; i++) { - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], &temp_status_array[i]); if (flag_array[i] == 1) - MPI_Recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); + smpi_mpi_recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); } } @@ -322,16 +322,15 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, else { /* if root already send a message to this node, don't send one-byte message */ - MPI_Iprobe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[0], &status); + smpi_mpi_iprobe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[0], &status); /* send 1-byte message to root */ if (flag_array[0] == 0) - MPI_Send(temp_buf, 1, MPI_CHAR, 0, tag, comm); + smpi_mpi_send(temp_buf, 1, MPI_CHAR, 0, tag, comm); /* wait for header forward when required */ - MPI_Irecv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, - &request); - MPI_Wait(&request, MPI_STATUS_IGNORE); + request = smpi_mpi_irecv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm); + smpi_mpi_wait(&request, MPI_STATUS_IGNORE); /* search for where it is */ int myordering = 0; @@ -341,7 +340,7 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, /* send header when required */ if (header_buf[myordering + 1] != -1) { - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], tag, comm); } @@ -349,25 +348,24 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, if (0 == -1) { //if (header_buf[1] == -1) { - MPI_Irecv(buf, count, datatype, 0, tag, comm, &request); - MPI_Wait(&request, MPI_STATUS_IGNORE); + request = smpi_mpi_irecv(buf, count, datatype, 0, tag, comm); + smpi_mpi_wait(&request, MPI_STATUS_IGNORE); //printf("\t\tnode %d ordering = %d receive data from root\n",rank,myordering); } else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *)buf + (i * increment), segment, datatype, MPI_ANY_SOURCE, - tag, comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *)buf + (i * increment), segment, datatype, MPI_ANY_SOURCE, + tag, comm); } } /* send data */ if (header_buf[myordering + 1] != -1) { for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], MPI_STATUS_IGNORE); - MPI_Isend((char *)buf + (i * increment), segment, datatype, - header_buf[myordering + 1], tag, comm, - &send_request_array[i]); + smpi_mpi_wait(&recv_request_array[i], MPI_STATUS_IGNORE); + send_request_array[i] = smpi_mpi_isend((char *)buf + (i * increment), segment, datatype, + header_buf[myordering + 1], tag, comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } } @@ -380,7 +378,8 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count, /* when count is not divisible by block size, use default BCAST for the remainder */ if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *)buf + (pipe_length * increment), remainder, datatype, root, comm); + XBT_WARN("MPI_bcast_arrival_nb use default MPI_bcast."); + smpi_mpi_bcast((char *)buf + (pipe_length * increment), remainder, datatype, root, comm); } return MPI_SUCCESS; diff --git a/src/smpi/colls/bcast-arrival-pattern-aware-wait.c b/src/smpi/colls/bcast-arrival-pattern-aware-wait.c index 7a91dd821f..0a1224608f 100644 --- a/src/smpi/colls/bcast-arrival-pattern-aware-wait.c +++ b/src/smpi/colls/bcast-arrival-pattern-aware-wait.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" int bcast_arrival_pattern_aware_wait_segment_size_in_byte = 8192; @@ -42,15 +42,15 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, int header_size = BCAST_ARRIVAL_PATTERN_AWARE_HEADER_SIZE; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); /* source and destination */ int to, from; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* segment is segment size in number of elements (not bytes) */ @@ -71,9 +71,9 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, */ if (root != 0) { if (rank == root) { - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); } else if (rank == 0) { - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } } @@ -92,13 +92,13 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, /* start pipeline bcast */ send_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); recv_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); send_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); recv_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); /* root */ if (rank == 0) { @@ -114,11 +114,11 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, for (k = 0; k < 3; k++) { for (i = 1; i < size; i++) { if ((already_sent[i] == 0) && (will_send[i] == 0)) { - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], &temp_status_array[i]); if (flag_array[i] == 1) { will_send[i] = 1; - MPI_Recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, + smpi_mpi_recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); i = 0; } @@ -147,14 +147,13 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, to = header_buf[0]; /* send header */ - MPI_Send(header_buf, header_size, MPI_INT, to, tag, comm); + smpi_mpi_send(header_buf, header_size, MPI_INT, to, tag, comm); /* send data - pipeline */ for (i = 0; i < pipe_length; i++) { - MPI_Isend((char *)buf + (i * increment), segment, datatype, to, tag, comm, - &send_request_array[i]); + send_request_array[i] = smpi_mpi_isend((char *)buf + (i * increment), segment, datatype, to, tag, comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } @@ -171,11 +170,11 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, header_buf[1] = -1; to = i; - MPI_Send(header_buf, header_size, MPI_INT, to, tag, comm); + smpi_mpi_send(header_buf, header_size, MPI_INT, to, tag, comm); /* still need to chop data so that we can use the same non-root code */ for (j = 0; j < pipe_length; j++) { - MPI_Send((char *)buf + (j * increment), segment, datatype, to, tag, comm); + smpi_mpi_send((char *)buf + (j * increment), segment, datatype, to, tag, comm); } } } @@ -188,12 +187,11 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, else { /* send 1-byte message to root */ - MPI_Send(temp_buf, 1, MPI_CHAR, 0, tag, comm); + smpi_mpi_send(temp_buf, 1, MPI_CHAR, 0, tag, comm); /* wait for header forward when required */ - MPI_Irecv(header_buf, header_size, MPI_INT, MPI_ANY_SOURCE, tag, comm, - &request); - MPI_Wait(&request, MPI_STATUS_IGNORE); + request = smpi_mpi_irecv(header_buf, header_size, MPI_INT, MPI_ANY_SOURCE, tag, comm); + smpi_mpi_wait(&request, MPI_STATUS_IGNORE); /* search for where it is */ int myordering = 0; @@ -210,29 +208,27 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, /* send header when required */ if (to != -1) { - MPI_Send(header_buf, header_size, MPI_INT, to, tag, comm); + smpi_mpi_send(header_buf, header_size, MPI_INT, to, tag, comm); } /* receive data */ for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *)buf + (i * increment), segment, datatype, from, tag, comm, - &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *)buf + (i * increment), segment, datatype, from, tag, comm); } /* forward data */ if (to != -1) { for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], MPI_STATUS_IGNORE); - MPI_Isend((char *)buf + (i * increment), segment, datatype, to, tag, comm, - &send_request_array[i]); + smpi_mpi_wait(&recv_request_array[i], MPI_STATUS_IGNORE); + send_request_array[i] = smpi_mpi_isend((char *)buf + (i * increment), segment, datatype, to, tag, comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } /* recv only */ else { - MPI_Waitall((pipe_length), recv_request_array, recv_status_array); + smpi_mpi_waitall((pipe_length), recv_request_array, recv_status_array); } } @@ -244,7 +240,8 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware_wait(void *buf, int count, /* when count is not divisible by block size, use default BCAST for the remainder */ if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *)buf + (pipe_length * increment), remainder, datatype, root, comm); + XBT_WARN("MPI_bcast_arrival_pattern_aware_wait use default MPI_bcast."); + smpi_mpi_bcast((char *)buf + (pipe_length * increment), remainder, datatype, root, comm); } return MPI_SUCCESS; diff --git a/src/smpi/colls/bcast-arrival-pattern-aware.c b/src/smpi/colls/bcast-arrival-pattern-aware.c index 9c84a49271..f4a482cab3 100644 --- a/src/smpi/colls/bcast-arrival-pattern-aware.c +++ b/src/smpi/colls/bcast-arrival-pattern-aware.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" static int bcast_NTSL_segment_size_in_byte = 8192; @@ -32,15 +32,15 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, char temp_buf[MAX_NODE]; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); /* destination */ int to; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* segment is segment size in number of elements (not bytes) */ @@ -61,9 +61,9 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, */ if (root != 0) { if (rank == root) { - MPI_Send(buf, count, datatype, 0, tag, comm); + smpi_mpi_send(buf, count, datatype, 0, tag, comm); } else if (rank == 0) { - MPI_Recv(buf, count, datatype, root, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag, comm, &status); } } @@ -79,7 +79,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, while (sent_count < (size - 1)) { for (i = 1; i < size; i++) { - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], MPI_STATUSES_IGNORE); } @@ -89,7 +89,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, /* message arrive */ if ((flag_array[i] == 1) && (already_sent[i] == 0)) { - MPI_Recv(temp_buf, 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); + smpi_mpi_recv(temp_buf, 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); header_buf[header_index] = i; header_index++; sent_count++; @@ -103,8 +103,8 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, if (header_index != 0) { header_buf[header_index] = -1; to = header_buf[0]; - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); - MPI_Send(buf, count, datatype, to, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); + smpi_mpi_send(buf, count, datatype, to, tag, comm); } /* randomly MPI_Send to one */ @@ -114,8 +114,8 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, if (already_sent[i] == 0) { header_buf[0] = i; header_buf[1] = -1; - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, i, tag, comm); - MPI_Send(buf, count, datatype, i, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, i, tag, comm); + smpi_mpi_send(buf, count, datatype, i, tag, comm); already_sent[i] = 1; sent_count++; break; @@ -131,12 +131,12 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, else { /* send 1-byte message to root */ - MPI_Send(temp_buf, 1, MPI_CHAR, 0, tag, comm); + smpi_mpi_send(temp_buf, 1, MPI_CHAR, 0, tag, comm); /* wait for header and data, forward when required */ - MPI_Recv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, + smpi_mpi_recv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, &status); - MPI_Recv(buf, count, datatype, MPI_ANY_SOURCE, tag, comm, &status); + smpi_mpi_recv(buf, count, datatype, MPI_ANY_SOURCE, tag, comm, &status); /* search for where it is */ int myordering = 0; @@ -146,22 +146,22 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, /* send header followed by data */ if (header_buf[myordering + 1] != -1) { - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], tag, comm); - MPI_Send(buf, count, datatype, header_buf[myordering + 1], tag, comm); + smpi_mpi_send(buf, count, datatype, header_buf[myordering + 1], tag, comm); } } } /* pipeline bcast */ else { send_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); recv_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); send_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); recv_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); if (rank == 0) { //double start2 = MPI_Wtime(); @@ -171,7 +171,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, //iteration++; //start = MPI_Wtime(); for (i = 1; i < size; i++) { - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], &temp_status_array[i]); } //total = MPI_Wtime() - start; @@ -184,7 +184,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, for (i = 1; i < size; i++) { /* message arrive */ if ((flag_array[i] == 1) && (already_sent[i] == 0)) { - MPI_Recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, + smpi_mpi_recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); header_buf[header_index] = i; header_index++; @@ -216,7 +216,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, //start = MPI_Wtime(); /* send header */ - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); //total = MPI_Wtime() - start; //total *= 1000; @@ -228,16 +228,16 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, if (0 == 1) { //if (header_index == 1) { - MPI_Send(buf, count, datatype, to, tag, comm); + smpi_mpi_send(buf, count, datatype, to, tag, comm); } /* send data - pipeline */ else { for (i = 0; i < pipe_length; i++) { - MPI_Send((char *)buf + (i * increment), segment, datatype, to, tag, comm); + smpi_mpi_send((char *)buf + (i * increment), segment, datatype, to, tag, comm); } - //MPI_Waitall((pipe_length), send_request_array, send_status_array); + //smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } //total = MPI_Wtime() - start; //total *= 1000; @@ -257,16 +257,16 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, to = i; //start = MPI_Wtime(); - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); /* still need to chop data so that we can use the same non-root code */ for (j = 0; j < pipe_length; j++) { - MPI_Send((char *)buf + (j * increment), segment, datatype, to, tag, + smpi_mpi_send((char *)buf + (j * increment), segment, datatype, to, tag, comm); } - //MPI_Send(buf,count,datatype,to,tag,comm); - //MPI_Wait(&request,MPI_STATUS_IGNORE); + //smpi_mpi_send(buf,count,datatype,to,tag,comm); + //smpi_mpi_wait(&request,MPI_STATUS_IGNORE); //total = MPI_Wtime() - start; //total *= 1000; @@ -291,12 +291,11 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, /* none root */ else { /* send 1-byte message to root */ - MPI_Send(temp_buf, 1, MPI_CHAR, 0, tag, comm); + smpi_mpi_send(temp_buf, 1, MPI_CHAR, 0, tag, comm); /* wait for header forward when required */ - MPI_Irecv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, - &request); - MPI_Wait(&request, MPI_STATUS_IGNORE); + request = smpi_mpi_irecv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm); + smpi_mpi_wait(&request, MPI_STATUS_IGNORE); /* search for where it is */ int myordering = 0; @@ -306,7 +305,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, /* send header when required */ if (header_buf[myordering + 1] != -1) { - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], tag, comm); } @@ -314,25 +313,24 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, if (0 == -1) { //if (header_buf[1] == -1) { - MPI_Irecv(buf, count, datatype, 0, tag, comm, &request); - MPI_Wait(&request, MPI_STATUS_IGNORE); + request = smpi_mpi_irecv(buf, count, datatype, 0, tag, comm); + smpi_mpi_wait(&request, MPI_STATUS_IGNORE); //printf("\t\tnode %d ordering = %d receive data from root\n",rank,myordering); } else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *)buf + (i * increment), segment, datatype, MPI_ANY_SOURCE, - tag, comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *)buf + (i * increment), segment, datatype, MPI_ANY_SOURCE, + tag, comm); } } /* send data */ if (header_buf[myordering + 1] != -1) { for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], MPI_STATUS_IGNORE); - MPI_Isend((char *)buf + (i * increment), segment, datatype, - header_buf[myordering + 1], tag, comm, - &send_request_array[i]); + smpi_mpi_wait(&recv_request_array[i], MPI_STATUS_IGNORE); + send_request_array[i] = smpi_mpi_isend((char *)buf + (i * increment), segment, datatype, + header_buf[myordering + 1], tag, comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } } @@ -345,7 +343,8 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count, /* when count is not divisible by block size, use default BCAST for the remainder */ if ((remainder != 0) && (count > segment)) { - MPI_Bcast((char *)buf + (pipe_length * increment), remainder, datatype, root, comm); + XBT_WARN("MPI_bcast_arrival_pattern_aware use default MPI_bcast."); + smpi_mpi_bcast((char *)buf + (pipe_length * increment), remainder, datatype, root, comm); } return MPI_SUCCESS; diff --git a/src/smpi/colls/bcast-arrival-scatter.c b/src/smpi/colls/bcast-arrival-scatter.c index 5c1df67440..6ad805d6e6 100644 --- a/src/smpi/colls/bcast-arrival-scatter.c +++ b/src/smpi/colls/bcast-arrival-scatter.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" #ifndef BCAST_ARRIVAL_PATTERN_AWARE_HEADER_SIZE #define BCAST_ARRIVAL_PATTERN_AWARE_HEADER_SIZE 128 @@ -41,18 +41,20 @@ int smpi_coll_tuned_bcast_arrival_scatter(void *buf, int count, int header_size = BCAST_ARRIVAL_PATTERN_AWARE_HEADER_SIZE; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); /* source and destination */ int to, from; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* message too small */ if (count < size) { - return MPI_Bcast(buf, count, datatype, root, comm); + XBT_WARN("MPI_bcast_arrival_scatter use default MPI_bcast."); + smpi_mpi_bcast(buf, count, datatype, root, comm); + return MPI_SUCCESS; } @@ -62,9 +64,9 @@ int smpi_coll_tuned_bcast_arrival_scatter(void *buf, int count, */ if (root != 0) { if (rank == root) { - MPI_Send(buf, count, datatype, 0, tag - 1, comm); + smpi_mpi_send(buf, count, datatype, 0, tag - 1, comm); } else if (rank == 0) { - MPI_Recv(buf, count, datatype, root, tag - 1, comm, &status); + smpi_mpi_recv(buf, count, datatype, root, tag - 1, comm, &status); } } @@ -88,11 +90,11 @@ int smpi_coll_tuned_bcast_arrival_scatter(void *buf, int count, for (k = 0; k < 3; k++) { for (i = 1; i < size; i++) { if ((already_sent[i] == 0) && (will_send[i] == 0)) { - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], &temp_status_array[i]); if (flag_array[i] == 1) { will_send[i] = 1; - MPI_Recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, + smpi_mpi_recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); i = 0; } @@ -131,7 +133,7 @@ int smpi_coll_tuned_bcast_arrival_scatter(void *buf, int count, /* send header */ for (i = 0; i < header_index; i++) { to = header_buf[i]; - MPI_Send(header_buf, header_size, MPI_INT, to, header_tag, comm); + smpi_mpi_send(header_buf, header_size, MPI_INT, to, header_tag, comm); } curr_remainder = count % header_index; @@ -145,7 +147,7 @@ int smpi_coll_tuned_bcast_arrival_scatter(void *buf, int count, if ((i == (header_index - 1)) || (curr_size == 0)) curr_size += curr_remainder; //printf("Root send to %d index %d\n",to,(i*curr_increment)); - MPI_Send((char *) buf + (i * curr_increment), curr_size, datatype, to, + smpi_mpi_send((char *) buf + (i * curr_increment), curr_size, datatype, to, tag, comm); } } @@ -156,10 +158,10 @@ int smpi_coll_tuned_bcast_arrival_scatter(void *buf, int count, /* none root */ else { /* send 1-byte message to root */ - MPI_Send(temp_buf, 1, MPI_CHAR, 0, tag, comm); + smpi_mpi_send(temp_buf, 1, MPI_CHAR, 0, tag, comm); /* wait for header forward when required */ - MPI_Recv(header_buf, header_size, MPI_INT, 0, header_tag, comm, &status); + smpi_mpi_recv(header_buf, header_size, MPI_INT, 0, header_tag, comm, &status); /* search for where it is */ int myordering = 0; @@ -180,7 +182,7 @@ int smpi_coll_tuned_bcast_arrival_scatter(void *buf, int count, /* receive data */ if (myordering == (total_nodes - 1)) recv_size += curr_remainder; - MPI_Recv((char *) buf + (myordering * curr_increment), recv_size, datatype, + smpi_mpi_recv((char *) buf + (myordering * curr_increment), recv_size, datatype, 0, tag, comm, &status); /* at this point all nodes in this set perform all-gather operation */ @@ -218,7 +220,7 @@ int smpi_coll_tuned_bcast_arrival_scatter(void *buf, int count, //printf("\tnode %d sent_offset %d send_count %d\n",rank,send_offset,send_count); - MPI_Sendrecv((char *) buf + send_offset, send_count, datatype, to, + smpi_mpi_sendrecv((char *) buf + send_offset, send_count, datatype, to, tag + i, (char *) buf + recv_offset, recv_count, datatype, from, tag + i, comm, &status); } diff --git a/src/smpi/colls/bcast-binomial-tree.c b/src/smpi/colls/bcast-binomial-tree.c index ae67cfc2f3..e840c027dc 100644 --- a/src/smpi/colls/bcast-binomial-tree.c +++ b/src/smpi/colls/bcast-binomial-tree.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -68,10 +68,10 @@ smpi_coll_tuned_bcast_binomial_tree(void *buff, int count, MPI_Comm comm) { int src, dst, rank, num_procs, mask, relative_rank; - int tag = 1, success = 0; + int tag = 1; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); relative_rank = (rank >= root) ? rank - root : rank - root + num_procs; @@ -81,7 +81,7 @@ smpi_coll_tuned_bcast_binomial_tree(void *buff, int count, src = rank - mask; if (src < 0) src += num_procs; - MPI_Recv(buff, count, data_type, src, tag, comm, MPI_STATUS_IGNORE); + smpi_mpi_recv(buff, count, data_type, src, tag, comm, MPI_STATUS_IGNORE); break; } mask <<= 1; @@ -93,10 +93,10 @@ smpi_coll_tuned_bcast_binomial_tree(void *buff, int count, dst = rank + mask; if (dst >= num_procs) dst -= num_procs; - MPI_Send(buff, count, data_type, dst, tag, comm); + smpi_mpi_send(buff, count, data_type, dst, tag, comm); } mask >>= 1; } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/bcast-flattree-pipeline.c b/src/smpi/colls/bcast-flattree-pipeline.c index 521203247d..9033bf571d 100644 --- a/src/smpi/colls/bcast-flattree-pipeline.c +++ b/src/smpi/colls/bcast-flattree-pipeline.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" int flattree_segment_in_byte = 8192; @@ -11,27 +11,29 @@ smpi_coll_tuned_bcast_flattree_pipeline(void *buff, int count, int tag = 1; MPI_Aint extent; - MPI_Type_extent(data_type, &extent); + extent = smpi_datatype_get_extent(data_type); int segment = flattree_segment_in_byte / extent; int pipe_length = count / segment; int increment = segment * extent; - - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); + if (pipe_length==0) { + XBT_WARN("MPI_bcast_flattree_pipeline use default MPI_bcast_flattree."); + return smpi_coll_tuned_bcast_flattree(buff, count, data_type, root, comm); + } + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); MPI_Request *request_array; MPI_Status *status_array; - request_array = (MPI_Request *) malloc(pipe_length * sizeof(MPI_Request)); - status_array = (MPI_Status *) malloc(pipe_length * sizeof(MPI_Status)); + request_array = (MPI_Request *) xbt_malloc(pipe_length * sizeof(MPI_Request)); + status_array = (MPI_Status *) xbt_malloc(pipe_length * sizeof(MPI_Status)); if (rank != root) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *)buff + (i * increment), segment, data_type, root, tag, comm, - &request_array[i]); + request_array[i] = smpi_mpi_irecv((char *)buff + (i * increment), segment, data_type, root, tag, comm); } - MPI_Waitall(pipe_length, request_array, status_array); + smpi_mpi_waitall(pipe_length, request_array, status_array); } else { @@ -41,7 +43,7 @@ smpi_coll_tuned_bcast_flattree_pipeline(void *buff, int count, continue; else { for (i = 0; i < pipe_length; i++) { - MPI_Send((char *)buff + (i * increment), segment, data_type, j, tag, comm); + smpi_mpi_send((char *)buff + (i * increment), segment, data_type, j, tag, comm); } } } diff --git a/src/smpi/colls/bcast-flattree.c b/src/smpi/colls/bcast-flattree.c index 693d83d555..626c20381c 100644 --- a/src/smpi/colls/bcast-flattree.c +++ b/src/smpi/colls/bcast-flattree.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" int smpi_coll_tuned_bcast_flattree(void *buff, int count, MPI_Datatype data_type, @@ -10,26 +10,26 @@ smpi_coll_tuned_bcast_flattree(void *buff, int count, MPI_Datatype data_type, int i, rank, num_procs; int tag = 1; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); if (rank != root) { - MPI_Recv(buff, count, data_type, root, tag, comm, MPI_STATUS_IGNORE); + smpi_mpi_recv(buff, count, data_type, root, tag, comm, MPI_STATUS_IGNORE); } else { - reqs = (MPI_Request *) malloc((num_procs - 1) * sizeof(MPI_Request)); + reqs = (MPI_Request *) xbt_malloc((num_procs - 1) * sizeof(MPI_Request)); req_ptr = reqs; // Root sends data to all others for (i = 0; i < num_procs; i++) { if (i == rank) continue; - MPI_Isend(buff, count, data_type, i, tag, comm, req_ptr++); + *(req_ptr++) = smpi_mpi_isend(buff, count, data_type, i, tag, comm); } // wait on all requests - MPI_Waitall(num_procs - 1, reqs, MPI_STATUSES_IGNORE); + smpi_mpi_waitall(num_procs - 1, reqs, MPI_STATUSES_IGNORE); free(reqs); } diff --git a/src/smpi/colls/bcast-ompi-pipeline.c b/src/smpi/colls/bcast-ompi-pipeline.c new file mode 100644 index 0000000000..63c206784a --- /dev/null +++ b/src/smpi/colls/bcast-ompi-pipeline.c @@ -0,0 +1,204 @@ + #include "colls_private.h" + #include "coll_tuned_topo.h" + +#define MAXTREEFANOUT 32 + + +int smpi_coll_tuned_bcast_ompi_pipeline( void* buffer, + int original_count, + MPI_Datatype datatype, + int root, + MPI_Comm comm) +{ + int count_by_segment = original_count; + size_t type_size; + int segsize =1024 << 7; + //mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module; + //mca_coll_tuned_comm_t *data = tuned_module->tuned_data; + +// return ompi_coll_tuned_bcast_intra_generic( buffer, count, datatype, root, comm, module, +// count_by_segment, data->cached_pipeline ); + ompi_coll_tree_t * tree = ompi_coll_tuned_topo_build_chain( 1, comm, root ); + int i; + int rank, size; + int segindex; + int num_segments; /* Number of segments */ + int sendcount; /* number of elements sent in this segment */ + size_t realsegsize; + char *tmpbuf; + ptrdiff_t extent; + MPI_Request recv_reqs[2] = {MPI_REQUEST_NULL, MPI_REQUEST_NULL}; + MPI_Request *send_reqs = NULL; + int req_index; + + /** + * Determine number of elements sent per operation. + */ + type_size = smpi_datatype_size(datatype); + + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + xbt_assert( size > 1 ); + + + const double a_p16 = 3.2118e-6; /* [1 / byte] */ + const double b_p16 = 8.7936; + const double a_p64 = 2.3679e-6; /* [1 / byte] */ + const double b_p64 = 1.1787; + const double a_p128 = 1.6134e-6; /* [1 / byte] */ + const double b_p128 = 2.1102; + size_t message_size; + + /* else we need data size for decision function */ + message_size = type_size * (unsigned long)original_count; /* needed for decision */ + + if (size < (a_p128 * message_size + b_p128)) { + //Pipeline with 128KB segments + segsize = 1024 << 7; + }else if (size < (a_p64 * message_size + b_p64)) { + // Pipeline with 64KB segments + segsize = 1024 << 6; + }else if (size < (a_p16 * message_size + b_p16)) { + //Pipeline with 16KB segments + segsize = 1024 << 4; + } + + COLL_TUNED_COMPUTED_SEGCOUNT( segsize, type_size, count_by_segment ); + + XBT_DEBUG("coll:tuned:bcast_intra_pipeline rank %d ss %5d type_size %lu count_by_segment %d", + smpi_comm_rank(comm), segsize, (unsigned long)type_size, count_by_segment); + + + + extent = smpi_datatype_get_extent (datatype); + num_segments = (original_count + count_by_segment - 1) / count_by_segment; + realsegsize = count_by_segment * extent; + + /* Set the buffer pointers */ + tmpbuf = (char *) buffer; + + if( tree->tree_nextsize != 0 ) { + send_reqs = xbt_new(MPI_Request, tree->tree_nextsize ); + } + + /* Root code */ + if( rank == root ) { + /* + For each segment: + - send segment to all children. + The last segment may have less elements than other segments. + */ + sendcount = count_by_segment; + for( segindex = 0; segindex < num_segments; segindex++ ) { + if( segindex == (num_segments - 1) ) { + sendcount = original_count - segindex * count_by_segment; + } + for( i = 0; i < tree->tree_nextsize; i++ ) { + send_reqs[i] = smpi_mpi_isend(tmpbuf, sendcount, datatype, + tree->tree_next[i], + 777, comm); + } + + /* complete the sends before starting the next sends */ + smpi_mpi_waitall( tree->tree_nextsize, send_reqs, + MPI_STATUSES_IGNORE ); + + /* update tmp buffer */ + tmpbuf += realsegsize; + + } + } + + /* Intermediate nodes code */ + else if( tree->tree_nextsize > 0 ) { + /* + Create the pipeline. + 1) Post the first receive + 2) For segments 1 .. num_segments + - post new receive + - wait on the previous receive to complete + - send this data to children + 3) Wait on the last segment + 4) Compute number of elements in last segment. + 5) Send the last segment to children + */ + req_index = 0; + recv_reqs[req_index]=smpi_mpi_irecv(tmpbuf, count_by_segment, datatype, + tree->tree_prev, 777, + comm); + + for( segindex = 1; segindex < num_segments; segindex++ ) { + + req_index = req_index ^ 0x1; + + /* post new irecv */ + recv_reqs[req_index]= smpi_mpi_irecv( tmpbuf + realsegsize, count_by_segment, + datatype, tree->tree_prev, + 777, + comm); + + /* wait for and forward the previous segment to children */ + smpi_mpi_wait( &recv_reqs[req_index ^ 0x1], + MPI_STATUSES_IGNORE ); + + for( i = 0; i < tree->tree_nextsize; i++ ) { + send_reqs[i]=smpi_mpi_isend(tmpbuf, count_by_segment, datatype, + tree->tree_next[i], + 777, comm ); + } + + /* complete the sends before starting the next iteration */ + smpi_mpi_waitall( tree->tree_nextsize, send_reqs, + MPI_STATUSES_IGNORE ); + + /* Update the receive buffer */ + tmpbuf += realsegsize; + } + + /* Process the last segment */ + smpi_mpi_wait( &recv_reqs[req_index], MPI_STATUSES_IGNORE ); + sendcount = original_count - (num_segments - 1) * count_by_segment; + for( i = 0; i < tree->tree_nextsize; i++ ) { + send_reqs[i] = smpi_mpi_isend(tmpbuf, sendcount, datatype, + tree->tree_next[i], + 777, comm); + } + + smpi_mpi_waitall( tree->tree_nextsize, send_reqs, + MPI_STATUSES_IGNORE ); + } + + /* Leaf nodes */ + else { + /* + Receive all segments from parent in a loop: + 1) post irecv for the first segment + 2) for segments 1 .. num_segments + - post irecv for the next segment + - wait on the previous segment to arrive + 3) wait for the last segment + */ + req_index = 0; + recv_reqs[req_index] = smpi_mpi_irecv(tmpbuf, count_by_segment, datatype, + tree->tree_prev, 777, + comm); + + for( segindex = 1; segindex < num_segments; segindex++ ) { + req_index = req_index ^ 0x1; + tmpbuf += realsegsize; + /* post receive for the next segment */ + recv_reqs[req_index] = smpi_mpi_irecv(tmpbuf, count_by_segment, datatype, + tree->tree_prev, 777, + comm); + /* wait on the previous segment */ + smpi_mpi_wait( &recv_reqs[req_index ^ 0x1], + MPI_STATUS_IGNORE ); + } + + smpi_mpi_wait( &recv_reqs[req_index], MPI_STATUS_IGNORE ); + } + + if( NULL != send_reqs ) free(send_reqs); + + return (MPI_SUCCESS); +} diff --git a/src/smpi/colls/bcast-ompi-split-bintree.c b/src/smpi/colls/bcast-ompi-split-bintree.c new file mode 100644 index 0000000000..f1201d1c4b --- /dev/null +++ b/src/smpi/colls/bcast-ompi-split-bintree.c @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2009 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) 2009 University of Houston. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer listed + * in this license in the documentation and/or other materials + * provided with the distribution. + + * - Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + + * The copyright holders provide no reassurances that the source code + * provided does not infringe any patent, copyright, or any other + * intellectual property rights of third parties. The copyright holders + * disclaim any liability to any recipient for claims brought against + * recipient by any third party for infringement of that parties + * intellectual property rights. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + #include "colls_private.h" + #include "coll_tuned_topo.h" + #define MAXTREEFANOUT 32 + +int +smpi_coll_tuned_bcast_ompi_split_bintree ( void* buffer, + int count, + MPI_Datatype datatype, + int root, + MPI_Comm comm) +{ + int segsize ; + int rank, size; + int segindex, i, lr, pair; + int segcount[2]; /* Number ompi_request_wait_allof elements sent with each segment */ + uint32_t counts[2]; + int num_segments[2]; /* Number of segmenets */ + int sendcount[2]; /* the same like segcount, except for the last segment */ + size_t realsegsize[2]; + char *tmpbuf[2]; + size_t type_size; + ptrdiff_t type_extent; + + + MPI_Request base_req, new_req; + ompi_coll_tree_t *tree; +// mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module; +// mca_coll_tuned_comm_t *data = tuned_module->tuned_data; + + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + + //compute again segsize + const size_t intermediate_message_size = 370728; + size_t message_size = smpi_datatype_size(datatype) * (unsigned long)count; + if(message_size < intermediate_message_size) + segsize = 1024 ; + else + segsize = 1024 << 3; + + XBT_DEBUG("ompi_coll_tuned_bcast_intra_split_bintree rank %d root %d ss %5d", rank, root, segsize); + + if (size == 1) { + return MPI_SUCCESS; + } + + /* setup the binary tree topology. */ + tree = ompi_coll_tuned_topo_build_tree(2,comm,root); + + type_size = smpi_datatype_size( datatype ); + + /* Determine number of segments and number of elements per segment */ + counts[0] = count/2; + if (count % 2 != 0) counts[0]++; + counts[1] = count - counts[0]; + if ( segsize > 0 ) { + /* Note that ompi_datatype_type_size() will never return a negative + value in typelng; it returns an int [vs. an unsigned type] + because of the MPI spec. */ + if (segsize < ((uint32_t) type_size)) { + segsize = type_size; /* push segsize up to hold one type */ + } + segcount[0] = segcount[1] = segsize / type_size; + num_segments[0] = counts[0]/segcount[0]; + if ((counts[0] % segcount[0]) != 0) num_segments[0]++; + num_segments[1] = counts[1]/segcount[1]; + if ((counts[1] % segcount[1]) != 0) num_segments[1]++; + } else { + segcount[0] = counts[0]; + segcount[1] = counts[1]; + num_segments[0] = num_segments[1] = 1; + } + + /* if the message is too small to be split into segments */ + if( (counts[0] == 0 || counts[1] == 0) || + (segsize > counts[0] * type_size) || + (segsize > counts[1] * type_size) ) { + /* call linear version here ! */ + return (smpi_coll_tuned_bcast_SMP_linear ( buffer, count, datatype, + root, comm)); + } + type_extent = smpi_datatype_get_extent(datatype); + + + /* Determine real segment size */ + realsegsize[0] = segcount[0] * type_extent; + realsegsize[1] = segcount[1] * type_extent; + + /* set the buffer pointers */ + tmpbuf[0] = (char *) buffer; + tmpbuf[1] = (char *) buffer+counts[0] * type_extent; + + /* Step 1: + Root splits the buffer in 2 and sends segmented message down the branches. + Left subtree of the tree receives first half of the buffer, while right + subtree receives the remaining message. + */ + + /* determine if I am left (0) or right (1), (root is right) */ + lr = ((rank + size - root)%size + 1)%2; + + /* root code */ + if( rank == root ) { + /* determine segment count */ + sendcount[0] = segcount[0]; + sendcount[1] = segcount[1]; + /* for each segment */ + for (segindex = 0; segindex < num_segments[0]; segindex++) { + /* for each child */ + for( i = 0; i < tree->tree_nextsize && i < 2; i++ ) { + if (segindex >= num_segments[i]) { /* no more segments */ + continue; + } + /* determine how many elements are being sent in this round */ + if(segindex == (num_segments[i] - 1)) + sendcount[i] = counts[i] - segindex*segcount[i]; + /* send data */ + smpi_mpi_send(tmpbuf[i], sendcount[i], datatype, + tree->tree_next[i], 777, comm); + /* update tmp buffer */ + tmpbuf[i] += realsegsize[i]; + } + } + } + + /* intermediate nodes code */ + else if( tree->tree_nextsize > 0 ) { + /* Intermediate nodes: + * It will receive segments only from one half of the data. + * Which one is determined by whether the node belongs to the "left" or "right" + * subtree. Topoloby building function builds binary tree such that + * odd "shifted ranks" ((rank + size - root)%size) are on the left subtree, + * and even on the right subtree. + * + * Create the pipeline. We first post the first receive, then in the loop we + * post the next receive and after that wait for the previous receive to complete + * and we disseminating the data to all children. + */ + sendcount[lr] = segcount[lr]; + base_req=smpi_mpi_irecv(tmpbuf[lr], sendcount[lr], datatype, + tree->tree_prev, 777, + comm); + + for( segindex = 1; segindex < num_segments[lr]; segindex++ ) { + /* determine how many elements to expect in this round */ + if( segindex == (num_segments[lr] - 1)) + sendcount[lr] = counts[lr] - segindex*segcount[lr]; + /* post new irecv */ + new_req = smpi_mpi_irecv( tmpbuf[lr] + realsegsize[lr], sendcount[lr], + datatype, tree->tree_prev, 777, + comm); + + /* wait for and forward current segment */ + smpi_mpi_waitall( 1, &base_req, MPI_STATUSES_IGNORE ); + for( i = 0; i < tree->tree_nextsize; i++ ) { /* send data to children (segcount[lr]) */ + smpi_mpi_send( tmpbuf[lr], segcount[lr], datatype, + tree->tree_next[i], 777, + comm); + } /* end of for each child */ + + /* upate the base request */ + base_req = new_req; + /* go to the next buffer (ie. the one corresponding to the next recv) */ + tmpbuf[lr] += realsegsize[lr]; + } /* end of for segindex */ + + /* wait for the last segment and forward current segment */ + smpi_mpi_waitall( 1, &base_req, MPI_STATUSES_IGNORE ); + for( i = 0; i < tree->tree_nextsize; i++ ) { /* send data to children */ + smpi_mpi_send(tmpbuf[lr], sendcount[lr], datatype, + tree->tree_next[i], 777, comm); + } /* end of for each child */ + } + + /* leaf nodes */ + else { + /* Just consume segments as fast as possible */ + sendcount[lr] = segcount[lr]; + for (segindex = 0; segindex < num_segments[lr]; segindex++) { + /* determine how many elements to expect in this round */ + if (segindex == (num_segments[lr] - 1)) sendcount[lr] = counts[lr] - segindex*segcount[lr]; + /* receive segments */ + smpi_mpi_recv(tmpbuf[lr], sendcount[lr], datatype, + tree->tree_prev, 777, + comm, MPI_STATUS_IGNORE); + /* update the initial pointer to the buffer */ + tmpbuf[lr] += realsegsize[lr]; + } + } + + /* reset the buffer pointers */ + tmpbuf[0] = (char *) buffer; + tmpbuf[1] = (char *) buffer+counts[0] * type_extent; + + /* Step 2: + Find your immediate pair (identical node in opposite subtree) and SendRecv + data buffer with them. + The tree building function ensures that + if (we are not root) + if we are in the left subtree (lr == 0) our pair is (rank+1)%size. + if we are in the right subtree (lr == 1) our pair is (rank-1)%size + If we have even number of nodes the rank (size-1) will pair up with root. + */ + if (lr == 0) { + pair = (rank+1)%size; + } else { + pair = (rank+size-1)%size; + } + + if ( (size%2) != 0 && rank != root) { + + smpi_mpi_sendrecv( tmpbuf[lr], counts[lr], datatype, + pair, 777, + tmpbuf[(lr+1)%2], counts[(lr+1)%2], datatype, + pair, 777, + comm, MPI_STATUS_IGNORE); + } else if ( (size%2) == 0 ) { + /* root sends right buffer to the last node */ + if( rank == root ) { + smpi_mpi_send(tmpbuf[1], counts[1], datatype, + (root+size-1)%size, 777, comm); + + } + /* last node receives right buffer from the root */ + else if (rank == (root+size-1)%size) { + smpi_mpi_recv(tmpbuf[1], counts[1], datatype, + root, 777, + comm, MPI_STATUS_IGNORE); + } + /* everyone else exchanges buffers */ + else { + smpi_mpi_sendrecv( tmpbuf[lr], counts[lr], datatype, + pair, 777, + tmpbuf[(lr+1)%2], counts[(lr+1)%2], datatype, + pair, 777, + comm, MPI_STATUS_IGNORE); + } + } + return (MPI_SUCCESS); + + +} + diff --git a/src/smpi/colls/bcast-scatter-LR-allgather.c b/src/smpi/colls/bcast-scatter-LR-allgather.c index db265a657d..ebd55391ac 100644 --- a/src/smpi/colls/bcast-scatter-LR-allgather.c +++ b/src/smpi/colls/bcast-scatter-LR-allgather.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -71,11 +71,11 @@ smpi_coll_tuned_bcast_scatter_LR_allgather(void *buff, int count, int i, src, dst, rank, num_procs; int mask, relative_rank, curr_size, recv_size, send_size, nbytes; int scatter_size, left, right, next_src, *recv_counts, *disps; - int tag = 1, success = 0, failure = 1; + int tag = 1; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(data_type, &extent); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(data_type); nbytes = extent * count; @@ -97,9 +97,9 @@ smpi_coll_tuned_bcast_scatter_LR_allgather(void *buff, int count, curr_size = 0; // this process doesn't receive any data // because of uneven division else { - MPI_Recv((char *) buff + relative_rank * scatter_size, recv_size, + smpi_mpi_recv((char *) buff + relative_rank * scatter_size, recv_size, MPI_BYTE, src, tag, comm, &status); - MPI_Get_count(&status, MPI_BYTE, &curr_size); + curr_size = smpi_mpi_get_count(&status, MPI_BYTE); } break; } @@ -121,7 +121,7 @@ smpi_coll_tuned_bcast_scatter_LR_allgather(void *buff, int count, dst = rank + mask; if (dst >= num_procs) dst -= num_procs; - MPI_Send((char *) buff + scatter_size * (relative_rank + mask), + smpi_mpi_send((char *) buff + scatter_size * (relative_rank + mask), send_size, MPI_BYTE, dst, tag, comm); curr_size -= send_size; @@ -131,19 +131,8 @@ smpi_coll_tuned_bcast_scatter_LR_allgather(void *buff, int count, } // done scatter now do allgather - recv_counts = (int *) malloc(sizeof(int) * num_procs); - if (!recv_counts) { - printf("bcast-scatter-LR-allgather:95: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } - - disps = (int *) malloc(sizeof(int) * num_procs); - if (!disps) { - printf("bcast-scatter-LR-allgather:103: cannot allocate memory\n"); - MPI_Finalize(); - exit(failure); - } + recv_counts = (int *) xbt_malloc(sizeof(int) * num_procs); + disps = (int *) xbt_malloc(sizeof(int) * num_procs); for (i = 0; i < num_procs; i++) { recv_counts[i] = nbytes - i * scatter_size; @@ -164,7 +153,7 @@ smpi_coll_tuned_bcast_scatter_LR_allgather(void *buff, int count, next_src = left; for (i = 1; i < num_procs; i++) { - MPI_Sendrecv((char *) buff + disps[(src - root + num_procs) % num_procs], + smpi_mpi_sendrecv((char *) buff + disps[(src - root + num_procs) % num_procs], recv_counts[(src - root + num_procs) % num_procs], MPI_BYTE, right, tag, (char *) buff + @@ -179,5 +168,5 @@ smpi_coll_tuned_bcast_scatter_LR_allgather(void *buff, int count, free(recv_counts); free(disps); - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/bcast-scatter-rdb-allgather.c b/src/smpi/colls/bcast-scatter-rdb-allgather.c index 489f168a4a..ab458e46b3 100644 --- a/src/smpi/colls/bcast-scatter-rdb-allgather.c +++ b/src/smpi/colls/bcast-scatter-rdb-allgather.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /***************************************************************************** @@ -70,14 +70,14 @@ smpi_coll_tuned_bcast_scatter_rdb_allgather(void *buff, int count, MPI_Datatype MPI_Status status; int i, j, k, src, dst, rank, num_procs, send_offset, recv_offset; - int mask, relative_rank, curr_size, recv_size, send_size, nbytes; + int mask, relative_rank, curr_size, recv_size = 0, send_size, nbytes; int scatter_size, tree_root, relative_dst, dst_tree_root; int my_tree_root, offset, tmp_mask, num_procs_completed; - int tag = 1, success = 0; + int tag = 1; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &num_procs); - MPI_Type_extent(data_type, &extent); + rank = smpi_comm_rank(comm); + num_procs = smpi_comm_size(comm); + extent = smpi_datatype_get_extent(data_type); nbytes = extent * count; scatter_size = (nbytes + num_procs - 1) / num_procs; // ceiling division @@ -98,9 +98,9 @@ smpi_coll_tuned_bcast_scatter_rdb_allgather(void *buff, int count, MPI_Datatype curr_size = 0; // this process doesn't receive any data // because of uneven division else { - MPI_Recv((char *)buff + relative_rank * scatter_size, recv_size, + smpi_mpi_recv((char *)buff + relative_rank * scatter_size, recv_size, MPI_BYTE, src, tag, comm, &status); - MPI_Get_count(&status, MPI_BYTE, &curr_size); + curr_size = smpi_mpi_get_count(&status, MPI_BYTE); } break; } @@ -122,7 +122,7 @@ smpi_coll_tuned_bcast_scatter_rdb_allgather(void *buff, int count, MPI_Datatype dst = rank + mask; if (dst >= num_procs) dst -= num_procs; - MPI_Send((char *)buff + scatter_size * (relative_rank + mask), + smpi_mpi_send((char *)buff + scatter_size * (relative_rank + mask), send_size, MPI_BYTE, dst, tag, comm); curr_size -= send_size; @@ -157,10 +157,10 @@ smpi_coll_tuned_bcast_scatter_rdb_allgather(void *buff, int count, MPI_Datatype recv_offset = dst_tree_root * scatter_size; if (relative_dst < num_procs) { - MPI_Sendrecv((char *)buff + send_offset, curr_size, MPI_BYTE, dst, tag, + smpi_mpi_sendrecv((char *)buff + send_offset, curr_size, MPI_BYTE, dst, tag, (char *)buff + recv_offset, scatter_size * mask, MPI_BYTE, dst, tag, comm, &status); - MPI_Get_count(&status, MPI_BYTE, &recv_size); + recv_size = smpi_mpi_get_count(&status, MPI_BYTE); curr_size += recv_size; } @@ -204,7 +204,7 @@ smpi_coll_tuned_bcast_scatter_rdb_allgather(void *buff, int count, MPI_Datatype if ((relative_dst > relative_rank) && (relative_rank < tree_root + num_procs_completed) && (relative_dst >= tree_root + num_procs_completed)) { - MPI_Send((char *)buff + offset, recv_size, MPI_BYTE, dst, tag, comm); + smpi_mpi_send((char *)buff + offset, recv_size, MPI_BYTE, dst, tag, comm); /* recv_size was set in the previous receive. that's the amount of data to be @@ -216,12 +216,12 @@ smpi_coll_tuned_bcast_scatter_rdb_allgather(void *buff, int count, MPI_Datatype && (relative_dst < tree_root + num_procs_completed) && (relative_rank >= tree_root + num_procs_completed)) { - MPI_Recv((char *)buff + offset, scatter_size * num_procs_completed, + smpi_mpi_recv((char *)buff + offset, scatter_size * num_procs_completed, MPI_BYTE, dst, tag, comm, &status); /* num_procs_completed is also equal to the no. of processes whose data we don't have */ - MPI_Get_count(&status, MPI_BYTE, &recv_size); + recv_size = smpi_mpi_get_count(&status, MPI_BYTE); curr_size += recv_size; } tmp_mask >>= 1; @@ -232,5 +232,5 @@ smpi_coll_tuned_bcast_scatter_rdb_allgather(void *buff, int count, MPI_Datatype i++; } - return success; + return MPI_SUCCESS; } diff --git a/src/smpi/colls/coll_tuned_topo.c b/src/smpi/colls/coll_tuned_topo.c new file mode 100644 index 0000000000..ce7cec739e --- /dev/null +++ b/src/smpi/colls/coll_tuned_topo.c @@ -0,0 +1,629 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2005 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$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "colls_private.h" +#include "coll_tuned_topo.h" +/* + * Some static helpers. + */ +static int pown( int fanout, int num ) +{ + int j, p = 1; + if( num < 0 ) return 0; + if (1==num) return fanout; + if (2==fanout) { + return p<MAXTREEFANOUT) { + XBT_DEBUG("coll:tuned:topo_build_tree invalid fanout %d bigger than max %d", fanout, MAXTREEFANOUT); + return NULL; + } + + /* + * Get size and rank of the process in this communicator + */ + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + tree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t)); + if (!tree) { + XBT_DEBUG("coll:tuned:topo_build_tree PANIC::out of memory"); + return NULL; + } + + tree->tree_root = MPI_UNDEFINED; + tree->tree_nextsize = MPI_UNDEFINED; + + /* + * Set root + */ + tree->tree_root = root; + + /* + * Initialize tree + */ + tree->tree_fanout = fanout; + tree->tree_bmtree = 0; + tree->tree_root = root; + tree->tree_prev = -1; + tree->tree_nextsize = 0; + for( i = 0; i < fanout; i++ ) { + tree->tree_next[i] = -1; + } + + /* return if we have less than 2 processes */ + if( size < 2 ) { + return tree; + } + + /* + * Shift all ranks by root, so that the algorithm can be + * designed as if root would be always 0 + * shiftedrank should be used in calculating distances + * and position in tree + */ + shiftedrank = rank - root; + if( shiftedrank < 0 ) { + shiftedrank += size; + } + + /* calculate my level */ + level = calculate_level( fanout, shiftedrank ); + delta = pown( fanout, level ); + + /* find my children */ + for( i = 0; i < fanout; i++ ) { + schild = shiftedrank + delta * (i+1); + if( schild < size ) { + tree->tree_next[i] = (schild+root)%size; + tree->tree_nextsize = tree->tree_nextsize + 1; + } else { + break; + } + } + + /* find my parent */ + slimit = calculate_num_nodes_up_to_level( fanout, level ); + sparent = shiftedrank; + if( sparent < fanout ) { + sparent = 0; + } else { + while( sparent >= slimit ) { + sparent -= delta/fanout; + } + } + tree->tree_prev = (sparent+root)%size; + + return tree; +} + +/* + * Constructs in-order binary tree which can be used for non-commutative reduce + * operations. + * Root of this tree is always rank (size-1) and fanout is 2. + * Here are some of the examples of this tree: + * size == 2 size == 3 size == 4 size == 9 + * 1 2 3 8 + * / / \ / \ / \ + * 0 1 0 2 1 7 3 + * / / \ / \ + * 0 6 5 2 1 + * / / + * 4 0 + */ +ompi_coll_tree_t* +ompi_coll_tuned_topo_build_in_order_bintree( MPI_Comm comm ) +{ + int rank, size; + int myrank, rightsize, delta; + int parent, lchild, rchild; + ompi_coll_tree_t* tree; + + /* + * Get size and rank of the process in this communicator + */ + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + tree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t)); + if (!tree) { + XBT_DEBUG( + "coll:tuned:topo_build_tree PANIC::out of memory"); + return NULL; + } + + tree->tree_root = MPI_UNDEFINED; + tree->tree_nextsize = MPI_UNDEFINED; + + /* + * Initialize tree + */ + tree->tree_fanout = 2; + tree->tree_bmtree = 0; + tree->tree_root = size - 1; + tree->tree_prev = -1; + tree->tree_nextsize = 0; + tree->tree_next[0] = -1; + tree->tree_next[1] = -1; + XBT_DEBUG( + "coll:tuned:topo_build_in_order_tree Building fo %d rt %d", + tree->tree_fanout, tree->tree_root); + + /* + * Build the tree + */ + myrank = rank; + parent = size - 1; + delta = 0; + + while ( 1 ) { + /* Compute the size of the right subtree */ + rightsize = size >> 1; + + /* Determine the left and right child of this parent */ + lchild = -1; + rchild = -1; + if (size - 1 > 0) { + lchild = parent - 1; + if (lchild > 0) { + rchild = rightsize - 1; + } + } + + /* The following cases are possible: myrank can be + - a parent, + - belong to the left subtree, or + - belong to the right subtee + Each of the cases need to be handled differently. + */ + + if (myrank == parent) { + /* I am the parent: + - compute real ranks of my children, and exit the loop. */ + if (lchild >= 0) tree->tree_next[0] = lchild + delta; + if (rchild >= 0) tree->tree_next[1] = rchild + delta; + break; + } + if (myrank > rchild) { + /* I belong to the left subtree: + - If I am the left child, compute real rank of my parent + - Iterate down through tree: + compute new size, shift ranks down, and update delta. + */ + if (myrank == lchild) { + tree->tree_prev = parent + delta; + } + size = size - rightsize - 1; + delta = delta + rightsize; + myrank = myrank - rightsize; + parent = size - 1; + + } else { + /* I belong to the right subtree: + - If I am the right child, compute real rank of my parent + - Iterate down through tree: + compute new size and parent, + but the delta and rank do not need to change. + */ + if (myrank == rchild) { + tree->tree_prev = parent + delta; + } + size = rightsize; + parent = rchild; + } + } + + if (tree->tree_next[0] >= 0) { tree->tree_nextsize = 1; } + if (tree->tree_next[1] >= 0) { tree->tree_nextsize += 1; } + + return tree; +} + +int ompi_coll_tuned_topo_destroy_tree( ompi_coll_tree_t** tree ) +{ + ompi_coll_tree_t *ptr; + + if ((!tree)||(!*tree)) { + return MPI_SUCCESS; + } + + ptr = *tree; + + free (ptr); + *tree = NULL; /* mark tree as gone */ + + return MPI_SUCCESS; +} + +/* + * + * Here are some of the examples of this tree: + * size == 2 size = 4 size = 8 + * 0 0 0 + * / | \ / | \ + * 1 2 1 4 2 1 + * | | |\ + * 3 6 5 3 + * | + * 7 + */ +ompi_coll_tree_t* +ompi_coll_tuned_topo_build_bmtree( MPI_Comm comm, + int root ) +{ + int childs = 0; + int rank; + int size; + int mask = 1; + int index; + int remote; + ompi_coll_tree_t *bmtree; + int i; + + XBT_DEBUG("coll:tuned:topo:build_bmtree rt %d", root); + + /* + * Get size and rank of the process in this communicator + */ + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + index = rank -root; + + bmtree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t)); + if (!bmtree) { + XBT_DEBUG("coll:tuned:topo:build_bmtree PANIC out of memory"); + return NULL; + } + + bmtree->tree_bmtree = 1; + + bmtree->tree_root = MPI_UNDEFINED; + bmtree->tree_nextsize = MPI_UNDEFINED; + for(i=0;itree_next[i] = -1; + } + + if( index < 0 ) index += size; + + while( mask <= index ) mask <<= 1; + + /* Now I can compute my father rank */ + if( root == rank ) { + bmtree->tree_prev = root; + } else { + remote = (index ^ (mask >> 1)) + root; + if( remote >= size ) remote -= size; + bmtree->tree_prev = remote; + } + /* And now let's fill my childs */ + while( mask < size ) { + remote = (index ^ mask); + if( remote >= size ) break; + remote += root; + if( remote >= size ) remote -= size; + if (childs==MAXTREEFANOUT) { + XBT_DEBUG("coll:tuned:topo:build_bmtree max fanout incorrect %d needed %d", MAXTREEFANOUT, childs); + return NULL; + } + bmtree->tree_next[childs] = remote; + mask <<= 1; + childs++; + } + bmtree->tree_nextsize = childs; + bmtree->tree_root = root; + return bmtree; +} + +/* + * Constructs in-order binomial tree which can be used for gather/scatter + * operations. + * + * Here are some of the examples of this tree: + * size == 2 size = 4 size = 8 + * 0 0 0 + * / / | / | \ + * 1 1 2 1 2 4 + * | | | \ + * 3 3 5 6 + * | + * 7 + */ +ompi_coll_tree_t* +ompi_coll_tuned_topo_build_in_order_bmtree( MPI_Comm comm, + int root ) +{ + int childs = 0; + int rank, vrank; + int size; + int mask = 1; + int remote; + ompi_coll_tree_t *bmtree; + int i; + + XBT_DEBUG("coll:tuned:topo:build_in_order_bmtree rt %d", root); + + /* + * Get size and rank of the process in this communicator + */ + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + vrank = (rank - root + size) % size; + + bmtree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t)); + if (!bmtree) { + XBT_DEBUG("coll:tuned:topo:build_bmtree PANIC out of memory"); + return NULL; + } + + bmtree->tree_bmtree = 1; + bmtree->tree_root = MPI_UNDEFINED; + bmtree->tree_nextsize = MPI_UNDEFINED; + for(i=0;itree_next[i] = -1; + } + + if (root == rank) { + bmtree->tree_prev = root; + } + + while (mask < size) { + remote = vrank ^ mask; + if (remote < vrank) { + bmtree->tree_prev = (remote + root) % size; + break; + } else if (remote < size) { + bmtree->tree_next[childs] = (remote + root) % size; + childs++; + if (childs==MAXTREEFANOUT) { + XBT_DEBUG( + "coll:tuned:topo:build_bmtree max fanout incorrect %d needed %d", + MAXTREEFANOUT, childs); + return NULL; + } + } + mask <<= 1; + } + bmtree->tree_nextsize = childs; + bmtree->tree_root = root; + + return bmtree; +} + + +ompi_coll_tree_t* +ompi_coll_tuned_topo_build_chain( int fanout, + MPI_Comm comm, + int root ) +{ + int rank, size; + int srank; /* shifted rank */ + int i,maxchainlen; + int mark,head,len; + ompi_coll_tree_t *chain; + + XBT_DEBUG("coll:tuned:topo:build_chain fo %d rt %d", fanout, root); + + /* + * Get size and rank of the process in this communicator + */ + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + if( fanout < 1 ) { + XBT_DEBUG("coll:tuned:topo:build_chain WARNING invalid fanout of ZERO, forcing to 1 (pipeline)!"); + fanout = 1; + } + if (fanout>MAXTREEFANOUT) { + XBT_DEBUG("coll:tuned:topo:build_chain WARNING invalid fanout %d bigger than max %d, forcing to max!", fanout, MAXTREEFANOUT); + fanout = MAXTREEFANOUT; + } + + /* + * Allocate space for topology arrays if needed + */ + chain = (ompi_coll_tree_t*)malloc( sizeof(ompi_coll_tree_t) ); + if (!chain) { + XBT_DEBUG("coll:tuned:topo:build_chain PANIC out of memory"); + fflush(stdout); + return NULL; + } + chain->tree_root = MPI_UNDEFINED; + chain->tree_nextsize = -1; + for(i=0;itree_next[i] = -1; + + /* + * Set root & numchain + */ + chain->tree_root = root; + if( (size - 1) < fanout ) { + chain->tree_nextsize = size-1; + fanout = size-1; + } else { + chain->tree_nextsize = fanout; + } + + /* + * Shift ranks + */ + srank = rank - root; + if (srank < 0) srank += size; + + /* + * Special case - fanout == 1 + */ + if( fanout == 1 ) { + if( srank == 0 ) chain->tree_prev = -1; + else chain->tree_prev = (srank-1+root)%size; + + if( (srank + 1) >= size) { + chain->tree_next[0] = -1; + chain->tree_nextsize = 0; + } else { + chain->tree_next[0] = (srank+1+root)%size; + chain->tree_nextsize = 1; + } + return chain; + } + + /* Let's handle the case where there is just one node in the communicator */ + if( size == 1 ) { + chain->tree_next[0] = -1; + chain->tree_nextsize = 0; + chain->tree_prev = -1; + return chain; + } + /* + * Calculate maximum chain length + */ + maxchainlen = (size-1) / fanout; + if( (size-1) % fanout != 0 ) { + maxchainlen++; + mark = (size-1)%fanout; + } else { + mark = fanout+1; + } + + /* + * Find your own place in the list of shifted ranks + */ + if( srank != 0 ) { + int column; + if( srank-1 < (mark * maxchainlen) ) { + column = (srank-1)/maxchainlen; + head = 1+column*maxchainlen; + len = maxchainlen; + } else { + column = mark + (srank-1-mark*maxchainlen)/(maxchainlen-1); + head = mark*maxchainlen+1+(column-mark)*(maxchainlen-1); + len = maxchainlen-1; + } + + if( srank == head ) { + chain->tree_prev = 0; /*root*/ + } else { + chain->tree_prev = srank-1; /* rank -1 */ + } + if( srank == (head + len - 1) ) { + chain->tree_next[0] = -1; + chain->tree_nextsize = 0; + } else { + if( (srank + 1) < size ) { + chain->tree_next[0] = srank+1; + chain->tree_nextsize = 1; + } else { + chain->tree_next[0] = -1; + chain->tree_nextsize = 0; + } + } + } + + /* + * Unshift values + */ + if( rank == root ) { + chain->tree_prev = -1; + chain->tree_next[0] = (root+1)%size; + for( i = 1; i < fanout; i++ ) { + chain->tree_next[i] = chain->tree_next[i-1] + maxchainlen; + if( i > mark ) { + chain->tree_next[i]--; + } + chain->tree_next[i] %= size; + } + chain->tree_nextsize = fanout; + } else { + chain->tree_prev = (chain->tree_prev+root)%size; + if( chain->tree_next[0] != -1 ) { + chain->tree_next[0] = (chain->tree_next[0]+root)%size; + } + } + + return chain; +} + +int ompi_coll_tuned_topo_dump_tree (ompi_coll_tree_t* tree, int rank) +{ + int i; + + XBT_DEBUG("coll:tuned:topo:topo_dump_tree %1d tree root %d" + " fanout %d BM %1d nextsize %d prev %d", + rank, tree->tree_root, tree->tree_bmtree, tree->tree_fanout, + tree->tree_nextsize, tree->tree_prev); + if( tree->tree_nextsize ) { + for( i = 0; i < tree->tree_nextsize; i++ ) + XBT_DEBUG("[%1d] %d", i, tree->tree_next[i]); + } + return (0); +} diff --git a/src/smpi/colls/coll_tuned_topo.h b/src/smpi/colls/coll_tuned_topo.h new file mode 100644 index 0000000000..73b0361356 --- /dev/null +++ b/src/smpi/colls/coll_tuned_topo.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2005 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$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#ifndef MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED +#define MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED + +#include "colls_private.h" + +#define MAXTREEFANOUT 32 + +#define COLL_TUNED_COMPUTED_SEGCOUNT(SEGSIZE, TYPELNG, SEGCOUNT) \ + if( ((SEGSIZE) >= (TYPELNG)) && \ + ((SEGSIZE) < ((TYPELNG) * (SEGCOUNT))) ) { \ + size_t residual; \ + (SEGCOUNT) = (int)((SEGSIZE) / (TYPELNG)); \ + residual = (SEGSIZE) - (SEGCOUNT) * (TYPELNG); \ + if( residual > ((TYPELNG) >> 1) ) \ + (SEGCOUNT)++; \ + } \ + + + typedef struct ompi_coll_tree_t { + int32_t tree_root; + int32_t tree_fanout; + int32_t tree_bmtree; + int32_t tree_prev; + int32_t tree_next[MAXTREEFANOUT]; + int32_t tree_nextsize; + } ompi_coll_tree_t; + + ompi_coll_tree_t* + ompi_coll_tuned_topo_build_tree( int fanout, + MPI_Comm com, + int root ); + ompi_coll_tree_t* + ompi_coll_tuned_topo_build_in_order_bintree( MPI_Comm comm ); + + ompi_coll_tree_t* + ompi_coll_tuned_topo_build_bmtree( MPI_Comm comm, + int root ); + ompi_coll_tree_t* + ompi_coll_tuned_topo_build_in_order_bmtree( MPI_Comm comm, + int root ); + ompi_coll_tree_t* + ompi_coll_tuned_topo_build_chain( int fanout, + MPI_Comm com, + int root ); + + int ompi_coll_tuned_topo_destroy_tree( ompi_coll_tree_t** tree ); + + /* debugging stuff, will be removed later */ + int ompi_coll_tuned_topo_dump_tree (ompi_coll_tree_t* tree, int rank); + +#endif /* MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED */ + diff --git a/src/smpi/colls/colls.h b/src/smpi/colls/colls.h index 43f5de93b8..3de368157b 100644 --- a/src/smpi/colls/colls.h +++ b/src/smpi/colls/colls.h @@ -3,10 +3,9 @@ #include #include "smpi/mpi.h" +#include "smpi/private.h" #include "xbt.h" -void star_reduction(MPI_Op op, void *src, void *target, int *count, MPI_Datatype *dtype); - #define COLL_DESCRIPTION(cat, ret, args, name) \ {# name,\ # cat " " # name " collective",\ @@ -21,6 +20,24 @@ void star_reduction(MPI_Op op, void *src, void *target, int *count, MPI_Datatype #define COLL_NOsep #define COLL_NOTHING(...) +/************* + * GATHER * + *************/ +#define COLL_GATHER_SIG gather, int, \ + (void *send_buff, int send_count, MPI_Datatype send_type, \ + void *recv_buff, int recv_count, MPI_Datatype recv_type, \ + int root, MPI_Comm comm) + +#define COLL_GATHERS(action, COLL_sep) \ +COLL_APPLY(action, COLL_GATHER_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_GATHER_SIG, ompi_basic_linear) COLL_sep \ +COLL_APPLY(action, COLL_GATHER_SIG, ompi_binomial) COLL_sep \ +COLL_APPLY(action, COLL_GATHER_SIG, ompi_linear_sync) COLL_sep \ +COLL_APPLY(action, COLL_GATHER_SIG, mpich) \ + + + +COLL_GATHERS(COLL_PROTO, COLL_NOsep) /************* * ALLGATHER * @@ -31,9 +48,9 @@ void star_reduction(MPI_Op op, void *src, void *target, int *count, MPI_Datatype MPI_Comm comm) #define COLL_ALLGATHERS(action, COLL_sep) \ -COLL_NOTHING(COLL_APPLY(action, COLL_ALLGATHER_SIG, 2dmesh) COLL_sep) \ -COLL_NOTHING(COLL_APPLY(action, COLL_ALLGATHER_SIG, 3dmesh) COLL_sep) \ -COLL_NOTHING(COLL_APPLY(action, COLL_ALLGATHER_SIG, bruck) COLL_sep) \ +COLL_APPLY(action, COLL_ALLGATHER_SIG, 2dmesh) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHER_SIG, 3dmesh) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHER_SIG, bruck) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, GB) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, loosely_lr) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, lr) COLL_sep \ @@ -41,16 +58,37 @@ COLL_APPLY(action, COLL_ALLGATHER_SIG, NTSLR) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, NTSLR_NB) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, pair) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, rdb) COLL_sep \ -COLL_APPLY(action, COLL_ALLGATHER_SIG, RDB) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, rhv) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, ring) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, SMP_NTS) COLL_sep \ COLL_APPLY(action, COLL_ALLGATHER_SIG, smp_simple) COLL_sep \ -COLL_APPLY(action, COLL_ALLGATHER_SIG, SMP_simple) COLL_sep \ -COLL_APPLY(action, COLL_ALLGATHER_SIG, spreading_simple) +COLL_APPLY(action, COLL_ALLGATHER_SIG, spreading_simple) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHER_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHER_SIG, ompi_neighborexchange) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHER_SIG, mpich) + COLL_ALLGATHERS(COLL_PROTO, COLL_NOsep) +/************** + * ALLGATHERV * + **************/ +#define COLL_ALLGATHERV_SIG allgatherv, int, \ + (void *send_buff, int send_count, MPI_Datatype send_type, \ + void *recv_buff, int *recv_count, int *recv_disps, \ + MPI_Datatype recv_type, MPI_Comm comm) + +#define COLL_ALLGATHERVS(action, COLL_sep) \ +COLL_APPLY(action, COLL_ALLGATHERV_SIG, GB) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHERV_SIG, pair) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHERV_SIG, ring) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHERV_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHERV_SIG, ompi_neighborexchange) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHERV_SIG, ompi_bruck) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHERV_SIG, mpich) COLL_sep \ +COLL_APPLY(action, COLL_ALLGATHERV_SIG, mpich_rdb) + +COLL_ALLGATHERVS(COLL_PROTO, COLL_NOsep) /************* * ALLREDUCE * @@ -64,17 +102,20 @@ COLL_APPLY(action, COLL_ALLREDUCE_SIG, lr) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, NTS) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, rab1) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, rab2) COLL_sep \ -COLL_NOTHING(COLL_APPLY(action, COLL_ALLREDUCE_SIG, rab_rdb) COLL_sep) \ +COLL_APPLY(action, COLL_ALLREDUCE_SIG, rab_rdb) COLL_sep \ COLL_NOTHING(COLL_APPLY(action, COLL_ALLREDUCE_SIG, rab_reduce_scatter) COLL_sep) \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, rab_rsag) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, rdb) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_binomial) COLL_sep \ -COLL_NOTHING(COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_binomial_pipeline) COLL_sep) \ +COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_binomial_pipeline) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_rdb) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_rsag) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_rsag_lr) COLL_sep \ COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_rsag_rab) COLL_sep \ -COLL_APPLY(action, COLL_ALLREDUCE_SIG, redbcast) +COLL_APPLY(action, COLL_ALLREDUCE_SIG, redbcast) COLL_sep \ +COLL_APPLY(action, COLL_ALLREDUCE_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_ALLREDUCE_SIG, ompi_ring_segmented) COLL_sep \ +COLL_APPLY(action, COLL_ALLREDUCE_SIG, mpich) COLL_ALLREDUCES(COLL_PROTO, COLL_NOsep) @@ -100,10 +141,34 @@ COLL_APPLY(action, COLL_ALLTOALL_SIG, ring) COLL_sep \ COLL_APPLY(action, COLL_ALLTOALL_SIG, ring_light_barrier) COLL_sep \ COLL_APPLY(action, COLL_ALLTOALL_SIG, ring_mpi_barrier) COLL_sep \ COLL_APPLY(action, COLL_ALLTOALL_SIG, ring_one_barrier) COLL_sep \ -COLL_APPLY(action, COLL_ALLTOALL_SIG, simple) +COLL_APPLY(action, COLL_ALLTOALL_SIG, simple) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALL_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALL_SIG, mpich) COLL_ALLTOALLS(COLL_PROTO, COLL_NOsep) +/************* + * ALLTOALLV * + *************/ +#define COLL_ALLTOALLV_SIG alltoallv, int, \ + (void *send_buff, int *send_counts, int *send_disps, MPI_Datatype send_type, \ + void *recv_buff, int *recv_counts, int *recv_disps, MPI_Datatype recv_type, \ + MPI_Comm com) + +#define COLL_ALLTOALLVS(action, COLL_sep) \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, bruck) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, pair) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, pair_light_barrier) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, pair_mpi_barrier) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, pair_one_barrier) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring_light_barrier) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring_mpi_barrier) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring_one_barrier) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_ALLTOALLV_SIG, mpich) + +COLL_ALLTOALLVS(COLL_PROTO, COLL_NOsep) /********* * BCAST * @@ -128,7 +193,10 @@ COLL_APPLY(action, COLL_BCAST_SIG, scatter_rdb_allgather) COLL_sep \ COLL_APPLY(action, COLL_BCAST_SIG, SMP_binary) COLL_sep \ COLL_APPLY(action, COLL_BCAST_SIG, SMP_binomial) COLL_sep \ COLL_APPLY(action, COLL_BCAST_SIG, SMP_linear) COLL_sep \ -COLL_APPLY(action, COLL_BCAST_SIG, TSB) +COLL_APPLY(action, COLL_BCAST_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_BCAST_SIG, ompi_split_bintree) COLL_sep \ +COLL_APPLY(action, COLL_BCAST_SIG, ompi_pipeline) COLL_sep \ +COLL_APPLY(action, COLL_BCAST_SIG, mpich) COLL_BCASTS(COLL_PROTO, COLL_NOsep) @@ -145,8 +213,71 @@ COLL_APPLY(action, COLL_REDUCE_SIG, arrival_pattern_aware) COLL_sep \ COLL_APPLY(action, COLL_REDUCE_SIG, binomial) COLL_sep \ COLL_APPLY(action, COLL_REDUCE_SIG, flat_tree) COLL_sep \ COLL_APPLY(action, COLL_REDUCE_SIG, NTSL) COLL_sep \ -COLL_APPLY(action, COLL_REDUCE_SIG, scatter_gather) +COLL_APPLY(action, COLL_REDUCE_SIG, scatter_gather) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SIG, ompi_chain) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SIG, ompi_pipeline) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SIG, ompi_basic_linear) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SIG, ompi_in_order_binary) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SIG, ompi_binary) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SIG, ompi_binomial) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SIG, mpich) COLL_REDUCES(COLL_PROTO, COLL_NOsep) +/************* + * REDUCE_SCATTER * + *************/ +#define COLL_REDUCE_SCATTER_SIG reduce_scatter, int, \ + (void *sbuf, void *rbuf, int *rcounts,\ + MPI_Datatype dtype,MPI_Op op,MPI_Comm comm) + +#define COLL_REDUCE_SCATTERS(action, COLL_sep) \ +COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, ompi_basic_recursivehalving) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, ompi_ring) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mpich) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mpich_pair) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mpich_rdb) COLL_sep \ +COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mpich_noncomm) + + +COLL_REDUCE_SCATTERS(COLL_PROTO, COLL_NOsep) + + +/************* + * SCATTER * + *************/ +#define COLL_SCATTER_SIG scatter, int, \ + (void *sendbuf, int sendcount, MPI_Datatype sendtype,\ + void *recvbuf, int recvcount, MPI_Datatype recvtype,\ + int root, MPI_Comm comm) + +#define COLL_SCATTERS(action, COLL_sep) \ +COLL_APPLY(action, COLL_SCATTER_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_SCATTER_SIG, ompi_basic_linear) COLL_sep \ +COLL_APPLY(action, COLL_SCATTER_SIG, ompi_binomial) COLL_sep \ +COLL_APPLY(action, COLL_SCATTER_SIG, mpich) + +COLL_SCATTERS(COLL_PROTO, COLL_NOsep) + +/************* + * SCATTER * + *************/ +#define COLL_BARRIER_SIG barrier, int, \ + (MPI_Comm comm) + +#define COLL_BARRIERS(action, COLL_sep) \ +COLL_APPLY(action, COLL_BARRIER_SIG, ompi) COLL_sep \ +COLL_APPLY(action, COLL_BARRIER_SIG, ompi_basic_linear) COLL_sep \ +COLL_APPLY(action, COLL_BARRIER_SIG, ompi_two_procs) COLL_sep \ +COLL_APPLY(action, COLL_BARRIER_SIG, ompi_tree) COLL_sep \ +COLL_APPLY(action, COLL_BARRIER_SIG, ompi_bruck) COLL_sep \ +COLL_APPLY(action, COLL_BARRIER_SIG, ompi_recursivedoubling) COLL_sep \ +COLL_APPLY(action, COLL_BARRIER_SIG, ompi_doublering) COLL_sep \ +COLL_APPLY(action, COLL_BARRIER_SIG, mpich) + +COLL_BARRIERS(COLL_PROTO, COLL_NOsep) + + #endif diff --git a/src/smpi/colls/colls_global.c b/src/smpi/colls/colls_global.c new file mode 100644 index 0000000000..65d5285d0a --- /dev/null +++ b/src/smpi/colls/colls_global.c @@ -0,0 +1,4 @@ +#include "xbt.h" + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_colls, smpi, + "Logging specific to SMPI collectives"); diff --git a/src/smpi/colls/colls_private.h b/src/smpi/colls/colls_private.h new file mode 100644 index 0000000000..66a2114be3 --- /dev/null +++ b/src/smpi/colls/colls_private.h @@ -0,0 +1,8 @@ +#ifndef SMPI_COLLS_PRIVATE_H +#define SMPI_COLLS_PRIVATE_H + +#include "colls.h" + +XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_colls); + +#endif diff --git a/src/smpi/colls/gather-ompi.c b/src/smpi/colls/gather-ompi.c new file mode 100644 index 0000000000..22e6e63dd9 --- /dev/null +++ b/src/smpi/colls/gather-ompi.c @@ -0,0 +1,410 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2009 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$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "colls_private.h" +#include "coll_tuned_topo.h" + +#define MCA_COLL_BASE_TAG_GATHER 333 +/* Todo: gather_intra_generic, gather_intra_binary, gather_intra_chain, + * gather_intra_pipeline, segmentation? */ +int +smpi_coll_tuned_gather_ompi_binomial(void *sbuf, int scount, + MPI_Datatype sdtype, + void *rbuf, int rcount, + MPI_Datatype rdtype, + int root, + MPI_Comm comm) +{ + int line = -1; + int i; + int rank; + int vrank; + int size; + int total_recv = 0; + char *ptmp = NULL; + char *tempbuf = NULL; + int err; + ompi_coll_tree_t* bmtree; + MPI_Status status; + MPI_Aint sextent, slb, strue_lb, strue_extent; + MPI_Aint rextent, rlb, rtrue_lb, rtrue_extent; + + + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + XBT_DEBUG( + "smpi_coll_tuned_gather_ompi_binomial rank %d", rank); + + /* create the binomial tree */ + // COLL_TUNED_UPDATE_IN_ORDER_BMTREE( comm, tuned_module, root ); + bmtree = ompi_coll_tuned_topo_build_in_order_bmtree(comm, root); + // data->cached_in_order_bmtree; + + smpi_datatype_extent(sdtype, &slb, &sextent); + smpi_datatype_extent(sdtype, &strue_lb, &strue_extent); + + vrank = (rank - root + size) % size; + + if (rank == root) { + smpi_datatype_extent(rdtype, &rlb, &rextent); + smpi_datatype_extent(rdtype, &rtrue_lb, &rtrue_extent); + if (0 == root){ + /* root on 0, just use the recv buffer */ + ptmp = (char *) rbuf; + if (sbuf != MPI_IN_PLACE) { + err = smpi_datatype_copy(sbuf, scount, sdtype, + ptmp, rcount, rdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + } + } else { + /* root is not on 0, allocate temp buffer for recv, + * rotate data at the end */ + tempbuf = (char *) malloc(rtrue_extent + (rcount*size - 1) * rextent); + if (NULL == tempbuf) { + err= MPI_ERR_OTHER; line = __LINE__; goto err_hndl; + } + + ptmp = tempbuf - rlb; + if (sbuf != MPI_IN_PLACE) { + /* copy from sbuf to temp buffer */ + err = smpi_datatype_copy(sbuf, scount, sdtype, + ptmp, rcount, rdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + } else { + /* copy from rbuf to temp buffer */ + err = smpi_datatype_copy((char *) rbuf + rank*rextent*rcount, rcount, rdtype, ptmp, rcount, rdtype ); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + } + } + total_recv = rcount; + } else if (!(vrank % 2)) { + /* other non-leaf nodes, allocate temp buffer for data received from + * children, the most we need is half of the total data elements due + * to the property of binimoal tree */ + tempbuf = (char *) malloc(strue_extent + (scount*size - 1) * sextent); + if (NULL == tempbuf) { + err= MPI_ERR_OTHER; line = __LINE__; goto err_hndl; + } + + ptmp = tempbuf - slb; + /* local copy to tempbuf */ + err = smpi_datatype_copy(sbuf, scount, sdtype, + ptmp, scount, sdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + /* use sdtype,scount as rdtype,rdcount since they are ignored on + * non-root procs */ + rdtype = sdtype; + rcount = scount; + rextent = sextent; + total_recv = rcount; + } else { + /* leaf nodes, no temp buffer needed, use sdtype,scount as + * rdtype,rdcount since they are ignored on non-root procs */ + ptmp = (char *) sbuf; + total_recv = scount; + } + + if (!(vrank % 2)) { + /* all non-leaf nodes recv from children */ + for (i = 0; i < bmtree->tree_nextsize; i++) { + int mycount = 0, vkid; + /* figure out how much data I have to send to this child */ + vkid = (bmtree->tree_next[i] - root + size) % size; + mycount = vkid - vrank; + if (mycount > (size - vkid)) + mycount = size - vkid; + mycount *= rcount; + + XBT_DEBUG( + "smpi_coll_tuned_gather_ompi_binomial rank %d recv %d mycount = %d", + rank, bmtree->tree_next[i], mycount); + + smpi_mpi_recv(ptmp + total_recv*rextent, rcount*size-total_recv, rdtype, + bmtree->tree_next[i], MCA_COLL_BASE_TAG_GATHER, + comm, &status); + + total_recv += mycount; + } + } + + if (rank != root) { + /* all nodes except root send to parents */ + XBT_DEBUG( + "smpi_coll_tuned_gather_ompi_binomial rank %d send %d count %d\n", + rank, bmtree->tree_prev, total_recv); + + smpi_mpi_send(ptmp, total_recv, sdtype, + bmtree->tree_prev, + MCA_COLL_BASE_TAG_GATHER, + comm); + } + if (rank == root) { + if (root != 0) { + /* rotate received data on root if root != 0 */ + err = smpi_datatype_copy(ptmp, rcount*(size - root), rdtype, + (char *) rbuf + rextent*root*rcount, rcount*(size - root), rdtype ); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + + err = smpi_datatype_copy( ptmp + rextent*rcount*(size-root), rcount*root,rdtype, + (char *) rbuf,rcount*root,rdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + free(tempbuf); + } + } else if (!(vrank % 2)) { + /* other non-leaf nodes */ + free(tempbuf); + } + return MPI_SUCCESS; + + err_hndl: + if (NULL != tempbuf) + free(tempbuf); + + XBT_DEBUG( "%s:%4d\tError occurred %d, rank %2d", + __FILE__, line, err, rank); + return err; +} + +/* + * gather_intra_linear_sync + * + * Function: - synchronized gather operation with + * Accepts: - same arguments as MPI_Gather(), first segment size + * Returns: - MPI_SUCCESS or error code + */ +int +smpi_coll_tuned_gather_ompi_linear_sync(void *sbuf, int scount, + MPI_Datatype sdtype, + void *rbuf, int rcount, + MPI_Datatype rdtype, + int root, + MPI_Comm comm) +{ + int i; + int ret, line; + int rank, size; + int first_segment_count; + size_t typelng; + MPI_Aint extent; + MPI_Aint lb; + + int first_segment_size=0; + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + size_t dsize, block_size; + if (rank == root) { + dsize= smpi_datatype_size(rdtype); + block_size = dsize * rcount; + } else { + dsize=smpi_datatype_size(sdtype); + block_size = dsize * scount; + } + + if (block_size > 92160){ + first_segment_size = 32768; + }else{ + first_segment_size = 1024; + } + + XBT_DEBUG( + "smpi_coll_tuned_gather_ompi_linear_sync rank %d, segment %d", rank, first_segment_size); + + if (rank != root) { + /* Non-root processes: + - receive zero byte message from the root, + - send the first segment of the data synchronously, + - send the second segment of the data. + */ + + typelng= smpi_datatype_size(sdtype); + smpi_datatype_extent(sdtype, &lb, &extent); + first_segment_count = scount; + COLL_TUNED_COMPUTED_SEGCOUNT( (size_t) first_segment_size, typelng, + first_segment_count ); + + smpi_mpi_recv(sbuf, 0, MPI_BYTE, root, + MCA_COLL_BASE_TAG_GATHER, + comm, MPI_STATUS_IGNORE); + + smpi_mpi_send(sbuf, first_segment_count, sdtype, root, + MCA_COLL_BASE_TAG_GATHER, + comm); + + smpi_mpi_send((char*)sbuf + extent * first_segment_count, + (scount - first_segment_count), sdtype, + root, MCA_COLL_BASE_TAG_GATHER, + comm); + } + + else { + /* Root process, + - For every non-root node: + - post irecv for the first segment of the message + - send zero byte message to signal node to send the message + - post irecv for the second segment of the message + - wait for the first segment to complete + - Copy local data if necessary + - Waitall for all the second segments to complete. + */ + char *ptmp; + MPI_Request *reqs = NULL, first_segment_req; + reqs = (MPI_Request *) calloc(size, sizeof(MPI_Request )); + if (NULL == reqs) { ret = -1; line = __LINE__; goto error_hndl; } + + typelng=smpi_datatype_size(rdtype); + smpi_datatype_extent(rdtype, &lb, &extent); + first_segment_count = rcount; + COLL_TUNED_COMPUTED_SEGCOUNT( (size_t)first_segment_size, typelng, + first_segment_count ); + + ptmp = (char *) rbuf; + for (i = 0; i < size; ++i) { + if (i == rank) { + /* skip myself */ + reqs[i] = MPI_REQUEST_NULL; + continue; + } + + /* irecv for the first segment from i */ + ptmp = (char*)rbuf + i * rcount * extent; + first_segment_req = smpi_mpi_irecv(ptmp, first_segment_count, rdtype, i, + MCA_COLL_BASE_TAG_GATHER, comm + ); + + /* send sync message */ + smpi_mpi_send(rbuf, 0, MPI_BYTE, i, + MCA_COLL_BASE_TAG_GATHER, + comm); + + /* irecv for the second segment */ + ptmp = (char*)rbuf + (i * rcount + first_segment_count) * extent; + reqs[i]=smpi_mpi_irecv(ptmp, (rcount - first_segment_count), + rdtype, i, MCA_COLL_BASE_TAG_GATHER, comm + ); + + /* wait on the first segment to complete */ + smpi_mpi_wait(&first_segment_req, MPI_STATUS_IGNORE); + } + + /* copy local data if necessary */ + if (MPI_IN_PLACE != sbuf) { + ret = smpi_datatype_copy(sbuf, scount, sdtype, + (char*)rbuf + rank * rcount * extent, + rcount, rdtype); + if (ret != MPI_SUCCESS) { line = __LINE__; goto error_hndl; } + } + + /* wait all second segments to complete */ + ret = smpi_mpi_waitall(size, reqs, MPI_STATUSES_IGNORE); + + free(reqs); + } + + /* All done */ + + return MPI_SUCCESS; + error_hndl: + XBT_DEBUG( + "ERROR_HNDL: node %d file %s line %d error %d\n", + rank, __FILE__, line, ret ); + return ret; +} + +/* + * Linear functions are copied from the BASIC coll module + * they do not segment the message and are simple implementations + * but for some small number of nodes and/or small data sizes they + * are just as fast as tuned/tree based segmenting operations + * and as such may be selected by the decision functions + * These are copied into this module due to the way we select modules + * in V1. i.e. in V2 we will handle this differently and so will not + * have to duplicate code. + * JPG following the examples from other coll_tuned implementations. Dec06. + */ + +/* copied function (with appropriate renaming) starts here */ +/* + * gather_intra + * + * Function: - basic gather operation + * Accepts: - same arguments as MPI_Gather() + * Returns: - MPI_SUCCESS or error code + */ +int +smpi_coll_tuned_gather_ompi_basic_linear(void *sbuf, int scount, + MPI_Datatype sdtype, + void *rbuf, int rcount, + MPI_Datatype rdtype, + int root, + MPI_Comm comm) +{ + int i; + int err; + int rank; + int size; + char *ptmp; + MPI_Aint incr; + MPI_Aint extent; + MPI_Aint lb; + + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + /* Everyone but root sends data and returns. */ + XBT_DEBUG( + "ompi_coll_tuned_gather_intra_basic_linear rank %d", rank); + + if (rank != root) { + smpi_mpi_send(sbuf, scount, sdtype, root, + MCA_COLL_BASE_TAG_GATHER, + comm); + return MPI_SUCCESS; + } + + /* I am the root, loop receiving the data. */ + + smpi_datatype_extent(rdtype, &lb, &extent); + incr = extent * rcount; + for (i = 0, ptmp = (char *) rbuf; i < size; ++i, ptmp += incr) { + if (i == rank) { + if (MPI_IN_PLACE != sbuf) { + err = smpi_datatype_copy(sbuf, scount, sdtype, + ptmp, rcount, rdtype); + } else { + err = MPI_SUCCESS; + } + } else { + smpi_mpi_recv(ptmp, rcount, rdtype, i, + MCA_COLL_BASE_TAG_GATHER, + comm, MPI_STATUS_IGNORE); + err = MPI_SUCCESS; + } + if (MPI_SUCCESS != err) { + return err; + } + } + + /* All done */ + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/reduce-NTSL.c b/src/smpi/colls/reduce-NTSL.c index 0dfc39b1bd..5a3b8875c6 100644 --- a/src/smpi/colls/reduce-NTSL.c +++ b/src/smpi/colls/reduce-NTSL.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" //#include int reduce_NTSL_segment_size_in_byte = 8192; @@ -19,10 +19,10 @@ int smpi_coll_tuned_reduce_NTSL(void *buf, void *rbuf, int count, int rank, size; int i; MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + rank = smpi_comm_rank(MPI_COMM_WORLD); + size = smpi_comm_size(MPI_COMM_WORLD); /* source node and destination nodes (same through out the functions) */ int to = (rank - 1 + size) % size; @@ -48,31 +48,31 @@ int smpi_coll_tuned_reduce_NTSL(void *buf, void *rbuf, int count, /* if (root != 0) { if (rank == root){ - MPI_Send(buf,count,datatype,0,tag,comm); + smpi_mpi_send(buf,count,datatype,0,tag,comm); } else if (rank == 0) { - MPI_Recv(buf,count,datatype,root,tag,comm,&status); + smpi_mpi_recv(buf,count,datatype,root,tag,comm,&status); } } */ char *tmp_buf; - tmp_buf = (char *) malloc(count * extent); + tmp_buf = (char *) xbt_malloc(count * extent); - MPI_Sendrecv(buf, count, datatype, rank, tag, rbuf, count, datatype, rank, + smpi_mpi_sendrecv(buf, count, datatype, rank, tag, rbuf, count, datatype, rank, tag, comm, &status); /* when a message is smaller than a block size => no pipeline */ if (count <= segment) { if (rank == root) { - MPI_Recv(tmp_buf, count, datatype, from, tag, comm, &status); - star_reduction(op, tmp_buf, rbuf, &count, &datatype); + smpi_mpi_recv(tmp_buf, count, datatype, from, tag, comm, &status); + smpi_op_apply(op, tmp_buf, rbuf, &count, &datatype); } else if (rank == ((root - 1 + size) % size)) { - MPI_Send(rbuf, count, datatype, to, tag, comm); + smpi_mpi_send(rbuf, count, datatype, to, tag, comm); } else { - MPI_Recv(tmp_buf, count, datatype, from, tag, comm, &status); - star_reduction(op, tmp_buf, rbuf, &count, &datatype); - MPI_Send(rbuf, count, datatype, to, tag, comm); + smpi_mpi_recv(tmp_buf, count, datatype, from, tag, comm, &status); + smpi_op_apply(op, tmp_buf, rbuf, &count, &datatype); + smpi_mpi_send(rbuf, count, datatype, to, tag, comm); } free(tmp_buf); return MPI_SUCCESS; @@ -81,23 +81,23 @@ int smpi_coll_tuned_reduce_NTSL(void *buf, void *rbuf, int count, /* pipeline */ else { send_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); recv_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); send_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); recv_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); /* root recv data */ if (rank == root) { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) tmp_buf + (i * increment), segment, datatype, from, - (tag + i), comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) tmp_buf + (i * increment), segment, datatype, from, + (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], &status); - star_reduction(op, tmp_buf + (i * increment), (char *)rbuf + (i * increment), + smpi_mpi_wait(&recv_request_array[i], &status); + smpi_op_apply(op, tmp_buf + (i * increment), (char *)rbuf + (i * increment), &segment, &datatype); } } @@ -105,26 +105,26 @@ int smpi_coll_tuned_reduce_NTSL(void *buf, void *rbuf, int count, /* last node only sends data */ else if (rank == ((root - 1 + size) % size)) { for (i = 0; i < pipe_length; i++) { - MPI_Isend((char *)rbuf + (i * increment), segment, datatype, to, (tag + i), - comm, &send_request_array[i]); + send_request_array[i] = smpi_mpi_isend((char *)rbuf + (i * increment), segment, datatype, to, (tag + i), + comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } /* intermediate nodes relay (receive, reduce, then send) data */ else { for (i = 0; i < pipe_length; i++) { - MPI_Irecv((char *) tmp_buf + (i * increment), segment, datatype, from, - (tag + i), comm, &recv_request_array[i]); + recv_request_array[i] = smpi_mpi_irecv((char *) tmp_buf + (i * increment), segment, datatype, from, + (tag + i), comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], &status); - star_reduction(op, tmp_buf + (i * increment), (char *)rbuf + (i * increment), + smpi_mpi_wait(&recv_request_array[i], &status); + smpi_op_apply(op, tmp_buf + (i * increment), (char *)rbuf + (i * increment), &segment, &datatype); - MPI_Isend((char *) rbuf + (i * increment), segment, datatype, to, - (tag + i), comm, &send_request_array[i]); + send_request_array[i] = smpi_mpi_isend((char *) rbuf + (i * increment), segment, datatype, to, + (tag + i), comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } free(send_request_array); @@ -135,7 +135,8 @@ int smpi_coll_tuned_reduce_NTSL(void *buf, void *rbuf, int count, /* when count is not divisible by block size, use default BCAST for the remainder */ if ((remainder != 0) && (count > segment)) { - MPI_Reduce((char *)buf + (pipe_length * increment), + XBT_WARN("MPI_reduce_NTSL use default MPI_reduce."); + smpi_mpi_reduce((char *)buf + (pipe_length * increment), (char *)rbuf + (pipe_length * increment), remainder, datatype, op, root, comm); } diff --git a/src/smpi/colls/reduce-arrival-pattern-aware.c b/src/smpi/colls/reduce-arrival-pattern-aware.c index 0182a6b516..1e252504c9 100644 --- a/src/smpi/colls/reduce-arrival-pattern-aware.c +++ b/src/smpi/colls/reduce-arrival-pattern-aware.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" //#include int reduce_arrival_pattern_aware_segment_size_in_byte = 8192; @@ -19,7 +19,7 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, MPI_Comm comm) { int rank; - MPI_Comm_rank(comm, &rank); + rank = smpi_comm_rank(comm); int tag = 50; MPI_Status status; @@ -42,14 +42,14 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, int header_buf[HEADER_SIZE]; char temp_buf[MAX_NODE]; - MPI_Aint extent; - MPI_Type_extent(datatype, &extent); + MPI_Aint extent, lb; + smpi_datatype_extent(datatype, &lb, &extent); /* source and destination */ int to, from; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + size=smpi_comm_size(comm); + rank=smpi_comm_rank(comm); /* segment is segment size in number of elements (not bytes) */ @@ -72,9 +72,9 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, } char *tmp_buf; - tmp_buf = (char *) malloc(count * extent); + tmp_buf = (char *) xbt_malloc(count * extent); - MPI_Sendrecv(buf, count, datatype, rank, tag, rbuf, count, datatype, rank, + smpi_mpi_sendrecv(buf, count, datatype, rank, tag, rbuf, count, datatype, rank, tag, comm, &status); @@ -88,9 +88,11 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, while (sent_count < (size - 1)) { for (i = 1; i < size; i++) { - if (already_received[i] == 0) - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], - MPI_STATUSES_IGNORE); + if (already_received[i] == 0) { + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + MPI_STATUSES_IGNORE); + simcall_process_sleep(0.0001); + } } header_index = 0; @@ -101,7 +103,7 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, /* 1-byte message arrive */ if ((flag_array[i] == 1) && (already_received[i] == 0)) { - MPI_Recv(temp_buf, 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); + smpi_mpi_recv(temp_buf, 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); header_buf[header_index] = i; header_index++; sent_count++; @@ -125,9 +127,9 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, to = header_buf[0]; from = header_buf[header_index - 1]; - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); - MPI_Recv(tmp_buf, count, datatype, from, tag, comm, &status); - star_reduction(op, tmp_buf, rbuf, &count, &datatype); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); + smpi_mpi_recv(tmp_buf, count, datatype, from, tag, comm, &status); + smpi_op_apply(op, tmp_buf, rbuf, &count, &datatype); } } /* while loop */ } @@ -137,12 +139,12 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, else { /* send 1-byte message to root */ - MPI_Send(temp_buf, 1, MPI_CHAR, 0, tag, comm); + smpi_mpi_send(temp_buf, 1, MPI_CHAR, 0, tag, comm); /* wait for header and data, forward when required */ - MPI_Recv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, + smpi_mpi_recv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, &status); - // MPI_Recv(buf,count,datatype,MPI_ANY_SOURCE,tag,comm,&status); + // smpi_mpi_recv(buf,count,datatype,MPI_ANY_SOURCE,tag,comm,&status); /* search for where it is */ int myordering = 0; @@ -152,7 +154,7 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, /* forward header */ if (header_buf[myordering + 1] != -1) { - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], tag, comm); } //printf("node %d ordering %d\n",rank,myordering); @@ -166,7 +168,7 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, } else { to = header_buf[myordering + 1]; } - MPI_Send(rbuf, count, datatype, to, tag, comm); + smpi_mpi_send(rbuf, count, datatype, to, tag, comm); } /* recv, reduce, send */ @@ -177,10 +179,10 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, to = header_buf[myordering + 1]; } from = header_buf[myordering - 1]; - MPI_Recv(tmp_buf, count, datatype, header_buf[myordering - 1], tag, + smpi_mpi_recv(tmp_buf, count, datatype, header_buf[myordering - 1], tag, comm, &status); - star_reduction(op, tmp_buf, rbuf, &count, &datatype); - MPI_Send(rbuf, count, datatype, to, tag, comm); + smpi_op_apply(op, tmp_buf, rbuf, &count, &datatype); + smpi_mpi_send(rbuf, count, datatype, to, tag, comm); } } /* non-root */ } @@ -189,13 +191,13 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, // printf("node %d start\n",rank); send_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); recv_request_array = - (MPI_Request *) malloc((size + pipe_length) * sizeof(MPI_Request)); + (MPI_Request *) xbt_malloc((size + pipe_length) * sizeof(MPI_Request)); send_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); recv_status_array = - (MPI_Status *) malloc((size + pipe_length) * sizeof(MPI_Status)); + (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status)); if (rank == 0) { sent_count = 0; @@ -212,11 +214,11 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, //if (i == rank) //continue; if ((already_received[i] == 0) && (will_send[i] == 0)) { - MPI_Iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], + smpi_mpi_iprobe(i, MPI_ANY_TAG, MPI_COMM_WORLD, &flag_array[i], &temp_status_array[i]); if (flag_array[i] == 1) { will_send[i] = 1; - MPI_Recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, + smpi_mpi_recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); //printf("recv from %d\n",i); i = 1; @@ -248,14 +250,14 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, to = header_buf[0]; /* send header */ - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, to, tag, comm); /* recv data - pipeline */ from = header_buf[header_index - 1]; for (i = 0; i < pipe_length; i++) { - MPI_Recv(tmp_buf + (i * increment), segment, datatype, from, tag, + smpi_mpi_recv(tmp_buf + (i * increment), segment, datatype, from, tag, comm, &status); - star_reduction(op, tmp_buf + (i * increment), + smpi_op_apply(op, tmp_buf + (i * increment), (char *)rbuf + (i * increment), &segment, &datatype); } } @@ -266,13 +268,12 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, /* none root */ else { /* send 1-byte message to root */ - MPI_Send(temp_buf, 1, MPI_CHAR, 0, tag, comm); + smpi_mpi_send(temp_buf, 1, MPI_CHAR, 0, tag, comm); /* wait for header forward when required */ - MPI_Irecv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm, - &request); - MPI_Wait(&request, MPI_STATUS_IGNORE); + request=smpi_mpi_irecv(header_buf, HEADER_SIZE, MPI_INT, MPI_ANY_SOURCE, tag, comm); + smpi_mpi_wait(&request, MPI_STATUS_IGNORE); /* search for where it is */ int myordering = 0; @@ -283,7 +284,7 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, /* send header when required */ if (header_buf[myordering + 1] != -1) { - MPI_Send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], + smpi_mpi_send(header_buf, HEADER_SIZE, MPI_INT, header_buf[myordering + 1], tag, comm); } @@ -297,27 +298,24 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, /* send only */ if (myordering == 0) { for (i = 0; i < pipe_length; i++) { - MPI_Isend((char *)rbuf + (i * increment), segment, datatype, to, tag, comm, - &send_request_array[i]); + send_request_array[i]= smpi_mpi_isend((char *)rbuf + (i * increment), segment, datatype, to, tag, comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } /* receive, reduce, and send */ else { from = header_buf[myordering - 1]; for (i = 0; i < pipe_length; i++) { - MPI_Irecv(tmp_buf + (i * increment), segment, datatype, from, tag, - comm, &recv_request_array[i]); + recv_request_array[i]=smpi_mpi_irecv(tmp_buf + (i * increment), segment, datatype, from, tag, comm); } for (i = 0; i < pipe_length; i++) { - MPI_Wait(&recv_request_array[i], MPI_STATUS_IGNORE); - star_reduction(op, tmp_buf + (i * increment), (char *)rbuf + (i * increment), + smpi_mpi_wait(&recv_request_array[i], MPI_STATUS_IGNORE); + smpi_op_apply(op, tmp_buf + (i * increment), (char *)rbuf + (i * increment), &segment, &datatype); - MPI_Isend((char *)rbuf + (i * increment), segment, datatype, to, tag, comm, - &send_request_array[i]); + send_request_array[i]=smpi_mpi_isend((char *)rbuf + (i * increment), segment, datatype, to, tag, comm); } - MPI_Waitall((pipe_length), send_request_array, send_status_array); + smpi_mpi_waitall((pipe_length), send_request_array, send_status_array); } } /* non-root */ @@ -338,16 +336,16 @@ int smpi_coll_tuned_reduce_arrival_pattern_aware(void *buf, void *rbuf, */ if (root != 0) { if (rank == 0) { - MPI_Send(rbuf, count, datatype, root, tag, comm); + smpi_mpi_send(rbuf, count, datatype, root, tag, comm); } else if (rank == root) { - MPI_Recv(rbuf, count, datatype, 0, tag, comm, &status); + smpi_mpi_recv(rbuf, count, datatype, 0, tag, comm, &status); } } /* when count is not divisible by block size, use default BCAST for the remainder */ if ((remainder != 0) && (count > segment)) { - MPI_Reduce((char *)buf + (pipe_length * increment), + smpi_mpi_reduce((char *)buf + (pipe_length * increment), (char *)rbuf + (pipe_length * increment), remainder, datatype, op, root, comm); } diff --git a/src/smpi/colls/reduce-binomial.c b/src/smpi/colls/reduce-binomial.c index 580e3dbbb5..63de8fe932 100644 --- a/src/smpi/colls/reduce-binomial.c +++ b/src/smpi/colls/reduce-binomial.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" //#include @@ -16,14 +16,14 @@ int smpi_coll_tuned_reduce_binomial(void *sendbuf, void *recvbuf, int count, if (count == 0) return 0; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &comm_size); + rank = smpi_comm_rank(comm); + comm_size = smpi_comm_size(comm); - MPI_Type_extent(datatype, &extent); + extent = smpi_datatype_get_extent(datatype); - tmp_buf = (void *) malloc(count * extent); + tmp_buf = (void *) xbt_malloc(count * extent); - MPI_Sendrecv(sendbuf, count, datatype, rank, tag, + smpi_mpi_sendrecv(sendbuf, count, datatype, rank, tag, recvbuf, count, datatype, rank, tag, comm, &status); mask = 1; relrank = (rank - root + comm_size) % comm_size; @@ -34,12 +34,12 @@ int smpi_coll_tuned_reduce_binomial(void *sendbuf, void *recvbuf, int count, source = (relrank | mask); if (source < comm_size) { source = (source + root) % comm_size; - MPI_Recv(tmp_buf, count, datatype, source, tag, comm, &status); - star_reduction(op, tmp_buf, recvbuf, &count, &datatype); + smpi_mpi_recv(tmp_buf, count, datatype, source, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recvbuf, &count, &datatype); } } else { dst = ((relrank & (~mask)) + root) % comm_size; - MPI_Send(recvbuf, count, datatype, dst, tag, comm); + smpi_mpi_send(recvbuf, count, datatype, dst, tag, comm); break; } mask <<= 1; diff --git a/src/smpi/colls/reduce-flat-tree.c b/src/smpi/colls/reduce-flat-tree.c index e6434c1144..f304e78224 100644 --- a/src/smpi/colls/reduce-flat-tree.c +++ b/src/smpi/colls/reduce-flat-tree.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" //#include int @@ -14,14 +14,14 @@ smpi_coll_tuned_reduce_flat_tree(void *sbuf, void *rbuf, int count, char *inbuf; MPI_Status status; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &size); + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); /* If not root, send data to the root. */ - MPI_Type_extent(dtype, &extent); + extent = smpi_datatype_get_extent(dtype); if (rank != root) { - MPI_Send(sbuf, count, dtype, root, tag, comm); + smpi_mpi_send(sbuf, count, dtype, root, tag, comm); return 0; } @@ -29,15 +29,15 @@ smpi_coll_tuned_reduce_flat_tree(void *sbuf, void *rbuf, int count, messages. */ if (size > 1) - origin = (char *) malloc(count * extent); + origin = (char *) xbt_malloc(count * extent); /* Initialize the receive buffer. */ if (rank == (size - 1)) - MPI_Sendrecv(sbuf, count, dtype, rank, tag, + smpi_mpi_sendrecv(sbuf, count, dtype, rank, tag, rbuf, count, dtype, rank, tag, comm, &status); else - MPI_Recv(rbuf, count, dtype, size - 1, tag, comm, &status); + smpi_mpi_recv(rbuf, count, dtype, size - 1, tag, comm, &status); /* Loop receiving and calling reduction function (C or Fortran). */ @@ -45,12 +45,12 @@ smpi_coll_tuned_reduce_flat_tree(void *sbuf, void *rbuf, int count, if (rank == i) inbuf = sbuf; else { - MPI_Recv(origin, count, dtype, i, tag, comm, &status); + smpi_mpi_recv(origin, count, dtype, i, tag, comm, &status); inbuf = origin; } /* Call reduction function. */ - star_reduction(op, inbuf, rbuf, &count, &dtype); + smpi_op_apply(op, inbuf, rbuf, &count, &dtype); } diff --git a/src/smpi/colls/reduce-ompi.c b/src/smpi/colls/reduce-ompi.c new file mode 100644 index 0000000000..c5d767ce7d --- /dev/null +++ b/src/smpi/colls/reduce-ompi.c @@ -0,0 +1,681 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2009 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$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "colls_private.h" +#include "coll_tuned_topo.h" +#define MCA_COLL_BASE_TAG_REDUCE 555 + + + +int smpi_coll_tuned_ompi_reduce_generic( void* sendbuf, void* recvbuf, int original_count, + MPI_Datatype datatype, MPI_Op op, + int root, MPI_Comm comm, + ompi_coll_tree_t* tree, int count_by_segment, + int max_outstanding_reqs ); +/** + * This is a generic implementation of the reduce protocol. It used the tree + * provided as an argument and execute all operations using a segment of + * count times a datatype. + * For the last communication it will update the count in order to limit + * the number of datatype to the original count (original_count) + * + * Note that for non-commutative operations we cannot save memory copy + * for the first block: thus we must copy sendbuf to accumbuf on intermediate + * to keep the optimized loop happy. + */ +int smpi_coll_tuned_ompi_reduce_generic( void* sendbuf, void* recvbuf, int original_count, + MPI_Datatype datatype, MPI_Op op, + int root, MPI_Comm comm, + ompi_coll_tree_t* tree, int count_by_segment, + int max_outstanding_reqs ) +{ + char *inbuf[2] = {NULL, NULL}, *inbuf_free[2] = {NULL, NULL}; + char *accumbuf = NULL, *accumbuf_free = NULL; + char *local_op_buffer = NULL, *sendtmpbuf = NULL; + ptrdiff_t extent, lower_bound, segment_increment; + MPI_Request reqs[2] = {MPI_REQUEST_NULL, MPI_REQUEST_NULL}; + int num_segments, line, ret, segindex, i, rank; + int recvcount, prevcount, inbi; + + /** + * Determine number of segments and number of elements + * sent per operation + */ + smpi_datatype_extent( datatype, &lower_bound, &extent); + num_segments = (original_count + count_by_segment - 1) / count_by_segment; + segment_increment = count_by_segment * extent; + + sendtmpbuf = (char*) sendbuf; + if( sendbuf == MPI_IN_PLACE ) { + sendtmpbuf = (char *)recvbuf; + } + + XBT_DEBUG( "coll:tuned:reduce_generic count %d, msg size %ld, segsize %ld, max_requests %d", original_count, (unsigned long)(num_segments * segment_increment), (unsigned long)segment_increment, max_outstanding_reqs); + + rank = smpi_comm_rank(comm); + + /* non-leaf nodes - wait for children to send me data & forward up + (if needed) */ + if( tree->tree_nextsize > 0 ) { + ptrdiff_t true_extent, real_segment_size; + true_extent=smpi_datatype_get_extent( datatype); + + /* handle non existant recv buffer (i.e. its NULL) and + protect the recv buffer on non-root nodes */ + accumbuf = (char*)recvbuf; + if( (NULL == accumbuf) || (root != rank) ) { + /* Allocate temporary accumulator buffer. */ + accumbuf_free = (char*)malloc(true_extent + + (original_count - 1) * extent); + if (accumbuf_free == NULL) { + line = __LINE__; ret = -1; goto error_hndl; + } + accumbuf = accumbuf_free - lower_bound; + } + + /* If this is a non-commutative operation we must copy + sendbuf to the accumbuf, in order to simplfy the loops */ + if (!smpi_op_is_commute(op)) { + smpi_datatype_copy( + (char*)accumbuf, original_count, datatype, + (char*)sendtmpbuf, original_count, datatype); + } + /* Allocate two buffers for incoming segments */ + real_segment_size = true_extent + (count_by_segment - 1) * extent; + inbuf_free[0] = (char*) malloc(real_segment_size); + if( inbuf_free[0] == NULL ) { + line = __LINE__; ret = -1; goto error_hndl; + } + inbuf[0] = inbuf_free[0] - lower_bound; + /* if there is chance to overlap communication - + allocate second buffer */ + if( (num_segments > 1) || (tree->tree_nextsize > 1) ) { + inbuf_free[1] = (char*) malloc(real_segment_size); + if( inbuf_free[1] == NULL ) { + line = __LINE__; ret = -1; goto error_hndl; + } + inbuf[1] = inbuf_free[1] - lower_bound; + } + + /* reset input buffer index and receive count */ + inbi = 0; + recvcount = 0; + /* for each segment */ + for( segindex = 0; segindex <= num_segments; segindex++ ) { + prevcount = recvcount; + /* recvcount - number of elements in current segment */ + recvcount = count_by_segment; + if( segindex == (num_segments-1) ) + recvcount = original_count - count_by_segment * segindex; + + /* for each child */ + for( i = 0; i < tree->tree_nextsize; i++ ) { + /** + * We try to overlap communication: + * either with next segment or with the next child + */ + /* post irecv for current segindex on current child */ + if( segindex < num_segments ) { + void* local_recvbuf = inbuf[inbi]; + if( 0 == i ) { + /* for the first step (1st child per segment) and + * commutative operations we might be able to irecv + * directly into the accumulate buffer so that we can + * reduce(op) this with our sendbuf in one step as + * ompi_op_reduce only has two buffer pointers, + * this avoids an extra memory copy. + * + * BUT if the operation is non-commutative or + * we are root and are USING MPI_IN_PLACE this is wrong! + */ + if( (smpi_op_is_commute(op)) && + !((MPI_IN_PLACE == sendbuf) && (rank == tree->tree_root)) ) { + local_recvbuf = accumbuf + segindex * segment_increment; + } + } + + reqs[inbi]=smpi_mpi_irecv(local_recvbuf, recvcount, datatype, + tree->tree_next[i], + MCA_COLL_BASE_TAG_REDUCE, comm + ); + } + /* wait for previous req to complete, if any. + if there are no requests reqs[inbi ^1] will be + MPI_REQUEST_NULL. */ + /* wait on data from last child for previous segment */ + smpi_mpi_waitall( 1, &reqs[inbi ^ 1], + MPI_STATUSES_IGNORE ); + local_op_buffer = inbuf[inbi ^ 1]; + if( i > 0 ) { + /* our first operation is to combine our own [sendbuf] data + * with the data we recvd from down stream (but only + * the operation is commutative and if we are not root and + * not using MPI_IN_PLACE) + */ + if( 1 == i ) { + if( (smpi_op_is_commute(op)) && + !((MPI_IN_PLACE == sendbuf) && (rank == tree->tree_root)) ) { + local_op_buffer = sendtmpbuf + segindex * segment_increment; + } + } + /* apply operation */ + smpi_op_apply(op, local_op_buffer, + accumbuf + segindex * segment_increment, + &recvcount, &datatype ); + } else if ( segindex > 0 ) { + void* accumulator = accumbuf + (segindex-1) * segment_increment; + if( tree->tree_nextsize <= 1 ) { + if( (smpi_op_is_commute(op)) && + !((MPI_IN_PLACE == sendbuf) && (rank == tree->tree_root)) ) { + local_op_buffer = sendtmpbuf + (segindex-1) * segment_increment; + } + } + smpi_op_apply(op, local_op_buffer, accumulator, &prevcount, + &datatype ); + + /* all reduced on available data this step (i) complete, + * pass to the next process unless you are the root. + */ + if (rank != tree->tree_root) { + /* send combined/accumulated data to parent */ + smpi_mpi_send( accumulator, prevcount, + datatype, tree->tree_prev, + MCA_COLL_BASE_TAG_REDUCE, + comm); + } + + /* we stop when segindex = number of segments + (i.e. we do num_segment+1 steps for pipelining */ + if (segindex == num_segments) break; + } + + /* update input buffer index */ + inbi = inbi ^ 1; + } /* end of for each child */ + } /* end of for each segment */ + + /* clean up */ + if( inbuf_free[0] != NULL) free(inbuf_free[0]); + if( inbuf_free[1] != NULL) free(inbuf_free[1]); + if( accumbuf_free != NULL ) free(accumbuf_free); + } + + /* leaf nodes + Depending on the value of max_outstanding_reqs and + the number of segments we have two options: + - send all segments using blocking send to the parent, or + - avoid overflooding the parent nodes by limiting the number of + outstanding requests to max_oustanding_reqs. + TODO/POSSIBLE IMPROVEMENT: If there is a way to determine the eager size + for the current communication, synchronization should be used only + when the message/segment size is smaller than the eager size. + */ + else { + + /* If the number of segments is less than a maximum number of oustanding + requests or there is no limit on the maximum number of outstanding + requests, we send data to the parent using blocking send */ + if ((0 == max_outstanding_reqs) || + (num_segments <= max_outstanding_reqs)) { + + segindex = 0; + while ( original_count > 0) { + if (original_count < count_by_segment) { + count_by_segment = original_count; + } + smpi_mpi_send((char*)sendbuf + + segindex * segment_increment, + count_by_segment, datatype, + tree->tree_prev, + MCA_COLL_BASE_TAG_REDUCE, + comm) ; + segindex++; + original_count -= count_by_segment; + } + } + + /* Otherwise, introduce flow control: + - post max_outstanding_reqs non-blocking synchronous send, + - for remaining segments + - wait for a ssend to complete, and post the next one. + - wait for all outstanding sends to complete. + */ + else { + + int creq = 0; + MPI_Request* sreq = NULL; + + sreq = (MPI_Request*) calloc( max_outstanding_reqs, + sizeof(MPI_Request ) ); + if (NULL == sreq) { line = __LINE__; ret = -1; goto error_hndl; } + + /* post first group of requests */ + for (segindex = 0; segindex < max_outstanding_reqs; segindex++) { + sreq[segindex]=smpi_mpi_isend((char*)sendbuf + + segindex * segment_increment, + count_by_segment, datatype, + tree->tree_prev, + MCA_COLL_BASE_TAG_REDUCE, + comm); + original_count -= count_by_segment; + } + + creq = 0; + while ( original_count > 0 ) { + /* wait on a posted request to complete */ + smpi_mpi_wait(&sreq[creq], MPI_STATUS_IGNORE); + sreq[creq] = MPI_REQUEST_NULL; + + if( original_count < count_by_segment ) { + count_by_segment = original_count; + } + sreq[creq]=smpi_mpi_isend((char*)sendbuf + + segindex * segment_increment, + count_by_segment, datatype, + tree->tree_prev, + MCA_COLL_BASE_TAG_REDUCE, + comm ); + creq = (creq + 1) % max_outstanding_reqs; + segindex++; + original_count -= count_by_segment; + } + + /* Wait on the remaining request to complete */ + smpi_mpi_waitall( max_outstanding_reqs, sreq, + MPI_STATUSES_IGNORE ); + + /* free requests */ + free(sreq); + } + } + return MPI_SUCCESS; + + error_hndl: /* error handler */ + XBT_DEBUG("ERROR_HNDL: node %d file %s line %d error %d\n", + rank, __FILE__, line, ret ); + if( inbuf_free[0] != NULL ) free(inbuf_free[0]); + if( inbuf_free[1] != NULL ) free(inbuf_free[1]); + if( accumbuf_free != NULL ) free(accumbuf); + return ret; +} + +/* Attention: this version of the reduce operations does not + work for: + - non-commutative operations + - segment sizes which are not multiplies of the extent of the datatype + meaning that at least one datatype must fit in the segment ! +*/ + +int smpi_coll_tuned_reduce_ompi_chain( void *sendbuf, void *recvbuf, int count, + MPI_Datatype datatype, + MPI_Op op, int root, + MPI_Comm comm + ) +{ + uint32_t segsize=64*1024; + int segcount = count; + size_t typelng; + int fanout = smpi_comm_size(comm)/2; + + XBT_DEBUG("coll:tuned:reduce_intra_chain rank %d fo %d ss %5d", smpi_comm_rank(comm), fanout, segsize); + + /** + * Determine number of segments and number of elements + * sent per operation + */ + typelng = smpi_datatype_size( datatype); + + COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount ); + + return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype, + op, root, comm, + ompi_coll_tuned_topo_build_chain(fanout, comm, root), + segcount, 0 ); +} + + +int smpi_coll_tuned_reduce_ompi_pipeline( void *sendbuf, void *recvbuf, + int count, MPI_Datatype datatype, + MPI_Op op, int root, + MPI_Comm comm ) +{ + + uint32_t segsize; + int segcount = count; + size_t typelng; +// COLL_TUNED_UPDATE_PIPELINE( comm, tuned_module, root ); + + /** + * Determine number of segments and number of elements + * sent per operation + */ + const double a2 = 0.0410 / 1024.0; /* [1/B] */ + const double b2 = 9.7128; + const double a4 = 0.0033 / 1024.0; /* [1/B] */ + const double b4 = 1.6761; + typelng= smpi_datatype_size( datatype); + int communicator_size = smpi_comm_size(comm); + size_t message_size = typelng * count; + + if (communicator_size > (a2 * message_size + b2)) { + // Pipeline_1K + segsize = 1024; + }else if (communicator_size > (a4 * message_size + b4)) { + // Pipeline_32K + segsize = 32*1024; + } else { + // Pipeline_64K + segsize = 64*1024; + } + + XBT_DEBUG("coll:tuned:reduce_intra_pipeline rank %d ss %5d", + smpi_comm_rank(comm), segsize); + + COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount ); + + return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype, + op, root, comm, + ompi_coll_tuned_topo_build_chain( 1, comm, root), + segcount, 0); +} + +int smpi_coll_tuned_reduce_ompi_binary( void *sendbuf, void *recvbuf, + int count, MPI_Datatype datatype, + MPI_Op op, int root, + MPI_Comm comm) +{ + uint32_t segsize; + int segcount = count; + size_t typelng; + + + + /** + * Determine number of segments and number of elements + * sent per operation + */ + typelng=smpi_datatype_size( datatype ); + + // Binary_32K + segsize = 32*1024; + + XBT_DEBUG("coll:tuned:reduce_intra_binary rank %d ss %5d", + smpi_comm_rank(comm), segsize); + + COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount ); + + return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype, + op, root, comm, + ompi_coll_tuned_topo_build_tree(2, comm, root), + segcount, 0); +} + +int smpi_coll_tuned_reduce_ompi_binomial( void *sendbuf, void *recvbuf, + int count, MPI_Datatype datatype, + MPI_Op op, int root, + MPI_Comm comm) +{ + + uint32_t segsize=0; + int segcount = count; + size_t typelng; + + const double a1 = 0.6016 / 1024.0; /* [1/B] */ + const double b1 = 1.3496; + +// COLL_TUNED_UPDATE_IN_ORDER_BMTREE( comm, tuned_module, root ); + + /** + * Determine number of segments and number of elements + * sent per operation + */ + typelng= smpi_datatype_size( datatype); + int communicator_size = smpi_comm_size(comm); + size_t message_size = typelng * count; + if (((communicator_size < 8) && (message_size < 20480)) || + (message_size < 2048) || (count <= 1)) { + /* Binomial_0K */ + segsize = 0; + } else if (communicator_size > (a1 * message_size + b1)) { + // Binomial_1K + segsize = 1024; + } + + XBT_DEBUG("coll:tuned:reduce_intra_binomial rank %d ss %5d", + smpi_comm_rank(comm), segsize); + COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount ); + + return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype, + op, root, comm, + ompi_coll_tuned_topo_build_in_order_bmtree(comm, root), + segcount, 0); +} + +/* + * reduce_intra_in_order_binary + * + * Function: Logarithmic reduce operation for non-commutative operations. + * Acecpts: same as MPI_Reduce() + * Returns: MPI_SUCCESS or error code + */ +int smpi_coll_tuned_reduce_ompi_in_order_binary( void *sendbuf, void *recvbuf, + int count, + MPI_Datatype datatype, + MPI_Op op, int root, + MPI_Comm comm) +{ + uint32_t segsize=0; + int ret; + int rank, size, io_root; + int segcount = count; + void *use_this_sendbuf = NULL, *use_this_recvbuf = NULL; + size_t typelng; + + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + XBT_DEBUG("coll:tuned:reduce_intra_in_order_binary rank %d ss %5d", + rank, segsize); + + /** + * Determine number of segments and number of elements + * sent per operation + */ + typelng=smpi_datatype_size( datatype); + COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount ); + + /* An in-order binary tree must use root (size-1) to preserve the order of + operations. Thus, if root is not rank (size - 1), then we must handle + 1. MPI_IN_PLACE option on real root, and + 2. we must allocate temporary recvbuf on rank (size - 1). + Note that generic function must be careful not to switch order of + operations for non-commutative ops. + */ + io_root = size - 1; + use_this_sendbuf = sendbuf; + use_this_recvbuf = recvbuf; + if (io_root != root) { + ptrdiff_t text, ext; + char *tmpbuf = NULL; + + ext=smpi_datatype_get_extent(datatype); + text=smpi_datatype_get_extent(datatype); + + if ((root == rank) && (MPI_IN_PLACE == sendbuf)) { + tmpbuf = (char *) malloc(text + (count - 1) * ext); + if (NULL == tmpbuf) { + return MPI_ERR_INTERN; + } + smpi_datatype_copy ( + (char*)tmpbuf, count, datatype, + (char*)recvbuf, count, datatype); + use_this_sendbuf = tmpbuf; + } else if (io_root == rank) { + tmpbuf = (char *) malloc(text + (count - 1) * ext); + if (NULL == tmpbuf) { + return MPI_ERR_INTERN; + } + use_this_recvbuf = tmpbuf; + } + } + + /* Use generic reduce with in-order binary tree topology and io_root */ + ret = smpi_coll_tuned_ompi_reduce_generic( use_this_sendbuf, use_this_recvbuf, count, datatype, + op, io_root, comm, + ompi_coll_tuned_topo_build_in_order_bintree(comm), + segcount, 0 ); + if (MPI_SUCCESS != ret) { return ret; } + + /* Clean up */ + if (io_root != root) { + if (root == rank) { + /* Receive result from rank io_root to recvbuf */ + smpi_mpi_recv(recvbuf, count, datatype, io_root, + MCA_COLL_BASE_TAG_REDUCE, comm, + MPI_STATUS_IGNORE); + if (MPI_IN_PLACE == sendbuf) { + free(use_this_sendbuf); + } + + } else if (io_root == rank) { + /* Send result from use_this_recvbuf to root */ + smpi_mpi_send(use_this_recvbuf, count, datatype, root, + MCA_COLL_BASE_TAG_REDUCE, + comm); + free(use_this_recvbuf); + } + } + + return MPI_SUCCESS; +} + +/* + * Linear functions are copied from the BASIC coll module + * they do not segment the message and are simple implementations + * but for some small number of nodes and/or small data sizes they + * are just as fast as tuned/tree based segmenting operations + * and as such may be selected by the decision functions + * These are copied into this module due to the way we select modules + * in V1. i.e. in V2 we will handle this differently and so will not + * have to duplicate code. + * GEF Oct05 after asking Jeff. + */ + +/* copied function (with appropriate renaming) starts here */ + +/* + * reduce_lin_intra + * + * Function: - reduction using O(N) algorithm + * Accepts: - same as MPI_Reduce() + * Returns: - MPI_SUCCESS or error code + */ + +int +smpi_coll_tuned_reduce_ompi_basic_linear(void *sbuf, void *rbuf, int count, + MPI_Datatype dtype, + MPI_Op op, + int root, + MPI_Comm comm) +{ + int i, rank, size; + ptrdiff_t true_extent, lb, extent; + char *free_buffer = NULL; + char *pml_buffer = NULL; + char *inplace_temp = NULL; + char *inbuf; + + /* Initialize */ + + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + + XBT_DEBUG("coll:tuned:reduce_intra_basic_linear rank %d", rank); + + /* If not root, send data to the root. */ + + if (rank != root) { + smpi_mpi_send(sbuf, count, dtype, root, + MCA_COLL_BASE_TAG_REDUCE, + comm); + return -1; + } + + /* see discussion in ompi_coll_basic_reduce_lin_intra about + extent and true extent */ + /* for reducing buffer allocation lengths.... */ + + smpi_datatype_extent(dtype, &lb, &extent); + true_extent = smpi_datatype_get_extent(dtype); + + if (MPI_IN_PLACE == sbuf) { + sbuf = rbuf; + inplace_temp = (char*)malloc(true_extent + (count - 1) * extent); + if (NULL == inplace_temp) { + return -1; + } + rbuf = inplace_temp - lb; + } + + if (size > 1) { + free_buffer = (char*)malloc(true_extent + (count - 1) * extent); + pml_buffer = free_buffer - lb; + } + + /* Initialize the receive buffer. */ + + if (rank == (size - 1)) { + smpi_datatype_copy((char*)rbuf, count, dtype, + (char*)sbuf, count, dtype); + } else { + smpi_mpi_recv(rbuf, count, dtype, size - 1, + MCA_COLL_BASE_TAG_REDUCE, comm, + MPI_STATUS_IGNORE); + } + + /* Loop receiving and calling reduction function (C or Fortran). */ + + for (i = size - 2; i >= 0; --i) { + if (rank == i) { + inbuf = (char*)sbuf; + } else { + smpi_mpi_recv(pml_buffer, count, dtype, i, + MCA_COLL_BASE_TAG_REDUCE, comm, + MPI_STATUS_IGNORE); + inbuf = pml_buffer; + } + + /* Perform the reduction */ + smpi_op_apply(op, inbuf, rbuf, &count, &dtype); + } + + if (NULL != inplace_temp) { + smpi_datatype_copy((char*)sbuf, count, dtype, + inplace_temp,count , dtype); + free(inplace_temp); + } + if (NULL != free_buffer) { + free(free_buffer); + } + + /* All done */ + return MPI_SUCCESS; +} + +/* copied function (with appropriate renaming) ends here */ + + diff --git a/src/smpi/colls/reduce-scatter-gather.c b/src/smpi/colls/reduce-scatter-gather.c index 481079adac..2c61d48f65 100644 --- a/src/smpi/colls/reduce-scatter-gather.c +++ b/src/smpi/colls/reduce-scatter-gather.c @@ -1,4 +1,4 @@ -#include "colls.h" +#include "colls_private.h" /* reduce @@ -10,7 +10,7 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, MPI_Op op, int root, MPI_Comm comm) { MPI_Status status; - int comm_size, rank, type_size, pof2, rem, newrank; + int comm_size, rank, pof2, rem, newrank; int mask, *cnts, *disps, i, j, send_idx = 0; int recv_idx, last_idx = 0, newdst; int dst, send_cnt, recv_cnt, newroot, newdst_tree_root; @@ -25,11 +25,10 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, if (count == 0) return 0; - MPI_Comm_rank(comm, &rank); - MPI_Comm_size(comm, &comm_size); + rank = smpi_comm_rank(comm); + comm_size = smpi_comm_size(comm); - MPI_Type_extent(datatype, &extent); - MPI_Type_size(datatype, &type_size); + extent = smpi_datatype_get_extent(datatype); /* find nearest power-of-two less than or equal to comm_size */ pof2 = 1; @@ -39,31 +38,31 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, if (count < comm_size) { new_count = comm_size; - send_ptr = (void *) malloc(new_count * extent); - recv_ptr = (void *) malloc(new_count * extent); - tmp_buf = (void *) malloc(new_count * extent); - memcpy(send_ptr, sendbuf, extent * new_count); + send_ptr = (void *) xbt_malloc(new_count * extent); + recv_ptr = (void *) xbt_malloc(new_count * extent); + tmp_buf = (void *) xbt_malloc(new_count * extent); + memcpy(send_ptr, sendbuf, extent * count); //if ((rank != root)) - MPI_Sendrecv(send_ptr, new_count, datatype, rank, tag, + smpi_mpi_sendrecv(send_ptr, new_count, datatype, rank, tag, recv_ptr, new_count, datatype, rank, tag, comm, &status); rem = comm_size - pof2; if (rank < 2 * rem) { if (rank % 2 != 0) { /* odd */ - MPI_Send(recv_ptr, new_count, datatype, rank - 1, tag, comm); + smpi_mpi_send(recv_ptr, new_count, datatype, rank - 1, tag, comm); newrank = -1; } else { - MPI_Recv(tmp_buf, count, datatype, rank + 1, tag, comm, &status); - star_reduction(op, tmp_buf, recv_ptr, &new_count, &datatype); + smpi_mpi_recv(tmp_buf, count, datatype, rank + 1, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recv_ptr, &new_count, &datatype); newrank = rank / 2; } } else /* rank >= 2*rem */ newrank = rank - rem; - cnts = (int *) malloc(pof2 * sizeof(int)); - disps = (int *) malloc(pof2 * sizeof(int)); + cnts = (int *) xbt_malloc(pof2 * sizeof(int)); + disps = (int *) xbt_malloc(pof2 * sizeof(int)); if (newrank != -1) { for (i = 0; i < (pof2 - 1); i++) @@ -98,7 +97,7 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, } /* Send data from recvbuf. Recv into tmp_buf */ - MPI_Sendrecv((char *) recv_ptr + + smpi_mpi_sendrecv((char *) recv_ptr + disps[send_idx] * extent, send_cnt, datatype, dst, tag, @@ -109,7 +108,7 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, /* tmp_buf contains data received in this step. recvbuf contains data accumulated so far */ - star_reduction(op, (char *) tmp_buf + disps[recv_idx] * extent, + smpi_op_apply(op, (char *) tmp_buf + disps[recv_idx] * extent, (char *) recv_ptr + disps[recv_idx] * extent, &recv_cnt, &datatype); @@ -136,13 +135,13 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, for (i = 1; i < pof2; i++) disps[i] = disps[i - 1] + cnts[i - 1]; - MPI_Recv(recv_ptr, cnts[0], datatype, 0, tag, comm, &status); + smpi_mpi_recv(recv_ptr, cnts[0], datatype, 0, tag, comm, &status); newrank = 0; send_idx = 0; last_idx = 2; } else if (newrank == 0) { - MPI_Send(recv_ptr, cnts[0], datatype, root, tag, comm); + smpi_mpi_send(recv_ptr, cnts[0], datatype, root, tag, comm); newrank = -1; } newroot = 0; @@ -194,12 +193,12 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, } if (newdst_tree_root == newroot_tree_root) { - MPI_Send((char *) recv_ptr + + smpi_mpi_send((char *) recv_ptr + disps[send_idx] * extent, send_cnt, datatype, dst, tag, comm); break; } else { - MPI_Recv((char *) recv_ptr + + smpi_mpi_recv((char *) recv_ptr + disps[recv_idx] * extent, recv_cnt, datatype, dst, tag, comm, &status); } @@ -218,29 +217,29 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, else if (count >= comm_size) { - tmp_buf = (void *) malloc(count * extent); + tmp_buf = (void *) xbt_malloc(count * extent); //if ((rank != root)) - MPI_Sendrecv(sendbuf, count, datatype, rank, tag, + smpi_mpi_sendrecv(sendbuf, count, datatype, rank, tag, recvbuf, count, datatype, rank, tag, comm, &status); rem = comm_size - pof2; if (rank < 2 * rem) { if (rank % 2 != 0) { /* odd */ - MPI_Send(recvbuf, count, datatype, rank - 1, tag, comm); + smpi_mpi_send(recvbuf, count, datatype, rank - 1, tag, comm); newrank = -1; } else { - MPI_Recv(tmp_buf, count, datatype, rank + 1, tag, comm, &status); - star_reduction(op, tmp_buf, recvbuf, &count, &datatype); + smpi_mpi_recv(tmp_buf, count, datatype, rank + 1, tag, comm, &status); + smpi_op_apply(op, tmp_buf, recvbuf, &count, &datatype); newrank = rank / 2; } } else /* rank >= 2*rem */ newrank = rank - rem; - cnts = (int *) malloc(pof2 * sizeof(int)); - disps = (int *) malloc(pof2 * sizeof(int)); + cnts = (int *) xbt_malloc(pof2 * sizeof(int)); + disps = (int *) xbt_malloc(pof2 * sizeof(int)); if (newrank != -1) { for (i = 0; i < (pof2 - 1); i++) @@ -275,7 +274,7 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, } /* Send data from recvbuf. Recv into tmp_buf */ - MPI_Sendrecv((char *) recvbuf + + smpi_mpi_sendrecv((char *) recvbuf + disps[send_idx] * extent, send_cnt, datatype, dst, tag, @@ -286,7 +285,7 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, /* tmp_buf contains data received in this step. recvbuf contains data accumulated so far */ - star_reduction(op, (char *) tmp_buf + disps[recv_idx] * extent, + smpi_op_apply(op, (char *) tmp_buf + disps[recv_idx] * extent, (char *) recvbuf + disps[recv_idx] * extent, &recv_cnt, &datatype); @@ -312,13 +311,13 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, for (i = 1; i < pof2; i++) disps[i] = disps[i - 1] + cnts[i - 1]; - MPI_Recv(recvbuf, cnts[0], datatype, 0, tag, comm, &status); + smpi_mpi_recv(recvbuf, cnts[0], datatype, 0, tag, comm, &status); newrank = 0; send_idx = 0; last_idx = 2; } else if (newrank == 0) { - MPI_Send(recvbuf, cnts[0], datatype, root, tag, comm); + smpi_mpi_send(recvbuf, cnts[0], datatype, root, tag, comm); newrank = -1; } newroot = 0; @@ -370,12 +369,12 @@ int smpi_coll_tuned_reduce_scatter_gather(void *sendbuf, void *recvbuf, } if (newdst_tree_root == newroot_tree_root) { - MPI_Send((char *) recvbuf + + smpi_mpi_send((char *) recvbuf + disps[send_idx] * extent, send_cnt, datatype, dst, tag, comm); break; } else { - MPI_Recv((char *) recvbuf + + smpi_mpi_recv((char *) recvbuf + disps[recv_idx] * extent, recv_cnt, datatype, dst, tag, comm, &status); } diff --git a/src/smpi/colls/reduce_scatter-mpich.c b/src/smpi/colls/reduce_scatter-mpich.c new file mode 100644 index 0000000000..dbde2e6111 --- /dev/null +++ b/src/smpi/colls/reduce_scatter-mpich.c @@ -0,0 +1,485 @@ +#include "colls_private.h" +#define MPIR_REDUCE_SCATTER_TAG 222 + +static inline int MPIU_Mirror_permutation(unsigned int x, int bits) +{ + /* a mask for the high order bits that should be copied as-is */ + int high_mask = ~((0x1 << bits) - 1); + int retval = x & high_mask; + int i; + + for (i = 0; i < bits; ++i) { + unsigned int bitval = (x & (0x1 << i)) >> i; /* 0x1 or 0x0 */ + retval |= bitval << ((bits - i) - 1); + } + + return retval; +} + + +int smpi_coll_tuned_reduce_scatter_mpich_pair(void *sendbuf, void *recvbuf, int recvcounts[], + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + int rank, comm_size, i; + MPI_Aint extent, true_extent, true_lb; + int *disps; + void *tmp_recvbuf; + int mpi_errno = MPI_SUCCESS; + int total_count, dst, src; + int is_commutative; + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + extent =smpi_datatype_get_extent(datatype); + smpi_datatype_extent(datatype, &true_lb, &true_extent); + + if (smpi_op_is_commute(op)) { + is_commutative = 1; + } + + disps = (int*)xbt_malloc( comm_size * sizeof(int)); + + total_count = 0; + for (i=0; i peer) { + /* we have the higher rank: send top half, recv bottom half */ + recv_offset += size; + } + else { + /* we have the lower rank: recv top half, send bottom half */ + send_offset += size; + } + + smpi_mpi_sendrecv(outgoing_data + send_offset*true_extent, + size, datatype, peer, MPIR_REDUCE_SCATTER_TAG, + incoming_data + recv_offset*true_extent, + size, datatype, peer, MPIR_REDUCE_SCATTER_TAG, + comm, MPI_STATUS_IGNORE); + /* always perform the reduction at recv_offset, the data at send_offset + is now our peer's responsibility */ + if (rank > peer) { + /* higher ranked value so need to call op(received_data, my_data) */ + smpi_op_apply(op, + incoming_data + recv_offset*true_extent, + outgoing_data + recv_offset*true_extent, + &size, &datatype ); + /* buf0_was_inout = buf0_was_inout; */ + } + else { + /* lower ranked value so need to call op(my_data, received_data) */ + smpi_op_apply( op, + outgoing_data + recv_offset*true_extent, + incoming_data + recv_offset*true_extent, + &size, &datatype); + buf0_was_inout = !buf0_was_inout; + } + + /* the next round of send/recv needs to happen within the block (of size + "size") that we just received and reduced */ + send_offset = recv_offset; + } + + xbt_assert(size == recvcounts[rank]); + + /* copy the reduced data to the recvbuf */ + result_ptr = (char *)(buf0_was_inout ? tmp_buf0 : tmp_buf1) + recv_offset * true_extent; + mpi_errno = smpi_datatype_copy(result_ptr, size, datatype, + recvbuf, size, datatype); + if (mpi_errno) return(mpi_errno); + return MPI_SUCCESS; +} + + + +int smpi_coll_tuned_reduce_scatter_mpich_rdb(void *sendbuf, void *recvbuf, int recvcounts[], + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + int rank, comm_size, i; + MPI_Aint extent, true_extent, true_lb; + int *disps; + void *tmp_recvbuf, *tmp_results; + int mpi_errno = MPI_SUCCESS; + int dis[2], blklens[2], total_count, dst; + int mask, dst_tree_root, my_tree_root, j, k; + int received; + MPI_Datatype sendtype, recvtype; + int nprocs_completed, tmp_mask, tree_root, is_commutative; + comm_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + extent =smpi_datatype_get_extent(datatype); + smpi_datatype_extent(datatype, &true_lb, &true_extent); + + if (smpi_op_is_commute(op)) { + is_commutative = 1; + } + + disps = (int*)xbt_malloc( comm_size * sizeof(int)); + + total_count = 0; + for (i=0; i> i; + dst_tree_root <<= i; + + my_tree_root = rank >> i; + my_tree_root <<= i; + + /* At step 1, processes exchange (n-n/p) amount of + data; at step 2, (n-2n/p) amount of data; at step 3, (n-4n/p) + amount of data, and so forth. We use derived datatypes for this. + + At each step, a process does not need to send data + indexed from my_tree_root to + my_tree_root+mask-1. Similarly, a process won't receive + data indexed from dst_tree_root to dst_tree_root+mask-1. */ + + /* calculate sendtype */ + blklens[0] = blklens[1] = 0; + for (j=0; j comm_size) { + nprocs_completed = comm_size - my_tree_root - mask; + /* nprocs_completed is the number of processes in this + subtree that have all the data. Send data to others + in a tree fashion. First find root of current tree + that is being divided into two. k is the number of + least-significant bits in this process's rank that + must be zeroed out to find the rank of the root */ + j = mask; + k = 0; + while (j) { + j >>= 1; + k++; + } + k--; + + tmp_mask = mask >> 1; + while (tmp_mask) { + dst = rank ^ tmp_mask; + + tree_root = rank >> k; + tree_root <<= k; + + /* send only if this proc has data and destination + doesn't have data. at any step, multiple processes + can send if they have the data */ + if ((dst > rank) && + (rank < tree_root + nprocs_completed) + && (dst >= tree_root + nprocs_completed)) { + /* send the current result */ + smpi_mpi_send(tmp_recvbuf, 1, recvtype, + dst, MPIR_REDUCE_SCATTER_TAG, + comm); + } + /* recv only if this proc. doesn't have data and sender + has data */ + else if ((dst < rank) && + (dst < tree_root + nprocs_completed) && + (rank >= tree_root + nprocs_completed)) { + smpi_mpi_recv(tmp_recvbuf, 1, recvtype, dst, + MPIR_REDUCE_SCATTER_TAG, + comm, MPI_STATUS_IGNORE); + received = 1; + } + tmp_mask >>= 1; + k--; + } + } + + /* The following reduction is done here instead of after + the MPIC_Sendrecv_ft or MPIC_Recv_ft above. This is + because to do it above, in the noncommutative + case, we would need an extra temp buffer so as not to + overwrite temp_recvbuf, because temp_recvbuf may have + to be communicated to other processes in the + non-power-of-two case. To avoid that extra allocation, + we do the reduce here. */ + if (received) { + if (is_commutative || (dst_tree_root < my_tree_root)) { + { + smpi_op_apply(op, + tmp_recvbuf, tmp_results, &blklens[0], + &datatype); + smpi_op_apply(op, + ((char *)tmp_recvbuf + dis[1]*extent), + ((char *)tmp_results + dis[1]*extent), + &blklens[1], &datatype); + } + } + else { + { + smpi_op_apply(op, + tmp_results, tmp_recvbuf, &blklens[0], + &datatype); + smpi_op_apply(op, + ((char *)tmp_results + dis[1]*extent), + ((char *)tmp_recvbuf + dis[1]*extent), + &blklens[1], &datatype); + } + /* copy result back into tmp_results */ + mpi_errno = smpi_datatype_copy(tmp_recvbuf, 1, recvtype, + tmp_results, 1, recvtype); + if (mpi_errno) return(mpi_errno); + } + } + + //smpi_datatype_free(&sendtype); + //smpi_datatype_free(&recvtype); + + mask <<= 1; + i++; + } + + /* now copy final results from tmp_results to recvbuf */ + mpi_errno = smpi_datatype_copy(((char *)tmp_results+disps[rank]*extent), + recvcounts[rank], datatype, recvbuf, + recvcounts[rank], datatype); + if (mpi_errno) return(mpi_errno); + + return MPI_SUCCESS; + } + + diff --git a/src/smpi/colls/reduce_scatter-ompi.c b/src/smpi/colls/reduce_scatter-ompi.c new file mode 100644 index 0000000000..e10be9815f --- /dev/null +++ b/src/smpi/colls/reduce_scatter-ompi.c @@ -0,0 +1,515 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2012 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) 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2009 University of Houston. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "colls_private.h" +#include "coll_tuned_topo.h" + +#define MCA_COLL_BASE_TAG_REDUCE_SCATTER 222 +/* + * Recursive-halving function is (*mostly*) copied from the BASIC coll module. + * I have removed the part which handles "large" message sizes + * (non-overlapping version of reduce_Scatter). + */ + +/* copied function (with appropriate renaming) starts here */ + +/* + * reduce_scatter_ompi_basic_recursivehalving + * + * Function: - reduce scatter implementation using recursive-halving + * algorithm + * Accepts: - same as MPI_Reduce_scatter() + * Returns: - MPI_SUCCESS or error code + * Limitation: - Works only for commutative operations. + */ +int +smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(void *sbuf, + void *rbuf, + int *rcounts, + MPI_Datatype dtype, + MPI_Op op, + MPI_Comm comm + ) +{ + int i, rank, size, count, err = MPI_SUCCESS; + int tmp_size=1, remain = 0, tmp_rank, *disps = NULL; + ptrdiff_t true_lb, true_extent, lb, extent, buf_size; + char *recv_buf = NULL, *recv_buf_free = NULL; + char *result_buf = NULL, *result_buf_free = NULL; + + /* Initialize */ + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + + XBT_DEBUG("coll:tuned:reduce_scatter_ompi_basic_recursivehalving, rank %d", rank); + + /* Find displacements and the like */ + disps = (int*) xbt_malloc(sizeof(int) * size); + if (NULL == disps) return MPI_ERR_OTHER; + + disps[0] = 0; + for (i = 0; i < (size - 1); ++i) { + disps[i + 1] = disps[i] + rcounts[i]; + } + count = disps[size - 1] + rcounts[size - 1]; + + /* short cut the trivial case */ + if (0 == count) { + xbt_free(disps); + return MPI_SUCCESS; + } + + /* get datatype information */ + smpi_datatype_extent(dtype, &lb, &extent); + smpi_datatype_extent(dtype, &true_lb, &true_extent); + buf_size = true_extent + (ptrdiff_t)(count - 1) * extent; + + /* Handle MPI_IN_PLACE */ + if (MPI_IN_PLACE == sbuf) { + sbuf = rbuf; + } + + /* Allocate temporary receive buffer. */ + recv_buf_free = (char*) xbt_malloc(buf_size); + recv_buf = recv_buf_free - lb; + if (NULL == recv_buf_free) { + err = MPI_ERR_OTHER; + goto cleanup; + } + + /* allocate temporary buffer for results */ + result_buf_free = (char*) xbt_malloc(buf_size); + result_buf = result_buf_free - lb; + + /* copy local buffer into the temporary results */ + err =smpi_datatype_copy(sbuf, count, dtype, result_buf, count, dtype); + if (MPI_SUCCESS != err) goto cleanup; + + /* figure out power of two mapping: grow until larger than + comm size, then go back one, to get the largest power of + two less than comm size */ + while (tmp_size <= size) tmp_size <<= 1; + tmp_size >>= 1; + remain = size - tmp_size; + + /* If comm size is not a power of two, have the first "remain" + procs with an even rank send to rank + 1, leaving a power of + two procs to do the rest of the algorithm */ + if (rank < 2 * remain) { + if ((rank & 1) == 0) { + smpi_mpi_send(result_buf, count, dtype, rank + 1, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, + comm); + /* we don't participate from here on out */ + tmp_rank = -1; + } else { + smpi_mpi_recv(recv_buf, count, dtype, rank - 1, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, + comm, MPI_STATUS_IGNORE); + + /* integrate their results into our temp results */ + smpi_op_apply(op, recv_buf, result_buf, &count, &dtype); + + /* adjust rank to be the bottom "remain" ranks */ + tmp_rank = rank / 2; + } + } else { + /* just need to adjust rank to show that the bottom "even + remain" ranks dropped out */ + tmp_rank = rank - remain; + } + + /* For ranks not kicked out by the above code, perform the + recursive halving */ + if (tmp_rank >= 0) { + int *tmp_disps = NULL, *tmp_rcounts = NULL; + int mask, send_index, recv_index, last_index; + + /* recalculate disps and rcounts to account for the + special "remainder" processes that are no longer doing + anything */ + tmp_rcounts = (int*) xbt_malloc(tmp_size * sizeof(int)); + if (NULL == tmp_rcounts) { + err = MPI_ERR_OTHER; + goto cleanup; + } + tmp_disps = (int*) xbt_malloc(tmp_size * sizeof(int)); + if (NULL == tmp_disps) { + xbt_free(tmp_rcounts); + err = MPI_ERR_OTHER; + goto cleanup; + } + + for (i = 0 ; i < tmp_size ; ++i) { + if (i < remain) { + /* need to include old neighbor as well */ + tmp_rcounts[i] = rcounts[i * 2 + 1] + rcounts[i * 2]; + } else { + tmp_rcounts[i] = rcounts[i + remain]; + } + } + + tmp_disps[0] = 0; + for (i = 0; i < tmp_size - 1; ++i) { + tmp_disps[i + 1] = tmp_disps[i] + tmp_rcounts[i]; + } + + /* do the recursive halving communication. Don't use the + dimension information on the communicator because I + think the information is invalidated by our "shrinking" + of the communicator */ + mask = tmp_size >> 1; + send_index = recv_index = 0; + last_index = tmp_size; + while (mask > 0) { + int tmp_peer, peer, send_count, recv_count; + MPI_Request request; + + tmp_peer = tmp_rank ^ mask; + peer = (tmp_peer < remain) ? tmp_peer * 2 + 1 : tmp_peer + remain; + + /* figure out if we're sending, receiving, or both */ + send_count = recv_count = 0; + if (tmp_rank < tmp_peer) { + send_index = recv_index + mask; + for (i = send_index ; i < last_index ; ++i) { + send_count += tmp_rcounts[i]; + } + for (i = recv_index ; i < send_index ; ++i) { + recv_count += tmp_rcounts[i]; + } + } else { + recv_index = send_index + mask; + for (i = send_index ; i < recv_index ; ++i) { + send_count += tmp_rcounts[i]; + } + for (i = recv_index ; i < last_index ; ++i) { + recv_count += tmp_rcounts[i]; + } + } + + /* actual data transfer. Send from result_buf, + receive into recv_buf */ + if (send_count > 0 && recv_count != 0) { + request=smpi_mpi_irecv(recv_buf + (ptrdiff_t)tmp_disps[recv_index] * extent, + recv_count, dtype, peer, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, + comm); + if (MPI_SUCCESS != err) { + xbt_free(tmp_rcounts); + xbt_free(tmp_disps); + goto cleanup; + } + } + if (recv_count > 0 && send_count != 0) { + smpi_mpi_send(result_buf + (ptrdiff_t)tmp_disps[send_index] * extent, + send_count, dtype, peer, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, + comm); + if (MPI_SUCCESS != err) { + xbt_free(tmp_rcounts); + xbt_free(tmp_disps); + goto cleanup; + } + } + if (send_count > 0 && recv_count != 0) { + smpi_mpi_wait(&request, MPI_STATUS_IGNORE); + } + + /* if we received something on this step, push it into + the results buffer */ + if (recv_count > 0) { + smpi_op_apply(op, + recv_buf + (ptrdiff_t)tmp_disps[recv_index] * extent, + result_buf + (ptrdiff_t)tmp_disps[recv_index] * extent, + &recv_count, &dtype); + } + + /* update for next iteration */ + send_index = recv_index; + last_index = recv_index + mask; + mask >>= 1; + } + + /* copy local results from results buffer into real receive buffer */ + if (0 != rcounts[rank]) { + err = smpi_datatype_copy(result_buf + disps[rank] * extent, + rcounts[rank], dtype, + rbuf, rcounts[rank], dtype); + if (MPI_SUCCESS != err) { + xbt_free(tmp_rcounts); + xbt_free(tmp_disps); + goto cleanup; + } + } + + xbt_free(tmp_rcounts); + xbt_free(tmp_disps); + } + + /* Now fix up the non-power of two case, by having the odd + procs send the even procs the proper results */ + if (rank < (2 * remain)) { + if ((rank & 1) == 0) { + if (rcounts[rank]) { + smpi_mpi_recv(rbuf, rcounts[rank], dtype, rank + 1, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, + comm, MPI_STATUS_IGNORE); + } + } else { + if (rcounts[rank - 1]) { + smpi_mpi_send(result_buf + disps[rank - 1] * extent, + rcounts[rank - 1], dtype, rank - 1, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, + comm); + } + } + } + + cleanup: + if (NULL != disps) xbt_free(disps); + if (NULL != recv_buf_free) xbt_free(recv_buf_free); + if (NULL != result_buf_free) xbt_free(result_buf_free); + + return err; +} + +/* copied function (with appropriate renaming) ends here */ + + +/* + * smpi_coll_tuned_reduce_scatter_ompi_ring + * + * Function: Ring algorithm for reduce_scatter operation + * Accepts: Same as MPI_Reduce_scatter() + * Returns: MPI_SUCCESS or error code + * + * Description: Implements ring algorithm for reduce_scatter: + * the block sizes defined in rcounts are exchanged and + 8 updated until they reach proper destination. + * Algorithm requires 2 * max(rcounts) extra buffering + * + * Limitations: The algorithm DOES NOT preserve order of operations so it + * can be used only for commutative operations. + * Example on 5 nodes: + * Initial state + * # 0 1 2 3 4 + * [00] [10] -> [20] [30] [40] + * [01] [11] [21] -> [31] [41] + * [02] [12] [22] [32] -> [42] + * -> [03] [13] [23] [33] [43] --> .. + * [04] -> [14] [24] [34] [44] + * + * COMPUTATION PHASE + * Step 0: rank r sends block (r-1) to rank (r+1) and + * receives block (r+1) from rank (r-1) [with wraparound]. + * # 0 1 2 3 4 + * [00] [10] [10+20] -> [30] [40] + * [01] [11] [21] [21+31] -> [41] + * -> [02] [12] [22] [32] [32+42] -->.. + * [43+03] -> [13] [23] [33] [43] + * [04] [04+14] -> [24] [34] [44] + * + * Step 1: + * # 0 1 2 3 4 + * [00] [10] [10+20] [10+20+30] -> [40] + * -> [01] [11] [21] [21+31] [21+31+41] -> + * [32+42+02] -> [12] [22] [32] [32+42] + * [03] [43+03+13] -> [23] [33] [43] + * [04] [04+14] [04+14+24] -> [34] [44] + * + * Step 2: + * # 0 1 2 3 4 + * -> [00] [10] [10+20] [10+20+30] [10+20+30+40] -> + * [21+31+41+01]-> [11] [21] [21+31] [21+31+41] + * [32+42+02] [32+42+02+12]-> [22] [32] [32+42] + * [03] [43+03+13] [43+03+13+23]-> [33] [43] + * [04] [04+14] [04+14+24] [04+14+24+34] -> [44] + * + * Step 3: + * # 0 1 2 3 4 + * [10+20+30+40+00] [10] [10+20] [10+20+30] [10+20+30+40] + * [21+31+41+01] [21+31+41+01+11] [21] [21+31] [21+31+41] + * [32+42+02] [32+42+02+12] [32+42+02+12+22] [32] [32+42] + * [03] [43+03+13] [43+03+13+23] [43+03+13+23+33] [43] + * [04] [04+14] [04+14+24] [04+14+24+34] [04+14+24+34+44] + * DONE :) + * + */ +int +smpi_coll_tuned_reduce_scatter_ompi_ring(void *sbuf, void *rbuf, int *rcounts, + MPI_Datatype dtype, + MPI_Op op, + MPI_Comm comm + ) +{ + int ret, line, rank, size, i, k, recv_from, send_to, total_count, max_block_count; + int inbi, *displs = NULL; + char *tmpsend = NULL, *tmprecv = NULL, *accumbuf = NULL, *accumbuf_free = NULL; + char *inbuf_free[2] = {NULL, NULL}, *inbuf[2] = {NULL, NULL}; + ptrdiff_t true_lb, true_extent, lb, extent, max_real_segsize; + MPI_Request reqs[2] = {NULL, NULL}; + + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + XBT_DEBUG( "coll:tuned:reduce_scatter_ompi_ring rank %d, size %d", + rank, size); + + /* Determine the maximum number of elements per node, + corresponding block size, and displacements array. + */ + displs = (int*) xbt_malloc(size * sizeof(int)); + if (NULL == displs) { ret = -1; line = __LINE__; goto error_hndl; } + displs[0] = 0; + total_count = rcounts[0]; + max_block_count = rcounts[0]; + for (i = 1; i < size; i++) { + displs[i] = total_count; + total_count += rcounts[i]; + if (max_block_count < rcounts[i]) max_block_count = rcounts[i]; + } + + /* Special case for size == 1 */ + if (1 == size) { + if (MPI_IN_PLACE != sbuf) { + ret = smpi_datatype_copy((char*)sbuf, total_count, dtype, (char*)rbuf, total_count, dtype); + if (ret < 0) { line = __LINE__; goto error_hndl; } + } + xbt_free(displs); + return MPI_SUCCESS; + } + + /* Allocate and initialize temporary buffers, we need: + - a temporary buffer to perform reduction (size total_count) since + rbuf can be of rcounts[rank] size. + - up to two temporary buffers used for communication/computation overlap. + */ + smpi_datatype_extent(dtype, &lb, &extent); + smpi_datatype_extent(dtype, &true_lb, &true_extent); + + max_real_segsize = true_extent + (ptrdiff_t)(max_block_count - 1) * extent; + + accumbuf_free = (char*)xbt_malloc(true_extent + (ptrdiff_t)(total_count - 1) * extent); + if (NULL == accumbuf_free) { ret = -1; line = __LINE__; goto error_hndl; } + accumbuf = accumbuf_free - lb; + + inbuf_free[0] = (char*)xbt_malloc(max_real_segsize); + if (NULL == inbuf_free[0]) { ret = -1; line = __LINE__; goto error_hndl; } + inbuf[0] = inbuf_free[0] - lb; + if (size > 2) { + inbuf_free[1] = (char*)xbt_malloc(max_real_segsize); + if (NULL == inbuf_free[1]) { ret = -1; line = __LINE__; goto error_hndl; } + inbuf[1] = inbuf_free[1] - lb; + } + + /* Handle MPI_IN_PLACE for size > 1 */ + if (MPI_IN_PLACE == sbuf) { + sbuf = rbuf; + } + + ret = smpi_datatype_copy((char*)sbuf, total_count, dtype, accumbuf, total_count, dtype); + if (ret < 0) { line = __LINE__; goto error_hndl; } + + /* Computation loop */ + + /* + For each of the remote nodes: + - post irecv for block (r-2) from (r-1) with wrap around + - send block (r-1) to (r+1) + - in loop for every step k = 2 .. n + - post irecv for block (r - 1 + n - k) % n + - wait on block (r + n - k) % n to arrive + - compute on block (r + n - k ) % n + - send block (r + n - k) % n + - wait on block (r) + - compute on block (r) + - copy block (r) to rbuf + Note that we must be careful when computing the begining of buffers and + for send operations and computation we must compute the exact block size. + */ + send_to = (rank + 1) % size; + recv_from = (rank + size - 1) % size; + + inbi = 0; + /* Initialize first receive from the neighbor on the left */ + reqs[inbi]=smpi_mpi_irecv(inbuf[inbi], max_block_count, dtype, recv_from, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, comm + ); + tmpsend = accumbuf + (ptrdiff_t)displs[recv_from] * extent; + smpi_mpi_send(tmpsend, rcounts[recv_from], dtype, send_to, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, + comm); + + for (k = 2; k < size; k++) { + const int prevblock = (rank + size - k) % size; + + inbi = inbi ^ 0x1; + + /* Post irecv for the current block */ + reqs[inbi]=smpi_mpi_irecv(inbuf[inbi], max_block_count, dtype, recv_from, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, comm + ); + + /* Wait on previous block to arrive */ + smpi_mpi_wait(&reqs[inbi ^ 0x1], MPI_STATUS_IGNORE); + + /* Apply operation on previous block: result goes to rbuf + rbuf[prevblock] = inbuf[inbi ^ 0x1] (op) rbuf[prevblock] + */ + tmprecv = accumbuf + (ptrdiff_t)displs[prevblock] * extent; + smpi_op_apply(op, inbuf[inbi ^ 0x1], tmprecv, &(rcounts[prevblock]), &dtype); + + /* send previous block to send_to */ + smpi_mpi_send(tmprecv, rcounts[prevblock], dtype, send_to, + MCA_COLL_BASE_TAG_REDUCE_SCATTER, + comm); + } + + /* Wait on the last block to arrive */ + smpi_mpi_wait(&reqs[inbi], MPI_STATUS_IGNORE); + + /* Apply operation on the last block (my block) + rbuf[rank] = inbuf[inbi] (op) rbuf[rank] */ + tmprecv = accumbuf + (ptrdiff_t)displs[rank] * extent; + smpi_op_apply(op, inbuf[inbi], tmprecv, &(rcounts[rank]), &dtype); + + /* Copy result from tmprecv to rbuf */ + ret = smpi_datatype_copy(tmprecv, rcounts[rank], dtype, (char*)rbuf, rcounts[rank], dtype); + if (ret < 0) { line = __LINE__; goto error_hndl; } + + if (NULL != displs) xbt_free(displs); + if (NULL != accumbuf_free) xbt_free(accumbuf_free); + if (NULL != inbuf_free[0]) xbt_free(inbuf_free[0]); + if (NULL != inbuf_free[1]) xbt_free(inbuf_free[1]); + + return MPI_SUCCESS; + + error_hndl: + XBT_DEBUG( "%s:%4d\tRank %d Error occurred %d\n", + __FILE__, line, rank, ret); + if (NULL != displs) xbt_free(displs); + if (NULL != accumbuf_free) xbt_free(accumbuf_free); + if (NULL != inbuf_free[0]) xbt_free(inbuf_free[0]); + if (NULL != inbuf_free[1]) xbt_free(inbuf_free[1]); + return ret; +} + diff --git a/src/smpi/colls/scatter-ompi.c b/src/smpi/colls/scatter-ompi.c new file mode 100644 index 0000000000..205d60287c --- /dev/null +++ b/src/smpi/colls/scatter-ompi.c @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2006 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$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + + +#include "colls_private.h" +#include "coll_tuned_topo.h" + +#define MCA_COLL_BASE_TAG_SCATTER 111 + +int +smpi_coll_tuned_scatter_ompi_binomial(void *sbuf, int scount, + MPI_Datatype sdtype, + void *rbuf, int rcount, + MPI_Datatype rdtype, + int root, + MPI_Comm comm + ) +{ + int line = -1; + int i; + int rank; + int vrank; + int size; + int total_send = 0; + char *ptmp = NULL; + char *tempbuf = NULL; + int err; + ompi_coll_tree_t* bmtree; + MPI_Status status; + MPI_Aint sextent, slb, strue_lb, strue_extent; + MPI_Aint rextent, rlb, rtrue_lb, rtrue_extent; + + size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + XBT_DEBUG( + "smpi_coll_tuned_scatter_ompi_binomial rank %d", rank); + + /* create the binomial tree */ + +// COLL_TUNED_UPDATE_IN_ORDER_BMTREE( comm, tuned_module, root ); + bmtree = ompi_coll_tuned_topo_build_in_order_bmtree( comm, root);//ompi_ data->cached_in_order_bmtree; + + smpi_datatype_extent(sdtype, &slb, &sextent); + smpi_datatype_extent(sdtype, &strue_lb, &strue_extent); + smpi_datatype_extent(rdtype, &rlb, &rextent); + smpi_datatype_extent(rdtype, &rtrue_lb, &rtrue_extent); + + vrank = (rank - root + size) % size; + + if (rank == root) { + if (0 == root) { + /* root on 0, just use the send buffer */ + ptmp = (char *) sbuf; + if (rbuf != MPI_IN_PLACE) { + /* local copy to rbuf */ + err = smpi_datatype_copy(sbuf, scount, sdtype, + rbuf, rcount, rdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + } + } else { + /* root is not on 0, allocate temp buffer for send */ + tempbuf = (char *) malloc(strue_extent + (scount*size - 1) * sextent); + if (NULL == tempbuf) { + err = MPI_ERR_OTHER; line = __LINE__; goto err_hndl; + } + + ptmp = tempbuf - slb; + + /* and rotate data so they will eventually in the right place */ + err = smpi_datatype_copy((char *) sbuf + sextent*root*scount, scount*(size-root), sdtype, + ptmp, scount*(size-root), sdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + + err = smpi_datatype_copy((char*)sbuf, scount*root, sdtype, + ptmp + sextent*scount*(size - root), scount*root, sdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + + if (rbuf != MPI_IN_PLACE) { + /* local copy to rbuf */ + err = smpi_datatype_copy(ptmp, scount, sdtype, + rbuf, rcount, rdtype); + if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; } + } + } + total_send = scount; + } else if (!(vrank % 2)) { + /* non-root, non-leaf nodes, allocte temp buffer for recv + * the most we need is rcount*size/2 */ + tempbuf = (char *) malloc(rtrue_extent + (rcount*size - 1) * rextent); + if (NULL == tempbuf) { + err= MPI_ERR_OTHER; line = __LINE__; goto err_hndl; + } + + ptmp = tempbuf - rlb; + + sdtype = rdtype; + scount = rcount; + sextent = rextent; + total_send = scount; + } else { + /* leaf nodes, just use rbuf */ + ptmp = (char *) rbuf; + } + + if (!(vrank % 2)) { + if (rank != root) { + /* recv from parent on non-root */ + smpi_mpi_recv(ptmp, rcount*size, rdtype, bmtree->tree_prev, + MCA_COLL_BASE_TAG_SCATTER, comm, &status); + /* local copy to rbuf */ + err = smpi_datatype_copy(ptmp, scount, sdtype, + rbuf, rcount, rdtype); + } + /* send to children on all non-leaf */ + for (i = 0; i < bmtree->tree_nextsize; i++) { + int mycount = 0, vkid; + /* figure out how much data I have to send to this child */ + vkid = (bmtree->tree_next[i] - root + size) % size; + mycount = vkid - vrank; + if (mycount > (size - vkid)) + mycount = size - vkid; + mycount *= scount; + + smpi_mpi_send(ptmp + total_send*sextent, mycount, sdtype, + bmtree->tree_next[i], + MCA_COLL_BASE_TAG_SCATTER, + comm); + + total_send += mycount; + } + + if (NULL != tempbuf) + free(tempbuf); + } else { + /* recv from parent on leaf nodes */ + smpi_mpi_recv(ptmp, rcount, rdtype, bmtree->tree_prev, + MCA_COLL_BASE_TAG_SCATTER, comm, &status); + } + + return MPI_SUCCESS; + + err_hndl: + if (NULL != tempbuf) + free(tempbuf); + + XBT_DEBUG( "%s:%4d\tError occurred %d, rank %2d", + __FILE__, line, err, rank); + return err; +} + +/* + * Linear functions are copied from the BASIC coll module + * they do not segment the message and are simple implementations + * but for some small number of nodes and/or small data sizes they + * are just as fast as tuned/tree based segmenting operations + * and as such may be selected by the decision functions + * These are copied into this module due to the way we select modules + * in V1. i.e. in V2 we will handle this differently and so will not + * have to duplicate code. + * JPG following the examples from other coll_tuned implementations. Dec06. + */ + +/* copied function (with appropriate renaming) starts here */ +/* + * scatter_intra + * + * Function: - basic scatter operation + * Accepts: - same arguments as MPI_Scatter() + * Returns: - MPI_SUCCESS or error code + */ +int +smpi_coll_tuned_scatter_ompi_basic_linear(void *sbuf, int scount, + MPI_Datatype sdtype, + void *rbuf, int rcount, + MPI_Datatype rdtype, + int root, + MPI_Comm comm + ) +{ + int i, rank, size, err; + char *ptmp; + ptrdiff_t lb, incr; + + /* Initialize */ + + rank = smpi_comm_rank(comm); + size = smpi_comm_size(comm); + + /* If not root, receive data. */ + + if (rank != root) { + smpi_mpi_recv(rbuf, rcount, rdtype, root, + MCA_COLL_BASE_TAG_SCATTER, + comm, MPI_STATUS_IGNORE); + return MPI_SUCCESS; + } + + /* I am the root, loop sending data. */ + + err = smpi_datatype_extent(sdtype, &lb, &incr); + if (MPI_SUCCESS != err) { + return MPI_ERR_OTHER; + } + + incr *= scount; + for (i = 0, ptmp = (char *) sbuf; i < size; ++i, ptmp += incr) { + + /* simple optimization */ + + if (i == rank) { + if (MPI_IN_PLACE != rbuf) { + err = + smpi_datatype_copy(ptmp, scount, sdtype, rbuf, rcount, + rdtype); + } + } else { + smpi_mpi_send(ptmp, scount, sdtype, i, + MCA_COLL_BASE_TAG_SCATTER, + comm); + } + if (MPI_SUCCESS != err) { + return err; + } + } + + /* All done */ + + return MPI_SUCCESS; +} diff --git a/src/smpi/colls/smpi_mpich_selector.c b/src/smpi/colls/smpi_mpich_selector.c new file mode 100644 index 0000000000..c81e2f2908 --- /dev/null +++ b/src/smpi/colls/smpi_mpich_selector.c @@ -0,0 +1,691 @@ +/* selector for collective algorithms based on mpich decision logic */ + +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "colls_private.h" + +/* This is the default implementation of allreduce. The algorithm is: + + Algorithm: MPI_Allreduce + + For the heterogeneous case, we call MPI_Reduce followed by MPI_Bcast + in order to meet the requirement that all processes must have the + same result. For the homogeneous case, we use the following algorithms. + + + For long messages and for builtin ops and if count >= pof2 (where + pof2 is the nearest power-of-two less than or equal to the number + of processes), we use Rabenseifner's algorithm (see + http://www.hlrs.de/mpi/myreduce.html). + This algorithm implements the allreduce in two steps: first a + reduce-scatter, followed by an allgather. A recursive-halving + algorithm (beginning with processes that are distance 1 apart) is + used for the reduce-scatter, and a recursive doubling + algorithm is used for the allgather. The non-power-of-two case is + handled by dropping to the nearest lower power-of-two: the first + few even-numbered processes send their data to their right neighbors + (rank+1), and the reduce-scatter and allgather happen among the remaining + power-of-two processes. At the end, the first few even-numbered + processes get the result from their right neighbors. + + For the power-of-two case, the cost for the reduce-scatter is + lgp.alpha + n.((p-1)/p).beta + n.((p-1)/p).gamma. The cost for the + allgather lgp.alpha + n.((p-1)/p).beta. Therefore, the + total cost is: + Cost = 2.lgp.alpha + 2.n.((p-1)/p).beta + n.((p-1)/p).gamma + + For the non-power-of-two case, + Cost = (2.floor(lgp)+2).alpha + (2.((p-1)/p) + 2).n.beta + n.(1+(p-1)/p).gamma + + + For short messages, for user-defined ops, and for count < pof2 + we use a recursive doubling algorithm (similar to the one in + MPI_Allgather). We use this algorithm in the case of user-defined ops + because in this case derived datatypes are allowed, and the user + could pass basic datatypes on one process and derived on another as + long as the type maps are the same. Breaking up derived datatypes + to do the reduce-scatter is tricky. + + Cost = lgp.alpha + n.lgp.beta + n.lgp.gamma + + Possible improvements: + + End Algorithm: MPI_Allreduce +*/ +int smpi_coll_tuned_allreduce_mpich(void *sbuf, void *rbuf, int count, + MPI_Datatype dtype, MPI_Op op, MPI_Comm comm) +{ + size_t dsize, block_dsize; + int comm_size = smpi_comm_size(comm); + const size_t large_message = 2048; //MPIR_PARAM_ALLREDUCE_SHORT_MSG_SIZE + + dsize = smpi_datatype_size(dtype); + block_dsize = dsize * count; + + + /* find nearest power-of-two less than or equal to comm_size */ + int pof2 = 1; + while (pof2 <= comm_size) pof2 <<= 1; + pof2 >>=1; + + if (block_dsize > large_message && count >= pof2 && smpi_op_is_commute(op)) { + //for long messages + return (smpi_coll_tuned_allreduce_rab_rsag (sbuf, rbuf, + count, dtype, + op, comm)); + }else { + //for short ones and count < pof2 + return (smpi_coll_tuned_allreduce_rdb (sbuf, rbuf, + count, dtype, + op, comm)); + } +} + + +/* This is the default implementation of alltoall. The algorithm is: + + Algorithm: MPI_Alltoall + + We use four algorithms for alltoall. For short messages and + (comm_size >= 8), we use the algorithm by Jehoshua Bruck et al, + IEEE TPDS, Nov. 1997. It is a store-and-forward algorithm that + takes lgp steps. Because of the extra communication, the bandwidth + requirement is (n/2).lgp.beta. + + Cost = lgp.alpha + (n/2).lgp.beta + + where n is the total amount of data a process needs to send to all + other processes. + + For medium size messages and (short messages for comm_size < 8), we + use an algorithm that posts all irecvs and isends and then does a + waitall. We scatter the order of sources and destinations among the + processes, so that all processes don't try to send/recv to/from the + same process at the same time. + + *** Modification: We post only a small number of isends and irecvs + at a time and wait on them as suggested by Tony Ladd. *** + *** See comments below about an additional modification that + we may want to consider *** + + For long messages and power-of-two number of processes, we use a + pairwise exchange algorithm, which takes p-1 steps. We + calculate the pairs by using an exclusive-or algorithm: + for (i=1; i=8 -> bruck + +// medium size messages and (short messages for comm_size < 8), we +// use an algorithm that posts all irecvs and isends and then does a +// waitall. + +// For long messages and power-of-two number of processes, we use a +// pairwise exchange algorithm + +// For a non-power-of-two number of processes, we use an +// algorithm in which, in step i, each process receives from (rank-i) +// and sends to (rank+i). + + + dsize = smpi_datatype_size(sdtype); + block_dsize = dsize * scount; + + if ((block_dsize < short_size) && (communicator_size >= 8)) { + return smpi_coll_tuned_alltoall_bruck(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + + } else if (block_dsize < medium_size) { + return smpi_coll_tuned_alltoall_simple(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + }else if (communicator_size%2){ + return smpi_coll_tuned_alltoall_ring(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } + + return smpi_coll_tuned_alltoall_pair (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); +} + +int smpi_coll_tuned_alltoallv_mpich(void *sbuf, int *scounts, int *sdisps, + MPI_Datatype sdtype, + void *rbuf, int *rcounts, int *rdisps, + MPI_Datatype rdtype, + MPI_Comm comm + ) +{ + /* For starters, just keep the original algorithm. */ + return smpi_coll_tuned_alltoallv_bruck(sbuf, scounts, sdisps, sdtype, + rbuf, rcounts, rdisps,rdtype, + comm); +} + + +int smpi_coll_tuned_barrier_mpich(MPI_Comm comm) +{ + return smpi_coll_tuned_barrier_ompi_bruck(comm); +} + +/* This is the default implementation of broadcast. The algorithm is: + + Algorithm: MPI_Bcast + + For short messages, we use a binomial tree algorithm. + Cost = lgp.alpha + n.lgp.beta + + For long messages, we do a scatter followed by an allgather. + We first scatter the buffer using a binomial tree algorithm. This costs + lgp.alpha + n.((p-1)/p).beta + If the datatype is contiguous and the communicator is homogeneous, + we treat the data as bytes and divide (scatter) it among processes + by using ceiling division. For the noncontiguous or heterogeneous + cases, we first pack the data into a temporary buffer by using + MPI_Pack, scatter it as bytes, and unpack it after the allgather. + + For the allgather, we use a recursive doubling algorithm for + medium-size messages and power-of-two number of processes. This + takes lgp steps. In each step pairs of processes exchange all the + data they have (we take care of non-power-of-two situations). This + costs approximately lgp.alpha + n.((p-1)/p).beta. (Approximately + because it may be slightly more in the non-power-of-two case, but + it's still a logarithmic algorithm.) Therefore, for long messages + Total Cost = 2.lgp.alpha + 2.n.((p-1)/p).beta + + Note that this algorithm has twice the latency as the tree algorithm + we use for short messages, but requires lower bandwidth: 2.n.beta + versus n.lgp.beta. Therefore, for long messages and when lgp > 2, + this algorithm will perform better. + + For long messages and for medium-size messages and non-power-of-two + processes, we use a ring algorithm for the allgather, which + takes p-1 steps, because it performs better than recursive doubling. + Total Cost = (lgp+p-1).alpha + 2.n.((p-1)/p).beta + + Possible improvements: + For clusters of SMPs, we may want to do something differently to + take advantage of shared memory on each node. + + End Algorithm: MPI_Bcast +*/ + + +int smpi_coll_tuned_bcast_mpich(void *buff, int count, + MPI_Datatype datatype, int root, + MPI_Comm comm + ) +{ + /* Decision function based on MX results for + messages up to 36MB and communicator sizes up to 64 nodes */ + const size_t small_message_size = 12288; + const size_t intermediate_message_size = 524288; + + int communicator_size; + //int segsize = 0; + size_t message_size, dsize; + + communicator_size = smpi_comm_size(comm); + + /* else we need data size for decision function */ + dsize = smpi_datatype_size(datatype); + message_size = dsize * (unsigned long)count; /* needed for decision */ + + /* Handle messages of small and intermediate size, and + single-element broadcasts */ + if ((message_size < small_message_size) || (communicator_size <= 8)) { + /* Binomial without segmentation */ + return smpi_coll_tuned_bcast_binomial_tree (buff, count, datatype, + root, comm); + + } else if (message_size < intermediate_message_size && !(communicator_size%2)) { + // SplittedBinary with 1KB segments + return smpi_coll_tuned_bcast_scatter_rdb_allgather(buff, count, datatype, + root, comm); + + } + //Handle large message sizes + return smpi_coll_tuned_bcast_scatter_LR_allgather (buff, count, datatype, + root, comm); + +} + + + +/* This is the default implementation of reduce. The algorithm is: + + Algorithm: MPI_Reduce + + For long messages and for builtin ops and if count >= pof2 (where + pof2 is the nearest power-of-two less than or equal to the number + of processes), we use Rabenseifner's algorithm (see + http://www.hlrs.de/organization/par/services/models/mpi/myreduce.html ). + This algorithm implements the reduce in two steps: first a + reduce-scatter, followed by a gather to the root. A + recursive-halving algorithm (beginning with processes that are + distance 1 apart) is used for the reduce-scatter, and a binomial tree + algorithm is used for the gather. The non-power-of-two case is + handled by dropping to the nearest lower power-of-two: the first + few odd-numbered processes send their data to their left neighbors + (rank-1), and the reduce-scatter happens among the remaining + power-of-two processes. If the root is one of the excluded + processes, then after the reduce-scatter, rank 0 sends its result to + the root and exits; the root now acts as rank 0 in the binomial tree + algorithm for gather. + + For the power-of-two case, the cost for the reduce-scatter is + lgp.alpha + n.((p-1)/p).beta + n.((p-1)/p).gamma. The cost for the + gather to root is lgp.alpha + n.((p-1)/p).beta. Therefore, the + total cost is: + Cost = 2.lgp.alpha + 2.n.((p-1)/p).beta + n.((p-1)/p).gamma + + For the non-power-of-two case, assuming the root is not one of the + odd-numbered processes that get excluded in the reduce-scatter, + Cost = (2.floor(lgp)+1).alpha + (2.((p-1)/p) + 1).n.beta + + n.(1+(p-1)/p).gamma + + + For short messages, user-defined ops, and count < pof2, we use a + binomial tree algorithm for both short and long messages. + + Cost = lgp.alpha + n.lgp.beta + n.lgp.gamma + + + We use the binomial tree algorithm in the case of user-defined ops + because in this case derived datatypes are allowed, and the user + could pass basic datatypes on one process and derived on another as + long as the type maps are the same. Breaking up derived datatypes + to do the reduce-scatter is tricky. + + FIXME: Per the MPI-2.1 standard this case is not possible. We + should be able to use the reduce-scatter/gather approach as long as + count >= pof2. [goodell@ 2009-01-21] + + Possible improvements: + + End Algorithm: MPI_Reduce +*/ + + +int smpi_coll_tuned_reduce_mpich( void *sendbuf, void *recvbuf, + int count, MPI_Datatype datatype, + MPI_Op op, int root, + MPI_Comm comm + ) +{ + int communicator_size=0; + //int segsize = 0; + size_t message_size, dsize; + communicator_size = smpi_comm_size(comm); + + /* need data size for decision function */ + dsize=smpi_datatype_size(datatype); + message_size = dsize * count; /* needed for decision */ + + int pof2 = 1; + while (pof2 <= communicator_size) pof2 <<= 1; + pof2 >>= 1; + + + if ((count < pof2) || (message_size < 2048) || !smpi_op_is_commute(op)) { + return smpi_coll_tuned_reduce_binomial (sendbuf, recvbuf, count, datatype, op, root, comm); + } + return smpi_coll_tuned_reduce_scatter_gather(sendbuf, recvbuf, count, datatype, op, root, comm/*, module, + segsize, max_requests*/); +} + + + +/* This is the default implementation of reduce_scatter. The algorithm is: + + Algorithm: MPI_Reduce_scatter + + If the operation is commutative, for short and medium-size + messages, we use a recursive-halving + algorithm in which the first p/2 processes send the second n/2 data + to their counterparts in the other half and receive the first n/2 + data from them. This procedure continues recursively, halving the + data communicated at each step, for a total of lgp steps. If the + number of processes is not a power-of-two, we convert it to the + nearest lower power-of-two by having the first few even-numbered + processes send their data to the neighboring odd-numbered process + at (rank+1). Those odd-numbered processes compute the result for + their left neighbor as well in the recursive halving algorithm, and + then at the end send the result back to the processes that didn't + participate. + Therefore, if p is a power-of-two, + Cost = lgp.alpha + n.((p-1)/p).beta + n.((p-1)/p).gamma + If p is not a power-of-two, + Cost = (floor(lgp)+2).alpha + n.(1+(p-1+n)/p).beta + n.(1+(p-1)/p).gamma + The above cost in the non power-of-two case is approximate because + there is some imbalance in the amount of work each process does + because some processes do the work of their neighbors as well. + + For commutative operations and very long messages we use + we use a pairwise exchange algorithm similar to + the one used in MPI_Alltoall. At step i, each process sends n/p + amount of data to (rank+i) and receives n/p amount of data from + (rank-i). + Cost = (p-1).alpha + n.((p-1)/p).beta + n.((p-1)/p).gamma + + + If the operation is not commutative, we do the following: + + We use a recursive doubling algorithm, which + takes lgp steps. At step 1, processes exchange (n-n/p) amount of + data; at step 2, (n-2n/p) amount of data; at step 3, (n-4n/p) + amount of data, and so forth. + + Cost = lgp.alpha + n.(lgp-(p-1)/p).beta + n.(lgp-(p-1)/p).gamma + + Possible improvements: + + End Algorithm: MPI_Reduce_scatter +*/ + + +int smpi_coll_tuned_reduce_scatter_mpich( void *sbuf, void *rbuf, + int *rcounts, + MPI_Datatype dtype, + MPI_Op op, + MPI_Comm comm + ) +{ + int comm_size, i; + size_t total_message_size; + + XBT_DEBUG("smpi_coll_tuned_reduce_scatter_mpich"); + + comm_size = smpi_comm_size(comm); + // We need data size for decision function + total_message_size = 0; + for (i = 0; i < comm_size; i++) { + total_message_size += rcounts[i]; + } + + if( smpi_op_is_commute(op) && total_message_size > 524288) { + return smpi_coll_tuned_reduce_scatter_mpich_pair (sbuf, rbuf, rcounts, + dtype, op, + comm); + }else if (!smpi_op_is_commute(op)) { + int is_block_regular = 1; + for (i = 0; i < (comm_size - 1); ++i) { + if (rcounts[i] != rcounts[i+1]) { + is_block_regular = 0; + break; + } + } + + /* slightly retask pof2 to mean pof2 equal or greater, not always greater as it is above */ + int pof2 = 1; + while (pof2 < comm_size) pof2 <<= 1; + + if (pof2 == comm_size && is_block_regular) { + /* noncommutative, pof2 size, and block regular */ + return smpi_coll_tuned_reduce_scatter_mpich_noncomm(sbuf, rbuf, rcounts, dtype, op, comm); + } + + return smpi_coll_tuned_reduce_scatter_mpich_rdb(sbuf, rbuf, rcounts, dtype, op, comm); + }else{ + return smpi_coll_tuned_reduce_scatter_mpich_rdb(sbuf, rbuf, rcounts, dtype, op, comm); + } +} + + +/* This is the default implementation of allgather. The algorithm is: + + Algorithm: MPI_Allgather + + For short messages and non-power-of-two no. of processes, we use + the algorithm from the Jehoshua Bruck et al IEEE TPDS Nov 97 + paper. It is a variant of the disemmination algorithm for + barrier. It takes ceiling(lg p) steps. + + Cost = lgp.alpha + n.((p-1)/p).beta + where n is total size of data gathered on each process. + + For short or medium-size messages and power-of-two no. of + processes, we use the recursive doubling algorithm. + + Cost = lgp.alpha + n.((p-1)/p).beta + + TODO: On TCP, we may want to use recursive doubling instead of the Bruck + algorithm in all cases because of the pairwise-exchange property of + recursive doubling (see Benson et al paper in Euro PVM/MPI + 2003). + + It is interesting to note that either of the above algorithms for + MPI_Allgather has the same cost as the tree algorithm for MPI_Gather! + + For long messages or medium-size messages and non-power-of-two + no. of processes, we use a ring algorithm. In the first step, each + process i sends its contribution to process i+1 and receives + the contribution from process i-1 (with wrap-around). From the + second step onwards, each process i forwards to process i+1 the + data it received from process i-1 in the previous step. This takes + a total of p-1 steps. + + Cost = (p-1).alpha + n.((p-1)/p).beta + + We use this algorithm instead of recursive doubling for long + messages because we find that this communication pattern (nearest + neighbor) performs twice as fast as recursive doubling for long + messages (on Myrinet and IBM SP). + + Possible improvements: + + End Algorithm: MPI_Allgather +*/ + +int smpi_coll_tuned_allgather_mpich(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int rcount, + MPI_Datatype rdtype, + MPI_Comm comm + ) +{ + int communicator_size, pow2_size; + size_t dsize, total_dsize; + + communicator_size = smpi_comm_size(comm); + + /* Determine complete data size */ + dsize=smpi_datatype_size(sdtype); + total_dsize = dsize * scount * communicator_size; + + for (pow2_size = 1; pow2_size < communicator_size; pow2_size <<=1); + + /* Decision as in MPICH-2 + presented in Thakur et.al. "Optimization of Collective Communication + Operations in MPICH", International Journal of High Performance Computing + Applications, Vol. 19, No. 1, 49-66 (2005) + - for power-of-two processes and small and medium size messages + (up to 512KB) use recursive doubling + - for non-power-of-two processes and small messages (80KB) use bruck, + - for everything else use ring. + */ + if ((pow2_size == communicator_size) && (total_dsize < 524288)) { + return smpi_coll_tuned_allgather_rdb(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } else if (total_dsize <= 81920) { + return smpi_coll_tuned_allgather_bruck(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } + return smpi_coll_tuned_allgather_ring(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); +} + + +/* This is the default implementation of allgatherv. The algorithm is: + + Algorithm: MPI_Allgatherv + + For short messages and non-power-of-two no. of processes, we use + the algorithm from the Jehoshua Bruck et al IEEE TPDS Nov 97 + paper. It is a variant of the disemmination algorithm for + barrier. It takes ceiling(lg p) steps. + + Cost = lgp.alpha + n.((p-1)/p).beta + where n is total size of data gathered on each process. + + For short or medium-size messages and power-of-two no. of + processes, we use the recursive doubling algorithm. + + Cost = lgp.alpha + n.((p-1)/p).beta + + TODO: On TCP, we may want to use recursive doubling instead of the Bruck + algorithm in all cases because of the pairwise-exchange property of + recursive doubling (see Benson et al paper in Euro PVM/MPI + 2003). + + For long messages or medium-size messages and non-power-of-two + no. of processes, we use a ring algorithm. In the first step, each + process i sends its contribution to process i+1 and receives + the contribution from process i-1 (with wrap-around). From the + second step onwards, each process i forwards to process i+1 the + data it received from process i-1 in the previous step. This takes + a total of p-1 steps. + + Cost = (p-1).alpha + n.((p-1)/p).beta + + Possible improvements: + + End Algorithm: MPI_Allgatherv +*/ +int smpi_coll_tuned_allgatherv_mpich(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int *rcounts, + int *rdispls, + MPI_Datatype rdtype, + MPI_Comm comm + ) +{ + int communicator_size, pow2_size; + size_t dsize, total_dsize; + + communicator_size = smpi_comm_size(comm); + + /* Determine complete data size */ + dsize=smpi_datatype_size(sdtype); + total_dsize = dsize * scount * communicator_size; + + for (pow2_size = 1; pow2_size < communicator_size; pow2_size <<=1); + + if ((pow2_size == communicator_size) && (total_dsize < 524288)) { + return smpi_coll_tuned_allgatherv_mpich_rdb(sbuf, scount, sdtype, + rbuf, rcounts, rdispls, rdtype, + comm); + } else if (total_dsize <= 81920) { + return smpi_coll_tuned_allgatherv_ompi_bruck(sbuf, scount, sdtype, + rbuf, rcounts, rdispls, rdtype, + comm); + } + return smpi_coll_tuned_allgatherv_ring(sbuf, scount, sdtype, + rbuf, rcounts, rdispls, rdtype, + comm); +} + +/* This is the default implementation of gather. The algorithm is: + + Algorithm: MPI_Gather + + We use a binomial tree algorithm for both short and long + messages. At nodes other than leaf nodes we need to allocate a + temporary buffer to store the incoming message. If the root is not + rank 0, for very small messages, we pack it into a temporary + contiguous buffer and reorder it to be placed in the right + order. For small (but not very small) messages, we use a derived + datatype to unpack the incoming data into non-contiguous buffers in + the right order. In the heterogeneous case we first pack the + buffers by using MPI_Pack and then do the gather. + + Cost = lgp.alpha + n.((p-1)/p).beta + where n is the total size of the data gathered at the root. + + Possible improvements: + + End Algorithm: MPI_Gather +*/ + +int smpi_coll_tuned_gather_mpich(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int rcount, + MPI_Datatype rdtype, + int root, + MPI_Comm comm + ) +{ + return smpi_coll_tuned_gather_ompi_binomial (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + root, comm); +} + +/* This is the default implementation of scatter. The algorithm is: + + Algorithm: MPI_Scatter + + We use a binomial tree algorithm for both short and + long messages. At nodes other than leaf nodes we need to allocate + a temporary buffer to store the incoming message. If the root is + not rank 0, we reorder the sendbuf in order of relative ranks by + copying it into a temporary buffer, so that all the sends from the + root are contiguous and in the right order. In the heterogeneous + case, we first pack the buffer by using MPI_Pack and then do the + scatter. + + Cost = lgp.alpha + n.((p-1)/p).beta + where n is the total size of the data to be scattered from the root. + + Possible improvements: + + End Algorithm: MPI_Scatter +*/ + + +int smpi_coll_tuned_scatter_mpich(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int rcount, + MPI_Datatype rdtype, + int root, MPI_Comm comm + ) +{ + return smpi_coll_tuned_scatter_ompi_binomial (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + root, comm); +} + diff --git a/src/smpi/colls/smpi_openmpi_selector.c b/src/smpi/colls/smpi_openmpi_selector.c new file mode 100644 index 0000000000..939b643577 --- /dev/null +++ b/src/smpi/colls/smpi_openmpi_selector.c @@ -0,0 +1,607 @@ +/* selector for collective algorithms based on openmpi's default coll_tuned_decision_fixed selector */ + +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "colls_private.h" + + +int smpi_coll_tuned_allreduce_ompi(void *sbuf, void *rbuf, int count, + MPI_Datatype dtype, MPI_Op op, MPI_Comm comm) +{ + size_t dsize, block_dsize; + int comm_size = smpi_comm_size(comm); + const size_t intermediate_message = 10000; + + /** + * Decision function based on MX results from the Grig cluster at UTK. + * + * Currently, linear, recursive doubling, and nonoverlapping algorithms + * can handle both commutative and non-commutative operations. + * Ring algorithm does not support non-commutative operations. + */ + dsize = smpi_datatype_size(dtype); + block_dsize = dsize * count; + + if (block_dsize < intermediate_message) { + return (smpi_coll_tuned_allreduce_rdb (sbuf, rbuf, + count, dtype, + op, comm)); + } + + if( smpi_op_is_commute(op) && (count > comm_size) ) { + const size_t segment_size = 1 << 20; /* 1 MB */ + if ((comm_size * segment_size >= block_dsize)) { + //FIXME: ok, these are not the right algorithms, try to find closer ones + // lr is a good match for allreduce_ring (difference is mainly the use of sendrecv) + return smpi_coll_tuned_allreduce_lr(sbuf, rbuf, count, dtype, + op, comm); + } else { + return (smpi_coll_tuned_allreduce_ompi_ring_segmented (sbuf, rbuf, + count, dtype, + op, comm + /*segment_size*/)); + } + } + + return (smpi_coll_tuned_allreduce_redbcast(sbuf, rbuf, count, + dtype, op, comm)); +} + + + +int smpi_coll_tuned_alltoall_ompi( void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int rcount, + MPI_Datatype rdtype, + MPI_Comm comm) +{ + int communicator_size; + size_t dsize, block_dsize; + communicator_size = smpi_comm_size(comm); + + /* Decision function based on measurement on Grig cluster at + the University of Tennessee (2GB MX) up to 64 nodes. + Has better performance for messages of intermediate sizes than the old one */ + /* determine block size */ + dsize = smpi_datatype_size(sdtype); + block_dsize = dsize * scount; + + if ((block_dsize < 200) && (communicator_size > 12)) { + return smpi_coll_tuned_alltoall_bruck(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + + } else if (block_dsize < 3000) { + return smpi_coll_tuned_alltoall_simple(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } + + return smpi_coll_tuned_alltoall_pair (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); +} + +int smpi_coll_tuned_alltoallv_ompi(void *sbuf, int *scounts, int *sdisps, + MPI_Datatype sdtype, + void *rbuf, int *rcounts, int *rdisps, + MPI_Datatype rdtype, + MPI_Comm comm + ) +{ + /* For starters, just keep the original algorithm. */ + return smpi_coll_tuned_alltoallv_pair(sbuf, scounts, sdisps, sdtype, + rbuf, rcounts, rdisps,rdtype, + comm); +} + + +int smpi_coll_tuned_barrier_ompi(MPI_Comm comm) +{ int communicator_size = smpi_comm_size(comm); + + if( 2 == communicator_size ) + return smpi_coll_tuned_barrier_ompi_two_procs(comm); +/* * Basic optimisation. If we have a power of 2 number of nodes*/ +/* * the use the recursive doubling algorithm, otherwise*/ +/* * bruck is the one we want.*/ + { + int has_one = 0; + for( ; communicator_size > 0; communicator_size >>= 1 ) { + if( communicator_size & 0x1 ) { + if( has_one ) + return smpi_coll_tuned_barrier_ompi_bruck(comm); + has_one = 1; + } + } + } + return smpi_coll_tuned_barrier_ompi_recursivedoubling(comm); +} + +int smpi_coll_tuned_bcast_ompi(void *buff, int count, + MPI_Datatype datatype, int root, + MPI_Comm comm + ) +{ + /* Decision function based on MX results for + messages up to 36MB and communicator sizes up to 64 nodes */ + const size_t small_message_size = 2048; + const size_t intermediate_message_size = 370728; + const double a_p16 = 3.2118e-6; /* [1 / byte] */ + const double b_p16 = 8.7936; + const double a_p64 = 2.3679e-6; /* [1 / byte] */ + const double b_p64 = 1.1787; + const double a_p128 = 1.6134e-6; /* [1 / byte] */ + const double b_p128 = 2.1102; + + int communicator_size; + //int segsize = 0; + size_t message_size, dsize; + + communicator_size = smpi_comm_size(comm); + + /* else we need data size for decision function */ + dsize = smpi_datatype_size(datatype); + message_size = dsize * (unsigned long)count; /* needed for decision */ + + /* Handle messages of small and intermediate size, and + single-element broadcasts */ + if ((message_size < small_message_size) || (count <= 1)) { + /* Binomial without segmentation */ + return smpi_coll_tuned_bcast_binomial_tree (buff, count, datatype, + root, comm); + + } else if (message_size < intermediate_message_size) { + // SplittedBinary with 1KB segments + return smpi_coll_tuned_bcast_ompi_split_bintree(buff, count, datatype, + root, comm); + + } + //Handle large message sizes + else if (communicator_size < (a_p128 * message_size + b_p128)) { + //Pipeline with 128KB segments + //segsize = 1024 << 7; + return smpi_coll_tuned_bcast_ompi_pipeline (buff, count, datatype, + root, comm); + + + } else if (communicator_size < 13) { + // Split Binary with 8KB segments + return smpi_coll_tuned_bcast_ompi_split_bintree(buff, count, datatype, + root, comm); + + } else if (communicator_size < (a_p64 * message_size + b_p64)) { + // Pipeline with 64KB segments + //segsize = 1024 << 6; + return smpi_coll_tuned_bcast_ompi_pipeline (buff, count, datatype, + root, comm); + + + } else if (communicator_size < (a_p16 * message_size + b_p16)) { + //Pipeline with 16KB segments + //segsize = 1024 << 4; + return smpi_coll_tuned_bcast_ompi_pipeline (buff, count, datatype, + root, comm); + + + } + /* Pipeline with 8KB segments */ + //segsize = 1024 << 3; + return smpi_coll_tuned_bcast_flattree_pipeline (buff, count, datatype, + root, comm + /*segsize*/); +#if 0 + /* this is based on gige measurements */ + + if (communicator_size < 4) { + return smpi_coll_tuned_bcast_intra_basic_linear (buff, count, datatype, root, comm, module); + } + if (communicator_size == 4) { + if (message_size < 524288) segsize = 0; + else segsize = 16384; + return smpi_coll_tuned_bcast_intra_bintree (buff, count, datatype, root, comm, module, segsize); + } + if (communicator_size <= 8 && message_size < 4096) { + return smpi_coll_tuned_bcast_intra_basic_linear (buff, count, datatype, root, comm, module); + } + if (communicator_size > 8 && message_size >= 32768 && message_size < 524288) { + segsize = 16384; + return smpi_coll_tuned_bcast_intra_bintree (buff, count, datatype, root, comm, module, segsize); + } + if (message_size >= 524288) { + segsize = 16384; + return smpi_coll_tuned_bcast_intra_pipeline (buff, count, datatype, root, comm, module, segsize); + } + segsize = 0; + /* once tested can swap this back in */ + /* return smpi_coll_tuned_bcast_intra_bmtree (buff, count, datatype, root, comm, segsize); */ + return smpi_coll_tuned_bcast_intra_bintree (buff, count, datatype, root, comm, module, segsize); +#endif /* 0 */ +} + +int smpi_coll_tuned_reduce_ompi( void *sendbuf, void *recvbuf, + int count, MPI_Datatype datatype, + MPI_Op op, int root, + MPI_Comm comm + ) +{ + int communicator_size=0; + //int segsize = 0; + size_t message_size, dsize; + const double a1 = 0.6016 / 1024.0; /* [1/B] */ + const double b1 = 1.3496; + const double a2 = 0.0410 / 1024.0; /* [1/B] */ + const double b2 = 9.7128; + const double a3 = 0.0422 / 1024.0; /* [1/B] */ + const double b3 = 1.1614; + //const double a4 = 0.0033 / 1024.0; /* [1/B] */ + //const double b4 = 1.6761; + + //const int max_requests = 0; /* no limit on # of outstanding requests */ + + communicator_size = smpi_comm_size(comm); + + /* need data size for decision function */ + dsize=smpi_datatype_size(datatype); + message_size = dsize * count; /* needed for decision */ + + /** + * If the operation is non commutative we currently have choice of linear + * or in-order binary tree algorithm. + */ + if( !smpi_op_is_commute(op) ) { + if ((communicator_size < 12) && (message_size < 2048)) { + return smpi_coll_tuned_reduce_ompi_basic_linear (sendbuf, recvbuf, count, datatype, op, root, comm/*, module*/); + } + return smpi_coll_tuned_reduce_ompi_in_order_binary (sendbuf, recvbuf, count, datatype, op, root, comm/*, module, + 0, max_requests*/); + } + + if ((communicator_size < 8) && (message_size < 512)){ + /* Linear_0K */ + return smpi_coll_tuned_reduce_ompi_basic_linear (sendbuf, recvbuf, count, datatype, op, root, comm); + } else if (((communicator_size < 8) && (message_size < 20480)) || + (message_size < 2048) || (count <= 1)) { + /* Binomial_0K */ + //segsize = 0; + return smpi_coll_tuned_reduce_ompi_binomial(sendbuf, recvbuf, count, datatype, op, root, comm/*, module, + segsize, max_requests*/); + } else if (communicator_size > (a1 * message_size + b1)) { + // Binomial_1K + //segsize = 1024; + return smpi_coll_tuned_reduce_ompi_binomial(sendbuf, recvbuf, count, datatype, op, root, comm/*, module, + segsize, max_requests*/); + } else if (communicator_size > (a2 * message_size + b2)) { + // Pipeline_1K + //segsize = 1024; + return smpi_coll_tuned_reduce_ompi_pipeline (sendbuf, recvbuf, count, datatype, op, root, comm/*, module, + segsize, max_requests*/); + } else if (communicator_size > (a3 * message_size + b3)) { + // Binary_32K + //segsize = 32*1024; + return smpi_coll_tuned_reduce_ompi_binary( sendbuf, recvbuf, count, datatype, op, root, + comm/*, module, segsize, max_requests*/); + } + /*if (communicator_size > (a4 * message_size + b4)) { + // Pipeline_32K + segsize = 32*1024; + } else { + // Pipeline_64K + segsize = 64*1024; + }*/ + return smpi_coll_tuned_reduce_ompi_pipeline (sendbuf, recvbuf, count, datatype, op, root, comm/*, module, + segsize, max_requests*/); + +#if 0 + /* for small messages use linear algorithm */ + if (message_size <= 4096) { + segsize = 0; + fanout = communicator_size - 1; + /* when linear implemented or taken from basic put here, right now using chain as a linear system */ + /* it is implemented and I shouldn't be calling a chain with a fanout bigger than MAXTREEFANOUT from topo.h! */ + return smpi_coll_tuned_reduce_intra_basic_linear (sendbuf, recvbuf, count, datatype, op, root, comm, module); + /* return smpi_coll_tuned_reduce_intra_chain (sendbuf, recvbuf, count, datatype, op, root, comm, segsize, fanout); */ + } + if (message_size < 524288) { + if (message_size <= 65536 ) { + segsize = 32768; + fanout = 8; + } else { + segsize = 1024; + fanout = communicator_size/2; + } + /* later swap this for a binary tree */ + /* fanout = 2; */ + return smpi_coll_tuned_reduce_intra_chain (sendbuf, recvbuf, count, datatype, op, root, comm, module, + segsize, fanout, max_requests); + } + segsize = 1024; + return smpi_coll_tuned_reduce_intra_pipeline (sendbuf, recvbuf, count, datatype, op, root, comm, module, + segsize, max_requests); +#endif /* 0 */ +} + +int smpi_coll_tuned_reduce_scatter_ompi( void *sbuf, void *rbuf, + int *rcounts, + MPI_Datatype dtype, + MPI_Op op, + MPI_Comm comm + ) +{ + int comm_size, i, pow2; + size_t total_message_size, dsize; + const double a = 0.0012; + const double b = 8.0; + const size_t small_message_size = 12 * 1024; + const size_t large_message_size = 256 * 1024; + int zerocounts = 0; + + XBT_DEBUG("smpi_coll_tuned_reduce_scatter_ompi"); + + comm_size = smpi_comm_size(comm); + // We need data size for decision function + dsize=smpi_datatype_size(dtype); + total_message_size = 0; + for (i = 0; i < comm_size; i++) { + total_message_size += rcounts[i]; + if (0 == rcounts[i]) { + zerocounts = 1; + } + } + + if( !smpi_op_is_commute(op) || (zerocounts)) { + smpi_mpi_reduce_scatter (sbuf, rbuf, rcounts, + dtype, op, + comm); + return MPI_SUCCESS; + } + + total_message_size *= dsize; + + // compute the nearest power of 2 + for (pow2 = 1; pow2 < comm_size; pow2 <<= 1); + + if ((total_message_size <= small_message_size) || + ((total_message_size <= large_message_size) && (pow2 == comm_size)) || + (comm_size >= a * total_message_size + b)) { + return + smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(sbuf, rbuf, rcounts, + dtype, op, + comm); + } + return smpi_coll_tuned_reduce_scatter_ompi_ring(sbuf, rbuf, rcounts, + dtype, op, + comm); + + + +} + +int smpi_coll_tuned_allgather_ompi(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int rcount, + MPI_Datatype rdtype, + MPI_Comm comm + ) +{ + int communicator_size, pow2_size; + size_t dsize, total_dsize; + + communicator_size = smpi_comm_size(comm); + + /* Special case for 2 processes */ + if (communicator_size == 2) { + return smpi_coll_tuned_allgather_pair (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm/*, module*/); + } + + /* Determine complete data size */ + dsize=smpi_datatype_size(sdtype); + total_dsize = dsize * scount * communicator_size; + + for (pow2_size = 1; pow2_size < communicator_size; pow2_size <<=1); + + /* Decision based on MX 2Gb results from Grig cluster at + The University of Tennesse, Knoxville + - if total message size is less than 50KB use either bruck or + recursive doubling for non-power of two and power of two nodes, + respectively. + - else use ring and neighbor exchange algorithms for odd and even + number of nodes, respectively. + */ + if (total_dsize < 50000) { + if (pow2_size == communicator_size) { + return smpi_coll_tuned_allgather_rdb(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } else { + return smpi_coll_tuned_allgather_bruck(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } + } else { + if (communicator_size % 2) { + return smpi_coll_tuned_allgather_ring(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } else { + return smpi_coll_tuned_allgather_ompi_neighborexchange(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } + } + +#if defined(USE_MPICH2_DECISION) + /* Decision as in MPICH-2 + presented in Thakur et.al. "Optimization of Collective Communication + Operations in MPICH", International Journal of High Performance Computing + Applications, Vol. 19, No. 1, 49-66 (2005) + - for power-of-two processes and small and medium size messages + (up to 512KB) use recursive doubling + - for non-power-of-two processes and small messages (80KB) use bruck, + - for everything else use ring. + */ + if ((pow2_size == communicator_size) && (total_dsize < 524288)) { + return smpi_coll_tuned_allgather_rdb(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } else if (total_dsize <= 81920) { + return smpi_coll_tuned_allgather_bruck(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); + } + return smpi_coll_tuned_allgather_ring(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); +#endif /* defined(USE_MPICH2_DECISION) */ +} + +int smpi_coll_tuned_allgatherv_ompi(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int *rcounts, + int *rdispls, + MPI_Datatype rdtype, + MPI_Comm comm + ) +{ + int i; + int communicator_size; + size_t dsize, total_dsize; + + communicator_size = smpi_comm_size(comm); + + /* Special case for 2 processes */ + if (communicator_size == 2) { + return smpi_coll_tuned_allgatherv_pair(sbuf, scount, sdtype, + rbuf, rcounts, rdispls, rdtype, + comm); + } + + /* Determine complete data size */ + dsize=smpi_datatype_size(sdtype); + total_dsize = 0; + for (i = 0; i < communicator_size; i++) { + total_dsize += dsize * rcounts[i]; + } + + /* Decision based on allgather decision. */ + if (total_dsize < 50000) { +/* return smpi_coll_tuned_allgatherv_intra_bruck(sbuf, scount, sdtype, + rbuf, rcounts, rdispls, rdtype, + comm, module);*/ + return smpi_coll_tuned_allgatherv_ring(sbuf, scount, sdtype, + rbuf, rcounts, rdispls, rdtype, + comm); + + } else { + if (communicator_size % 2) { + return smpi_coll_tuned_allgatherv_ring(sbuf, scount, sdtype, + rbuf, rcounts, rdispls, rdtype, + comm); + } else { + return smpi_coll_tuned_allgatherv_ompi_neighborexchange(sbuf, scount, sdtype, + rbuf, rcounts, rdispls, rdtype, + comm); + } + } +} + +int smpi_coll_tuned_gather_ompi(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int rcount, + MPI_Datatype rdtype, + int root, + MPI_Comm comm + ) +{ + //const int large_segment_size = 32768; + //const int small_segment_size = 1024; + + //const size_t large_block_size = 92160; + const size_t intermediate_block_size = 6000; + const size_t small_block_size = 1024; + + const int large_communicator_size = 60; + const int small_communicator_size = 10; + + int communicator_size, rank; + size_t dsize, block_size; + + XBT_DEBUG("smpi_coll_tuned_gather_ompi"); + + communicator_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + + // Determine block size + if (rank == root) { + dsize = smpi_datatype_size(rdtype); + block_size = dsize * rcount; + } else { + dsize = smpi_datatype_size(sdtype); + block_size = dsize * scount; + } + +/* if (block_size > large_block_size) {*/ +/* return smpi_coll_tuned_gather_ompi_linear_sync (sbuf, scount, sdtype, */ +/* rbuf, rcount, rdtype, */ +/* root, comm);*/ + +/* } else*/ if (block_size > intermediate_block_size) { + return smpi_coll_tuned_gather_ompi_linear_sync (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + root, comm); + + } else if ((communicator_size > large_communicator_size) || + ((communicator_size > small_communicator_size) && + (block_size < small_block_size))) { + return smpi_coll_tuned_gather_ompi_binomial (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + root, comm); + + } + // Otherwise, use basic linear + return smpi_coll_tuned_gather_ompi_basic_linear (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + root, comm); +} + +int smpi_coll_tuned_scatter_ompi(void *sbuf, int scount, + MPI_Datatype sdtype, + void* rbuf, int rcount, + MPI_Datatype rdtype, + int root, MPI_Comm comm + ) +{ + const size_t small_block_size = 300; + const int small_comm_size = 10; + int communicator_size, rank; + size_t dsize, block_size; + + XBT_DEBUG("smpi_coll_tuned_scatter_ompi"); + + communicator_size = smpi_comm_size(comm); + rank = smpi_comm_rank(comm); + // Determine block size + if (root == rank) { + dsize=smpi_datatype_size(sdtype); + block_size = dsize * scount; + } else { + dsize=smpi_datatype_size(rdtype); + block_size = dsize * rcount; + } + + if ((communicator_size > small_comm_size) && + (block_size < small_block_size)) { + return smpi_coll_tuned_scatter_ompi_binomial (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + root, comm); + } + return smpi_coll_tuned_scatter_ompi_basic_linear (sbuf, scount, sdtype, + rbuf, rcount, rdtype, + root, comm); +} + diff --git a/src/smpi/colls/star-reduction.c b/src/smpi/colls/star-reduction.c deleted file mode 100644 index 14281f57c1..0000000000 --- a/src/smpi/colls/star-reduction.c +++ /dev/null @@ -1,334 +0,0 @@ -#include "colls.h" - -/* - * created by Pitch Patarasuk - * Modified by Xin Yuan - * - * realize a subset of MPI predefine operators: - * MPI_LAND, MPI_BAND: C integer, Fortran integer, Byte - * MPI_LOR, MPI_BOR: C integer, Fortran integer, Byte - * MPI_LXOR, MPI_BXOR: C integer, Fortran integer, Byte - * MPI_SUM, MPI_PROD: C integer, Fortran integer, Floating point - * MPI_MIN, MPI_MAX: C integer, Fortran integer, Floating point, Byte - * - * Types not implemented: MPI_LONG_DOUBLE, MPI_LOGICAL, MPI_COMPLEX - */ - -#ifndef STAR_REDUCTION -#define STAR_REDUCTION - - -#ifdef MPICH2_REDUCTION -extern MPI_User_function * MPIR_Op_table[]; -#elif defined MVAPICH_REDUCETION -extern void *MPIR_ToPointer(); -struct MPIR_OP -{ - MPI_User_function *op; - int commute; - int permanent; -}; -#endif - -static void star_generic_reduction(MPI_Op op, void *src, void *target, int *count, MPI_Datatype *dtype){ - int i; - if ((op == MPI_BOR) || (op == MPI_LOR)) { - if ((*dtype == MPI_BYTE) || (*dtype == MPI_CHAR)) { - for (i=0;i<*count;i++) { - ((char *)target)[i] |= ((char *)src)[i]; - } - } - else if ((*dtype == MPI_INT) - || (*dtype == MPI_LONG) - || (*dtype == MPI_INT) - || (*dtype == MPI_UNSIGNED) - || (*dtype == MPI_UNSIGNED_LONG)) { - for (i=0;i<*count;i++) { - ((int *)target)[i] |= ((int *)src)[i]; - } - } - else if ((*dtype == MPI_SHORT) - || (*dtype == MPI_UNSIGNED_SHORT)) { - for (i=0;i<*count;i++) { - ((short *)target)[i] |= ((short *)src)[i]; - } - } - else { - printf("reduction operation not supported\n"); - } - } - - else if ((op == MPI_BAND) || (op == MPI_LAND)) { - if ((*dtype == MPI_BYTE) || (*dtype == MPI_CHAR)) { - for (i=0;i<*count;i++) { - ((char *)target)[i] &= ((char *)src)[i]; - } - } - else if ((*dtype == MPI_INT) - || (*dtype == MPI_LONG) - || (*dtype == MPI_UNSIGNED) - || (*dtype == MPI_UNSIGNED_LONG)) { - for (i=0;i<*count;i++) { - ((int *)target)[i] &= ((int *)src)[i]; - } - } - else if ((*dtype == MPI_SHORT) - || (*dtype == MPI_UNSIGNED_SHORT)) { - for (i=0;i<*count;i++) { - ((short *)target)[i] &= ((short *)src)[i]; - } - } - else { - printf("reduction operation not supported\n"); - } - } - - - else if ((op == MPI_BXOR) || (op == MPI_LXOR)) { - if ((*dtype == MPI_BYTE) || (*dtype == MPI_CHAR)) { - for (i=0;i<*count;i++) { - ((char *)target)[i] ^= ((char *)src)[i]; - } - } - else if ((*dtype == MPI_INT) - || (*dtype == MPI_LONG) - || (*dtype == MPI_UNSIGNED) - || (*dtype == MPI_UNSIGNED_LONG)) { - for (i=0;i<*count;i++) { - ((int *)target)[i] ^= ((int *)src)[i]; - } - } - else if ((*dtype == MPI_SHORT) - || (*dtype == MPI_UNSIGNED_SHORT)) { - for (i=0;i<*count;i++) { - ((short *)target)[i] ^= ((short *)src)[i]; - } - } - else { - printf("reduction operation not supported\n"); - } - } - - else if (op == MPI_MAX) { - if ((*dtype == MPI_INT) - || (*dtype == MPI_LONG)) { - for (i=0;i<*count;i++) { - if (((int *)src)[i] > ((int *)target)[i]) { - ((int *)target)[i] = ((int *)src)[i]; - } - } - } - else if ((*dtype == MPI_UNSIGNED) - || (*dtype == MPI_UNSIGNED_LONG)) { - for (i=0;i<*count;i++) { - if (((unsigned int *)src)[i] > ((unsigned int *)target)[i]) { - ((unsigned int *)target)[i] = ((unsigned int *)src)[i]; - } - } - } - else if (*dtype == MPI_SHORT) { - for (i=0;i<*count;i++) { - if (((short *)src)[i] > ((short *)target)[i]) { - ((short *)target)[i] = ((short *)src)[i]; - } - } - } - else if (*dtype == MPI_UNSIGNED_SHORT) { - for (i=0;i<*count;i++) { - if (((unsigned short *)src)[i] > ((unsigned short *)target)[i]) { - ((unsigned short *)target)[i] = ((unsigned short *)src)[i]; - } - } - } - - else if (*dtype == MPI_DOUBLE) { - for (i=0;i<*count;i++) { - if (((double *)src)[i] > ((double *)target)[i]) { - ((double *)target)[i] = ((double *)src)[i]; - } - } - } - else if (*dtype == MPI_FLOAT) { - for (i=0;i<*count;i++) { - if (((float *)src)[i] > ((float *)target)[i]) { - ((float *)target)[i] = ((float *)src)[i]; - } - } - } - else if ((*dtype == MPI_CHAR) || (*dtype == MPI_BYTE)) { - for (i=0;i<*count;i++) { - if (((char *)src)[i] > ((char *)target)[i]) { - ((char *)target)[i] = ((char *)src)[i]; - } - } - } - else { - printf("reduction operation not supported\n"); - } - } - - - - else if (op == MPI_MIN) { - if ((*dtype == MPI_INT) - || (*dtype == MPI_LONG)) { - for (i=0;i<*count;i++) { - if (((int *)src)[i] < ((int *)target)[i]) { - ((int *)target)[i] = ((int *)src)[i]; - } - } - } - else if ((*dtype == MPI_UNSIGNED) - || (*dtype == MPI_UNSIGNED_LONG)) { - for (i=0;i<*count;i++) { - if (((unsigned int *)src)[i] < ((unsigned int *)target)[i]) { - ((unsigned int *)target)[i] = ((unsigned int *)src)[i]; - } - } - } - else if (*dtype == MPI_SHORT) { - for (i=0;i<*count;i++) { - if (((short *)src)[i] < ((short *)target)[i]) { - ((short *)target)[i] = ((short *)src)[i]; - } - } - } - else if (*dtype == MPI_UNSIGNED_SHORT) { - for (i=0;i<*count;i++) { - if (((unsigned short *)src)[i] < ((unsigned short *)target)[i]) { - ((unsigned short *)target)[i] = ((unsigned short *)src)[i]; - } - } - } - - else if (*dtype == MPI_DOUBLE) { - for (i=0;i<*count;i++) { - if (((double *)src)[i] < ((double *)target)[i]) { - ((double *)target)[i] = ((double *)src)[i]; - } - } - } - else if (*dtype == MPI_FLOAT) { - for (i=0;i<*count;i++) { - if (((float *)src)[i] < ((float *)target)[i]) { - ((float *)target)[i] = ((float *)src)[i]; - } - } - } - else if ((*dtype == MPI_CHAR) || (*dtype == MPI_BYTE)) { - for (i=0;i<*count;i++) { - if (((char *)src)[i] < ((char *)target)[i]) { - ((char *)target)[i] = ((char *)src)[i]; - } - } - } - else { - printf("reduction operation not supported\n"); - } - } - - - else if (op == MPI_SUM) { - if ((*dtype == MPI_INT) - || (*dtype == MPI_LONG)) { - for (i=0;i<*count;i++) { - ((int *)target)[i] += ((int *)src)[i]; - } - } - else if ((*dtype == MPI_UNSIGNED) - || (*dtype == MPI_UNSIGNED_LONG)) { - for (i=0;i<*count;i++) { - ((unsigned int *)target)[i] += ((unsigned int *)src)[i]; - } - } - else if (*dtype == MPI_SHORT) { - for (i=0;i<*count;i++) { - ((short *)target)[i] += ((short *)src)[i]; - } - } - else if (*dtype == MPI_UNSIGNED_SHORT) { - for (i=0;i<*count;i++) { - ((unsigned short *)target)[i] += ((unsigned short *)src)[i]; - } - } - - else if (*dtype == MPI_DOUBLE) { - for (i=0;i<*count;i++) { - ((double *)target)[i] += ((double *)src)[i]; - } - } - else if (*dtype == MPI_FLOAT) { - for (i=0;i<*count;i++) { - ((float *)target)[i] += ((float *)src)[i]; - } - } - else { - printf("reduction operation not supported\n"); - } - } - - else if (op == MPI_PROD) { - if ((*dtype == MPI_INT) - || (*dtype == MPI_LONG)) { - for (i=0;i<*count;i++) { - ((int *)target)[i] *= ((int *)src)[i]; - } - } - else if ((*dtype == MPI_UNSIGNED) - || (*dtype == MPI_UNSIGNED_LONG)) { - for (i=0;i<*count;i++) { - ((unsigned int *)target)[i] *= ((unsigned int *)src)[i]; - } - } - else if (*dtype == MPI_SHORT) { - for (i=0;i<*count;i++) { - ((short *)target)[i] *= ((short *)src)[i]; - } - } - else if (*dtype == MPI_UNSIGNED_SHORT) { - for (i=0;i<*count;i++) { - ((unsigned short *)target)[i] *= ((unsigned short *)src)[i]; - } - } - - else if (*dtype == MPI_DOUBLE) { - for (i=0;i<*count;i++) { - ((double *)target)[i] *= ((double *)src)[i]; - } - } - else if (*dtype == MPI_FLOAT) { - for (i=0;i<*count;i++) { - ((float *)target)[i] *= ((float *)src)[i]; - } - } - else { - printf("reduction operation not supported\n"); - } - } - - else { - printf("reduction operation not supported\n"); - } -} - -void star_reduction(MPI_Op op, void *src, void *target, int *count, MPI_Datatype *dtype){ - -#ifdef MPICH2_REDUCTION -MPI_User_function * uop = MPIR_Op_table[op % 16 - 1]; - return (*uop) (src,target,count,dtype); -#elif defined MVAPICH_REDUCTION -MPI_User_function *uop; -struct MPIR_OP *op_ptr; -op_ptr = MPIR_ToPointer(op); -uop = op_ptr->op; - return (*uop) (src,target,count,dtype); -#else - return star_generic_reduction(op,src,target,count,dtype); -#endif - - - -} - - -#endif diff --git a/src/smpi/private.h b/src/smpi/private.h index 3c4e936aca..156337f827 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -114,7 +114,7 @@ void smpi_datatype_use(MPI_Datatype type); void smpi_datatype_unuse(MPI_Datatype type); int smpi_datatype_contiguous(int count, MPI_Datatype old_type, - MPI_Datatype* new_type); + MPI_Datatype* new_type, MPI_Aint lb); int smpi_datatype_vector(int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* new_type); @@ -135,6 +135,7 @@ void smpi_datatype_commit(MPI_Datatype* datatype); void smpi_empty_status(MPI_Status * status); MPI_Op smpi_op_new(MPI_User_function * function, int commute); +int smpi_op_is_commute(MPI_Op op); void smpi_op_destroy(MPI_Op op); void smpi_op_apply(MPI_Op op, void *invec, void *inoutvec, int *len, MPI_Datatype * datatype); @@ -210,6 +211,8 @@ void smpi_mpi_barrier(MPI_Comm comm); void smpi_mpi_gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); +void smpi_mpi_reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm); void smpi_mpi_gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm); @@ -239,7 +242,7 @@ void nary_tree_bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm, int arity); void nary_tree_barrier(MPI_Comm comm, int arity); -int smpi_coll_tuned_alltoall_ompi(void *sendbuf, int sendcount, +int smpi_coll_tuned_alltoall_ompi2(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm); @@ -252,10 +255,6 @@ int smpi_coll_tuned_alltoall_basic_linear(void *sendbuf, int sendcount, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm); -int smpi_coll_tuned_alltoall_pairwise(void *sendbuf, int sendcount, - MPI_Datatype sendtype, void *recvbuf, - int recvcount, MPI_Datatype recvtype, - MPI_Comm comm); int smpi_coll_basic_alltoallv(void *sendbuf, int *sendcounts, int *senddisps, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 837f1e3811..067cd82af0 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -197,7 +197,7 @@ static MPI_Request build_request(void *buf, int count, if(datatype->has_subtype == 1){ // This part handles the problem of non-contiguous memory old_buf = buf; - buf = xbt_malloc(count*smpi_datatype_size(datatype)); + buf = count==0 ? NULL : xbt_malloc(count*smpi_datatype_size(datatype)); if (flags & SEND) { subtype->serialize(old_buf, buf, count, datatype->substruct); } @@ -284,7 +284,7 @@ MPI_Request smpi_mpi_send_init(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + build_request(buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, comm, PERSISTENT | SEND); request->refcount++; return request; @@ -294,7 +294,7 @@ MPI_Request smpi_mpi_ssend_init(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + build_request(buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, comm, PERSISTENT | SSEND | SEND); request->refcount++; return request; @@ -304,7 +304,7 @@ MPI_Request smpi_mpi_recv_init(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, src, smpi_comm_rank(comm), tag, + build_request(buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag, comm, PERSISTENT | RECV); request->refcount++; return request; @@ -337,7 +337,7 @@ void smpi_mpi_start(MPI_Request request) } else { - int receiver = smpi_group_index(smpi_comm_group(request->comm), request->dst); + int receiver = request->dst;//smpi_group_index(smpi_comm_group(request->comm), request->dst); #ifdef HAVE_TRACING int rank = smpi_process_index(); @@ -362,13 +362,14 @@ void smpi_mpi_start(MPI_Request request) request->refcount++; if(request->old_type->has_subtype == 0){ oldbuf = request->buf; - if (oldbuf){ + if (oldbuf && request->size!=0){ request->buf = xbt_malloc(request->size); memcpy(request->buf,oldbuf,request->size); } } XBT_DEBUG("Send request %p is detached; buf %p copied into %p",request,oldbuf,request->buf); } + // we make a copy here, as the size is modified by simix, and we may reuse the request in another receive later request->real_size=request->size; smpi_datatype_use(request->old_type); @@ -422,8 +423,12 @@ void smpi_mpi_request_free(MPI_Request * request) if((*request)->refcount<0) xbt_die("wrong refcount"); if((*request)->refcount==0){ + print_request("Destroying", (*request)); xbt_free(*request); *request = MPI_REQUEST_NULL; + }else{ + print_request("Decrementing", (*request)); + } }else{ xbt_die("freeing an already free request"); @@ -434,7 +439,7 @@ MPI_Request smpi_isend_init(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + build_request(buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, comm, NON_PERSISTENT | SEND); return request; @@ -444,7 +449,7 @@ MPI_Request smpi_mpi_isend(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + build_request(buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, comm, NON_PERSISTENT | ISEND | SEND); smpi_mpi_start(request); @@ -455,7 +460,7 @@ MPI_Request smpi_mpi_issend(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + build_request(buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, comm, NON_PERSISTENT | ISEND | SSEND | SEND); smpi_mpi_start(request); return request; @@ -467,7 +472,7 @@ MPI_Request smpi_irecv_init(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, src, smpi_comm_rank(comm), tag, + build_request(buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag, comm, NON_PERSISTENT | RECV); return request; } @@ -476,7 +481,7 @@ MPI_Request smpi_mpi_irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, src, smpi_comm_rank(comm), tag, + build_request(buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag, comm, NON_PERSISTENT | RECV); smpi_mpi_start(request); @@ -497,9 +502,8 @@ void smpi_mpi_send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { MPI_Request request = - build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + build_request(buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, comm, NON_PERSISTENT | SEND); - smpi_mpi_start(request); smpi_mpi_wait(&request, MPI_STATUS_IGNORE); @@ -508,7 +512,11 @@ void smpi_mpi_send(void *buf, int count, MPI_Datatype datatype, int dst, void smpi_mpi_ssend(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { - MPI_Request request = smpi_mpi_issend(buf, count, datatype, dst, tag, comm); + MPI_Request request = + build_request(buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, + comm, NON_PERSISTENT | SSEND | SEND); + + smpi_mpi_start(request); smpi_mpi_wait(&request, MPI_STATUS_IGNORE); } @@ -545,7 +553,8 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) if(!(req->detached && req->flags & SEND)){ if(status != MPI_STATUS_IGNORE) { - status->MPI_SOURCE = req->src == MPI_ANY_SOURCE ? req->real_src : req->src; + int src = req->src == MPI_ANY_SOURCE ? req->real_src : req->src; + status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(req->comm), src); status->MPI_TAG = req->tag == MPI_ANY_TAG ? req->real_tag : req->tag; status->MPI_ERROR = req->truncated ? MPI_ERR_TRUNCATE : MPI_SUCCESS; // this handles the case were size in receive differs from size in send @@ -574,7 +583,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) if (TRACE_smpi_view_internals()) { if(req->flags & RECV){ int rank = smpi_process_index(); - int src_traced = smpi_group_index(smpi_comm_group(req->comm), req->src); + int src_traced = smpi_group_index(smpi_comm_group(req->comm), req->src == MPI_ANY_SOURCE ? req->real_src : req->src); TRACE_smpi_recv(rank, src_traced, rank); } } @@ -600,8 +609,8 @@ int smpi_mpi_test(MPI_Request * request, MPI_Status * status) { else flag = simcall_comm_test((*request)->action); if(flag) { - (*request)->refcount++; finish_wait(request, status); + request=MPI_REQUEST_NULL; }else{ smpi_empty_status(status); } @@ -678,16 +687,21 @@ void smpi_mpi_probe(int source, int tag, MPI_Comm comm, MPI_Status* status){ while(flag==0){ smpi_mpi_iprobe(source, tag, comm, &flag, status); XBT_DEBUG("Busy Waiting on probing : %d", flag); - if(!flag) { - simcall_process_sleep(0.0001); - } } } void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* status){ - MPI_Request request =build_request(NULL, 0, MPI_CHAR, source, smpi_comm_rank(comm), tag, + + MPI_Request request =build_request(NULL, 0, MPI_CHAR, source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), source), smpi_comm_rank(comm), tag, comm, NON_PERSISTENT | RECV); + //to avoid deadlock, we have to sleep some time here, or the timer won't advance and we will only do iprobe simcalls + double sleeptime= sg_cfg_get_double("smpi/iprobe"); + //multiplier to the sleeptime, to increase speed of execution, each failed iprobe will increase it + static int nsleeps = 1; + + simcall_process_sleep(sleeptime); + // behave like a receive, but don't do it smx_rdv_t mailbox; @@ -708,13 +722,17 @@ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* MPI_Request req = (MPI_Request)SIMIX_comm_get_src_data(request->action); *flag = 1; if(status != MPI_STATUS_IGNORE) { - status->MPI_SOURCE = req->src; + status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(comm), req->src); status->MPI_TAG = req->tag; status->MPI_ERROR = MPI_SUCCESS; status->count = req->real_size; } + nsleeps=1;//reset the number of sleeps we will do next time + } + else { + *flag = 0; + nsleeps++; } - else *flag = 0; smpi_mpi_request_free(&request); return; @@ -807,6 +825,7 @@ int smpi_mpi_waitall(int count, MPI_Request requests[], index = smpi_mpi_waitany(count, requests, pstat); if (index == MPI_UNDEFINED) break; + requests[index]=MPI_REQUEST_NULL; } if (status != MPI_STATUSES_IGNORE) { status[index] = *pstat; @@ -835,6 +854,7 @@ int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices, if(status != MPI_STATUSES_IGNORE) { status[index] = *pstat; } + requests[index]=MPI_REQUEST_NULL; }else{ return MPI_UNDEFINED; } @@ -859,6 +879,8 @@ int smpi_mpi_testsome(int incount, MPI_Request requests[], int *indices, if(status != MPI_STATUSES_IGNORE) { status[i] = *pstat; } + requests[i]=MPI_REQUEST_NULL; + } }else{ count_dead++; @@ -919,6 +941,27 @@ void smpi_mpi_gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, } } + +void smpi_mpi_reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + int i, size, count; + int *displs; + int rank = smpi_process_index(); + /* arbitrarily choose root as rank 0 */ + size = smpi_comm_size(comm); + count = 0; + displs = xbt_new(int, size); + for (i = 0; i < size; i++) { + displs[i] = count; + count += recvcounts[i]; + } + mpi_coll_reduce_fun(sendbuf, recvbuf, count, datatype, op, 0, comm); + smpi_mpi_scatterv(recvbuf, recvcounts, displs, datatype, recvbuf, + recvcounts[rank], datatype, 0, comm); + xbt_free(displs); +} + void smpi_mpi_gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm) diff --git a/src/smpi/smpi_bench.c b/src/smpi/smpi_bench.c index 18e4205c05..357e6f806b 100644 --- a/src/smpi/smpi_bench.c +++ b/src/smpi/smpi_bench.c @@ -149,7 +149,7 @@ static void smpi_execute(double duration) void smpi_bench_begin(void) { - xbt_os_timer_start(smpi_process_timer()); + xbt_os_threadtimer_start(smpi_process_timer()); smpi_current_rank = smpi_process_index(); } @@ -157,7 +157,7 @@ void smpi_bench_end(void) { xbt_os_timer_t timer = smpi_process_timer(); - xbt_os_timer_stop(timer); + xbt_os_threadtimer_stop(timer); smpi_execute(xbt_os_timer_elapsed(timer)); } @@ -320,7 +320,7 @@ void smpi_sample_3(int global, const char *file, int line) } // ok, benchmarking this loop is over - xbt_os_timer_stop(smpi_process_timer()); + xbt_os_threadtimer_stop(smpi_process_timer()); // update the stats double sample, n; diff --git a/src/smpi/smpi_coll.c b/src/smpi/smpi_coll.c index 13ff3b3e30..172ddb167c 100644 --- a/src/smpi/smpi_coll.c +++ b/src/smpi/smpi_coll.c @@ -12,6 +12,16 @@ #include "private.h" #include "colls/colls.h" +#include "simgrid/sg_config.h" + +s_mpi_coll_description_t mpi_coll_gather_description[] = { + {"default", + "gather default collective", + smpi_mpi_gather}, +COLL_GATHERS(COLL_DESCRIPTION, COLL_COMMA), + {NULL, NULL, NULL} /* this array must be NULL terminated */ +}; + s_mpi_coll_description_t mpi_coll_allgather_description[] = { {"default", @@ -21,6 +31,14 @@ COLL_ALLGATHERS(COLL_DESCRIPTION, COLL_COMMA), {NULL, NULL, NULL} /* this array must be NULL terminated */ }; +s_mpi_coll_description_t mpi_coll_allgatherv_description[] = { + {"default", + "allgatherv default collective", + smpi_mpi_allgatherv}, +COLL_ALLGATHERVS(COLL_DESCRIPTION, COLL_COMMA), + {NULL, NULL, NULL} /* this array must be NULL terminated */ +}; + s_mpi_coll_description_t mpi_coll_allreduce_description[] = { {"default", "allreduce default collective", @@ -29,10 +47,33 @@ COLL_ALLREDUCES(COLL_DESCRIPTION, COLL_COMMA), {NULL, NULL, NULL} /* this array must be NULL terminated */ }; +s_mpi_coll_description_t mpi_coll_reduce_scatter_description[] = { + {"default", + "reduce_scatter default collective", + smpi_mpi_reduce_scatter}, +COLL_REDUCE_SCATTERS(COLL_DESCRIPTION, COLL_COMMA), + {NULL, NULL, NULL} /* this array must be NULL terminated */ +}; + +s_mpi_coll_description_t mpi_coll_scatter_description[] = { + {"default", + "scatter default collective", + smpi_mpi_scatter}, +COLL_SCATTERS(COLL_DESCRIPTION, COLL_COMMA), + {NULL, NULL, NULL} /* this array must be NULL terminated */ +}; + +s_mpi_coll_description_t mpi_coll_barrier_description[] = { + {"default", + "barrier default collective", + smpi_mpi_barrier}, +COLL_BARRIERS(COLL_DESCRIPTION, COLL_COMMA), + {NULL, NULL, NULL} /* this array must be NULL terminated */ +}; s_mpi_coll_description_t mpi_coll_alltoall_description[] = { - {"ompi", + {"default", "Ompi alltoall default collective", - smpi_coll_tuned_alltoall_ompi}, + smpi_coll_tuned_alltoall_ompi2}, COLL_ALLTOALLS(COLL_DESCRIPTION, COLL_COMMA), {"bruck", "Alltoall Bruck (SG) collective", @@ -40,15 +81,20 @@ COLL_ALLTOALLS(COLL_DESCRIPTION, COLL_COMMA), {"basic_linear", "Alltoall basic linear (SG) collective", smpi_coll_tuned_alltoall_basic_linear}, - {"pairwise", - "Alltoall pairwise (SG) collective", - smpi_coll_tuned_alltoall_pairwise}, + {NULL, NULL, NULL} /* this array must be NULL terminated */ +}; + +s_mpi_coll_description_t mpi_coll_alltoallv_description[] = { + {"default", + "Ompi alltoallv default collective", + smpi_coll_basic_alltoallv}, +COLL_ALLTOALLVS(COLL_DESCRIPTION, COLL_COMMA), {NULL, NULL, NULL} /* this array must be NULL terminated */ }; s_mpi_coll_description_t mpi_coll_bcast_description[] = { {"default", - "allgather default collective", + "bcast default collective", smpi_mpi_bcast}, COLL_BCASTS(COLL_DESCRIPTION, COLL_COMMA), {NULL, NULL, NULL} /* this array must be NULL terminated */ @@ -56,7 +102,7 @@ COLL_BCASTS(COLL_DESCRIPTION, COLL_COMMA), s_mpi_coll_description_t mpi_coll_reduce_description[] = { {"default", - "allgather default collective", + "reduce default collective", smpi_mpi_reduce}, COLL_REDUCES(COLL_DESCRIPTION, COLL_COMMA), {NULL, NULL, NULL} /* this array must be NULL terminated */ @@ -75,15 +121,28 @@ void coll_help(const char *category, s_mpi_coll_description_t * table) } int find_coll_description(s_mpi_coll_description_t * table, - const char *name) + char *name) { int i; char *name_list = NULL; - + int selector_on=0; + if(name==NULL){//no argument provided, use active selector's algorithm + name=(char*)sg_cfg_get_string("smpi/coll_selector"); + selector_on=1; + } for (i = 0; table[i].name; i++) if (!strcmp(name, table[i].name)) { return i; } + + if(selector_on){ + // collective seems not handled by the active selector, try with default one + name=(char*)"default"; + for (i = 0; table[i].name; i++) + if (!strcmp(name, table[i].name)) { + return i; + } + } name_list = strdup(table[0].name); for (i = 1; table[i].name; i++) { name_list = @@ -96,17 +155,20 @@ int find_coll_description(s_mpi_coll_description_t * table, return -1; } - - XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi, "Logging specific to SMPI (coll)"); +int (*mpi_coll_gather_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, int root, MPI_Comm); int (*mpi_coll_allgather_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, MPI_Comm); +int (*mpi_coll_allgatherv_fun)(void *, int, MPI_Datatype, void*, int*, int*, MPI_Datatype, MPI_Comm); int (*mpi_coll_allreduce_fun)(void *sbuf, void *rbuf, int rcount, MPI_Datatype dtype, MPI_Op op, MPI_Comm comm); int (*mpi_coll_alltoall_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, MPI_Comm); +int (*mpi_coll_alltoallv_fun)(void *, int*, int*, MPI_Datatype, void*, int*, int*, MPI_Datatype, MPI_Comm); int (*mpi_coll_bcast_fun)(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm com); int (*mpi_coll_reduce_fun)(void *buf, void *rbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm); - +int (*mpi_coll_reduce_scatter_fun)(void *sbuf, void *rbuf, int *rcounts,MPI_Datatype dtype,MPI_Op op,MPI_Comm comm); +int (*mpi_coll_scatter_fun)(void *sendbuf, int sendcount, MPI_Datatype sendtype,void *recvbuf, int recvcount, MPI_Datatype recvtype,int root, MPI_Comm comm); +int (*mpi_coll_barrier_fun)(MPI_Comm comm); struct s_proc_tree { int PROCTREE_A; int numChildren; @@ -284,7 +346,7 @@ void nary_tree_barrier(MPI_Comm comm, int arity) free_tree(tree); } -int smpi_coll_tuned_alltoall_ompi(void *sendbuf, int sendcount, +int smpi_coll_tuned_alltoall_ompi2(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm) @@ -304,9 +366,9 @@ int smpi_coll_tuned_alltoall_ompi(void *sendbuf, int sendcount, recvcount, recvtype, comm); } else { return - smpi_coll_tuned_alltoall_pairwise(sendbuf, sendcount, sendtype, - recvbuf, recvcount, recvtype, - comm); + smpi_coll_tuned_alltoall_ring(sendbuf, sendcount, sendtype, + recvbuf, recvcount, recvtype, + comm); } } @@ -434,44 +496,6 @@ int smpi_coll_tuned_alltoall_basic_linear(void *sendbuf, int sendcount, return err; } -/** - * Alltoall pairwise - * - * this algorithm performs size steps (1<=s<=size) and - * at each step s, a process p sends iand receive to.from a unique distinct remote process - * size=5 : s=1: 4->0->1, 0->1->2, 1->2->3, ... - * s=2: 3->0->2, 4->1->3, 0->2->4, 1->3->0 , 2->4->1 - * .... - * Openmpi calls this routine when the message size sent to each rank is greater than 3000 bytes - **/ -int smpi_coll_tuned_alltoall_pairwise(void *sendbuf, int sendcount, - MPI_Datatype sendtype, void *recvbuf, - int recvcount, MPI_Datatype recvtype, - MPI_Comm comm) -{ - int system_tag = 999; - int rank, size, step, sendto, recvfrom, sendsize, recvsize; - - rank = smpi_comm_rank(comm); - size = smpi_comm_size(comm); - XBT_DEBUG("<%d> algorithm alltoall_pairwise() called.", rank); - sendsize = smpi_datatype_size(sendtype); - recvsize = smpi_datatype_size(recvtype); - /* Perform pairwise exchange - starting from 1 so the local copy is last */ - for (step = 1; step < size + 1; step++) { - /* who do we talk to in this step? */ - sendto = (rank + step) % size; - recvfrom = (rank + size - step) % size; - /* send and receive */ - smpi_mpi_sendrecv(&((char *) sendbuf)[sendto * sendsize * sendcount], - sendcount, sendtype, sendto, system_tag, - &((char *) recvbuf)[recvfrom * recvsize * recvcount], - recvcount, recvtype, recvfrom, system_tag, comm, - MPI_STATUS_IGNORE); - } - return MPI_SUCCESS; -} - int smpi_coll_basic_alltoallv(void *sendbuf, int *sendcounts, int *senddisps, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, diff --git a/src/smpi/smpi_f77.c b/src/smpi/smpi_f77.c index d782052c73..f7a1583bbb 100644 --- a/src/smpi/smpi_f77.c +++ b/src/smpi/smpi_f77.c @@ -99,50 +99,51 @@ static MPI_Op get_op(int op) { } void mpi_init_(int* ierr) { - comm_lookup = xbt_dynar_new(sizeof(MPI_Comm), NULL); - new_comm(MPI_COMM_WORLD); - group_lookup = xbt_dynar_new(sizeof(MPI_Group), NULL); - - request_lookup = xbt_dict_new_homogeneous(NULL); - - datatype_lookup = xbt_dynar_new(sizeof(MPI_Datatype), NULL); - new_datatype(MPI_BYTE); - new_datatype(MPI_CHAR); - new_datatype(MPI_INT); - new_datatype(MPI_INT); - new_datatype(MPI_INT8_T); - new_datatype(MPI_INT16_T); - new_datatype(MPI_INT32_T); - new_datatype(MPI_INT64_T); - new_datatype(MPI_FLOAT); - new_datatype(MPI_FLOAT); - new_datatype(MPI_DOUBLE); - new_datatype(MPI_DOUBLE); - new_datatype(MPI_C_FLOAT_COMPLEX); - new_datatype(MPI_C_DOUBLE_COMPLEX); - new_datatype(MPI_2INT); - new_datatype(MPI_UINT8_T); - new_datatype(MPI_UINT16_T); - new_datatype(MPI_UINT32_T); - new_datatype(MPI_UINT64_T); - new_datatype(MPI_2FLOAT); - new_datatype(MPI_2DOUBLE); - - - op_lookup = xbt_dynar_new(sizeof(MPI_Op), NULL); - new_op(MPI_MAX); - new_op(MPI_MIN); - new_op(MPI_MAXLOC); - new_op(MPI_MINLOC); - new_op(MPI_SUM); - new_op(MPI_PROD); - new_op(MPI_LAND); - new_op(MPI_LOR); - new_op(MPI_LXOR); - new_op(MPI_BAND); - new_op(MPI_BOR); - new_op(MPI_BXOR); - + if(!comm_lookup){ + comm_lookup = xbt_dynar_new(sizeof(MPI_Comm), NULL); + new_comm(MPI_COMM_WORLD); + group_lookup = xbt_dynar_new(sizeof(MPI_Group), NULL); + + request_lookup = xbt_dict_new_homogeneous(NULL); + + datatype_lookup = xbt_dynar_new(sizeof(MPI_Datatype), NULL); + new_datatype(MPI_BYTE); + new_datatype(MPI_CHAR); + new_datatype(MPI_INT); + new_datatype(MPI_INT); + new_datatype(MPI_INT8_T); + new_datatype(MPI_INT16_T); + new_datatype(MPI_INT32_T); + new_datatype(MPI_INT64_T); + new_datatype(MPI_FLOAT); + new_datatype(MPI_FLOAT); + new_datatype(MPI_DOUBLE); + new_datatype(MPI_DOUBLE); + new_datatype(MPI_C_FLOAT_COMPLEX); + new_datatype(MPI_C_DOUBLE_COMPLEX); + new_datatype(MPI_2INT); + new_datatype(MPI_UINT8_T); + new_datatype(MPI_UINT16_T); + new_datatype(MPI_UINT32_T); + new_datatype(MPI_UINT64_T); + new_datatype(MPI_2FLOAT); + new_datatype(MPI_2DOUBLE); + + + op_lookup = xbt_dynar_new(sizeof(MPI_Op), NULL); + new_op(MPI_MAX); + new_op(MPI_MIN); + new_op(MPI_MAXLOC); + new_op(MPI_MINLOC); + new_op(MPI_SUM); + new_op(MPI_PROD); + new_op(MPI_LAND); + new_op(MPI_LOR); + new_op(MPI_LXOR); + new_op(MPI_BAND); + new_op(MPI_BOR); + new_op(MPI_BXOR); + } /* smpif2c is responsible for generating a call with the final arguments */ *ierr = MPI_Init(NULL, NULL); } diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index ab6e4b21e6..c62c1036b9 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -315,7 +315,7 @@ int __attribute__((weak)) MAIN__(){ int smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]) { srand(SMPI_RAND_SEED); - + if(getenv("SMPI_PRETEND_CC") != NULL) { /* Hack to ensure that smpicc can pretend to be a simple compiler. Particularly handy to pass it to the configuration tools */ return 0; @@ -360,6 +360,72 @@ int smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]) SIMIX_function_register_default(realmain); SIMIX_launch_application(argv[2]); + int gather_id = find_coll_description(mpi_coll_gather_description, + sg_cfg_get_string("smpi/gather")); + mpi_coll_gather_fun = (int (*)(void *, int, MPI_Datatype, + void*, int, MPI_Datatype, int, MPI_Comm)) + mpi_coll_gather_description[gather_id].coll; + + int allgather_id = find_coll_description(mpi_coll_allgather_description, + sg_cfg_get_string("smpi/allgather")); + mpi_coll_allgather_fun = (int (*)(void *, int, MPI_Datatype, + void*, int, MPI_Datatype, MPI_Comm)) + mpi_coll_allgather_description[allgather_id].coll; + + int allgatherv_id = find_coll_description(mpi_coll_allgatherv_description, + sg_cfg_get_string("smpi/allgatherv")); + mpi_coll_allgatherv_fun = (int (*)(void *, int, MPI_Datatype, + void*, int*, int*, MPI_Datatype, MPI_Comm)) + mpi_coll_allgatherv_description[allgatherv_id].coll; + + int allreduce_id = find_coll_description(mpi_coll_allreduce_description, + sg_cfg_get_string("smpi/allreduce")); + mpi_coll_allreduce_fun = (int (*)(void *sbuf, void *rbuf, int rcount, \ + MPI_Datatype dtype, MPI_Op op, MPI_Comm comm)) + mpi_coll_allreduce_description[allreduce_id].coll; + + int alltoall_id = find_coll_description(mpi_coll_alltoall_description, + sg_cfg_get_string("smpi/alltoall")); + mpi_coll_alltoall_fun = (int (*)(void *, int, MPI_Datatype, + void*, int, MPI_Datatype, MPI_Comm)) + mpi_coll_alltoall_description[alltoall_id].coll; + + int alltoallv_id = find_coll_description(mpi_coll_alltoallv_description, + sg_cfg_get_string("smpi/alltoallv")); + mpi_coll_alltoallv_fun = (int (*)(void *, int*, int*, MPI_Datatype, + void*, int*, int*, MPI_Datatype, MPI_Comm)) + mpi_coll_alltoallv_description[alltoallv_id].coll; + + int bcast_id = find_coll_description(mpi_coll_bcast_description, + sg_cfg_get_string("smpi/bcast")); + mpi_coll_bcast_fun = (int (*)(void *buf, int count, MPI_Datatype datatype, \ + int root, MPI_Comm com)) + mpi_coll_bcast_description[bcast_id].coll; + + int reduce_id = find_coll_description(mpi_coll_reduce_description, + sg_cfg_get_string("smpi/reduce")); + mpi_coll_reduce_fun = (int (*)(void *buf, void *rbuf, int count, MPI_Datatype datatype, \ + MPI_Op op, int root, MPI_Comm comm)) + mpi_coll_reduce_description[reduce_id].coll; + + int reduce_scatter_id = find_coll_description(mpi_coll_reduce_scatter_description, + sg_cfg_get_string("smpi/reduce_scatter")); + mpi_coll_reduce_scatter_fun = (int (*)(void *sbuf, void *rbuf, int *rcounts,\ + MPI_Datatype dtype,MPI_Op op,MPI_Comm comm)) + mpi_coll_reduce_scatter_description[reduce_scatter_id].coll; + + int scatter_id = find_coll_description(mpi_coll_scatter_description, + sg_cfg_get_string("smpi/scatter")); + mpi_coll_scatter_fun = (int (*)(void *sendbuf, int sendcount, MPI_Datatype sendtype,\ + void *recvbuf, int recvcount, MPI_Datatype recvtype,\ + int root, MPI_Comm comm)) + mpi_coll_scatter_description[scatter_id].coll; + + int barrier_id = find_coll_description(mpi_coll_barrier_description, + sg_cfg_get_string("smpi/barrier")); + mpi_coll_barrier_fun = (int (*)(MPI_Comm comm)) + mpi_coll_barrier_description[barrier_id].coll; + smpi_global_init(); /* Clean IO before the run */ @@ -371,7 +437,7 @@ int smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]) else SIMIX_run(); - if (sg_cfg_get_int("smpi/display_timing")) + if (sg_cfg_get_boolean("smpi/display_timing")) XBT_INFO("Simulation time: %g seconds.", SIMIX_get_clock()); smpi_global_destroy(); diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index 7778277dc2..266ec5e4a8 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -14,35 +14,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi, smpi, int MPI_Init(int *argc, char ***argv) { - int allgather_id = find_coll_description(mpi_coll_allgather_description, - sg_cfg_get_string("smpi/allgather")); - mpi_coll_allgather_fun = (int (*)(void *, int, MPI_Datatype, - void*, int, MPI_Datatype, MPI_Comm)) - mpi_coll_allgather_description[allgather_id].coll; - - int allreduce_id = find_coll_description(mpi_coll_allreduce_description, - sg_cfg_get_string("smpi/allreduce")); - mpi_coll_allreduce_fun = (int (*)(void *sbuf, void *rbuf, int rcount, \ - MPI_Datatype dtype, MPI_Op op, MPI_Comm comm)) - mpi_coll_allreduce_description[allreduce_id].coll; - - int alltoall_id = find_coll_description(mpi_coll_alltoall_description, - sg_cfg_get_string("smpi/alltoall")); - mpi_coll_alltoall_fun = (int (*)(void *, int, MPI_Datatype, - void*, int, MPI_Datatype, MPI_Comm)) - mpi_coll_alltoall_description[alltoall_id].coll; - - int bcast_id = find_coll_description(mpi_coll_bcast_description, - sg_cfg_get_string("smpi/bcast")); - mpi_coll_bcast_fun = (int (*)(void *buf, int count, MPI_Datatype datatype, \ - int root, MPI_Comm com)) - mpi_coll_bcast_description[bcast_id].coll; - - int reduce_id = find_coll_description(mpi_coll_reduce_description, - sg_cfg_get_string("smpi/reduce")); - mpi_coll_reduce_fun = (int (*)(void *buf, void *rbuf, int count, MPI_Datatype datatype, \ - MPI_Op op, int root, MPI_Comm comm)) - mpi_coll_reduce_description[reduce_id].coll; return PMPI_Init(argc, argv); } diff --git a/src/smpi/smpi_mpi_dt.c b/src/smpi/smpi_mpi_dt.c index 29471e963e..b233c413d4 100644 --- a/src/smpi/smpi_mpi_dt.c +++ b/src/smpi/smpi_mpi_dt.c @@ -177,13 +177,12 @@ int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, }else{ s_smpi_subtype_t *subtype = sendtype->substruct; - s_smpi_mpi_vector_t* type_c = (s_smpi_mpi_vector_t*)sendtype; - void * buf_tmp = xbt_malloc(count * type_c->size_oldtype); + void * buf_tmp = xbt_malloc(count); subtype->serialize( sendbuf, buf_tmp,1, subtype); subtype = recvtype->substruct; - subtype->unserialize(recvbuf, buf_tmp,1, subtype); + subtype->unserialize( buf_tmp, recvbuf,1, subtype); free(buf_tmp); } @@ -324,17 +323,100 @@ void smpi_datatype_unuse(MPI_Datatype type){ smpi_datatype_free(&type); } -int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_type) + + + +/* +Contiguous Implementation +*/ + + +/* + * Copies noncontiguous data into contiguous memory. + * @param contiguous_hvector - output hvector + * @param noncontiguous_hvector - input hvector + * @param type - pointer contening : + * - stride - stride of between noncontiguous data, in bytes + * - block_length - the width or height of blocked matrix + * - count - the number of rows of matrix + */ +void serialize_contiguous( const void *noncontiguous_hvector, + void *contiguous_hvector, + size_t count, + void *type) +{ + s_smpi_mpi_contiguous_t* type_c = (s_smpi_mpi_contiguous_t*)type; + char* contiguous_vector_char = (char*)contiguous_hvector; + char* noncontiguous_vector_char = (char*)noncontiguous_hvector+type_c->lb; + memcpy(contiguous_vector_char, + noncontiguous_vector_char, count* type_c->block_count * type_c->size_oldtype); +} +/* + * Copies contiguous data into noncontiguous memory. + * @param noncontiguous_vector - output hvector + * @param contiguous_vector - input hvector + * @param type - pointer contening : + * - stride - stride of between noncontiguous data, in bytes + * - block_length - the width or height of blocked matrix + * - count - the number of rows of matrix + */ +void unserialize_contiguous( const void *contiguous_vector, + void *noncontiguous_vector, + size_t count, + void *type) +{ + s_smpi_mpi_contiguous_t* type_c = (s_smpi_mpi_contiguous_t*)type; + char* contiguous_vector_char = (char*)contiguous_vector; + char* noncontiguous_vector_char = (char*)noncontiguous_vector+type_c->lb; + + memcpy(noncontiguous_vector_char, + contiguous_vector_char, count* type_c->block_count * type_c->size_oldtype); +} + +void free_contiguous(MPI_Datatype* d){ +} + +/* + * Create a Sub type contiguous to be able to serialize and unserialize it + * the structure s_smpi_mpi_contiguous_t is derived from s_smpi_subtype which + * required the functions unserialize and serialize + * + */ +s_smpi_mpi_contiguous_t* smpi_datatype_contiguous_create( MPI_Aint lb, + int block_count, + MPI_Datatype old_type, + int size_oldtype){ + s_smpi_mpi_contiguous_t *new_t= xbt_new(s_smpi_mpi_contiguous_t,1); + new_t->base.serialize = &serialize_contiguous; + new_t->base.unserialize = &unserialize_contiguous; + new_t->base.subtype_free = &free_contiguous; + new_t->lb = lb; + new_t->block_count = block_count; + new_t->old_type = old_type; + new_t->size_oldtype = size_oldtype; + return new_t; +} + + + + +int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_type, MPI_Aint lb) { int retval; if(old_type->has_subtype){ //handle this case as a hvector with stride equals to the extent of the datatype return smpi_datatype_hvector(count, 1, smpi_datatype_get_extent(old_type), old_type, new_type); } + + s_smpi_mpi_contiguous_t* subtype = smpi_datatype_contiguous_create( lb, + count, + old_type, + smpi_datatype_size(old_type)); + smpi_datatype_create(new_type, count * smpi_datatype_size(old_type), - 0,count * smpi_datatype_size(old_type), - 0,NULL, DT_FLAG_CONTIGUOUS); + lb,lb + count * smpi_datatype_size(old_type), + 1,subtype, DT_FLAG_CONTIGUOUS); retval=MPI_SUCCESS; return retval; } @@ -342,7 +424,7 @@ int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new int smpi_datatype_vector(int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* new_type) { int retval; - if (blocklen<=0) return MPI_ERR_ARG; + if (blocklen<0) return MPI_ERR_ARG; MPI_Aint lb = 0; MPI_Aint ub = 0; if(count>0){ @@ -483,7 +565,7 @@ void free_hvector(MPI_Datatype* d){ int smpi_datatype_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type) { int retval; - if (blocklen<=0) return MPI_ERR_ARG; + if (blocklen<0) return MPI_ERR_ARG; MPI_Aint lb = 0; MPI_Aint ub = 0; if(count>0){ @@ -537,7 +619,7 @@ void serialize_indexed( const void *noncontiguous_indexed, s_smpi_mpi_indexed_t* type_c = (s_smpi_mpi_indexed_t*)type; int i,j; char* contiguous_indexed_char = (char*)contiguous_indexed; - char* noncontiguous_indexed_char = (char*)noncontiguous_indexed; + char* noncontiguous_indexed_char = (char*)noncontiguous_indexed+type_c->block_indices[0] * type_c->size_oldtype; for(j=0; jblock_count; i++) { if (type_c->old_type->has_subtype == 0) @@ -571,15 +653,15 @@ void unserialize_indexed( const void *contiguous_indexed, size_t count, void *type) { + s_smpi_mpi_indexed_t* type_c = (s_smpi_mpi_indexed_t*)type; int i,j; - char* contiguous_indexed_char = (char*)contiguous_indexed; - char* noncontiguous_indexed_char = (char*)noncontiguous_indexed; + char* noncontiguous_indexed_char = (char*)noncontiguous_indexed+type_c->block_indices[0]*smpi_datatype_get_extent(type_c->old_type); for(j=0; jblock_count; i++) { if (type_c->old_type->has_subtype == 0) - memcpy(noncontiguous_indexed_char, + memcpy(noncontiguous_indexed_char , contiguous_indexed_char, type_c->block_lengths[i] * type_c->size_oldtype); else ((s_smpi_subtype_t*)type_c->old_type->substruct)->unserialize( contiguous_indexed_char, @@ -644,7 +726,7 @@ int smpi_datatype_indexed(int count, int* blocklens, int* indices, MPI_Datatype } for(i=0; i< count; i++){ - if (blocklens[i]<=0) + if (blocklens[i]<0) return MPI_ERR_ARG; size += blocklens[i]; @@ -667,9 +749,12 @@ int smpi_datatype_indexed(int count, int* blocklens, int* indices, MPI_Datatype smpi_datatype_create(new_type, size * smpi_datatype_size(old_type),lb,ub,1, subtype, DT_FLAG_DATA); }else{ + s_smpi_mpi_contiguous_t* subtype = smpi_datatype_contiguous_create( lb, + size, + old_type, + smpi_datatype_size(old_type)); smpi_datatype_create(new_type, size * - smpi_datatype_size(old_type),0,size * - smpi_datatype_size(old_type),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS); + smpi_datatype_size(old_type),lb,ub,1, subtype, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS); } retval=MPI_SUCCESS; return retval; @@ -697,7 +782,7 @@ void serialize_hindexed( const void *noncontiguous_hindexed, s_smpi_mpi_hindexed_t* type_c = (s_smpi_mpi_hindexed_t*)type; int i,j; char* contiguous_hindexed_char = (char*)contiguous_hindexed; - char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed; + char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed+ type_c->block_indices[0]; for(j=0; jblock_count; i++) { if (type_c->old_type->has_subtype == 0) @@ -734,7 +819,7 @@ void unserialize_hindexed( const void *contiguous_hindexed, int i,j; char* contiguous_hindexed_char = (char*)contiguous_hindexed; - char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed; + char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed+ type_c->block_indices[0]; for(j=0; jblock_count; i++) { if (type_c->old_type->has_subtype == 0) @@ -801,7 +886,7 @@ int smpi_datatype_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Dat ub=indices[0] + blocklens[0]*smpi_datatype_ub(old_type); } for(i=0; i< count; i++){ - if (blocklens[i]<=0) + if (blocklens[i]<0) return MPI_ERR_ARG; size += blocklens[i]; @@ -824,9 +909,13 @@ int smpi_datatype_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Dat ub ,1, subtype, DT_FLAG_DATA); }else{ + s_smpi_mpi_contiguous_t* subtype = smpi_datatype_contiguous_create( lb, + size, + old_type, + smpi_datatype_size(old_type)); smpi_datatype_create(new_type, size * smpi_datatype_size(old_type), 0,size * smpi_datatype_size(old_type), - 0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS); + 1, subtype, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS); } retval=MPI_SUCCESS; return retval; @@ -854,7 +943,7 @@ void serialize_struct( const void *noncontiguous_struct, s_smpi_mpi_struct_t* type_c = (s_smpi_mpi_struct_t*)type; int i,j; char* contiguous_struct_char = (char*)contiguous_struct; - char* noncontiguous_struct_char = (char*)noncontiguous_struct; + char* noncontiguous_struct_char = (char*)noncontiguous_struct+ type_c->block_indices[0]; for(j=0; jblock_count; i++) { if (type_c->old_types[i]->has_subtype == 0) @@ -892,7 +981,7 @@ void unserialize_struct( const void *contiguous_struct, int i,j; char* contiguous_struct_char = (char*)contiguous_struct; - char* noncontiguous_struct_char = (char*)noncontiguous_struct; + char* noncontiguous_struct_char = (char*)noncontiguous_struct+ type_c->block_indices[0]; for(j=0; jblock_count; i++) { if (type_c->old_types[i]->has_subtype == 0) @@ -965,7 +1054,7 @@ int smpi_datatype_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datat int forced_lb=0; int forced_ub=0; for(i=0; i< count; i++){ - if (blocklens[i]<=0) + if (blocklens[i]<0) return MPI_ERR_ARG; if (old_types[i]->has_subtype == 1) contiguous=0; @@ -994,7 +1083,11 @@ int smpi_datatype_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datat smpi_datatype_create(new_type, size, lb, ub,1, subtype, DT_FLAG_DATA); }else{ - smpi_datatype_create(new_type, size, lb, ub,0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS); + s_smpi_mpi_contiguous_t* subtype = smpi_datatype_contiguous_create( lb, + size, + MPI_CHAR, + 1); + smpi_datatype_create(new_type, size, lb, ub,1, subtype, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS); } return MPI_SUCCESS; } @@ -1006,6 +1099,7 @@ void smpi_datatype_commit(MPI_Datatype *datatype) typedef struct s_smpi_mpi_op { MPI_User_function *func; + int is_commute; } s_smpi_mpi_op_t; #define MAX_OP(a, b) (b) = (a) < (b) ? (b) : (a) @@ -1327,7 +1421,7 @@ static void maxloc_func(void *a, void *b, int *length, #define CREATE_MPI_OP(name, func) \ - static s_smpi_mpi_op_t mpi_##name = { &(func) /* func */ }; \ + static s_smpi_mpi_op_t mpi_##name = { &(func) /* func */, TRUE }; \ MPI_Op name = &mpi_##name; CREATE_MPI_OP(MPI_MAX, max_func); @@ -1346,13 +1440,17 @@ CREATE_MPI_OP(MPI_MINLOC, minloc_func); MPI_Op smpi_op_new(MPI_User_function * function, int commute) { MPI_Op op; - - //FIXME: add commute param op = xbt_new(s_smpi_mpi_op_t, 1); op->func = function; + op-> is_commute = commute; return op; } +int smpi_op_is_commute(MPI_Op op) +{ + return op-> is_commute; +} + void smpi_op_destroy(MPI_Op op) { xbt_free(op); diff --git a/src/smpi/smpi_mpi_dt_private.h b/src/smpi/smpi_mpi_dt_private.h index 608beffc69..23af198871 100644 --- a/src/smpi/smpi_mpi_dt_private.h +++ b/src/smpi/smpi_mpi_dt_private.h @@ -40,44 +40,54 @@ extern MPI_Datatype MPI_PTR; used for serialization/unserialization of messages */ +typedef struct s_smpi_mpi_contiguous{ + s_smpi_subtype_t base; + MPI_Datatype old_type; + MPI_Aint lb; + size_t size_oldtype; + size_t block_count; +} s_smpi_mpi_contiguous_t; + typedef struct s_smpi_mpi_vector{ s_smpi_subtype_t base; + MPI_Datatype old_type; + size_t size_oldtype; size_t block_stride; size_t block_length; size_t block_count; - MPI_Datatype old_type; - size_t size_oldtype; } s_smpi_mpi_vector_t; typedef struct s_smpi_mpi_hvector{ s_smpi_subtype_t base; + MPI_Datatype old_type; + size_t size_oldtype; MPI_Aint block_stride; size_t block_length; size_t block_count; - MPI_Datatype old_type; - size_t size_oldtype; } s_smpi_mpi_hvector_t; typedef struct s_smpi_mpi_indexed{ s_smpi_subtype_t base; + MPI_Datatype old_type; + size_t size_oldtype; int* block_lengths; int* block_indices; size_t block_count; - MPI_Datatype old_type; - size_t size_oldtype; } s_smpi_mpi_indexed_t; typedef struct s_smpi_mpi_hindexed{ s_smpi_subtype_t base; + MPI_Datatype old_type; + size_t size_oldtype; int* block_lengths; MPI_Aint* block_indices; size_t block_count; - MPI_Datatype old_type; - size_t size_oldtype; } s_smpi_mpi_hindexed_t; typedef struct s_smpi_mpi_struct{ s_smpi_subtype_t base; + MPI_Datatype old_type; + size_t size_oldtype; int* block_lengths; MPI_Aint* block_indices; size_t block_count; @@ -88,7 +98,23 @@ typedef struct s_smpi_mpi_struct{ Functions to handle serialization/unserialization of messages, 3 for each type of MPI_Type One for creating the substructure to handle, one for serialization, one for unserialization */ +void unserialize_contiguous( const void *contiguous_vector, + void *noncontiguous_vector, + size_t count, + void *type); +void serialize_contiguous( const void *noncontiguous_vector, + void *contiguous_vector, + size_t count, + void *type); + +void free_contiguous(MPI_Datatype* type); + +s_smpi_mpi_contiguous_t* smpi_datatype_contiguous_create( MPI_Aint lb, + int block_count, + MPI_Datatype old_type, + int size_oldtype); + void unserialize_vector( const void *contiguous_vector, void *noncontiguous_vector, size_t count, diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index d6938f5f7f..64c66cb906 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -1235,7 +1235,6 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int src_traced = smpi_group_index(smpi_comm_group(comm), src); TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__); TRACE_smpi_send(rank, rank, dst_traced); - TRACE_smpi_send(rank, src_traced, rank); #endif @@ -1245,7 +1244,6 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__); - TRACE_smpi_recv(rank, rank, dst_traced); TRACE_smpi_recv(rank, src_traced, rank); TRACE_smpi_computing_in(rank); #endif @@ -1263,18 +1261,18 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, //TODO: suboptimal implementation void *recvbuf; int retval; - if ((datatype == MPI_DATATYPE_NULL)||(datatype->has_subtype==1)) { + if (datatype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; } else if (count < 0) { retval = MPI_ERR_COUNT; } else { - int size = smpi_datatype_size(datatype) * count; + int size = smpi_datatype_get_extent(datatype) * count; recvbuf = xbt_new(char, size); retval = MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count, datatype, src, recvtag, comm, status); if(retval==MPI_SUCCESS){ - memcpy(buf, recvbuf, size * sizeof(char)); + smpi_datatype_copy(recvbuf, count, datatype, buf, count, datatype); } xbt_free(recvbuf); @@ -1392,9 +1390,8 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status) : -1; TRACE_smpi_computing_out(rank); - MPI_Group group = smpi_comm_group((*request)->comm); - int src_traced = smpi_group_index(group, (*request)->src); - int dst_traced = smpi_group_index(group, (*request)->dst); + int src_traced = (*request)->src; + int dst_traced = (*request)->dst; int is_wait_for_receive = (*request)->recv; TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__); #endif @@ -1479,7 +1476,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) int valid_count = 0; for (i = 0; i < count; i++) { MPI_Request req = requests[i]; - if(req){ + if(req!=MPI_REQUEST_NULL){ srcs[valid_count] = req->src; dsts[valid_count] = req->dst; recvs[valid_count] = req->recv; @@ -1558,7 +1555,7 @@ int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm c if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else { - smpi_mpi_bcast(buf, count, datatype, root, comm); + mpi_coll_bcast_fun(buf, count, datatype, root, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1582,7 +1579,7 @@ int PMPI_Barrier(MPI_Comm comm) if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else { - smpi_mpi_barrier(comm); + mpi_coll_barrier_fun(comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1612,7 +1609,7 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, || recvtype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; } else { - smpi_mpi_gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, + mpi_coll_gather_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; } @@ -1675,8 +1672,8 @@ int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, || recvtype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; } else { - smpi_mpi_allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, - recvtype, comm); + mpi_coll_allgather_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, + recvtype, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1706,7 +1703,7 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, } else if (recvcounts == NULL || displs == NULL) { retval = MPI_ERR_ARG; } else { - smpi_mpi_allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, + mpi_coll_allgatherv_fun(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm); retval = MPI_SUCCESS; } @@ -1738,7 +1735,7 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, || recvtype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; } else { - smpi_mpi_scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, + mpi_coll_scatter_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; } @@ -1800,7 +1797,7 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count, } else if (datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) { retval = MPI_ERR_ARG; } else { - smpi_mpi_reduce(sendbuf, recvbuf, count, datatype, op, root, comm); + mpi_coll_reduce_fun(sendbuf, recvbuf, count, datatype, op, root, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1829,7 +1826,7 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, } else if (op == MPI_OP_NULL) { retval = MPI_ERR_OP; } else { - smpi_mpi_allreduce(sendbuf, recvbuf, count, datatype, op, comm); + mpi_coll_allreduce_fun(sendbuf, recvbuf, count, datatype, op, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1872,12 +1869,10 @@ int PMPI_Scan(void *sendbuf, void *recvbuf, int count, int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) { - int retval, i, size, count; - int *displs; - int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; - + int retval; smpi_bench_end(); #ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); TRACE_smpi_collective_in(rank, -1, __FUNCTION__); #endif @@ -1890,19 +1885,9 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, } else if (recvcounts == NULL) { retval = MPI_ERR_ARG; } else { - /* arbitrarily choose root as rank 0 */ - /* TODO: faster direct implementation ? */ - size = smpi_comm_size(comm); - count = 0; - displs = xbt_new(int, size); - for (i = 0; i < size; i++) { - count += recvcounts[i]; - displs[i] = 0; - } - smpi_mpi_reduce(sendbuf, recvbuf, count, datatype, op, 0, comm); - smpi_mpi_scatterv(recvbuf, recvcounts, displs, datatype, recvbuf, - recvcounts[rank], datatype, 0, comm); - xbt_free(displs); + + mpi_coll_reduce_scatter_fun(sendbuf, recvbuf, recvcounts, + datatype, op, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1963,7 +1948,7 @@ int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps, retval = MPI_ERR_ARG; } else { retval = - smpi_coll_basic_alltoallv(sendbuf, sendcounts, senddisps, sendtype, + mpi_coll_alltoallv_fun(sendbuf, sendcounts, senddisps, sendtype, recvbuf, recvcounts, recvdisps, recvtype, comm); } @@ -2026,7 +2011,7 @@ int PMPI_Type_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_typ } else if (count<0){ retval = MPI_ERR_COUNT; } else { - retval = smpi_datatype_contiguous(count, old_type, new_type); + retval = smpi_datatype_contiguous(count, old_type, new_type, 0); } smpi_bench_begin(); return retval; diff --git a/src/smpi/smpi_replay.c b/src/smpi/smpi_replay.c index dfc0d229e5..5991906ea4 100644 --- a/src/smpi/smpi_replay.c +++ b/src/smpi/smpi_replay.c @@ -16,7 +16,8 @@ int communicator_size = 0; static int active_processes = 0; xbt_dynar_t *reqq = NULL; -MPI_Datatype MPI_DEFAULT_TYPE, MPI_CURRENT_TYPE; +MPI_Datatype MPI_DEFAULT_TYPE; +MPI_Datatype MPI_CURRENT_TYPE; static void log_timed_action (const char *const *action, double clock){ if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){ @@ -452,7 +453,7 @@ static void action_reduce(const char *const *action) int root_traced = smpi_group_rank(smpi_comm_group(MPI_COMM_WORLD), 0); TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__); #endif - smpi_mpi_reduce(NULL, NULL, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, root, MPI_COMM_WORLD); + mpi_coll_reduce_fun(NULL, NULL, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, root, MPI_COMM_WORLD); smpi_execute_flops(comp_size); #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__); @@ -475,9 +476,9 @@ static void action_allReduce(const char *const *action) { TRACE_smpi_computing_out(rank); TRACE_smpi_collective_in(rank, -1, __FUNCTION__); #endif - smpi_mpi_reduce(NULL, NULL, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, 0, MPI_COMM_WORLD); + mpi_coll_reduce_fun(NULL, NULL, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, 0, MPI_COMM_WORLD); smpi_execute_flops(comp_size); - smpi_mpi_bcast(NULL, comm_size, MPI_CURRENT_TYPE, 0, MPI_COMM_WORLD); + mpi_coll_bcast_fun(NULL, comm_size, MPI_CURRENT_TYPE, 0, MPI_COMM_WORLD); #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, -1, __FUNCTION__); TRACE_smpi_computing_in(rank); @@ -491,31 +492,82 @@ static void action_allToAll(const char *const *action) { int comm_size = smpi_comm_size(MPI_COMM_WORLD); int send_size = parse_double(action[2]); int recv_size = parse_double(action[3]); - void *send = xbt_new0(int, send_size*comm_size); - void *recv = xbt_new0(int, send_size*comm_size); + MPI_Datatype MPI_CURRENT_TYPE2; - if(action[4]) MPI_CURRENT_TYPE=decode_datatype(action[4]); - else MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE; + if(action[4]) { + MPI_CURRENT_TYPE=decode_datatype(action[4]); + MPI_CURRENT_TYPE2=decode_datatype(action[5]); + } + else { + MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE; + MPI_CURRENT_TYPE2=MPI_DEFAULT_TYPE; + } + void *send = calloc(send_size*comm_size, smpi_datatype_size(MPI_CURRENT_TYPE)); + void *recv = calloc(recv_size*comm_size, smpi_datatype_size(MPI_CURRENT_TYPE2)); #ifdef HAVE_TRACING int rank = smpi_process_index(); TRACE_smpi_computing_out(rank); TRACE_smpi_collective_in(rank, -1, __FUNCTION__); #endif + + mpi_coll_alltoall_fun(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, MPI_COMM_WORLD); + +#ifdef HAVE_TRACING + TRACE_smpi_collective_out(rank, -1, __FUNCTION__); + TRACE_smpi_computing_in(rank); +#endif + + log_timed_action (action, clock); + xbt_free(send); + xbt_free(recv); +} + + +static void action_gather(const char *const *action) { + + + /* + The structure of the gather action for the rank 0 (total 4 processes) + is the following: + 0 gather 68 68 0 0 0 - if (send_size < 200 && comm_size > 12) { - smpi_coll_tuned_alltoall_bruck(send, send_size, MPI_CURRENT_TYPE, - recv, recv_size, MPI_CURRENT_TYPE, - MPI_COMM_WORLD); - } else if (send_size < 3000) { - smpi_coll_tuned_alltoall_basic_linear(send, send_size, MPI_CURRENT_TYPE, - recv, recv_size, MPI_CURRENT_TYPE, - MPI_COMM_WORLD); + where: + 1) 68 is the sendcounts + 2) 68 is the recvcounts + 3) 0 is the root node + 4) 0 is the send datatype id, see decode_datatype() + 5) 0 is the recv datatype id, see decode_datatype() + + */ + double clock = smpi_process_simulated_elapsed(); + int comm_size = smpi_comm_size(MPI_COMM_WORLD); + int send_size = parse_double(action[2]); + int recv_size = parse_double(action[3]); + MPI_Datatype MPI_CURRENT_TYPE2; + if(action[5]) { + MPI_CURRENT_TYPE=decode_datatype(action[5]); + MPI_CURRENT_TYPE2=decode_datatype(action[6]); } else { - smpi_coll_tuned_alltoall_pairwise(send, send_size, MPI_CURRENT_TYPE, - recv, recv_size, MPI_CURRENT_TYPE, - MPI_COMM_WORLD); + MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE; + MPI_CURRENT_TYPE2=MPI_DEFAULT_TYPE; } + void *send = calloc(send_size, smpi_datatype_size(MPI_CURRENT_TYPE)); + void *recv = calloc(recv_size, smpi_datatype_size(MPI_CURRENT_TYPE2)); + + int root=atoi(action[4]); + int rank = smpi_process_index(); + + if(rank==root) + recv = calloc(recv_size*comm_size, smpi_datatype_size(MPI_CURRENT_TYPE2)); + +#ifdef HAVE_TRACING + TRACE_smpi_computing_out(rank); + TRACE_smpi_collective_in(rank, -1, __FUNCTION__); +#endif +smpi_mpi_gather(send, send_size, MPI_CURRENT_TYPE, + recv, recv_size, MPI_CURRENT_TYPE2, + root, MPI_COMM_WORLD); #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, -1, __FUNCTION__); @@ -527,6 +579,126 @@ static void action_allToAll(const char *const *action) { xbt_free(recv); } + +static void action_reducescatter(const char *const *action) { + + /* + The structure of the reducescatter action for the rank 0 (total 4 processes) + is the following: +0 reduceScatter 275427 275427 275427 204020 11346849 0 + + where: + 1) The first four values after the name of the action declare the recvcounts array + 2) The value 11346849 is the amount of instructions + 3) The last value corresponds to the datatype, see decode_datatype(). + + We analyze a MPI_Reduce_scatter call to one MPI_Reduce and one MPI_Scatterv. + + */ + + double clock = smpi_process_simulated_elapsed(); + int comm_size = smpi_comm_size(MPI_COMM_WORLD); + int comp_size = parse_double(action[2+comm_size]); + int *recvcounts = xbt_new0(int, comm_size); + int *disps = xbt_new0(int, comm_size); + int i=0,recv_sum=0; + int root=0; + int rank = smpi_process_index(); + + if(action[3+comm_size]) + MPI_CURRENT_TYPE=decode_datatype(action[3+comm_size]); + else + MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE; + + for(i=0;i.*/' ${PLATFORM} > ${HOSTFILE} +fi + # Don't use wc -l to compute it to avoid issues with trailing \n at EOF hostfile_procs=`grep -c "[a-zA-Z0-9]" $HOSTFILE` @@ -246,7 +271,7 @@ if [ -n "${HOSTFILE}" ] && [ -f ${HOSTFILE} ]; then fi if [ "${EXTOPT}" = "smpi_replay" ]; then - APP_TRACES=$1; + APP_TRACES=$PROC_ARGS if [ -n "${APP_TRACES}" ] && [ -f "${APP_TRACES}" ]; then hosttraces=(`cat ${APP_TRACES} | tr \\\n " "`) NUMTRACES=`cat ${APP_TRACES} | wc -l` @@ -301,7 +326,7 @@ do echo " " >> ${APPLICATIONTMP} fi else - for ARG in $*; do + for ARG in $PROC_ARGS; do echo " " >> ${APPLICATIONTMP} done fi @@ -346,6 +371,9 @@ fi export SMPI_GLOBAL_SIZE=${NUMPROCS} if [ -n "${KEEP}" ] ; then echo ${EXEC} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP} + if [ ${HOSTFILETMP} = 1 ] ; then + echo "Generated hostfile ${HOSTFILE} keeped." + fi fi ${EXEC} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP} status=$? @@ -354,6 +382,9 @@ if [ -z "${KEEP}" ] ; then if [ -z "${PLATFORM}" ]; then rm ${PLATFORMTMP} fi + if [ ${HOSTFILETMP} = 1 ] ; then + rm ${HOSTFILE} + fi rm ${APPLICATIONTMP} fi diff --git a/src/surf/cpu_cas01.c b/src/surf/cpu_cas01.c index d85dc7374a..cae096c6b3 100644 --- a/src/surf/cpu_cas01.c +++ b/src/surf/cpu_cas01.c @@ -294,11 +294,20 @@ static e_surf_resource_state_t cpu_get_state(void *cpu) return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->state_current; } +static void cpu_set_state(void *cpu, e_surf_resource_state_t state) +{ + ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->state_current = state; +} + static double cpu_get_speed(void *cpu, double load) { return load * ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak; } +static int cpu_get_core(void *cpu) +{ + return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->core; +} static double cpu_get_available_speed(void *cpu) { /* number between 0 and 1 */ @@ -328,7 +337,7 @@ static surf_model_t surf_cpu_model_init_cas01(void) char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim"); int select = - xbt_cfg_get_int(_sg_cfg_set, "cpu/maxmin_selective_update"); + xbt_cfg_get_boolean(_sg_cfg_set, "cpu/maxmin_selective_update"); surf_model_t cpu_model = surf_model_init(); @@ -391,6 +400,8 @@ static surf_model_t surf_cpu_model_init_cas01(void) cpu_model->extension.cpu.sleep = cpu_action_sleep; cpu_model->extension.cpu.get_state = cpu_get_state; + cpu_model->extension.cpu.set_state = cpu_set_state; + cpu_model->extension.cpu.get_core = cpu_get_core; cpu_model->extension.cpu.get_speed = cpu_get_speed; cpu_model->extension.cpu.get_available_speed = cpu_get_available_speed; diff --git a/src/surf/cpu_ti.c b/src/surf/cpu_ti.c index 01ba42f883..8ba0f400c5 100644 --- a/src/surf/cpu_ti.c +++ b/src/surf/cpu_ti.c @@ -705,6 +705,11 @@ static e_surf_resource_state_t cpu_ti_get_state(void *cpu) return ((cpu_ti_t)surf_cpu_resource_priv(cpu))->state_current; } +static void cpu_ti_set_state(void *cpu, e_surf_resource_state_t state) +{ + ((cpu_ti_t)surf_cpu_resource_priv(cpu))->state_current = state; +} + static double cpu_ti_get_speed(void *cpu, double load) { return load * ((cpu_ti_t)surf_cpu_resource_priv(cpu))->power_peak; @@ -809,6 +814,7 @@ static surf_model_t surf_cpu_ti_model_init_internal(void) cpu_model->extension.cpu.sleep = cpu_ti_action_sleep; cpu_model->extension.cpu.get_state = cpu_ti_get_state; + cpu_model->extension.cpu.set_state = cpu_ti_set_state; cpu_model->extension.cpu.get_speed = cpu_ti_get_speed; cpu_model->extension.cpu.get_available_speed = cpu_ti_get_available_speed; diff --git a/src/surf/instr_routing.c b/src/surf/instr_routing.c index c0510fb849..8aa9377763 100644 --- a/src/surf/instr_routing.c +++ b/src/surf/instr_routing.c @@ -235,7 +235,7 @@ static void instr_routing_parse_start_link (sg_platf_link_cbarg_t link) container_t new = PJ_container_new (link_name, INSTR_LINK, father); - if (TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()){ + if ((TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) && (! TRACE_disable_link())) { type_t bandwidth = PJ_type_get_or_null ("bandwidth", new->type); if (bandwidth == NULL){ bandwidth = PJ_type_variable_new ("bandwidth", NULL, new->type); @@ -263,7 +263,7 @@ static void instr_routing_parse_start_host (sg_platf_host_cbarg_t host) container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1); container_t new = PJ_container_new (host->id, INSTR_HOST, father); - if (TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) { + if ((TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) && (! TRACE_disable_power())) { type_t power = PJ_type_get_or_null ("power", new->type); if (power == NULL){ power = PJ_type_variable_new ("power", NULL, new->type); diff --git a/src/surf/network.c b/src/surf/network.c index 0d7f5ba3a2..1646c58ea2 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -736,7 +736,7 @@ static void set_update_mechanism(void) { char *optim = xbt_cfg_get_string(_sg_cfg_set, "network/optim"); int select = - xbt_cfg_get_int(_sg_cfg_set, "network/maxmin_selective_update"); + xbt_cfg_get_boolean(_sg_cfg_set, "network/maxmin_selective_update"); if (!strcmp(optim, "Full")) { surf_network_model->model_private->update_mechanism = UM_FULL; diff --git a/src/surf/new_model.c b/src/surf/new_model.c index dce13e2b5a..f5a91f951d 100644 --- a/src/surf/new_model.c +++ b/src/surf/new_model.c @@ -10,7 +10,6 @@ #include "xbt/ex.h" #include "xbt/dict.h" -#include "xbt/file_stat.h" #include "portable.h" #include "surf_private.h" #include "new_model_private.h" diff --git a/src/surf/simgrid.dtd b/src/surf/simgrid.dtd index ed8b8eb6e4..3142bb8bc3 100644 --- a/src/surf/simgrid.dtd +++ b/src/surf/simgrid.dtd @@ -27,7 +27,7 @@ - + @@ -66,7 +66,7 @@ - + diff --git a/src/surf/simgrid_dtd.c b/src/surf/simgrid_dtd.c index eacf7fd5cf..fb7a5a74d3 100644 --- a/src/surf/simgrid_dtd.c +++ b/src/surf/simgrid_dtd.c @@ -403,8 +403,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 564 -#define YY_END_OF_BUFFER 565 +#define YY_NUM_RULES 562 +#define YY_END_OF_BUFFER 563 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -412,7 +412,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[3299] = +static yyconst flex_int16_t yy_accept[3286] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -441,332 +441,331 @@ static yyconst flex_int16_t yy_accept[3299] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 565, 563, 15, 10, 10, 15, 15, 543, - 10, 543, 5, 6, 5, 8, 9, 8, 559, 551, - 552, 560, 557, 560, 558, 562, 551, 552, 562, 563, - 22, 10, 22, 22, 22, 20, 22, 26, 10, 26, - 26, 563, 26, 563, 563, 26, 33, 10, 33, 33, - - 33, 31, 33, 37, 10, 37, 37, 48, 10, 48, - 48, 48, 46, 48, 48, 48, 560, 559, 78, 10, - 78, 78, 78, 76, 78, 78, 78, 78, 78, 82, - 10, 82, 101, 10, 101, 101, 101, 99, 101, 101, - 101, 105, 10, 105, 128, 10, 128, 128, 128, 126, - 128, 128, 132, 10, 132, 132, 563, 132, 563, 132, - 132, 563, 563, 132, 563, 132, 563, 132, 145, 10, - 145, 145, 145, 143, 145, 145, 145, 145, 149, 10, - 149, 149, 160, 10, 160, 160, 160, 158, 160, 160, - 160, 164, 10, 164, 164, 173, 10, 173, 173, 173, - - 171, 173, 173, 177, 10, 177, 186, 10, 186, 186, - 186, 184, 186, 186, 190, 10, 190, 213, 10, 213, - 213, 213, 211, 213, 213, 213, 213, 213, 217, 10, - 217, 563, 217, 224, 10, 224, 224, 224, 222, 224, - 228, 10, 228, 239, 10, 239, 239, 239, 237, 239, - 239, 239, 243, 10, 243, 290, 10, 290, 290, 290, - 288, 290, 290, 290, 290, 290, 290, 290, 290, 294, - 10, 294, 313, 10, 313, 313, 313, 311, 313, 313, - 313, 313, 313, 313, 317, 10, 317, 338, 10, 338, - 338, 338, 336, 338, 338, 338, 338, 338, 338, 338, - - 342, 10, 342, 351, 10, 351, 351, 351, 349, 351, - 351, 355, 10, 355, 366, 10, 366, 366, 366, 364, - 366, 366, 366, 370, 10, 370, 397, 10, 397, 397, - 397, 395, 397, 397, 397, 397, 401, 10, 401, 401, - 414, 10, 414, 414, 414, 412, 414, 414, 418, 10, - 418, 563, 418, 435, 10, 435, 435, 435, 433, 435, - 435, 435, 439, 10, 439, 439, 452, 10, 452, 452, - 452, 450, 452, 452, 456, 10, 456, 465, 10, 465, - 465, 465, 463, 465, 465, 469, 10, 469, 469, 482, - 10, 482, 482, 482, 480, 482, 482, 482, 486, 10, - - 486, 486, 503, 10, 503, 503, 503, 501, 503, 503, - 503, 503, 503, 507, 10, 507, 563, 507, 514, 10, - 514, 514, 514, 512, 514, 518, 10, 518, 525, 10, - 525, 525, 525, 523, 525, 529, 10, 529, 529, 538, - 10, 538, 538, 538, 536, 538, 538, 542, 10, 542, - 10, 0, 2, 2, 0, 4, 7, 554, 553, 0, - 0, 0, 0, 0, 0, 0, 21, 23, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 563, 561, + 15, 10, 10, 15, 15, 541, 10, 541, 5, 6, + 5, 8, 9, 8, 557, 549, 550, 558, 555, 558, + 556, 560, 549, 550, 560, 561, 22, 10, 22, 22, + 22, 20, 22, 26, 10, 26, 26, 561, 26, 561, + + 561, 26, 33, 10, 33, 33, 33, 31, 33, 37, + 10, 37, 37, 48, 10, 48, 48, 48, 46, 48, + 48, 48, 558, 557, 78, 10, 78, 78, 78, 76, + 78, 78, 78, 78, 78, 82, 10, 82, 101, 10, + 101, 101, 101, 99, 101, 101, 101, 105, 10, 105, + 126, 10, 126, 126, 126, 124, 126, 126, 130, 10, + 130, 130, 561, 130, 561, 130, 130, 561, 561, 130, + 561, 130, 561, 130, 143, 10, 143, 143, 143, 141, + 143, 143, 143, 143, 147, 10, 147, 147, 158, 10, + 158, 158, 158, 156, 158, 158, 158, 162, 10, 162, + + 162, 171, 10, 171, 171, 171, 169, 171, 171, 175, + 10, 175, 184, 10, 184, 184, 184, 182, 184, 184, + 188, 10, 188, 211, 10, 211, 211, 211, 209, 211, + 211, 211, 211, 211, 215, 10, 215, 561, 215, 222, + 10, 222, 222, 222, 220, 222, 226, 10, 226, 237, + 10, 237, 237, 237, 235, 237, 237, 237, 241, 10, + 241, 288, 10, 288, 288, 288, 286, 288, 288, 288, + 288, 288, 288, 288, 288, 292, 10, 292, 292, 311, + 10, 311, 311, 311, 309, 311, 311, 311, 311, 311, + 311, 315, 10, 315, 336, 10, 336, 336, 336, 334, + + 336, 336, 336, 336, 336, 336, 336, 340, 10, 340, + 349, 10, 349, 349, 349, 347, 349, 349, 353, 10, + 353, 364, 10, 364, 364, 364, 362, 364, 364, 364, + 368, 10, 368, 395, 10, 395, 395, 395, 393, 395, + 395, 395, 395, 399, 10, 399, 399, 412, 10, 412, + 412, 412, 410, 412, 412, 416, 10, 416, 561, 416, + 433, 10, 433, 433, 433, 431, 433, 433, 433, 437, + 10, 437, 437, 450, 10, 450, 450, 450, 448, 450, + 450, 454, 10, 454, 463, 10, 463, 463, 463, 461, + 463, 463, 467, 10, 467, 467, 480, 10, 480, 480, + + 480, 478, 480, 480, 480, 484, 10, 484, 484, 501, + 10, 501, 501, 501, 499, 501, 501, 501, 501, 501, + 505, 10, 505, 561, 505, 512, 10, 512, 512, 512, + 510, 512, 516, 10, 516, 523, 10, 523, 523, 523, + 521, 523, 527, 10, 527, 527, 536, 10, 536, 536, + 536, 534, 536, 536, 540, 10, 540, 10, 0, 2, + 2, 0, 4, 7, 552, 551, 0, 0, 0, 0, + 0, 0, 0, 21, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32, 34, 34, 0, 47, 49, 49, - 49, 49, 0, 0, 0, 77, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 0, 100, 102, 102, 102, - 102, 0, 127, 129, 129, 129, 0, 0, 0, 0, + 32, 34, 34, 0, 47, 49, 49, 49, 49, 0, + 0, 0, 77, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 0, 100, 102, 102, 102, 102, 0, 125, + 127, 127, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 144, 146, 146, 146, 146, - 146, 0, 159, 161, 161, 161, 161, 0, 172, 174, - 174, 174, 0, 185, 187, 187, 187, 0, 212, 214, - 214, 214, 214, 214, 214, 0, 0, 223, 225, 225, - 0, 238, 240, 240, 240, 240, 0, 289, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - - 291, 291, 291, 291, 0, 312, 314, 314, 314, 314, - 314, 314, 314, 314, 0, 337, 339, 339, 339, 339, - 339, 339, 339, 339, 0, 350, 352, 352, 352, 0, - 365, 367, 367, 367, 367, 0, 396, 398, 398, 398, - 398, 398, 398, 0, 413, 415, 415, 415, 415, 0, - 0, 434, 436, 436, 436, 436, 436, 0, 451, 453, - 453, 453, 0, 464, 466, 466, 466, 0, 481, 483, - 483, 483, 483, 0, 502, 504, 504, 504, 504, 504, - 504, 0, 0, 513, 515, 515, 0, 524, 526, 526, - 0, 537, 539, 539, 539, 0, 0, 0, 0, 0, - - 3, 0, 0, 0, 0, 0, 0, 0, 561, 0, - 23, 0, 0, 107, 0, 0, 0, 0, 0, 0, + 0, 0, 142, 144, 144, 144, 144, 144, 0, 157, + 159, 159, 159, 159, 0, 170, 172, 172, 172, 0, + 183, 185, 185, 185, 0, 210, 212, 212, 212, 212, + 212, 212, 0, 0, 221, 223, 223, 0, 236, 238, + 238, 238, 238, 0, 287, 289, 289, 289, 289, 289, + + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 0, 310, 312, 312, 312, 312, 312, 312, 312, + 312, 0, 335, 337, 337, 337, 337, 337, 337, 337, + 337, 0, 348, 350, 350, 350, 0, 363, 365, 365, + 365, 365, 0, 394, 396, 396, 396, 396, 396, 396, + 0, 411, 413, 413, 413, 413, 0, 0, 432, 434, + 434, 434, 434, 434, 0, 449, 451, 451, 451, 0, + 462, 464, 464, 464, 0, 479, 481, 481, 481, 481, + 0, 500, 502, 502, 502, 502, 502, 502, 0, 0, + 511, 513, 513, 0, 522, 524, 524, 0, 535, 537, + + 537, 537, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 559, 0, 23, 0, 0, + 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, - 0, 0, 34, 0, 0, 49, 0, 0, 49, 0, - 0, 0, 556, 79, 0, 0, 79, 79, 79, 79, - 79, 79, 0, 0, 102, 102, 102, 0, 0, 0, - 0, 129, 0, 0, 107, 0, 0, 0, 0, 0, - 0, 0, 0, 106, 0, 0, 0, 0, 146, 0, - 0, 146, 146, 0, 0, 161, 0, 0, 161, 0, - - 0, 0, 0, 174, 0, 0, 187, 187, 0, 0, - 214, 214, 214, 0, 0, 214, 214, 0, 0, 0, - 0, 225, 0, 0, 240, 0, 0, 0, 0, 0, - 0, 291, 291, 0, 0, 291, 0, 0, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 0, 0, - 0, 0, 0, 0, 314, 314, 314, 314, 314, 0, - 0, 339, 339, 339, 0, 0, 339, 339, 339, 0, - 0, 352, 0, 0, 0, 0, 367, 0, 0, 367, - 0, 0, 398, 0, 0, 398, 398, 398, 0, 0, - 415, 415, 415, 0, 0, 0, 436, 436, 436, 436, - - 0, 0, 453, 0, 0, 0, 0, 466, 466, 0, - 0, 483, 483, 483, 0, 0, 504, 504, 504, 504, - 504, 0, 0, 0, 515, 0, 0, 0, 0, 0, - 0, 0, 0, 539, 0, 0, 0, 14, 1, 0, - 0, 549, 0, 0, 0, 546, 545, 0, 0, 23, - 0, 0, 25, 0, 107, 0, 0, 0, 0, 0, - 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, - 0, 0, 0, 0, 34, 0, 0, 36, 0, 49, - 0, 41, 40, 49, 0, 0, 0, 51, 0, 79, - - 0, 55, 54, 0, 0, 79, 0, 0, 79, 79, - 79, 0, 0, 81, 0, 102, 102, 102, 0, 0, - 104, 0, 0, 109, 108, 129, 0, 0, 131, 0, - 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 146, 0, 136, 135, 146, 146, 0, - 0, 148, 0, 161, 0, 153, 152, 161, 0, 0, - 163, 0, 0, 168, 167, 174, 0, 0, 176, 0, - 187, 187, 0, 0, 189, 0, 214, 214, 214, 0, - 194, 193, 214, 214, 0, 0, 216, 0, 0, 0, - 225, 0, 0, 227, 0, 240, 0, 232, 231, 0, - - 234, 233, 0, 0, 242, 0, 291, 291, 291, 291, - 0, 259, 258, 291, 0, 247, 246, 0, 0, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 0, 0, - 293, 0, 0, 308, 307, 0, 298, 297, 0, 0, - 314, 314, 314, 314, 0, 0, 316, 0, 339, 339, - 339, 339, 0, 321, 320, 0, 0, 339, 339, 0, - 0, 341, 0, 352, 0, 346, 345, 0, 0, 354, - 0, 367, 0, 359, 358, 367, 0, 0, 369, 0, - 398, 0, 374, 373, 398, 398, 398, 0, 0, 400, - 0, 0, 0, 0, 0, 415, 0, 0, 417, 0, - - 0, 0, 0, 436, 436, 0, 0, 436, 0, 0, - 438, 0, 453, 0, 443, 442, 0, 0, 455, 0, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, - 483, 483, 0, 0, 0, 0, 485, 0, 504, 504, - 504, 504, 504, 0, 0, 506, 0, 0, 515, 0, - 0, 517, 0, 0, 522, 521, 0, 0, 528, 0, - 0, 533, 532, 539, 0, 0, 541, 0, 0, 0, - 550, 544, 0, 0, 0, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 218, 191, 0, 371, 0, 0, - 319, 0, 0, 530, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 79, 0, 59, 58, 0, 0, - 0, 57, 56, 79, 0, 0, 79, 0, 102, 0, - 0, 102, 0, 129, 0, 130, 0, 0, 0, 219, - 192, 372, 531, 0, 0, 0, 0, 0, 0, 146, - 146, 0, 0, 0, 161, 161, 0, 0, 0, 0, - 0, 0, 187, 0, 214, 214, 0, 0, 214, 214, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, - 291, 291, 291, 0, 0, 0, 261, 260, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 0, 0, 310, - - 309, 314, 314, 314, 314, 0, 339, 339, 339, 339, - 0, 329, 328, 339, 339, 0, 352, 0, 367, 367, - 0, 398, 398, 398, 398, 0, 0, 407, 406, 0, - 405, 404, 415, 0, 371, 0, 424, 423, 436, 436, - 0, 422, 421, 436, 0, 453, 0, 0, 462, 461, - 0, 460, 459, 0, 0, 475, 474, 483, 483, 0, - 473, 472, 0, 504, 0, 0, 504, 504, 504, 0, - 0, 515, 0, 0, 539, 0, 0, 0, 0, 12, - 0, 547, 548, 0, 23, 0, 0, 0, 0, 0, - 0, 0, 0, 191, 0, 0, 371, 0, 165, 0, - - 319, 0, 0, 530, 0, 402, 0, 39, 0, 0, - 0, 0, 0, 318, 0, 38, 0, 30, 29, 0, - 0, 43, 42, 49, 0, 0, 79, 0, 61, 60, - 79, 0, 65, 64, 79, 0, 102, 0, 0, 0, - 0, 0, 0, 129, 0, 0, 0, 192, 0, 372, - 531, 403, 0, 0, 0, 403, 402, 146, 0, 0, - 0, 140, 139, 0, 161, 161, 0, 0, 170, 169, - 0, 0, 183, 182, 187, 0, 214, 214, 0, 198, - 197, 0, 0, 0, 0, 214, 0, 166, 0, 0, - 221, 220, 0, 226, 0, 236, 235, 0, 291, 0, - - 0, 291, 291, 0, 257, 256, 291, 291, 0, 0, - 291, 291, 291, 291, 291, 291, 0, 0, 0, 314, - 314, 314, 0, 339, 0, 0, 339, 339, 0, 0, - 339, 0, 352, 0, 367, 367, 0, 398, 398, 398, - 0, 0, 398, 0, 415, 0, 0, 436, 436, 436, - 0, 453, 0, 0, 483, 483, 0, 504, 0, 490, - 489, 504, 504, 504, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 0, 23, 0, - 0, 0, 0, 0, 0, 0, 520, 0, 0, 0, - 165, 0, 0, 0, 53, 402, 343, 0, 39, 0, - - 519, 52, 0, 0, 0, 0, 38, 0, 0, 49, - 0, 0, 79, 79, 79, 0, 102, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 96, 95, 0, 129, - 0, 0, 0, 0, 403, 344, 0, 0, 0, 146, - 0, 138, 137, 0, 161, 0, 0, 0, 0, 0, - 0, 0, 214, 214, 0, 196, 195, 0, 0, 0, - 214, 0, 215, 166, 0, 0, 291, 0, 269, 268, - 0, 0, 291, 291, 291, 0, 255, 254, 0, 0, - 291, 291, 291, 291, 0, 0, 0, 0, 306, 305, - 0, 0, 314, 0, 0, 0, 339, 0, 325, 324, - - 0, 0, 339, 0, 323, 322, 339, 0, 340, 352, - 0, 367, 367, 0, 398, 398, 398, 0, 0, 0, - 398, 0, 399, 415, 0, 0, 0, 0, 0, 0, - 436, 0, 453, 0, 0, 0, 0, 0, 0, 0, - 504, 504, 504, 504, 0, 0, 0, 511, 510, 0, - 0, 0, 535, 534, 0, 540, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 0, 296, 245, - 520, 0, 28, 0, 0, 0, 488, 53, 343, 150, - 0, 519, 52, 295, 244, 27, 487, 0, 0, 49, - 0, 0, 50, 79, 0, 0, 79, 0, 0, 0, - + 0, 0, 106, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 49, 0, 0, 49, 0, 0, 0, 554, + 79, 0, 0, 79, 79, 79, 79, 79, 79, 0, + 0, 102, 102, 102, 0, 0, 0, 0, 127, 0, + 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 0, 0, 0, 0, 144, 0, 0, 144, 144, + + 0, 0, 159, 0, 0, 159, 0, 0, 0, 0, + 172, 0, 0, 185, 185, 0, 0, 212, 212, 212, + 0, 0, 212, 212, 0, 0, 0, 0, 223, 0, + 0, 238, 0, 0, 0, 0, 0, 0, 289, 289, + 0, 0, 289, 0, 0, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 0, 0, 0, 0, 0, + 0, 312, 312, 312, 312, 312, 0, 0, 337, 337, + 337, 0, 0, 337, 337, 337, 0, 0, 350, 0, + 0, 0, 0, 365, 0, 0, 365, 0, 0, 396, + 0, 0, 396, 396, 396, 0, 0, 413, 413, 413, + + 0, 0, 0, 434, 434, 434, 434, 0, 0, 451, + 0, 0, 0, 0, 464, 464, 0, 0, 481, 481, + 481, 0, 0, 502, 502, 502, 502, 502, 0, 0, + 0, 513, 0, 0, 0, 0, 0, 0, 0, 0, + 537, 0, 0, 0, 14, 1, 0, 0, 547, 0, + 0, 0, 544, 543, 0, 0, 23, 0, 0, 25, + 0, 107, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 420, 0, 0, 0, 0, 344, 151, - 0, 0, 0, 0, 0, 0, 155, 154, 0, 0, - 175, 0, 181, 180, 0, 214, 214, 0, 0, 214, - 0, 0, 291, 0, 271, 270, 291, 291, 291, 0, - 249, 248, 0, 0, 291, 291, 291, 0, 251, 250, - 0, 0, 300, 299, 0, 0, 0, 302, 301, 0, - 339, 0, 327, 326, 339, 339, 352, 0, 367, 0, - 0, 0, 398, 0, 0, 398, 398, 0, 0, 398, - 415, 0, 416, 0, 0, 428, 427, 0, 426, 425, - - 436, 0, 453, 0, 0, 0, 479, 478, 0, 477, - 476, 0, 504, 504, 504, 504, 0, 0, 0, 0, - 0, 0, 0, 17, 0, 19, 18, 0, 419, 508, - 356, 0, 0, 296, 245, 0, 28, 440, 178, 16, - 488, 150, 0, 0, 295, 244, 27, 487, 0, 0, - 49, 555, 79, 0, 67, 66, 79, 0, 80, 0, - 98, 97, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 420, 357, 0, 0, - 0, 151, 0, 0, 142, 141, 0, 0, 157, 156, - 0, 0, 214, 214, 0, 0, 0, 0, 214, 179, - - 0, 291, 291, 291, 291, 0, 253, 252, 291, 291, - 291, 0, 0, 304, 303, 0, 339, 339, 339, 352, - 0, 353, 367, 0, 363, 362, 0, 398, 0, 380, - 379, 398, 398, 0, 0, 0, 0, 398, 415, 441, - 436, 0, 453, 0, 0, 0, 0, 0, 504, 504, - 504, 0, 509, 0, 0, 527, 0, 0, 0, 17, - 0, 508, 356, 0, 0, 229, 440, 178, 16, 0, - 0, 0, 0, 35, 49, 0, 0, 79, 0, 0, + 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 36, 0, 49, 0, 41, 40, + + 49, 0, 0, 0, 51, 0, 79, 0, 55, 54, + 0, 0, 79, 0, 0, 79, 79, 79, 0, 0, + 81, 0, 102, 102, 102, 0, 0, 104, 0, 0, + 109, 108, 127, 0, 0, 129, 0, 0, 0, 0, + 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 144, 0, 134, 133, 144, 144, 0, 0, 146, 0, + 159, 0, 151, 150, 159, 0, 0, 161, 0, 0, + 166, 165, 172, 0, 0, 174, 0, 185, 185, 0, + 0, 187, 0, 212, 212, 212, 0, 192, 191, 212, + 212, 0, 0, 214, 0, 0, 0, 223, 0, 0, + + 225, 0, 238, 0, 230, 229, 0, 232, 231, 0, + 0, 240, 0, 289, 289, 289, 289, 0, 257, 256, + 289, 0, 245, 244, 0, 0, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 0, 0, 291, 0, 0, + 306, 305, 0, 296, 295, 0, 0, 312, 312, 312, + 312, 0, 0, 314, 0, 337, 337, 337, 337, 0, + 319, 318, 0, 0, 337, 337, 0, 0, 339, 0, + 350, 0, 344, 343, 0, 0, 352, 0, 365, 0, + 357, 356, 365, 0, 0, 367, 0, 396, 0, 372, + 371, 396, 396, 396, 0, 0, 398, 0, 0, 0, + + 0, 0, 413, 0, 0, 415, 0, 0, 0, 0, + 434, 434, 0, 0, 434, 0, 0, 436, 0, 451, + 0, 441, 440, 0, 0, 453, 0, 0, 0, 0, + 0, 0, 0, 466, 0, 0, 0, 481, 481, 0, + 0, 0, 0, 483, 0, 502, 502, 502, 502, 502, + 0, 0, 504, 0, 0, 513, 0, 0, 515, 0, + 0, 520, 519, 0, 0, 526, 0, 0, 531, 530, + 537, 0, 0, 539, 0, 0, 0, 548, 542, 0, + 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, + 0, 216, 189, 0, 369, 0, 0, 317, 0, 0, + + 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 316, 0, 0, 0, 0, 0, 0, 0, 49, 0, + 0, 79, 0, 59, 58, 0, 0, 0, 57, 56, + 79, 0, 0, 79, 0, 102, 0, 0, 102, 0, + 127, 0, 128, 0, 0, 0, 217, 190, 370, 529, + 0, 0, 0, 0, 0, 0, 144, 144, 0, 0, + 0, 159, 159, 0, 0, 0, 0, 0, 0, 185, + 0, 212, 212, 0, 0, 212, 212, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 289, 289, 289, 289, + 0, 0, 0, 259, 258, 289, 289, 289, 289, 289, + + 289, 289, 289, 289, 0, 0, 308, 307, 312, 312, + 312, 312, 0, 337, 337, 337, 337, 0, 327, 326, + 337, 337, 0, 350, 0, 365, 365, 0, 396, 396, + 396, 396, 0, 0, 405, 404, 0, 403, 402, 413, + 0, 369, 0, 422, 421, 434, 434, 0, 420, 419, + 434, 0, 451, 0, 0, 460, 459, 0, 458, 457, + 0, 0, 473, 472, 481, 481, 0, 471, 470, 0, + 502, 0, 0, 502, 502, 502, 0, 0, 513, 0, + 0, 537, 0, 0, 0, 0, 12, 0, 545, 546, + 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, + + 189, 0, 0, 369, 0, 163, 0, 317, 0, 0, + 528, 0, 400, 0, 39, 0, 0, 0, 0, 0, + 316, 0, 38, 0, 30, 29, 0, 0, 43, 42, + 49, 0, 0, 79, 0, 61, 60, 79, 0, 65, + 64, 79, 0, 102, 0, 0, 0, 0, 0, 0, + 127, 0, 0, 0, 190, 0, 370, 529, 401, 0, + 0, 0, 401, 400, 144, 0, 0, 0, 138, 137, + 0, 159, 159, 0, 0, 168, 167, 0, 0, 181, + 180, 185, 0, 212, 212, 0, 196, 195, 0, 0, + 0, 0, 212, 0, 164, 0, 0, 219, 218, 0, + + 224, 0, 234, 233, 0, 289, 0, 0, 289, 289, + 0, 255, 254, 289, 289, 0, 0, 289, 289, 289, + 289, 289, 289, 0, 0, 0, 312, 312, 312, 0, + 337, 0, 0, 337, 337, 0, 0, 337, 0, 350, + 0, 365, 365, 0, 396, 396, 396, 0, 0, 396, + 0, 413, 0, 0, 434, 434, 434, 0, 451, 0, + 0, 481, 481, 0, 502, 0, 488, 487, 502, 502, + 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 0, 23, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 0, 163, 0, 0, + + 0, 53, 400, 341, 0, 39, 0, 517, 52, 0, + 0, 0, 0, 38, 0, 0, 49, 0, 0, 79, + 79, 79, 0, 102, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 95, 0, 127, 0, 0, 0, + 0, 401, 342, 0, 0, 0, 144, 0, 136, 135, + 0, 159, 0, 0, 0, 0, 0, 0, 0, 212, + 212, 0, 194, 193, 0, 0, 0, 212, 0, 213, + 164, 0, 0, 289, 0, 267, 266, 0, 0, 289, + 289, 289, 0, 253, 252, 0, 0, 289, 289, 289, + 289, 0, 0, 0, 0, 304, 303, 0, 0, 312, + + 0, 0, 0, 337, 0, 323, 322, 0, 0, 337, + 0, 321, 320, 337, 0, 338, 350, 0, 365, 365, + 0, 396, 396, 396, 0, 0, 0, 396, 0, 397, + 413, 0, 0, 0, 0, 0, 0, 434, 0, 451, + 0, 0, 0, 0, 0, 0, 0, 502, 502, 502, + 502, 0, 0, 0, 509, 508, 0, 0, 0, 533, + 532, 0, 538, 0, 0, 0, 0, 0, 0, 0, + 417, 0, 0, 0, 0, 294, 243, 518, 0, 28, + 0, 0, 0, 486, 53, 341, 148, 0, 517, 52, + 293, 242, 27, 485, 0, 0, 49, 0, 0, 50, + + 79, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 418, 0, 0, 0, 0, 342, 149, 0, 0, 0, + 0, 0, 0, 153, 152, 0, 0, 173, 0, 179, + 178, 0, 212, 212, 0, 0, 212, 0, 0, 289, + 0, 269, 268, 289, 289, 289, 0, 247, 246, 0, + 0, 289, 289, 289, 0, 249, 248, 0, 0, 298, + 297, 0, 0, 0, 300, 299, 0, 337, 0, 325, + 324, 337, 337, 350, 0, 365, 0, 0, 0, 396, + 0, 0, 396, 396, 0, 0, 396, 413, 0, 414, + + 0, 0, 426, 425, 0, 424, 423, 434, 0, 451, + 0, 0, 0, 477, 476, 0, 475, 474, 0, 502, + 502, 502, 502, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 19, 18, 0, 417, 506, 354, 0, 0, + 294, 243, 0, 28, 438, 176, 16, 486, 148, 0, + 0, 293, 242, 27, 485, 0, 0, 49, 553, 79, + 0, 67, 66, 79, 0, 80, 0, 98, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 357, 0, 0, 230, 0, 0, 0, 162, 0, - 214, 214, 0, 204, 0, 203, 214, 179, 0, 291, - 291, 291, 291, 291, 0, 0, 291, 291, 0, 292, - 0, 315, 339, 339, 339, 352, 0, 0, 0, 0, - 0, 398, 398, 398, 0, 384, 0, 383, 398, 415, - 441, 436, 0, 437, 0, 0, 0, 0, 0, 0, - 492, 491, 0, 0, 504, 504, 0, 505, 509, 0, - 0, 0, 0, 0, 24, 0, 0, 229, 0, 0, - 0, 49, 0, 0, 0, 79, 0, 0, 0, 0, + 0, 0, 0, 418, 355, 0, 0, 0, 149, 0, + 0, 140, 139, 0, 0, 155, 154, 0, 0, 212, + + 212, 0, 0, 0, 0, 212, 177, 0, 289, 289, + 289, 289, 0, 251, 250, 289, 289, 289, 0, 0, + 302, 301, 0, 337, 337, 337, 350, 0, 351, 365, + 0, 361, 360, 0, 396, 0, 378, 377, 396, 396, + 0, 0, 0, 0, 396, 413, 439, 434, 0, 451, + 0, 0, 0, 0, 0, 502, 502, 502, 0, 507, + 0, 0, 525, 0, 0, 0, 17, 0, 506, 354, + 0, 0, 227, 438, 176, 16, 0, 0, 0, 0, + 35, 49, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 355, 0, 0, 228, + 0, 0, 0, 160, 0, 212, 212, 0, 202, 0, + 201, 212, 177, 0, 289, 289, 289, 289, 289, 0, + 0, 289, 289, 0, 290, 0, 313, 337, 337, 337, + 350, 0, 0, 0, 0, 0, 396, 396, 396, 0, + 382, 0, 381, 396, 413, 439, 434, 0, 435, 0, + 0, 0, 0, 0, 0, 490, 489, 0, 0, 502, + 502, 0, 503, 507, 0, 0, 0, 0, 0, 24, + 0, 0, 227, 0, 0, 0, 49, 0, 0, 0, + 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 0, 188, 214, 214, - 206, 205, 0, 0, 0, 291, 291, 291, 291, 291, - 0, 281, 280, 291, 0, 0, 339, 339, 0, 0, - 352, 0, 361, 360, 0, 368, 0, 376, 375, 398, - 398, 398, 386, 385, 0, 0, 415, 436, 0, 0, - 0, 0, 454, 0, 0, 0, 496, 495, 0, 0, - 0, 0, 0, 516, 0, 0, 0, 0, 457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 79, 0, 0, 0, 0, 88, 0, 0, 0, 0, - - 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 458, 0, 0, - 214, 0, 0, 0, 208, 207, 0, 241, 291, 291, - 291, 0, 0, 291, 291, 0, 279, 278, 339, 0, - 0, 0, 335, 334, 0, 0, 398, 398, 398, 0, - 388, 387, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 494, 493, - 0, 0, 0, 0, 457, 133, 0, 0, 0, 45, - 44, 0, 0, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, + 186, 212, 212, 204, 203, 0, 0, 0, 289, 289, + 289, 289, 289, 0, 279, 278, 289, 0, 0, 337, + 337, 0, 0, 350, 0, 359, 358, 0, 366, 0, + 374, 373, 396, 396, 396, 384, 383, 0, 0, 413, + 434, 0, 0, 0, 0, 452, 0, 0, 0, 494, + 493, 0, 0, 0, 0, 0, 514, 0, 0, 0, + 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 79, 0, 0, 0, 0, 88, 0, + + 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, + 0, 212, 0, 0, 0, 206, 205, 0, 239, 289, + 289, 289, 0, 0, 289, 289, 0, 277, 276, 337, + 0, 0, 0, 333, 332, 0, 0, 396, 396, 396, + 0, 386, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 492, + 491, 0, 0, 0, 0, 455, 131, 0, 0, 0, + 45, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 458, 134, 0, 0, 0, 214, - 0, 210, 209, 291, 291, 0, 0, 0, 285, 284, - 0, 0, 291, 339, 0, 331, 330, 0, 348, 347, - 398, 0, 0, 398, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 456, 132, 0, 0, 0, 212, 0, + 208, 207, 289, 289, 0, 0, 0, 283, 282, 0, + 0, 289, 337, 0, 329, 328, 0, 346, 345, 396, + 0, 0, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 470, 133, 84, 83, + 0, 0, 0, 0, 0, 468, 131, 84, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 94, 0, 0, 0, 93, 0, 0, 0, - 0, 0, 111, 119, 0, 0, 0, 0, 0, 110, - - 118, 0, 0, 471, 134, 0, 0, 200, 199, 214, - 291, 291, 0, 283, 282, 0, 287, 286, 291, 339, - 398, 0, 382, 381, 398, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 445, 0, 0, 444, 0, - 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 470, 84, 83, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 63, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, - 112, 0, 0, 471, 0, 147, 214, 291, 291, 0, - 0, 339, 0, 0, 0, 0, 0, 0, 0, 0, - + 0, 94, 0, 0, 0, 93, 0, 0, 0, 0, + 0, 111, 119, 0, 0, 0, 0, 110, 118, 0, + + 469, 132, 0, 0, 198, 197, 212, 289, 289, 0, + 281, 280, 0, 285, 284, 289, 337, 396, 0, 380, + 379, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 443, 0, 0, 442, 0, 465, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, + 84, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 62, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 113, 0, 0, 0, 112, 0, 469, 0, + 145, 212, 289, 289, 0, 0, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 75, 71, 0, 0, 74, 70, 0, 92, 0, 0, - 91, 0, 0, 0, 103, 0, 0, 0, 0, 0, - 0, 0, 0, 214, 291, 291, 0, 0, 0, 339, - 0, 378, 377, 0, 0, 0, 411, 0, 410, 0, - 432, 0, 431, 0, 447, 449, 446, 448, 0, 484, - 498, 0, 497, 0, 0, 0, 0, 12, 0, 12, - 0, 0, 0, 0, 0, 86, 90, 85, 89, 125, - 0, 0, 123, 124, 0, 0, 122, 214, 291, 291, - - 0, 0, 0, 0, 339, 0, 0, 0, 0, 409, - 408, 430, 429, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 115, 0, 0, 114, 0, 0, + 0, 0, 0, 0, 0, 75, 71, 0, 0, 74, + 70, 0, 92, 0, 0, 91, 0, 0, 0, 103, + 0, 0, 0, 0, 0, 0, 212, 289, 289, 0, + 0, 0, 337, 0, 376, 375, 0, 0, 0, 409, + 0, 408, 0, 430, 0, 429, 0, 445, 447, 444, + 446, 0, 482, 496, 0, 495, 0, 0, 0, 0, + 12, 0, 12, 0, 0, 0, 0, 0, 86, 90, + 85, 89, 123, 0, 121, 122, 0, 120, 212, 289, + 289, 0, 0, 0, 0, 337, 0, 0, 0, 0, + + 407, 406, 428, 427, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 115, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 69, 0, 68, 0, 0, 121, - 0, 120, 0, 202, 201, 0, 277, 276, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 333, 332, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 69, 0, 68, 0, 0, 0, 0, + 200, 199, 0, 275, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 331, 330, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 498, 497, 0, + 73, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 500, 499, 0, 73, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 116, 0, 0, 0, 0, 0, 0, 261, 0, + 0, 260, 0, 0, 388, 0, 0, 387, 0, 0, + 0, 0, 0, 265, 0, 264, 0, 390, 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 116, 0, 0, 0, 0, 0, - 0, 263, 0, 0, 262, 0, 0, 390, 0, 0, - 389, 0, 0, 0, 0, 0, 267, 0, 266, 0, - 392, 0, 391, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 273, 0, 272, 0, 0, + 0, 0, 271, 0, 270, 0, 0, 0, 0, 0, + 0, 273, 272, 263, 262, 392, 391, 0, 0, 0, - 0, 0, 0, 0, 275, 274, 265, 264, 394, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -775,8 +774,7 @@ static yyconst flex_int16_t yy_accept[3299] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 0 - + 0, 0, 0, 13, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -823,7 +821,7 @@ static yyconst flex_int32_t yy_meta[75] = 5, 5, 5, 5 } ; -static yyconst flex_int16_t yy_base[3779] = +static yyconst flex_int16_t yy_base[3766] = { 0, 0, 0, 0, 3, 6, 9, 12, 29, 16, 19, 14, 17, 33, 36, 49, 55, 45, 61, 66, 72, @@ -841,2368 +839,2373 @@ static yyconst flex_int16_t yy_base[3779] = 1149, 1153, 1191, 1253, 1211, 1214, 1315, 1383, 1217, 1221, 1451, 1518, 1224, 1273, 1276, 1279, 1283, 1286, 1335, 1338, 1585, 1647, 1341, 1345, 1709, 1778, 1348, 1403, 1847, 0, - 1406, 1409, 1921, 1988, 1413, 1416, 2055, 2122, 1471, 1474, - 2189, 2246, 1477, 1481, 2303, 2363, 1538, 1541, 2423, 2490, - 1544, 1548, 1605, 1608, 1611, 1615, 1618, 1667, 2557, 2624, - 1670, 1673, 1677, 1680, 1729, 1732, 1735, 1739, 2691, 2758, - 1742, 1798, 1801, 1804, 1808, 1811, 1941, 1944, 2825, 2882, - - 1947, 1951, 2939, 3006, 1954, 2008, 2011, 2014, 2018, 2021, - 2075, 2078, 3073, 3140, 2081, 2085, 2142, 2145, 2148, 2152, - 2209, 2212, 3207, 3274, 2215, 2219, 2266, 2269, 2272, 2276, - 2323, 2326, 3341, 3411, 2329, 2333, 3481, 3538, 2336, 2383, - 2386, 2389, 2393, 2396, 2443, 2446, 3595, 3665, 2449, 2453, - 0, 0, 9023,12038,12038, 95, 100, 29, 41,12038, - 103, 51,12038,12038, 9012,12038,12038, 9001,12038, 9012, - 9012, 202,12038,12038,12038,12038, 9010, 9006, 8961, 153, - 12038, 161, 8987, 0, 145,12038, 8949,12038, 165, 3731, - 73, 2462, 315, 357, 8989, 8936,12038, 168, 8975, 0, - - 152,12038, 8937,12038, 261, 8981, 31,12038, 266, 8968, - 0, 245,12038, 8930, 8934, 8928, 421, 8933,12038, 269, - 8959, 0, 340,12038, 8921, 8921, 271, 8923, 238,12038, - 441, 484,12038, 504, 8947, 0, 401,12038, 8906, 8908, - 8894,12038, 561, 548,12038, 571, 8939, 0, 481,12038, - 8906, 8890,12038, 628, 3795, 8888, 163, 2456, 567, 206, - 38, 8939, 954, 2465, 639, 907, 437, 79,12038, 634, - 8926, 0, 546,12038, 8882, 8892, 8876, 8881,12038, 638, - 313, 368,12038, 697, 8917, 0, 549,12038, 8869, 8879, - 8857,12038, 704, 426, 497,12038, 707, 8905, 0, 747, - - 12038, 8872, 8874,12038, 767, 753,12038, 773, 8349, 0, - 757,12038, 8319, 8293,12038, 831, 818,12038, 838, 8345, - 0, 758,12038, 8294, 8300, 8310, 8298, 8292,12038, 841, - 559, 825, 530,12038, 906, 8338, 0, 815,12038, 8308, - 12038, 914, 891,12038, 977, 8335, 0, 953,12038, 8284, - 8294, 8280,12038, 981, 965,12038, 1021, 8316, 0, 966, - 12038, 8265, 203, 8270, 8275, 378, 85, 311, 972,12038, - 1040, 1025,12038, 1048, 8305, 0, 1026,12038, 8249, 8267, - 8268, 157, 8263, 8242,12038, 1088, 1092,12038, 1105, 8284, - 0, 1033,12038, 8232, 8230, 8236, 8234, 8236, 8220, 8207, - - 12038, 1112, 1154,12038, 1115, 8254, 0, 1089,12038, 8209, - 8219,12038, 1118, 1160,12038, 1174, 8249, 0, 1090,12038, - 8215, 8211, 8208,12038, 1180, 1228,12038, 1183, 8236, 0, - 1158,12038, 8205, 8190, 8192, 15,12038, 1186, 564, 814, - 12038, 1241, 8217, 0, 1225,12038, 8169, 181,12038, 1248, - 1294, 432, 303,12038, 1305, 8214, 0, 1226,12038, 8166, - 8138, 299,12038, 1309, 1224, 350,12038, 1365, 8184, 0, - 1293,12038, 8146, 8138,12038, 1368, 1352,12038, 1372, 8169, - 0, 1360,12038, 8120, 8116,12038, 1376, 1426, 676,12038, - 1433, 8161, 0, 1418,12038, 8112, 8103, 8107,12038, 1438, - - 1436, 685,12038, 1503, 8151, 0, 1423,12038, 8093, 8098, - 8103, 8095, 8088,12038, 1507, 1504, 560, 899,12038, 1510, - 8125, 0, 1428,12038, 8095,12038, 1568, 1622,12038, 1574, - 8119, 0, 1482,12038, 8086,12038, 1577, 963, 1007,12038, - 1635, 8116, 0, 1496,12038, 8082, 8084,12038, 1638, 1623, - 1697, 677, 8059,12038, 8115, 8097,12038,12038,12038, 1690, - 253, 8048, 8046, 8039, 8087, 8045,12038, 0, 8030, 8027, - 8038, 8005, 104, 1383, 8006, 8005, 7987, 7987, 889, 1636, - 1037, 7975, 7965, 1500, 1105, 7991, 1691, 7962, 1699, 7950, - 1709, 1710, 1711,12038, 0, 7955, 7956,12038, 0, 7948, - - 2088, 7941, 666, 7936, 7979,12038, 0, 7934, 2155, 7922, - 7937, 7923, 7925, 7922, 7922, 7902,12038, 0, 7914, 7903, - 7905, 7885,12038, 0, 2222, 7882, 7924, 7906, 172, 7875, - 7874, 7879, 1767, 1297, 7866, 1768, 7890, 707, 724, 814, - 841, 1567, 1782, 1629, 888,12038, 0, 7866, 2279, 7871, - 7848, 7843,12038, 0, 7847, 2456, 7843, 7832,12038, 0, - 2514, 7837, 7826,12038, 0, 7825, 7819, 7814,12038, 0, - 7816, 373, 2519, 7793, 7804, 7796, 897,12038, 0, 7789, - 7790,12038, 0, 7773, 2525, 2577, 7786,12038, 0, 7792, - 7791, 2580, 7768, 2583, 7765, 7766, 7763, 7753, 7760, 7760, - - 7741, 7756, 7753, 7743, 7745,12038, 0, 2586, 2589, 7726, - 7713, 7729, 7724, 7720, 7715,12038, 0, 7716, 7715, 7695, - 2644, 7688, 7683, 7704, 7687,12038, 0, 7682, 2647, 7671, - 12038, 0, 7664, 2650, 7651, 7668,12038, 0, 7654, 2653, - 7637, 7655, 7653, 7637,12038, 0, 7628, 7642, 7630, 7620, - 7627,12038, 0, 7615, 7626, 7622, 7610, 7644,12038, 0, - 7599, 2656, 7600,12038, 0, 7591, 7606, 7598,12038, 0, - 7577, 7595, 7588, 7577,12038, 0, 7564, 7557, 7555, 7565, - 7559, 7543, 7539,12038, 0, 7537, 7547,12038, 0, 2711, - 7543,12038, 0, 2714, 7528, 7517, 7560, 7568, 1537, 7507, - - 12038, 1823, 0, 7493, 7493, 7537, 7532, 7485,12038, 7497, - 7477, 2719, 2722, 1971, 7487, 7490, 7454, 7466, 7446, 7450, - 7441, 7439, 7451, 7431, 7423, 7422, 7429, 7432, 7412, 7410, - 7390, 7388, 7401, 7382, 7380, 1980, 7388, 7364, 7381, 7372, - 7349, 7355, 7350, 2725, 2732, 7348, 2781, 2038, 7336, 7368, - 2786, 2789,12038, 7337, 2793, 2107, 2799, 7327, 2845, 7330, - 7330, 7333, 2848, 2855, 7313, 7320, 7310, 2858, 2903, 2906, - 2174, 7292, 2910, 2916, 2353, 7306, 7291, 7281, 7281, 7281, - 7279, 7271, 7266, 2413, 7264, 7262, 7254, 7251, 7227, 2913, - 2539, 7240, 7233, 2959, 2962, 7217, 2968, 2608, 7230, 2972, - - 3029, 2986, 2675, 7229, 3034, 3037, 7220, 7202, 3040, 3043, - 7193, 7183, 7194, 3099, 2745, 7189, 7169, 3102, 3109, 7165, - 7155, 7165, 3112, 3165, 7154, 3105, 2813, 3160, 2991, 3171, - 3174, 7154, 1910, 3178, 3062, 7157, 3186, 3197, 3228, 7151, - 7133, 7143, 7140, 7136, 7123, 7124, 7120, 7133, 3231, 3236, - 3239, 3246, 3295, 3298, 3306, 3313, 3320, 3376, 3373, 3242, - 3361, 7113, 37, 7103, 3365, 3387, 3432, 7109, 7093, 3309, - 3444, 7087, 3435, 3395, 3439, 3458, 7096, 3501, 3463, 7093, - 3504, 3511, 7088, 3507, 3471, 7082, 7057, 7054, 3514, 3560, - 3563, 3567, 3570, 3573, 3618, 7055, 3621, 3641, 3630, 3644, - - 3633, 3686, 7061, 3694, 3652, 3697, 3700, 3712, 3725, 3730, - 3735, 3743, 3757, 3764, 3738, 3769, 7056, 7037, 7043, 7048, - 7030, 3799, 3802, 7040, 7002, 3808, 3811, 3775, 3823, 3833, - 3837, 3845, 3863, 6998, 3871, 3876, 7042,12038,12038, 1138, - 7001,12038, 7042, 7018, 6967,12038,12038, 6964, 6959, 6969, - 3879, 3882,12038, 3885, 1704, 6950, 6931, 6939, 6947, 6934, - 6913, 6925, 1771, 6900, 6904, 6904, 6890, 6887, 6883, 6877, - 446, 6892, 6871, 6872, 6885, 6864, 6861, 2047, 6854, 6843, - 6848, 6834, 1109, 6842, 3890, 3904, 3908,12038, 3911, 3914, - 3917,12038,12038, 3933, 6865, 3936, 3941,12038, 3944, 6819, - - 3951,12038,12038, 3947, 3965, 3973, 3976, 3979, 6829, 3987, - 6820, 3995, 3998,12038, 4001, 6816, 4005, 6808, 4008, 4023, - 12038, 4027, 4030,12038,12038, 6803, 4038, 4042,12038, 4046, - 6795, 6798, 6802, 2240, 6782, 6785, 1510, 6765, 6762, 6778, - 6776, 6756, 6754, 6761, 4050,12038,12038, 6752, 4065, 4068, - 4071,12038, 4075, 6758, 4083,12038,12038, 6779, 4078, 4097, - 12038, 4100, 4103,12038,12038, 4111, 4119, 4122,12038, 4125, - 4129, 4132, 4150, 4153,12038, 4156, 6733, 6739, 4162, 4165, - 12038,12038, 6723, 6735, 4175, 4180,12038, 4183, 6723, 6720, - 4186, 4189, 4194,12038, 4208, 4204, 4213,12038,12038, 4223, - - 12038,12038, 4231, 4234,12038, 4237, 6720, 6694, 6714, 6703, - 4240,12038,12038, 4256, 4259,12038,12038, 4267, 4270, 6686, - 6702, 6681, 6689, 6693, 6674, 6669, 6652, 6637, 4278, 4281, - 12038, 4285, 4288,12038,12038, 4304,12038,12038, 4312, 4315, - 6627, 6634, 6635, 6628, 4323, 4326,12038, 4330, 6614, 6611, - 6597, 6588, 4333,12038,12038, 4345, 4349, 6573, 6580, 4357, - 4363,12038, 4366, 6579, 4369,12038,12038, 4385, 4388,12038, - 4391, 6551, 4394,12038,12038, 6559, 4410, 4413,12038, 4418, - 6546, 4422,12038,12038, 6550, 6554, 6552, 4432, 4437,12038, - 4441, 4444, 4447, 4462, 4468, 6549, 4476, 4480,12038, 4484, - - 6541, 4487, 4505, 6530, 6519, 4491, 4513, 6530, 4521, 4524, - 12038, 4527, 6531, 4530,12038,12038, 4546, 4552,12038, 4555, - 4558, 4561, 4576, 4579, 4587, 4594,12038, 4598, 4601, 4606, - 6513, 6504, 4619, 4622, 4630, 4633,12038, 4637, 6494, 4640, - 6507, 6505, 6484, 4643, 4652,12038, 4662, 6472, 6486, 4665, - 4671,12038, 4674, 4677,12038,12038, 4685, 4693,12038, 4696, - 4700,12038,12038, 6483, 4708, 4715,12038, 4718, 1013, 4728, - 12038,12038, 6517, 6516, 6477, 6455, 4737, 6446, 6437, 6437, - 6408, 6397, 6357, 6340, 2297, 2549, 6327, 2552, 6310, 6270, - 2616, 6281, 6266, 2619, 6255, 6262, 6256, 6192, 6159, 6151, - - 6100, 6066, 6044, 2683, 6002, 5974, 4740, 4758, 4743, 4749, - 4767, 5914, 5881, 4775, 5686, 4780,12038,12038, 4788, 4795, - 4806,12038,12038, 17, 4814, 4818, 36, 4826, 132, 4832, - 4835, 4845, 4850, 256, 4752,12038, 313, 349, 338, 2686, - 2863, 3000, 2753, 393, 429, 432, 460, 497, 503, 556, - 4853, 4856, 4859, 4877, 581, 632, 4880, 4883, 4886, 4901, - 4904, 4907, 633, 4915, 680, 698, 4922, 4925, 4934, 4945, - 4948, 699, 746, 4952, 4956, 4970, 4973, 4977, 4985, 772, - 4992, 756, 782, 4995, 4998, 5006,12038,12038, 793, 843, - 5015, 825, 853, 854, 986, 1050, 1033, 5018, 5021,12038, - - 12038, 5029, 5033, 5037, 5040, 5043, 1090, 5047, 1139, 1165, - 5058,12038,12038, 5068, 1186, 5071, 1184, 5074, 1212, 1242, - 5077, 1238, 1245, 1240, 5080, 5086, 5105,12038,12038, 5113, - 12038,12038, 1235, 5100, 3135, 5121,12038,12038, 1237, 1280, - 5129,12038,12038, 1287, 5137, 1314, 5144, 5147,12038,12038, - 5156,12038,12038, 5167, 5170,12038,12038, 1331, 1363, 5179, - 12038,12038, 5187, 1365, 5190, 5193, 1357, 1369, 1399, 5202, - 1389, 5208, 5211, 5215, 5221, 5226, 1538, 1447, 5230,12038, - 1462,12038,12038, 1425, 1428, 5235, 1423, 1440, 1471, 1487, - 1502, 1531, 1546, 2877, 1564, 1573, 3131, 1594, 3265, 1597, - - 3269, 1600, 1619, 3332, 1626, 3404, 1635, 3533, 1642, 1664, - 1695, 1696, 1715, 3368, 1701, 4495, 5239,12038,12038, 5254, - 5257,12038,12038, 1737, 1769, 5268, 1749, 5273,12038,12038, - 1758, 5289,12038,12038, 1753, 5282, 1764, 5301, 2898, 2944, - 5309, 5313, 5322, 1784, 1773, 1780, 1777, 3588, 1786, 3624, - 3761, 5327, 1882, 1885, 1894, 5330, 5333, 1895, 5336, 5344, - 5354,12038,12038, 5362, 1896, 5365, 5368, 5374,12038,12038, - 5383, 5388,12038,12038, 5402, 5398, 1916, 1914, 5406,12038, - 12038, 5420, 5423, 5431, 5434, 1925, 5442, 5445, 1931, 5450, - 12038,12038, 5463,12038, 5466,12038,12038, 5474, 1936, 5477, - - 5482, 5495, 1938, 5498,12038,12038, 1953, 1976, 5506, 5509, - 5517, 1968, 1982, 1976, 1979, 5524, 5527, 5530, 5535, 5548, - 5551, 5554, 5557, 1993, 5560, 5572, 5580, 1991, 5583, 5587, - 2017, 5601, 2024, 5604, 2042, 2022, 5610, 2045, 2025, 2045, - 5613, 5625, 2054, 5633, 2048, 5636, 2066, 5639, 5642, 5645, - 5648, 2061, 5667, 5663, 5671, 5674, 5677, 2057, 5682,12038, - 12038, 2064, 2078, 2085, 5692, 2108, 5697, 5700, 5716, 5719, - 5722, 5725, 5744, 2144, 2167, 2185,12038, 2096, 5747, 5750, - 2112, 2105, 2113, 2264, 2116, 2119, 5753, 2131, 2167, 2160, - 5756, 2176, 2166, 2167, 5759, 5765, 5769, 2186, 5776, 2194, - - 5779, 5782, 2194, 2211, 2232, 2221, 5785, 2238, 5788, 2240, - 2273, 5791, 2233, 5795, 2262, 5798, 5801, 2312, 2306, 2372, - 2307, 2323, 2310, 2432, 2312, 5813,12038,12038, 5821, 5824, - 2299, 2296, 2383, 2302, 5827, 5830, 2308, 2384, 2443, 5833, - 5842,12038,12038, 5851, 5854, 5858, 5861, 5872, 5876, 5879, - 5882, 5891, 2305, 2330, 5898,12038,12038, 5906, 2367, 2372, - 2355, 5914,12038, 5917, 2363, 5921, 2382, 5926,12038,12038, - 5934, 5940, 2406, 2418, 2413, 5948,12038,12038, 5956, 5959, - 5967, 2419, 2429, 2425, 5970, 5974, 5988, 5991,12038,12038, - 5999, 6003, 6011, 6017, 6020, 6029, 2428, 6036,12038,12038, - - 6044, 6048, 2437, 6056,12038,12038, 2431, 6064,12038, 2440, - 6067, 2444, 6070, 6073, 2446, 6076, 2477, 6088, 2496, 2498, - 2478, 6096,12038, 2482, 6099, 2478, 6102, 6105, 6123, 6126, - 2492, 6135, 2510, 6141, 6144, 6147, 6150, 6165, 6168, 6176, - 2532, 2534, 2529, 2544, 6179, 2544, 6184,12038,12038, 6198, - 6202, 6206,12038,12038, 6217,12038, 2587, 2699, 2595, 2555, - 6221, 6224, 6232, 6245, 2572, 2609, 2625, 2602, 6251, 6256, - 6259, 2605, 6262, 2606, 2620, 2613, 6265, 6268, 6271, 6274, - 2617, 6277, 6280, 6283, 6286, 6289, 6292, 2619, 6297, 2626, - 2661, 6300,12038, 2654, 6304, 6307, 2682, 6322, 6325, 6328, - - 2697, 2701, 2701, 2709, 2710, 2739, 2741, 2741, 2751, 2744, - 6336, 6343, 6349, 6357, 2745, 2760, 2744, 2746, 6361, 6364, - 6367, 6370, 6378, 6381, 6386, 6399,12038,12038, 6407, 6412, - 12038, 6415,12038,12038, 6426, 2751, 2746, 3024, 3034, 2760, - 2768, 6431, 2763, 6434,12038,12038, 2762, 2781, 2805, 6446, - 12038,12038, 6454, 6459, 2802, 2792, 2803, 6468,12038,12038, - 6476, 6480,12038,12038, 6488, 6491, 6499,12038,12038, 6507, - 2809, 6510,12038,12038, 2802, 2813, 2806, 6518, 2820, 6521, - 6526, 6541, 2842, 6544, 6547, 2868, 2860, 3035, 3096, 2866, - 2882, 6556,12038, 2875, 6562,12038,12038, 6575,12038,12038, - - 2887, 6570, 2906, 6584, 6589, 6592,12038,12038, 6604,12038, - 12038, 6612, 6616, 6622, 6626, 6634, 6640, 2910, 6644, 6647, - 6652, 3009, 3069, 6655, 6659,12038,12038, 6667, 6674, 6677, - 6680, 2914, 2914, 6686, 6694, 2925, 6697, 6700, 6706, 6709, - 6712, 6715, 2928, 2936, 6718, 6721, 6727, 6730, 2937, 6733, - 2933,12038, 6736, 6739,12038,12038, 6747, 6754,12038, 6758, - 12038,12038, 2997, 2988, 3008, 3003, 3024, 3030, 3016, 3041, - 3063, 3070, 6766, 6769, 6752, 6757, 6794, 6798, 3032, 3030, - 3058, 6801, 3053, 6804,12038,12038, 6814, 6817,12038,12038, - 6828, 6833, 3069, 3074, 3103, 3150, 3138, 3157, 3117, 6836, - - 6839, 3114, 3129, 3136, 3323, 6843,12038,12038, 6852, 3133, - 3145, 6861, 6864,12038,12038, 6872, 3145, 3151, 3170, 3183, - 6875,12038, 6880, 6885,12038,12038, 6894, 6900, 6903,12038, - 12038, 6913, 6918, 3230, 3253, 3233, 3255, 6921, 3216, 6924, - 3241, 6931, 6927, 6939, 6951, 6958, 6954, 6963, 6973, 6980, - 6983, 6986, 6991, 7001, 7005,12038, 7008, 3286, 3283, 7013, - 7020, 7016, 7027, 3242, 3250, 7035, 7039, 7042, 7045, 3246, - 3264, 3265, 7048,12038, 3258, 7051, 7054, 3300, 3339, 3337, - 3351, 3346, 3362, 3359, 3355, 3370, 3361, 3402, 7062, 3384, - 3388, 3463, 3386, 3381, 3395, 3393, 3398, 3518, 3393, 3394, - - 3411, 7071, 3408, 3408, 7074, 3406, 7077, 7081,12038, 7084, - 3444, 3452, 3516,12038, 3516,12038, 7087, 7090, 7096, 3461, - 3482, 3471, 3483, 3512, 7106, 7109, 3508, 7117, 7124,12038, - 7127,12038, 3511, 3516, 7130, 3521, 7135, 7154, 7139, 7148, - 7162, 7170, 7173, 7176, 3588,12038, 3602,12038, 7179, 3558, - 7182, 3559, 7197,12038, 7200, 7203, 7211, 7218, 7223, 7226, - 12038,12038, 7237, 7242, 7250, 7255, 7258,12038, 7261, 7264, - 3631, 3630, 3644, 7268,12038, 3560, 3577, 7273, 3575, 3604, - 3606, 7277, 7288, 3795, 4026, 3599, 3662, 3672, 3671, 3687, - 3704, 3688, 3697, 3697, 3701, 3715, 7296, 3657, 3672, 3685, - - 3689, 3689, 3694, 3686, 3700, 3712, 3711, 3715, 3722, 3725, - 3720, 3724, 3743, 7299, 3754, 7302, 7305,12038, 3748, 7308, - 12038,12038, 7311, 7315, 7329, 3750, 3770, 3779, 7332, 3775, - 7335,12038,12038, 3797, 7343, 7350, 3785, 7361, 7364, 7367, - 7375, 7382,12038,12038, 7393,12038, 7396,12038,12038, 7404, - 7407, 7412,12038,12038, 7415, 7418, 7426, 7433, 7437, 3835, - 4268, 7445,12038, 7451, 7454, 7464,12038,12038, 7460, 7474, - 7482, 7485, 7493,12038, 3878, 3870, 3910, 3803, 7496, 3842, - 3846, 3850, 7501, 7505, 3865, 3868, 3951, 3884, 3889, 4000, - 3867, 3916, 3916, 3914, 3921,12038, 3940, 3928, 3939, 3945, - - 12038, 7519, 3927, 3954, 3941, 3956, 3964, 3966, 3971, 3956, - 3978, 3965, 3995, 4004, 4007, 4016, 4015, 7522, 4037, 7525, - 7528, 7531, 7534, 7549,12038,12038, 7557,12038, 4045, 4031, - 7560, 7563, 7581, 7567, 4045, 7589,12038,12038, 4049, 7597, - 7600, 7608,12038,12038, 7616, 7619, 7627, 7630, 7634, 7638, - 12038,12038, 7648, 7652, 7660, 7666, 4072, 4074, 4074, 4080, - 4082, 4082, 7674, 7678, 7686, 4112, 4193, 7697,12038,12038, - 4152, 4120, 7705, 4088, 7571, 7708, 4075, 4076, 7711,12038, - 12038, 4124, 4112, 4114, 4133, 4158, 4164, 4166, 4174, 7719, - 4164, 4191, 4215, 4208, 4205, 4225, 4239, 4230, 7726, 4185, - - 4188, 4204, 4258, 4260, 4244, 4218, 4227, 4229, 4247, 4291, - 4293, 4288, 4252, 4267, 7729, 7732, 7737, 7740, 7746, 4268, - 7758,12038,12038, 4269, 4278, 7766, 7769, 7777,12038,12038, - 7785, 7789, 4267, 4287, 7797,12038,12038, 7805,12038,12038, - 7813, 7816, 7819, 7827, 7834, 4339, 4364, 7845, 4392, 4397, - 4301, 4310, 4350, 4314, 4327, 4354, 7853, 7856, 4346, 4353, - 4351, 4356, 4438, 7859, 7865, 7868, 7878, 7887, 7890, 7893, - 4350, 4375, 4377, 4365, 4371, 4381, 4385, 4379, 7899, 7902, - 4394, 4399,12038, 4424, 4426, 4429,12038, 4432, 7910, 4414, - 4400, 4467,12038,12038, 4426, 4424, 4432, 4433, 4493,12038, - - 12038, 4456, 4460, 7913, 7917, 7923, 7929,12038,12038, 4456, - 4461, 4463, 7938,12038,12038, 7946,12038,12038, 7954, 4464, - 7957, 7960,12038,12038, 7968, 4499, 4511, 4502, 4514, 4506, - 4519, 4510, 4525, 4517, 4542,12038, 4534, 4545,12038, 7977, - 12038, 7980, 4547, 4535, 4550, 4545, 4566, 7986, 7989, 8008, - 8033, 8080, 7999, 8016, 8019, 4562, 4586, 4588, 4559, 4581, - 4602, 4604, 4576, 8023,12038,12038, 4613, 4594, 4597, 4639, - 4616, 4618, 8044, 4586, 4592,12038, 4593, 4604, 4604, 4605, - 12038, 4617, 4633, 8053, 8056,12038, 4632, 4633, 4656, 8059, - 8063, 4648, 8071, 8100, 8091, 8109, 4708, 4676, 4714, 4685, - - 4720, 4688, 4724, 4695, 4730, 4731, 4741, 4756, 8117, 4760, - 4734, 4766, 4740, 4765, 8126, 4782, 4791, 8146, 8193, 4773, - 12038,12038, 4755, 4780,12038,12038, 4758,12038, 4800, 4807, - 12038, 4805, 4810, 8120,12038, 4817, 4776, 4779, 4834, 4833, - 4794, 4792, 4841, 4813, 4814, 4796, 8166, 4893, 4903, 4818, - 8174,12038,12038, 8182, 4906, 4930,12038, 4867,12038, 4865, - 12038, 4870,12038, 4868,12038,12038,12038,12038, 8139,12038, - 12038, 4869,12038, 4871, 4878, 4964, 4894, 4888, 5045, 4887, - 8204, 4884, 4886, 4907, 4914,12038,12038,12038,12038,12038, - 4961, 4892,12038,12038, 4982, 4909,12038, 8213, 8216, 8219, - - 5088, 4937, 5122, 4953, 8224, 5139, 4974, 5145, 4984,12038, - 12038,12038,12038, 4988, 4990, 8227, 5023, 5034, 5048, 8242, - 5052, 5046, 5060, 5070,12038, 5044, 5089,12038, 5047, 5089, - 8246, 8249, 8257, 8264, 8275, 8278, 5061, 5080, 5096, 5081, - 5093, 5112, 8286, 8294, 5103, 5119, 5132, 5115, 5133, 5153, - 5137, 5138, 8289, 5164,12038, 5164,12038, 5167, 5157,12038, - 5169,12038, 8304,12038,12038, 8312,12038,12038, 8320, 5225, - 5260, 5184, 5193, 5206, 5210, 5216, 5213, 8328,12038,12038, - 5217, 5229, 5227, 5230, 5235, 5235, 5272, 5272, 5298,12038, - 5288, 5287, 5241, 5245, 5284, 5279, 5287, 5285, 5290, 5302, - - 5315, 5314, 5324, 5325, 5322, 5329, 5333, 5331, 5337, 5347, - 12038,12038, 5359,12038,12038, 5321, 5328, 5349, 5373, 5367, - 5391, 5377, 5375, 5394, 5383, 5387, 5405, 5394, 5400, 5417, - 5418, 5416, 5433, 5453, 5454, 5452, 5426, 5433, 5437, 5444, - 5461, 5452, 5484, 5466, 5458, 5494, 5479, 5469, 5510, 5491, - 5486, 5515, 5520,12038,12038, 5505, 5516, 5515, 5522, 5559, - 5533,12038, 5559, 5536,12038, 5565, 5539,12038, 5571, 5555, - 12038, 5589, 5555, 5569, 5560, 5573,12038, 5574,12038, 5575, - 12038, 5584,12038, 5592, 8336, 5594, 5616, 5599, 5617, 5589, - 5610, 5611, 5615, 8339, 5656,12038, 5654,12038, 5666, 5673, - - 5686, 5689, 5687, 5718,12038,12038,12038,12038,12038,12038, - 5819, 5822, 5829, 5846, 5745, 5786, 5694, 5717, 5693, 5720, - 5893, 5919, 5801, 5944, 5755, 5790, 5906, 5927, 5962, 5979, - 5879, 5913, 5928, 5978, 5935, 5964, 6017, 6033, 6041, 6063, - 5688, 5818, 6023, 6068, 5990, 6044, 6065, 6102, 5869, 6120, - 6165, 6178, 6103, 6138, 6145, 6155, 6097, 6277, 6174, 6193, - 5976, 6092, 6218, 6221, 6061, 6294, 6357, 6373, 6321, 6337, - 6177, 6355, 6334, 6384, 6386, 6393, 6387, 6444, 6379, 6400, - 6447, 6449, 6374, 6424, 6301, 6506, 6433, 6517, 5936, 6171, - 6537, 6547, 6236, 5787, 8347, 8350,12038,12038, 8370, 8379, - - 8388, 8397, 8406, 8415, 8424, 8433, 8442, 8451, 8460, 8469, - 8478, 8487, 8496, 8505, 8514, 8523, 8532, 8541, 8550, 8559, - 8568, 8577, 8586, 8595, 8604, 8613, 8622, 8631, 8640, 8649, - 8658, 8667, 8676, 8685, 8694, 8703, 8712, 8721, 8730, 8739, - 8748, 8757, 8766, 8775, 8784, 8793, 8802, 8811, 8820, 8829, - 8838, 8847, 8856, 8865, 8874, 8883, 8892, 8901, 8910, 8917, - 8924, 8931, 8938, 8945, 8952, 8959, 8966, 8973, 8980, 8987, - 8994, 9001, 9008, 9015, 9022, 9029, 9036, 9043, 9050, 9057, - 9064, 9071, 9078, 9085, 9092, 9099, 9106, 9115, 9122, 9127, - 9134, 9139, 9146, 9151, 9158, 9163, 9170, 9175, 9182, 9187, - - 9194, 9199, 9206, 9211, 9218, 9223, 9230, 9235, 9242, 9247, - 9254, 9259, 9266, 9271, 9278, 9283, 9290, 9295, 9302, 9307, - 9314, 9319, 9326, 9331, 9338, 9343, 9350, 9355, 9362, 9367, - 9374, 9379, 9386, 9391, 9398, 9403, 9410, 9415, 9422, 9427, - 9434, 9439, 9446, 9451, 9460, 9466, 9473, 9481, 9488, 9496, - 9503, 9511, 9518, 9526, 9533, 9541, 9548, 9556, 9563, 9571, - 9578, 9586, 9593, 9601, 9608, 9616, 9623, 9631, 9638, 9646, - 9653, 9661, 9668, 9676, 9684, 9692, 9699, 9707, 9714, 9722, - 9729, 9737, 9744, 9752, 9760, 9768, 9776, 9784, 9791, 9799, - 9807, 9815, 9823, 9831, 9838, 9846, 9853, 9861, 9869, 9876, - - 9884, 9893, 9899, 9906, 9914, 9922, 9930, 9938, 9946, 9953, - 9961, 9968, 9976, 9983, 9991, 9998,10006,10013,10021,10029, - 10037,10045,10053,10060,10068,10076,10084,10092,10100,10107, - 10115,10122,10130,10137,10145,10152,10160,10167,10175,10182, - 10190,10197,10205,10212,10220,10227,10235,10243,10250,10258, - 10265,10273,10280,10288,10296,10303,10311,10320,10329,10336, - 10344,10352,10359,10367,10374,10382,10389,10397,10404,10411, - 10419,10426,10434,10442,10449,10457,10464,10472,10480,10488, - 10495,10503,10511,10519,10526,10534,10541,10549,10556,10564, - 10571,10579,10586,10594,10601,10609,10616,10624,10632,10639, - - 10647,10654,10662,10670,10678,10686,10694,10702,10711,10720, - 10727,10735,10743,10750,10758,10765,10773,10780,10788,10795, - 10802,10810,10817,10825,10833,10841,10849,10856,10864,10872, - 10879,10887,10895,10903,10910,10918,10925,10933,10940,10948, - 10955,10963,10970,10978,10986,10994,11001,11009,11017,11025, - 11033,11040,11048,11056,11064,11072,11081,11090,11098,11106, - 11114,11121,11129,11136,11144,11152,11160,11168,11176,11184, - 11192,11200,11208,11216,11223,11231,11238,11246,11254,11262, - 11269,11276,11284,11291,11299,11306,11313,11321,11328,11336, - 11343,11351,11359,11367,11374,11382,11390,11398,11407,11416, - - 11424,11432,11439,11446,11454,11462,11470,11478,11486,11493, - 11501,11508,11516,11524,11531,11538,11546,11553,11561,11568, - 11575,11582,11590,11597,11605,11613,11621,11629,11637,11645, - 11653,11662,11671,11679,11687,11694,11702,11710,11718,11726, - 11734,11741,11749,11756,11764,11772,11779,11786,11794,11802, - 11810,11817,11824,11832,11840,11848,11856,11864,11872,11880, - 11888,11897,11906,11914,11921,11928,11936,11944,11952,11959, - 11967,11974,11983,11992,12001,12010,12019,12028 + 1406, 1409, 1413, 1416, 1471, 1474, 1477, 1481, 1921, 1988, + 1538, 1541, 2055, 2122, 1544, 1548, 2189, 2246, 1605, 1608, + 2303, 2363, 1611, 1615, 2423, 2490, 1618, 1667, 1670, 1673, + 1677, 1680, 1729, 1732, 2557, 2624, 1735, 1739, 1742, 1798, + 1801, 1804, 1808, 1811, 2691, 2758, 1941, 1944, 1947, 1951, + + 1954, 2008, 2011, 2014, 2825, 2882, 2018, 2021, 2939, 3006, + 2075, 2078, 2081, 2085, 2142, 2145, 2148, 2152, 3073, 3140, + 2209, 2212, 2215, 2219, 2266, 2269, 2272, 2276, 3207, 3274, + 2323, 2326, 2329, 2333, 2336, 2383, 2386, 2389, 3341, 3411, + 2393, 2396, 3481, 3538, 2443, 2446, 2449, 2453, 2456, 2510, + 2513, 2516, 3595, 3665, 2520, 2523, 0, 0, 8394,12107, + 12107, 95, 100, 29, 41,12107, 103, 51,12107,12107, + 8379,12107,12107, 8368,12107, 8382, 8378, 202,12107,12107, + 12107,12107, 8376, 8370, 8324, 153,12107, 161, 8350, 0, + 145,12107, 8315,12107, 165, 3731, 73, 2530, 315, 357, + + 8343, 8290,12107, 168, 8332, 0, 152,12107, 8287,12107, + 261, 8331, 31,12107, 266, 8321, 0, 245,12107, 8283, + 8286, 8280, 421, 8285,12107, 269, 8306, 0, 340,12107, + 8272, 8271, 271, 8262, 238,12107, 441, 484,12107, 504, + 8290, 0, 401,12107, 8246, 8248, 8237,12107, 561, 548, + 12107, 571, 8282, 0, 481,12107, 8226, 8210,12107, 628, + 3795, 8208, 163, 2532, 567, 206, 38, 8247, 954, 2523, + 639, 907, 437, 79,12107, 634, 8238, 0, 546,12107, + 8193, 8199, 8187, 8191,12107, 638, 313, 368,12107, 697, + 8223, 0, 549,12107, 8179, 8188, 8158,12107, 704, 426, + + 497,12107, 707, 8210, 0, 747,12107, 8177, 8177,12107, + 767, 753,12107, 773, 8205, 0, 757,12107, 8165, 8140, + 12107, 831, 818,12107, 838, 8188, 0, 758,12107, 8137, + 8142, 8151, 8139, 8132,12107, 841, 559, 825, 530,12107, + 906, 8174, 0, 815,12107, 8137,12107, 914, 891,12107, + 977, 8165, 0, 953,12107, 8120, 8125, 8112,12107, 981, + 965,12107, 1021, 8154, 0, 966,12107, 8095, 203, 8097, + 8094, 378, 85, 311, 972,12107, 1040, 564, 814,12107, + 1044, 8120, 0, 1032,12107, 8068, 8085, 8069, 157, 8064, + 8043,12107, 1048, 1086,12107, 1106, 8080, 0, 1033,12107, + + 8029, 8022, 8022, 8032, 8033, 8014, 8008,12107, 1111, 1099, + 12107, 1114, 8053, 0, 1100,12107, 8005, 8013,12107, 1156, + 1160,12107, 1173, 8043, 0, 1157,12107, 8006, 8002, 7997, + 12107, 1180, 1228,12107, 1183, 8024, 0, 1158,12107, 7994, + 7985, 7987, 15,12107, 1186, 899, 963,12107, 1241, 8014, + 0, 1225,12107, 7956, 181,12107, 1248, 1294, 432, 303, + 12107, 1305, 8002, 0, 1226,12107, 7953, 7944, 299,12107, + 1309, 1224, 350,12107, 1365, 7994, 0, 1293,12107, 7951, + 7954,12107, 1368, 1352,12107, 1372, 7985, 0, 1360,12107, + 7936, 7932,12107, 1376, 1426, 676,12107, 1433, 7977, 0, + + 1418,12107, 7925, 7920, 7913,12107, 1438, 1436, 685,12107, + 1503, 7958, 0, 1423,12107, 7907, 7905, 7910, 7894, 7887, + 12107, 1507, 1504, 560, 1007,12107, 1510, 7932, 0, 1428, + 12107, 7895,12107, 1568, 1622,12107, 1574, 7914, 0, 1482, + 12107, 7881,12107, 1577, 1229, 1291,12107, 1635, 7902, 0, + 1496,12107, 7869, 7870,12107, 1638, 1623, 1697, 677, 7842, + 12107, 7903, 7891,12107,12107,12107, 1690, 253, 7842, 7840, + 7834, 7882, 7836,12107, 0, 7829, 7829, 7843, 7815, 104, + 1037, 7815, 7811, 7809, 7809, 889, 1636, 1105, 7797, 7797, + 1383, 1297, 7814, 1500, 7789, 1698, 7779, 1705, 1710, 1767, + + 12107, 0, 7783, 7778,12107, 0, 7774, 2088, 7766, 666, + 7759, 7805,12107, 0, 7761, 2155, 7750, 7771, 7752, 7754, + 7742, 7736, 7721,12107, 0, 7732, 7712, 7724, 7703,12107, + 0, 2222, 7697, 7743, 7723, 172, 7696, 7692, 7696, 1768, + 1567, 7684, 1778, 7704, 707, 724, 814, 841, 1629, 1783, + 1710, 888,12107, 0, 7680, 2279, 7688, 7661, 7667,12107, + 0, 7667, 2582, 7664, 7659,12107, 0, 2588, 7656, 7653, + 12107, 0, 7651, 7644, 7635,12107, 0, 7646, 373, 2644, + 7622, 7635, 7626, 897,12107, 0, 7616, 7621,12107, 0, + 7603, 2647, 2650, 7610,12107, 0, 7616, 7615, 2653, 7591, + + 2656, 7582, 7588, 7584, 7566, 7573, 7573, 7554, 7569, 7568, + 7561, 7562,12107, 0, 2711, 2714, 7543, 7539, 7534, 7533, + 7530, 7530,12107, 0, 7530, 7527, 7508, 2717, 7494, 7490, + 7510, 7487,12107, 0, 7487, 2720, 7478,12107, 0, 7479, + 2723, 7460, 7470,12107, 0, 7457, 2778, 7445, 7462, 7458, + 7442,12107, 0, 7433, 7443, 7420, 7407, 7415,12107, 0, + 7402, 7414, 7410, 7398, 7436,12107, 0, 7390, 2781, 7391, + 12107, 0, 7382, 7392, 7391,12107, 0, 7362, 7381, 7375, + 7374,12107, 0, 7357, 7350, 7352, 7363, 7360, 7334, 7331, + 12107, 0, 7335, 7343,12107, 0, 2784, 7338,12107, 0, + + 2787, 7304, 7298, 7335, 7344, 1537, 7291,12107, 1960, 0, + 7287, 7279, 7307, 7302, 7255,12107, 7267, 7244, 2791, 2845, + 1980, 7251, 7252, 7228, 7237, 7216, 7218, 7210, 7210, 7215, + 7203, 7194, 7194, 7207, 7210, 7194, 7194, 7170, 7175, 7182, + 7168, 7160, 2047, 7167, 7146, 7158, 7151, 7129, 7142, 7133, + 2848, 2853, 7130, 2805, 2038, 7119, 7150, 2856, 2859,12107, + 7119, 2904, 2174, 2907, 7109, 2914, 7108, 7112, 7092, 2910, + 2917, 7075, 7079, 7079, 2959, 2967, 2970, 2353, 7060, 2973, + 3026, 2413, 7053, 7039, 7032, 7029, 7033, 7019, 7000, 7004, + 2473, 7001, 6996, 6980, 6979, 6969, 2978, 2608, 6980, 6979, + + 3034, 3037, 6953, 3040, 2675, 6966, 3046, 3094, 3097, 2745, + 6965, 3104, 3107, 6961, 6960, 3119, 3162, 6951, 6941, 6952, + 3165, 2812, 6934, 6914, 3169, 3173, 6911, 6911, 6924, 3176, + 3235, 6907, 3228, 2992, 3231, 3058, 3238, 3242, 6905, 2050, + 3294, 3127, 6906, 3298, 3195, 3304, 6897, 6885, 6887, 6884, + 6873, 6861, 6861, 6853, 6865, 3307, 3312, 3361, 3364, 3372, + 3375, 3390, 3444, 3449, 3452, 3457, 3502, 3511, 6856, 37, + 6836, 3431, 3393, 3514, 6847, 6831, 3517, 3566, 6828, 3559, + 3401, 3562, 3569, 6841, 3572, 3434, 6838, 3618, 3641, 6831, + 3621, 3463, 6829, 6785, 6781, 3626, 3631, 3645, 3689, 3694, + + 3697, 3700, 6783, 3712, 3722, 3725, 3735, 3703, 3730, 6787, + 3743, 3471, 3755, 3763, 3774, 3799, 3802, 3806, 3809, 3821, + 3828, 3833, 3862, 6787, 6765, 6772, 6776, 6747, 3865, 3872, + 6757, 6722, 3887, 3891, 3839, 3651, 3894, 3897, 3868, 3900, + 6711, 3916, 3919, 6759,12107,12107, 1070, 6717,12107, 6755, + 6754, 6693,12107,12107, 6691, 6684, 6669, 3922, 3925,12107, + 3928, 1704, 6662, 6650, 6658, 6659, 6650, 6636, 6644, 1837, + 6629, 6631, 6629, 6624, 6622, 6617, 6607, 446, 6619, 6601, + 6602, 6615, 6602, 6603, 2240, 6596, 6581, 6583, 6575, 1510, + 6589, 3947, 3950, 3959,12107, 3969, 3965, 3972,12107,12107, + + 3984, 6613, 3988, 3991,12107, 3994, 6561, 3998,12107,12107, + 4013, 4019, 4027, 4031, 4035, 6574, 4049, 6571, 4052, 4055, + 12107, 4058, 6569, 4061, 6567, 4067, 4079,12107, 4082, 4086, + 12107,12107, 6562, 4094, 4101,12107, 4104, 6554, 6553, 6555, + 2297, 6535, 6542, 1772, 6524, 6524, 6536, 6535, 6505, 6503, + 6509, 4107,12107,12107, 6501, 4115, 4123, 4126,12107, 4133, + 6502, 4136,12107,12107, 6523, 4145, 4148,12107, 4152, 4155, + 12107,12107, 4167, 4171, 4174,12107, 4177, 4180, 4186, 4198, + 4204,12107, 4207, 6492, 6498, 4210, 4217,12107,12107, 6479, + 6487, 4228, 4231,12107, 4234, 6477, 6470, 4237, 4240, 4259, + + 12107, 4262, 4255, 4267,12107,12107, 4281,12107,12107, 4289, + 4292,12107, 4295, 6471, 6459, 6479, 6471, 4301,12107,12107, + 4314, 4317,12107,12107, 4325, 4332, 6457, 6462, 6445, 6452, + 6457, 6453, 6442, 6440, 6435, 4343, 4346,12107, 4349, 4352, + 12107,12107, 4368,12107,12107, 4376, 4379, 6424, 6428, 6432, + 6425, 4387, 4390,12107, 4394, 6420, 6417, 6408, 6412, 4397, + 12107,12107, 4409, 4413, 6397, 6408, 4421, 4427,12107, 4430, + 6391, 4433,12107,12107, 4449, 4452,12107, 4455, 6369, 4458, + 12107,12107, 6373, 4474, 4477,12107, 4482, 6363, 4486,12107, + 12107, 6367, 6370, 6369, 4496, 4501,12107, 4505, 4508, 4511, + + 4526, 4532, 6368, 4540, 4544,12107, 4548, 6360, 4551, 4569, + 6340, 6339, 4555, 4577, 6351, 4585, 4588,12107, 4591, 6350, + 4594,12107,12107, 4610, 4616,12107, 4619, 4622, 4625, 4640, + 4643, 4651, 4658,12107, 4662, 4665, 4670, 6333, 6332, 4683, + 4686, 4694, 4697,12107, 4701, 6323, 4704, 6335, 6293, 6268, + 4707, 4716,12107, 4726, 6262, 6275, 4729, 4735,12107, 4738, + 4741,12107,12107, 4749, 4757,12107, 4760, 4764,12107,12107, + 6265, 4772, 4779,12107, 4782, 1099, 4792,12107,12107, 6286, + 6285, 6246, 6157, 4801, 6137, 6143, 6151, 6131, 6079, 6071, + 6028, 2482, 2485, 6015, 2616, 6002, 5976, 2619, 5880, 5856, + + 2683, 5844, 5798, 5799, 5794, 5766, 5707, 5705, 5663, 5607, + 2686, 5544, 5517, 4804, 4822, 4807, 4813, 4831, 5466, 5491, + 4839, 5441, 4844,12107,12107, 4852, 4859, 4870,12107,12107, + 17, 4878, 4882, 36, 4890, 132, 4896, 4899, 4909, 4914, + 256, 4816,12107, 313, 349, 338, 2753, 3067, 3532, 3000, + 393, 429, 432, 460, 497, 503, 556, 4917, 4920, 4923, + 4941, 581, 632, 4944, 4947, 4950, 4965, 4968, 4971, 633, + 4979, 680, 698, 4986, 4989, 4998, 5009, 5012, 699, 746, + 5016, 5020, 5034, 5037, 5041, 5049, 772, 5056, 756, 782, + 5059, 5062, 5070,12107,12107, 793, 843, 5079, 825, 853, + + 854, 968, 983, 961, 5082, 5085,12107,12107, 5093, 5097, + 5101, 5104, 5107, 1043, 5111, 1027, 1065, 5122,12107,12107, + 5132, 1118, 5135, 1116, 5138, 1150, 1171, 5141, 1177, 1218, + 1233, 5144, 5150, 5169,12107,12107, 5177,12107,12107, 1228, + 5164, 4559, 5185,12107,12107, 1234, 1254, 5193,12107,12107, + 1263, 5201, 1314, 5208, 5211,12107,12107, 5220,12107,12107, + 5231, 5234,12107,12107, 1331, 1363, 5243,12107,12107, 5251, + 1365, 5254, 5257, 1357, 1369, 1399, 5266, 1389, 5272, 5275, + 5279, 5285, 5290, 1538, 1447, 5294,12107, 1462,12107,12107, + 1425, 1428, 5299, 1423, 1440, 1471, 1487, 1502, 1531, 1546, + + 3100, 1564, 1573, 3265, 1594, 3269, 1597, 3322, 1600, 1619, + 3332, 1626, 3521, 1635, 5303, 1642, 1664, 1687, 1695, 1697, + 3336, 1685, 5309, 5318,12107,12107, 5326, 5332,12107,12107, + 1710, 1729, 5346, 1703, 5356,12107,12107, 1712, 5365,12107, + 12107, 1704, 5373, 1707, 5376, 2841, 2955, 5384, 5388, 5398, + 1722, 1726, 1746, 1750, 3590, 1758, 3768, 5402, 5405, 1782, + 1775, 1778, 5408, 5411, 1869, 5418, 5421, 5429,12107,12107, + 5437, 1884, 5440, 5443, 5446,12107,12107, 5458, 5463,12107, + 12107, 5477, 5480, 1910, 1899, 5485,12107,12107, 5495, 5499, + 5508, 5513, 1909, 5521, 5526, 1915, 5529,12107,12107, 5540, + + 12107, 5545,12107,12107, 5553, 1916, 5559, 5562, 5572, 1904, + 5577,12107,12107, 1910, 1928, 5585, 5590, 5603, 1920, 1938, + 1949, 1965, 5606, 5609, 5612, 5615, 5624, 5630, 5633, 5636, + 1977, 5642, 5651, 5660, 1966, 5663, 5666, 1976, 5681, 1969, + 5684, 1981, 1964, 5689, 1991, 1980, 2016, 5692, 5704, 2032, + 5712, 2028, 5715, 2044, 5719, 5722, 5725, 5743, 2040, 5746, + 5749, 5752, 5755, 5758, 2035, 5773,12107,12107, 2051, 2049, + 2043, 5781, 2061, 5784, 5793, 5802, 5807, 5811, 5815, 5829, + 2101, 2100, 2167,12107, 2050, 5833, 5836, 2065, 2091, 2099, + 2143, 2096, 2101, 5839, 2118, 2131, 2117, 5842, 2133, 2139, + + 2161, 5851, 5855, 5858, 2176, 5863, 2180, 5866, 5869, 2164, + 2168, 2185, 2172, 5872, 2194, 5875, 2211, 2255, 5878, 2222, + 5881, 2229, 5884, 5887, 2266, 2253, 2312, 2255, 2273, 2260, + 2372, 2266, 5899,12107,12107, 5890, 5909, 2266, 2281, 2323, + 2289, 5912, 5915, 2295, 2381, 2383, 5918, 5927,12107,12107, + 5921, 5940, 5944, 5947, 5958, 5962, 5965, 5968, 5977, 2295, + 2309, 5983,12107,12107, 5992, 2343, 2370, 2351, 6000,12107, + 6003, 2357, 6007, 2361, 6012,12107,12107, 6020, 6026, 2365, + 2391, 2395, 6034,12107,12107, 6042, 6045, 6053, 2405, 2415, + 2408, 6056, 6060, 6074, 6077,12107,12107, 6085, 6089, 6097, + + 6103, 6106, 6115, 2409, 6122,12107,12107, 6130, 6134, 2419, + 6142,12107,12107, 2415, 6150,12107, 2429, 6153, 2413, 6156, + 6159, 2414, 6162, 2458, 6174, 2485, 2493, 2473, 6182,12107, + 2475, 6185, 2467, 6188, 6191, 6209, 6212, 2486, 6221, 2483, + 6227, 6230, 6233, 6236, 6251, 6254, 6262, 2486, 2488, 2482, + 2496, 6265, 2493, 6270,12107,12107, 6284, 6288, 6292,12107, + 12107, 6303,12107, 2573, 2772, 2536, 2518, 6307, 6310, 6318, + 6331, 2512, 2530, 2549, 2532, 6337, 6342, 6345, 2535, 6348, + 2543, 2553, 2547, 6351, 6354, 6357, 6360, 2550, 6363, 6366, + 6369, 6372, 6375, 6378, 2552, 6383, 2559, 2594, 6386,12107, + + 2595, 6390, 6393, 2613, 6408, 6411, 6414, 2630, 2628, 2628, + 2638, 2631, 2645, 2643, 2643, 2672, 2685, 6422, 6429, 6435, + 6443, 2676, 2692, 2669, 2672, 6447, 6450, 6453, 6456, 6464, + 6467, 6472, 6485,12107,12107, 6493, 6498,12107, 6501,12107, + 12107, 6512, 2675, 2672, 2717, 2718, 2681, 2697, 6517, 2714, + 6520,12107,12107, 2734, 2738, 2751, 6532,12107,12107, 6540, + 6545, 2749, 2738, 2752, 6554,12107,12107, 6562, 6566,12107, + 12107, 6574, 6577, 6585,12107,12107, 6593, 2757, 6596,12107, + 12107, 2751, 2760, 2754, 6604, 2785, 6607, 6612, 6627, 2797, + 6630, 6633, 2800, 2802, 2840, 2897, 2809, 2829, 6642,12107, + + 2819, 6648,12107,12107, 6661,12107,12107, 2847, 6656, 2842, + 6670, 6675, 6678,12107,12107, 6690,12107,12107, 6698, 6702, + 6708, 6712, 6720, 6726, 2854, 6730, 6733, 6738, 3069, 2916, + 6741, 6745,12107,12107, 6753, 6760, 6763, 6766, 2861, 2862, + 6772, 6780, 2876, 6783, 6786, 6792, 6795, 6798, 6801, 2870, + 2893, 6804, 6807, 6813, 6816, 2902, 6819, 2897,12107, 6822, + 6825,12107,12107, 6833, 6840,12107, 6844,12107,12107, 2942, + 2928, 2964, 2967, 2974, 2980, 2982, 3005, 3000, 3008, 6852, + 6855, 5765, 6838, 6864, 6867, 2969, 2976, 2988, 6872, 2983, + 6875,12107,12107, 6883, 6886,12107,12107, 6894, 6902, 2998, + + 3003, 3036, 3062, 3045, 3086, 3059, 6905, 6908, 3056, 3062, + 3061, 3131, 6914,12107,12107, 6922, 3063, 3081, 6930, 6933, + 12107,12107, 6941, 3078, 3084, 3085, 3103, 6944,12107, 6949, + 6954,12107,12107, 6963, 6969, 6972,12107,12107, 6982, 6987, + 3136, 3168, 3156, 3176, 6990, 3139, 6993, 3141, 7000, 6996, + 7008, 7020, 7027, 7023, 7032, 7042, 7049, 7052, 7055, 7060, + 7070, 7074,12107, 7077, 3270, 3186, 7082, 7089, 7085, 7096, + 3131, 3132, 7104, 7108, 7111, 7114, 3129, 3141, 3143, 7117, + 12107, 3150, 7120, 7123, 3191, 3206, 3203, 3217, 3208, 3219, + 3216, 3212, 3229, 3217, 3265, 7131, 3244, 3255, 3329, 3255, + + 3262, 3269, 3274, 3410, 3294, 3312, 7140, 3308, 3314, 7143, + 3310, 7146, 7150,12107, 7153, 3317, 3319, 3384,12107, 3391, + 12107, 7156, 7159, 7165, 3333, 3358, 3346, 3356, 3390, 7175, + 7178, 3381, 7186, 7193,12107, 7196,12107, 3374, 3377, 7199, + 3378, 7204, 7223, 7208, 7217, 7231, 7239, 7242, 7245, 3443, + 12107, 3453,12107, 7248, 3404, 7251, 3418, 7266,12107, 7269, + 7272, 7280, 7287, 7292, 7295,12107,12107, 7306, 7311, 7319, + 7324, 7327,12107, 7330, 7333, 3557, 3510, 3563, 7337,12107, + 3438, 3455, 7342, 3446, 3459, 3473, 7346, 7357, 3726, 3908, + 3466, 3502, 3532, 3555, 3559, 3582, 3560, 3589, 3594, 3605, + + 3622, 7365, 3567, 3579, 3576, 3590, 3594, 3588, 3590, 3604, + 3600, 3621, 3625, 3619, 3625, 3642, 7368, 3645, 7371, 7374, + 12107, 3637, 7377,12107,12107, 7380, 7384, 7398, 3645, 3655, + 3662, 7401, 3662, 7404,12107,12107, 3683, 7412, 7419, 3669, + 7430, 7433, 7436, 7444, 7451,12107,12107, 7462,12107, 7465, + 12107,12107, 7473, 7476, 7481,12107,12107, 7484, 7487, 7495, + 7502, 7506, 3813, 4001, 7514,12107, 7520, 7523, 7533,12107, + 12107, 7529, 7543, 7551, 7554, 7562,12107, 3736, 3728, 3753, + 3681, 7565, 3707, 3717, 3728, 7570, 7574, 3746, 3758, 3792, + 3781, 3785, 3912, 3767, 3808, 3792, 3794, 3807,12107, 3832, + + 3818, 3832, 3836,12107, 7588, 3813, 3822, 3810, 3824, 3833, + 3856, 3841, 3851, 3839, 3853, 3862, 3867, 3869, 7591, 3887, + 7594, 7597, 7600, 7603, 7618,12107,12107, 7626,12107, 3893, + 3881, 7629, 7632, 7650, 7636, 3904, 7658,12107,12107, 3908, + 7666, 7669, 7677,12107,12107, 7685, 7688, 7696, 7699, 7703, + 7707,12107,12107, 7717, 7721, 7729, 7735, 3922, 3923, 3927, + 3929, 3944, 3945, 7743, 7747, 7755, 3974, 3980, 7766,12107, + 12107, 3999, 3990, 7774, 3930, 7640, 7777, 3938, 3941, 7780, + 12107,12107, 3991, 3989, 3992, 4012, 4026, 4014, 4031, 4045, + 7788, 4034, 4054, 4071, 4057, 4051, 4071, 4085, 4078, 7795, + + 4033, 4045, 4063, 4116, 4117, 4072, 4065, 4074, 4092, 4151, + 4153, 4103, 4113, 7798, 7801, 7806, 7809, 7815, 4113, 7827, + 12107,12107, 4131, 4127, 7835, 7838, 7846,12107,12107, 7854, + 7858, 4119, 4139, 7866,12107,12107, 7874,12107,12107, 7882, + 7885, 7888, 7896, 7903, 4210, 4232, 7914, 4233, 4279, 4152, + 4163, 4197, 4161, 4182, 4213, 7922, 7925, 4195, 4202, 4217, + 4223, 4232, 7928, 7934, 7937, 7947, 7956, 7959, 7962, 4215, + 4227, 4247, 4241, 4246, 4262, 4264, 4261, 7968, 7971, 4273, + 4276,12107, 4278, 4282, 4283,12107, 4292, 7979, 4272, 4262, + 4326,12107,12107, 4285, 4286, 4272, 4333,12107,12107, 4291, + + 7982, 7986, 7992, 7998,12107,12107, 4300, 4302, 4303, 8007, + 12107,12107, 8015,12107,12107, 8023, 4307, 8026, 8029,12107, + 12107, 8037, 4329, 4341, 4332, 4347, 4339, 4350, 4348, 4360, + 4352, 4376,12107, 4369, 4379,12107, 8046,12107, 8049, 4382, + 4370, 4394, 4382, 4407, 8055, 8058, 8077, 8102, 8149, 8068, + 8085, 8088, 4401, 4432, 4434, 4403, 4420, 4437, 4439, 4409, + 8092,12107,12107, 4457, 4432, 4433, 4459, 4438, 4440, 8113, + 4408, 4416,12107, 4430, 4425, 4427,12107, 4439, 8122, 8125, + 12107, 4441, 4446, 4467, 8128, 8132, 4459, 8140, 8169, 8160, + 8178, 4516, 4484, 4517, 4492, 4526, 4498, 4530, 4501, 4543, + + 4550, 4556, 4557, 8186, 4563, 4536, 4568, 4542, 4582, 8195, + 4579, 4595, 8215, 8262, 4570,12107,12107, 4563, 4592,12107, + 12107, 4571,12107, 4604, 4610,12107, 4623, 4624, 8189,12107, + 4629, 4588, 4632, 4631, 4601, 4642, 4603, 4605, 4590, 8235, + 4685, 4686, 4617, 8243,12107,12107, 8251, 4695, 4751,12107, + 4669,12107, 4668,12107, 4674,12107, 4674,12107,12107,12107, + 12107, 8208,12107,12107, 4669,12107, 4671, 4674, 4751, 4695, + 4742, 4778, 4745, 8273, 4741, 4746, 4764, 4762,12107,12107, + 12107,12107,12107, 4833,12107,12107, 4805,12107, 8282, 8285, + 8288, 4808, 4762, 4829, 4768, 8293, 4836, 4771, 4842, 4772, + + 12107,12107,12107,12107, 4800, 4806, 8296, 4846, 4839, 4857, + 8311, 4869, 4856, 4878, 4867,12107, 4846,12107, 4847, 8315, + 8318, 8326, 8333, 8344, 8347, 4864, 4873, 4885, 4869, 4881, + 4908, 8355, 8363, 4891, 4900, 4913, 4897, 4905, 4918, 4901, + 4915, 8358, 4937,12107, 4924,12107, 4926, 4911, 4912, 8373, + 12107,12107, 8381,12107,12107, 8389, 4957, 4967, 4939, 4945, + 4941, 4949, 4964, 4965, 8397,12107,12107, 4967, 4975, 4971, + 4984, 4992, 4992, 5025, 5024, 5047,12107, 5028, 5037, 4992, + 4993, 5033, 5041, 5055, 5061, 5063, 5093, 5093, 5091, 5097, + 5103, 5102, 5108, 5130, 5127, 5134, 5134,12107,12107, 5154, + + 12107,12107, 5109, 5112, 5137, 5160, 5145, 5168, 5161, 5166, + 5183, 5179, 5177, 5194, 5188, 5186, 5205, 5194, 5198, 5216, + 5222, 5238, 5239, 5213, 5227, 5235, 5246, 5259, 5253, 5302, + 5283, 5278, 5307, 5292, 5286, 5319, 5300, 5294, 5323, 5317, + 12107,12107, 5309, 5314, 5312, 5319, 5346, 5322,12107, 5347, + 5328,12107, 5357, 5337,12107, 5363, 5340,12107, 5364, 5344, + 5358, 5352, 5371,12107, 5390,12107, 5391,12107, 5393,12107, + 5400, 8405, 5402, 5423, 5408, 5444, 5410, 5412, 5414, 5420, + 8408, 5462,12107, 5461,12107, 5467, 5466, 5470, 5476, 5484, + 5489,12107,12107,12107,12107,12107,12107, 5501, 5514, 5516, + + 5517, 5475, 5486, 5582, 5631, 5547, 5583, 5630, 5661, 5533, + 5638, 5621, 5677, 5610, 5628, 5710, 5753, 5557, 5654, 5679, + 5683, 5500, 5538, 5722, 5761, 5773, 5877, 5744, 5919, 5639, + 5680, 5760, 5830, 5920, 5935, 5938, 5980, 5809, 5915, 5968, + 6011, 5937, 5988, 5999, 6054, 6014, 6033, 5934, 5992, 6062, + 6091, 6076, 6093, 6101, 6103, 6130, 6162, 6176, 6179, 6151, + 6152, 5932, 6183, 5997, 6206, 6251, 6261, 6242, 6273, 5660, + 6077, 6264, 6304, 6197, 6207, 5552, 6257, 6228, 6231, 5487, + 6094, 8416, 8419,12107,12107, 8439, 8448, 8457, 8466, 8475, + 8484, 8493, 8502, 8511, 8520, 8529, 8538, 8547, 8556, 8565, + + 8574, 8583, 8592, 8601, 8610, 8619, 8628, 8637, 8646, 8655, + 8664, 8673, 8682, 8691, 8700, 8709, 8718, 8727, 8736, 8745, + 8754, 8763, 8772, 8781, 8790, 8799, 8808, 8817, 8826, 8835, + 8844, 8853, 8862, 8871, 8880, 8889, 8898, 8907, 8916, 8925, + 8934, 8943, 8952, 8961, 8970, 8979, 8986, 8993, 9000, 9007, + 9014, 9021, 9028, 9035, 9042, 9049, 9056, 9063, 9070, 9077, + 9084, 9091, 9098, 9105, 9112, 9119, 9126, 9133, 9140, 9147, + 9154, 9161, 9168, 9175, 9184, 9191, 9196, 9203, 9208, 9215, + 9220, 9227, 9232, 9239, 9244, 9251, 9256, 9263, 9268, 9275, + 9280, 9287, 9292, 9299, 9304, 9311, 9316, 9323, 9328, 9335, + + 9340, 9347, 9352, 9359, 9364, 9371, 9376, 9383, 9388, 9395, + 9400, 9407, 9412, 9419, 9424, 9431, 9436, 9443, 9448, 9455, + 9460, 9467, 9472, 9479, 9484, 9491, 9496, 9503, 9508, 9515, + 9520, 9529, 9535, 9542, 9550, 9557, 9565, 9572, 9580, 9587, + 9595, 9602, 9610, 9617, 9625, 9632, 9640, 9647, 9655, 9662, + 9670, 9677, 9685, 9692, 9700, 9707, 9715, 9722, 9730, 9737, + 9745, 9753, 9761, 9768, 9776, 9783, 9791, 9798, 9806, 9813, + 9821, 9829, 9837, 9845, 9853, 9860, 9868, 9876, 9884, 9892, + 9900, 9907, 9915, 9922, 9930, 9938, 9945, 9953, 9962, 9968, + 9975, 9983, 9991, 9999,10007,10015,10022,10030,10037,10045, + + 10052,10060,10067,10075,10082,10090,10098,10106,10114,10122, + 10129,10137,10145,10153,10161,10169,10176,10184,10191,10199, + 10206,10214,10221,10229,10236,10244,10251,10259,10266,10274, + 10281,10289,10296,10304,10312,10319,10327,10334,10342,10349, + 10357,10365,10372,10380,10389,10398,10405,10413,10421,10428, + 10436,10443,10451,10458,10466,10473,10480,10488,10495,10503, + 10511,10518,10526,10533,10541,10549,10557,10564,10572,10580, + 10588,10595,10603,10610,10618,10625,10633,10640,10648,10655, + 10663,10670,10678,10685,10693,10701,10708,10716,10723,10731, + 10739,10747,10755,10763,10771,10780,10789,10796,10804,10812, + + 10819,10827,10834,10842,10849,10857,10864,10871,10879,10886, + 10894,10902,10910,10918,10925,10933,10941,10948,10956,10964, + 10972,10979,10987,10994,11002,11009,11017,11024,11032,11039, + 11047,11055,11063,11070,11078,11086,11094,11102,11109,11117, + 11125,11133,11141,11150,11159,11167,11175,11183,11190,11198, + 11205,11213,11221,11229,11237,11245,11253,11261,11269,11277, + 11285,11292,11300,11307,11315,11323,11331,11338,11345,11353, + 11360,11368,11375,11382,11390,11397,11405,11412,11420,11428, + 11436,11443,11451,11459,11467,11476,11485,11493,11501,11508, + 11515,11523,11531,11539,11547,11555,11562,11570,11577,11585, + + 11593,11600,11607,11615,11622,11630,11637,11644,11651,11659, + 11666,11674,11682,11690,11698,11706,11714,11722,11731,11740, + 11748,11756,11763,11771,11779,11787,11795,11803,11810,11818, + 11825,11833,11841,11848,11855,11863,11871,11879,11886,11893, + 11901,11909,11917,11925,11933,11941,11949,11957,11966,11975, + 11983,11990,11997,12005,12013,12021,12028,12036,12043,12052, + 12061,12070,12079,12088,12097 } ; -static yyconst flex_int16_t yy_def[3779] = +static yyconst flex_int16_t yy_def[3766] = { 0, - 3299, 3299, 3300, 3300, 3300, 3300, 3301, 3301, 3302, 3302, - 3303, 3303, 3304, 3304, 3304, 3304, 3305, 3305, 3299, 3299, - 3306, 3306, 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3307, - 3307, 3307, 3299, 3299, 3307, 3307, 3299, 3299, 3307, 3307, - 3307, 3307, 3308, 3308, 3309, 3309, 3299, 3299, 3309, 3309, - 3309, 3309, 3310, 3310, 3304, 3304, 3311, 3311, 3312, 3312, - 3313, 3313, 3314, 3314, 3315, 3315, 3316, 3316, 3316, 3316, - 3299, 3299, 3316, 3316, 3316, 3316, 3299, 3299, 3316, 3316, - 3316, 3316, 3299, 3299, 3316, 3316, 3299, 3299, 3316, 3316, - 3316, 3316, 3299, 3299, 3316, 3316, 3299, 3299, 3316, 3316, - - 3316, 3316, 3317, 3317, 3318, 3318, 3299, 3299, 3318, 3318, - 3318, 3318, 3319, 3319, 3320, 3320, 3299, 3299, 3320, 3320, + 3286, 3286, 3287, 3287, 3287, 3287, 3288, 3288, 3289, 3289, + 3290, 3290, 3291, 3291, 3291, 3291, 3292, 3292, 3286, 3286, + 3293, 3293, 3294, 3294, 3294, 3294, 3286, 3286, 3294, 3294, + 3294, 3294, 3286, 3286, 3294, 3294, 3286, 3286, 3294, 3294, + 3294, 3294, 3295, 3295, 3296, 3296, 3286, 3286, 3296, 3296, + 3296, 3296, 3297, 3297, 3291, 3291, 3298, 3298, 3299, 3299, + 3300, 3300, 3301, 3301, 3302, 3302, 3303, 3303, 3303, 3303, + 3286, 3286, 3303, 3303, 3303, 3303, 3286, 3286, 3303, 3303, + 3303, 3303, 3286, 3286, 3303, 3303, 3286, 3286, 3303, 3303, + 3303, 3303, 3286, 3286, 3303, 3303, 3286, 3286, 3303, 3303, + + 3303, 3303, 3304, 3304, 3305, 3305, 3286, 3286, 3305, 3305, + 3305, 3305, 3306, 3306, 3307, 3307, 3286, 3286, 3307, 3307, + 3307, 3307, 3308, 3308, 3309, 3309, 3310, 3310, 3311, 3311, + 3312, 3312, 3313, 3313, 3286, 3286, 3313, 3313, 3313, 3313, + 3314, 3314, 3315, 3315, 3316, 3316, 3317, 3317, 3285, 149, + 3318, 3318, 3286, 3286, 3318, 3318, 3318, 3318, 3319, 3319, 3320, 3320, 3321, 3321, 3322, 3322, 3323, 3323, 3324, 3324, - 3325, 3325, 3326, 3326, 3299, 3299, 3326, 3326, 3326, 3326, - 3327, 3327, 3328, 3328, 3329, 3329, 3330, 3330, 3298, 149, - 3331, 3331, 3332, 3332, 3333, 3333, 3334, 3334, 3335, 3335, - 3336, 3336, 3337, 3337, 3338, 3338, 3339, 3339, 3340, 3340, - 3341, 3341, 3299, 3299, 3341, 3341, 3341, 3341, 3342, 3342, - 3343, 3343, 3299, 3299, 3343, 3343, 3343, 3343, 3344, 3344, - 3345, 3345, 3299, 3299, 3345, 3345, 3345, 3345, 3346, 3346, - - 3347, 3347, 3348, 3348, 3349, 3349, 3299, 3299, 3349, 3349, - 3349, 3349, 3350, 3350, 3351, 3351, 3299, 3299, 3351, 3351, - 3351, 3351, 3352, 3352, 3353, 3353, 3299, 3299, 3353, 3353, - 3353, 3353, 3354, 3354, 3355, 3355, 3356, 3356, 3357, 3357, - 3299, 3299, 3357, 3357, 3357, 3357, 3358, 3358, 3359, 3359, - 3299, 3299, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3360, 3298, 3298, 3360, 3298, 3298, 3298, - 290, 290, 292, 290, 293, 293, 3298, 3298, 3298, 3361, - - 3298, 3298, 3361, 3298, 3298, 294, 293, 3298, 3298, 3298, - 3362, 3298, 3298, 3362, 3362, 3362, 3298, 3298, 3298, 3298, - 3298, 3363, 3298, 3298, 3363, 3363, 3363, 3363, 3363, 3298, - 3298, 3298, 3298, 3298, 3298, 3364, 3298, 3298, 3364, 3364, - 3364, 3298, 3298, 3298, 3298, 3298, 3298, 3365, 3298, 3298, - 3365, 3365, 3298, 3298, 3298, 355, 293, 293, 294, 359, - 358, 358, 358, 358, 359, 365, 363, 363, 3298, 3298, - 3298, 3366, 3298, 3298, 3366, 3366, 3366, 3366, 3298, 3298, - 293, 293, 3298, 3298, 3298, 3367, 3298, 3298, 3367, 3367, - 3367, 3298, 3298, 293, 293, 3298, 3298, 3298, 3368, 3298, - - 3298, 3368, 3368, 3298, 3298, 3298, 3298, 3298, 3298, 3369, - 3298, 3298, 3369, 3369, 3298, 3298, 3298, 3298, 3298, 3298, - 3370, 3298, 3298, 3370, 3370, 3370, 3370, 3370, 3298, 3298, - 293, 293, 293, 3298, 3298, 3298, 3371, 3298, 3298, 3371, - 3298, 3298, 3298, 3298, 3298, 3298, 3372, 3298, 3298, 3372, - 3372, 3372, 3298, 3298, 3298, 3298, 3298, 3298, 3373, 3298, - 3298, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3298, - 3298, 3298, 3298, 3298, 3298, 3374, 3298, 3298, 3374, 3374, - 3374, 3374, 3374, 3374, 3298, 3298, 3298, 3298, 3298, 3298, - 3375, 3298, 3298, 3375, 3375, 3375, 3375, 3375, 3375, 3375, - - 3298, 3298, 3298, 3298, 3298, 3298, 3376, 3298, 3298, 3376, - 3376, 3298, 3298, 3298, 3298, 3298, 3298, 3377, 3298, 3298, - 3377, 3377, 3377, 3298, 3298, 3298, 3298, 3298, 3298, 3378, - 3298, 3298, 3378, 3378, 3378, 3378, 3298, 3298, 293, 293, - 3298, 3298, 3298, 3379, 3298, 3298, 3379, 3379, 3298, 3298, - 293, 363, 363, 3298, 3298, 3298, 3380, 3298, 3298, 3380, - 3380, 3380, 3298, 3298, 363, 363, 3298, 3298, 3298, 3381, - 3298, 3298, 3381, 3381, 3298, 3298, 3298, 3298, 3298, 3298, - 3382, 3298, 3298, 3382, 3382, 3298, 3298, 363, 363, 3298, - 3298, 3298, 3383, 3298, 3298, 3383, 3383, 3383, 3298, 3298, - - 363, 363, 3298, 3298, 3298, 3384, 3298, 3298, 3384, 3384, - 3384, 3384, 3384, 3298, 3298, 293, 432, 293, 3298, 3298, - 3298, 3385, 3298, 3298, 3385, 3298, 3298, 3298, 3298, 3298, - 3298, 3386, 3298, 3298, 3386, 3298, 3298, 293, 293, 3298, - 3298, 3298, 3387, 3298, 3298, 3387, 3387, 3298, 3298, 3298, - 3298, 3388, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3389, 3389, 3390, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3391, 3391, 3392, 3298, 3393, 3393, - - 3393, 3393, 3298, 3394, 3298, 3298, 3395, 3395, 3395, 3395, - 3395, 3395, 3395, 3395, 3395, 3396, 3298, 3397, 3397, 3397, - 3397, 3398, 3298, 3399, 3399, 3399, 3400, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3401, 3401, 3401, 3401, - 3401, 3402, 3298, 3403, 3403, 3403, 3403, 3404, 3298, 3405, - 3405, 3405, 3406, 3298, 3407, 3407, 3407, 3408, 3298, 3409, - 3409, 3409, 3409, 3409, 3409, 3410, 3298, 3298, 3411, 3411, - 3412, 3298, 3413, 3413, 3413, 3413, 3414, 3298, 3415, 3415, - 3415, 3415, 3415, 3415, 3415, 3415, 3415, 3415, 3415, 3415, - - 3415, 3415, 3415, 3415, 3416, 3298, 3417, 3417, 3417, 3417, - 3417, 3417, 3417, 3417, 3418, 3298, 3419, 3419, 3419, 3419, - 3419, 3419, 3419, 3419, 3420, 3298, 3421, 3421, 3421, 3422, - 3298, 3423, 3423, 3423, 3423, 3424, 3298, 3425, 3425, 3425, - 3425, 3425, 3425, 3426, 3298, 3427, 3427, 3427, 3427, 3428, - 3298, 3298, 3429, 3429, 3429, 3429, 3429, 3430, 3298, 3431, - 3431, 3431, 3432, 3298, 3433, 3433, 3433, 3434, 3298, 3435, - 3435, 3435, 3435, 3436, 3298, 3437, 3437, 3437, 3437, 3437, - 3437, 3438, 3298, 3298, 3439, 3439, 3440, 3298, 3441, 3441, - 3442, 3298, 3443, 3443, 3443, 3444, 3445, 3298, 3445, 3298, - - 3298, 3298, 3446, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3447, 3448, 3448, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3449, 3450, 3450, 3451, 3298, 3298, 3451, 3298, - 3452, 3452, 3298, 3453, 3298, 3298, 3453, 3453, 3453, 3453, - 3453, 3453, 3454, 3454, 3455, 3455, 3455, 3456, 3456, 3298, - 3298, 3457, 3458, 3458, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3459, 3298, - 3298, 3459, 3459, 3460, 3460, 3461, 3298, 3298, 3461, 3462, - - 3462, 3298, 3298, 3463, 3464, 3464, 3465, 3465, 3466, 3466, - 3467, 3467, 3467, 3298, 3298, 3467, 3467, 3468, 3468, 3298, - 3298, 3469, 3470, 3470, 3471, 3298, 3298, 3298, 3298, 3472, - 3472, 3473, 3473, 3298, 3298, 3473, 3298, 3298, 3473, 3473, - 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3474, 3474, - 3298, 3298, 3298, 3298, 3475, 3475, 3475, 3475, 3475, 3476, - 3476, 3477, 3477, 3477, 3298, 3298, 3477, 3477, 3477, 3478, - 3478, 3479, 3298, 3298, 3480, 3480, 3481, 3298, 3298, 3481, - 3482, 3482, 3483, 3298, 3298, 3483, 3483, 3483, 3484, 3484, - 3485, 3485, 3485, 3486, 3486, 3298, 3487, 3487, 3487, 3487, - - 3488, 3488, 3489, 3298, 3298, 3490, 3490, 3491, 3491, 3492, - 3492, 3493, 3493, 3493, 3494, 3494, 3495, 3495, 3495, 3495, - 3495, 3496, 3496, 3298, 3497, 3498, 3498, 3298, 3298, 3499, - 3499, 3298, 3298, 3500, 3501, 3501, 3502, 3298, 3298, 3502, - 3298, 3298, 3503, 3298, 3298, 3298, 3298, 3298, 3298, 3504, - 3298, 3505, 3298, 3505, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3506, 3298, 3507, 3298, 3507, 3508, - 3298, 3298, 3298, 3508, 3298, 3298, 3509, 3298, 3509, 3510, - - 3298, 3298, 3298, 3298, 3298, 3510, 3298, 3298, 3510, 3510, - 3510, 3298, 3511, 3298, 3511, 3512, 3512, 3512, 3298, 3513, - 3298, 3513, 3298, 3298, 3298, 3514, 3298, 3515, 3298, 3515, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3516, 3298, 3298, 3298, 3516, 3516, 3298, - 3517, 3298, 3517, 3518, 3298, 3298, 3298, 3518, 3298, 3519, - 3298, 3519, 3298, 3298, 3298, 3520, 3298, 3521, 3298, 3521, - 3522, 3522, 3298, 3523, 3298, 3523, 3524, 3524, 3524, 3298, - 3298, 3298, 3524, 3524, 3298, 3525, 3298, 3525, 3298, 3298, - 3526, 3298, 3527, 3298, 3527, 3528, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3529, 3298, 3529, 3530, 3530, 3530, 3530, - 3298, 3298, 3298, 3530, 3298, 3298, 3298, 3298, 3298, 3530, - 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3298, 3531, - 3298, 3531, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3532, 3532, 3532, 3532, 3298, 3533, 3298, 3533, 3534, 3534, - 3534, 3534, 3298, 3298, 3298, 3298, 3298, 3534, 3534, 3298, - 3535, 3298, 3535, 3536, 3298, 3298, 3298, 3298, 3537, 3298, - 3537, 3538, 3298, 3298, 3298, 3538, 3298, 3539, 3298, 3539, - 3540, 3298, 3298, 3298, 3540, 3540, 3540, 3298, 3541, 3298, - 3541, 3298, 3298, 3298, 3298, 3542, 3298, 3543, 3298, 3543, - - 3298, 3298, 3298, 3544, 3544, 3298, 3298, 3544, 3298, 3545, - 3298, 3545, 3546, 3298, 3298, 3298, 3298, 3547, 3298, 3547, - 3298, 3298, 3298, 3298, 3298, 3548, 3298, 3548, 3298, 3298, - 3549, 3549, 3298, 3298, 3298, 3550, 3298, 3550, 3551, 3551, - 3551, 3551, 3551, 3298, 3552, 3298, 3552, 3298, 3553, 3298, - 3554, 3298, 3554, 3298, 3298, 3298, 3298, 3555, 3298, 3555, - 3298, 3298, 3298, 3556, 3298, 3557, 3298, 3557, 3558, 3559, - 3298, 3298, 3298, 3298, 3298, 3560, 3561, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3562, 3298, - 3298, 3563, 3298, 3564, 3565, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3565, 3298, 3298, 3565, 3566, 3567, 3298, - 3298, 3567, 3568, 3569, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3570, - 3570, 3298, 3298, 3571, 3572, 3572, 3573, 3298, 3298, 3574, - 3298, 3298, 3575, 3576, 3577, 3577, 3298, 3298, 3577, 3577, - 3578, 3298, 3298, 3298, 3298, 3579, 3298, 3298, 3580, 3581, - 3581, 3581, 3581, 3298, 3298, 3298, 3298, 3298, 3581, 3581, - 3581, 3581, 3581, 3581, 3581, 3581, 3581, 3582, 3298, 3298, - - 3298, 3583, 3583, 3583, 3583, 3584, 3585, 3585, 3585, 3585, - 3298, 3298, 3298, 3585, 3585, 3586, 3587, 3588, 3589, 3589, - 3590, 3591, 3591, 3591, 3591, 3592, 3298, 3298, 3298, 3298, - 3298, 3298, 3593, 3594, 3298, 3298, 3298, 3298, 3595, 3595, - 3298, 3298, 3298, 3595, 3596, 3597, 3598, 3298, 3298, 3298, - 3298, 3298, 3298, 3599, 3298, 3298, 3298, 3600, 3600, 3298, - 3298, 3298, 3601, 3602, 3298, 3298, 3602, 3602, 3602, 3603, - 3298, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3610, 3298, - 3610, 3298, 3298, 3298, 3611, 3612, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3613, - 3298, 3298, 3298, 3614, 3298, 3615, 3616, 3298, 3298, 3298, - 3616, 3298, 3298, 3298, 3616, 3617, 3618, 3298, 3298, 3298, - 3298, 3298, 3619, 3620, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3621, 3298, 3298, - 3298, 3298, 3298, 3622, 3623, 3623, 3624, 3298, 3298, 3298, - 3625, 3298, 3298, 3298, 3626, 3627, 3628, 3628, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3628, 3629, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3630, 3631, 3298, - - 3298, 3631, 3631, 3298, 3298, 3298, 3631, 3631, 3298, 3298, - 3631, 3631, 3631, 3631, 3631, 3631, 3632, 3298, 3298, 3633, - 3633, 3633, 3634, 3635, 3298, 3298, 3635, 3635, 3298, 3298, - 3635, 3636, 3637, 3638, 3639, 3639, 3640, 3641, 3641, 3641, - 3298, 3298, 3641, 3642, 3643, 3644, 3298, 3645, 3645, 3645, - 3646, 3647, 3648, 3649, 3650, 3650, 3651, 3652, 3298, 3298, - 3298, 3652, 3652, 3652, 3653, 3298, 3298, 3298, 3654, 3655, - 3298, 3298, 3656, 3657, 3658, 3658, 3298, 3298, 3659, 3660, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3661, 3662, - 3298, 3663, 3664, 3664, 3664, 3665, 3666, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3667, 3668, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3669, - 3298, 3298, 3298, 3670, 3671, 3298, 3298, 3672, 3673, 3298, - 3298, 3674, 3675, 3675, 3298, 3298, 3298, 3298, 3298, 3298, - 3675, 3298, 3298, 3298, 3298, 3676, 3677, 3298, 3298, 3298, - 3298, 3298, 3677, 3677, 3677, 3298, 3298, 3298, 3298, 3298, - 3677, 3677, 3677, 3677, 3298, 3298, 3678, 3298, 3298, 3298, - 3298, 3298, 3679, 3298, 3298, 3680, 3681, 3298, 3298, 3298, - - 3298, 3298, 3681, 3298, 3298, 3298, 3681, 3298, 3298, 3682, - 3683, 3684, 3684, 3685, 3686, 3686, 3686, 3298, 3298, 3298, - 3686, 3298, 3298, 3687, 3688, 3298, 3298, 3298, 3298, 3298, - 3689, 3690, 3691, 3692, 3693, 3298, 3298, 3298, 3298, 3694, - 3695, 3695, 3695, 3695, 3696, 3298, 3298, 3298, 3298, 3697, - 3698, 3298, 3298, 3298, 3298, 3298, 3699, 3700, 3700, 3298, - 3298, 3298, 3701, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3702, 3703, - 3298, 3298, 3298, 3704, 3298, 3298, 3704, 3705, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3706, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3707, 3298, 3298, 3298, 3298, 3298, 3708, 3298, - 3298, 3298, 3298, 3298, 3709, 3710, 3710, 3298, 3298, 3710, - 3298, 3711, 3712, 3298, 3298, 3298, 3712, 3712, 3712, 3298, - 3298, 3298, 3298, 3298, 3712, 3712, 3712, 3298, 3298, 3298, - 3713, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3714, - 3715, 3298, 3298, 3298, 3715, 3715, 3716, 3717, 3718, 3298, - 3298, 3719, 3720, 3298, 3298, 3720, 3720, 3298, 3298, 3720, - 3721, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3722, 3723, 3724, 3725, 3726, 3298, 3298, 3298, 3298, 3298, - 3298, 3727, 3728, 3728, 3728, 3728, 3729, 3298, 3730, 3731, - 3732, 3733, 3733, 3298, 3298, 3298, 3298, 3734, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3735, - 3736, 3298, 3737, 3298, 3298, 3298, 3737, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3738, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3739, 3298, 3298, 3298, - 3740, 3741, 3742, 3742, 3298, 3298, 3298, 3298, 3742, 3298, - - 3743, 3744, 3744, 3744, 3744, 3298, 3298, 3298, 3744, 3744, - 3744, 3745, 3298, 3298, 3298, 3746, 3747, 3747, 3747, 3748, - 3298, 3298, 3749, 3298, 3298, 3298, 3750, 3751, 3298, 3298, - 3298, 3751, 3751, 3298, 3298, 3298, 3298, 3751, 3752, 3298, - 3753, 3754, 3755, 3756, 3757, 3758, 3298, 3298, 3759, 3759, - 3759, 3760, 3298, 3761, 3298, 3298, 3762, 3763, 3763, 3298, - 3764, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3765, 3298, 3298, 3766, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3767, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3768, 3298, 3298, 3769, - 3770, 3770, 3298, 3298, 3298, 3298, 3770, 3298, 3771, 3772, - 3772, 3772, 3772, 3772, 3298, 3298, 3772, 3772, 3298, 3298, - 3298, 3298, 3747, 3747, 3747, 3748, 3298, 3298, 3750, 3298, - 3298, 3751, 3751, 3751, 3298, 3298, 3298, 3298, 3751, 3752, - 3298, 3753, 3298, 3298, 3298, 3298, 3756, 3757, 3758, 3298, - 3298, 3298, 3298, 3298, 3759, 3759, 3298, 3298, 3298, 3761, - 3762, 3763, 3763, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3765, 3298, 3298, 3298, 3766, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3767, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3768, 3298, 3298, 3770, 3770, - 3298, 3298, 3298, 3298, 3771, 3772, 3772, 3772, 3772, 3772, - 3298, 3298, 3298, 3772, 3298, 3298, 3747, 3747, 3298, 3298, - 3748, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3751, - 3751, 3751, 3298, 3298, 3298, 3298, 3752, 3753, 3298, 3298, - 3298, 3298, 3298, 3757, 3758, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3762, 3763, 3763, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3766, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3767, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3768, - 3770, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3772, 3772, - 3772, 3298, 3298, 3772, 3772, 3298, 3298, 3298, 3747, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3751, 3751, 3751, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3757, 3758, 3298, 3298, 3298, 3298, 3298, 3298, - 3762, 3763, 3763, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3766, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3767, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3768, 3298, 3298, 3770, - 3298, 3298, 3298, 3772, 3772, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3772, 3747, 3298, 3298, 3298, 3298, 3298, 3298, - 3751, 3298, 3298, 3751, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3757, 3758, 3298, 3298, - 3298, 3298, 3762, 3763, 3763, 3763, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3767, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3768, 3298, 3298, 3298, 3770, - 3772, 3772, 3298, 3298, 3298, 3298, 3298, 3298, 3772, 3747, - 3751, 3298, 3298, 3298, 3751, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3758, 3298, 3298, 3298, 3298, 3762, 3763, 3763, 3763, - 3773, 3774, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3767, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3770, 3772, 3772, 3298, - 3298, 3747, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3758, 3298, - 3298, 3298, 3298, 3762, 3763, 3775, 3776, 3773, 3774, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3770, 3772, 3772, 3298, 3298, 3298, 3747, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3762, 3775, 3763, 3777, 3776, 3778, - 3763, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3770, 3772, 3772, - - 3298, 3298, 3298, 3298, 3747, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3762, 3777, 3298, 3778, 3763, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3762, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3762, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3762, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3762, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3762, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3762, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3762, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3762, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3762, 3762, 3298, 3298, 3298, 3298, 3298, 3298, - 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, - 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, - 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, - 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, - 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, - 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, - 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, - 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, - 3762, 3762, 3762, 3762, 3762, 3762, 3298, 0, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298 + 3325, 3325, 3326, 3326, 3327, 3327, 3328, 3328, 3286, 3286, + 3328, 3328, 3328, 3328, 3329, 3329, 3330, 3330, 3286, 3286, + 3330, 3330, 3330, 3330, 3331, 3331, 3332, 3332, 3286, 3286, + + 3332, 3332, 3332, 3332, 3333, 3333, 3334, 3334, 3335, 3335, + 3336, 3336, 3286, 3286, 3336, 3336, 3336, 3336, 3337, 3337, + 3338, 3338, 3286, 3286, 3338, 3338, 3338, 3338, 3339, 3339, + 3340, 3340, 3286, 3286, 3340, 3340, 3340, 3340, 3341, 3341, + 3342, 3342, 3343, 3343, 3344, 3344, 3286, 3286, 3344, 3344, + 3344, 3344, 3345, 3345, 3346, 3346, 3286, 3286, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3347, + 3285, 3285, 3347, 3285, 3285, 3285, 296, 296, 298, 296, + + 299, 299, 3285, 3285, 3285, 3348, 3285, 3285, 3348, 3285, + 3285, 300, 299, 3285, 3285, 3285, 3349, 3285, 3285, 3349, + 3349, 3349, 3285, 3285, 3285, 3285, 3285, 3350, 3285, 3285, + 3350, 3350, 3350, 3350, 3350, 3285, 3285, 3285, 3285, 3285, + 3285, 3351, 3285, 3285, 3351, 3351, 3351, 3285, 3285, 3285, + 3285, 3285, 3285, 3352, 3285, 3285, 3352, 3352, 3285, 3285, + 3285, 361, 299, 299, 300, 365, 364, 364, 364, 364, + 365, 371, 369, 369, 3285, 3285, 3285, 3353, 3285, 3285, + 3353, 3353, 3353, 3353, 3285, 3285, 299, 299, 3285, 3285, + 3285, 3354, 3285, 3285, 3354, 3354, 3354, 3285, 3285, 299, + + 299, 3285, 3285, 3285, 3355, 3285, 3285, 3355, 3355, 3285, + 3285, 3285, 3285, 3285, 3285, 3356, 3285, 3285, 3356, 3356, + 3285, 3285, 3285, 3285, 3285, 3285, 3357, 3285, 3285, 3357, + 3357, 3357, 3357, 3357, 3285, 3285, 299, 299, 299, 3285, + 3285, 3285, 3358, 3285, 3285, 3358, 3285, 3285, 3285, 3285, + 3285, 3285, 3359, 3285, 3285, 3359, 3359, 3359, 3285, 3285, + 3285, 3285, 3285, 3285, 3360, 3285, 3285, 3360, 3360, 3360, + 3360, 3360, 3360, 3360, 3360, 3285, 3285, 299, 299, 3285, + 3285, 3285, 3361, 3285, 3285, 3361, 3361, 3361, 3361, 3361, + 3361, 3285, 3285, 3285, 3285, 3285, 3285, 3362, 3285, 3285, + + 3362, 3362, 3362, 3362, 3362, 3362, 3362, 3285, 3285, 3285, + 3285, 3285, 3285, 3363, 3285, 3285, 3363, 3363, 3285, 3285, + 3285, 3285, 3285, 3285, 3364, 3285, 3285, 3364, 3364, 3364, + 3285, 3285, 3285, 3285, 3285, 3285, 3365, 3285, 3285, 3365, + 3365, 3365, 3365, 3285, 3285, 299, 299, 3285, 3285, 3285, + 3366, 3285, 3285, 3366, 3366, 3285, 3285, 299, 369, 369, + 3285, 3285, 3285, 3367, 3285, 3285, 3367, 3367, 3367, 3285, + 3285, 369, 369, 3285, 3285, 3285, 3368, 3285, 3285, 3368, + 3368, 3285, 3285, 3285, 3285, 3285, 3285, 3369, 3285, 3285, + 3369, 3369, 3285, 3285, 369, 369, 3285, 3285, 3285, 3370, + + 3285, 3285, 3370, 3370, 3370, 3285, 3285, 369, 369, 3285, + 3285, 3285, 3371, 3285, 3285, 3371, 3371, 3371, 3371, 3371, + 3285, 3285, 299, 438, 299, 3285, 3285, 3285, 3372, 3285, + 3285, 3372, 3285, 3285, 3285, 3285, 3285, 3285, 3373, 3285, + 3285, 3373, 3285, 3285, 299, 299, 3285, 3285, 3285, 3374, + 3285, 3285, 3374, 3374, 3285, 3285, 3285, 3285, 3375, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3376, 3376, 3377, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3378, 3378, 3379, 3285, 3380, 3380, 3380, 3380, 3285, + 3381, 3285, 3285, 3382, 3382, 3382, 3382, 3382, 3382, 3382, + 3382, 3382, 3383, 3285, 3384, 3384, 3384, 3384, 3385, 3285, + 3386, 3386, 3386, 3387, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3388, 3388, 3388, 3388, 3388, 3389, 3285, + 3390, 3390, 3390, 3390, 3391, 3285, 3392, 3392, 3392, 3393, + 3285, 3394, 3394, 3394, 3395, 3285, 3396, 3396, 3396, 3396, + 3396, 3396, 3397, 3285, 3285, 3398, 3398, 3399, 3285, 3400, + 3400, 3400, 3400, 3401, 3285, 3402, 3402, 3402, 3402, 3402, + + 3402, 3402, 3402, 3402, 3402, 3402, 3402, 3402, 3402, 3402, + 3402, 3403, 3285, 3404, 3404, 3404, 3404, 3404, 3404, 3404, + 3404, 3405, 3285, 3406, 3406, 3406, 3406, 3406, 3406, 3406, + 3406, 3407, 3285, 3408, 3408, 3408, 3409, 3285, 3410, 3410, + 3410, 3410, 3411, 3285, 3412, 3412, 3412, 3412, 3412, 3412, + 3413, 3285, 3414, 3414, 3414, 3414, 3415, 3285, 3285, 3416, + 3416, 3416, 3416, 3416, 3417, 3285, 3418, 3418, 3418, 3419, + 3285, 3420, 3420, 3420, 3421, 3285, 3422, 3422, 3422, 3422, + 3423, 3285, 3424, 3424, 3424, 3424, 3424, 3424, 3425, 3285, + 3285, 3426, 3426, 3427, 3285, 3428, 3428, 3429, 3285, 3430, + + 3430, 3430, 3431, 3432, 3285, 3432, 3285, 3285, 3285, 3433, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3434, 3435, 3435, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3436, + 3437, 3437, 3438, 3285, 3285, 3438, 3285, 3439, 3439, 3285, + 3440, 3285, 3285, 3440, 3440, 3440, 3440, 3440, 3440, 3441, + 3441, 3442, 3442, 3442, 3443, 3443, 3285, 3285, 3444, 3445, + 3445, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3446, 3285, 3285, 3446, 3446, + + 3447, 3447, 3448, 3285, 3285, 3448, 3449, 3449, 3285, 3285, + 3450, 3451, 3451, 3452, 3452, 3453, 3453, 3454, 3454, 3454, + 3285, 3285, 3454, 3454, 3455, 3455, 3285, 3285, 3456, 3457, + 3457, 3458, 3285, 3285, 3285, 3285, 3459, 3459, 3460, 3460, + 3285, 3285, 3460, 3285, 3285, 3460, 3460, 3460, 3460, 3460, + 3460, 3460, 3460, 3460, 3460, 3461, 3461, 3285, 3285, 3285, + 3285, 3462, 3462, 3462, 3462, 3462, 3463, 3463, 3464, 3464, + 3464, 3285, 3285, 3464, 3464, 3464, 3465, 3465, 3466, 3285, + 3285, 3467, 3467, 3468, 3285, 3285, 3468, 3469, 3469, 3470, + 3285, 3285, 3470, 3470, 3470, 3471, 3471, 3472, 3472, 3472, + + 3473, 3473, 3285, 3474, 3474, 3474, 3474, 3475, 3475, 3476, + 3285, 3285, 3477, 3477, 3478, 3478, 3479, 3479, 3480, 3480, + 3480, 3481, 3481, 3482, 3482, 3482, 3482, 3482, 3483, 3483, + 3285, 3484, 3485, 3485, 3285, 3285, 3486, 3486, 3285, 3285, + 3487, 3488, 3488, 3489, 3285, 3285, 3489, 3285, 3285, 3490, + 3285, 3285, 3285, 3285, 3285, 3285, 3491, 3285, 3492, 3285, + 3492, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3493, 3285, 3494, 3285, 3494, 3495, 3285, 3285, 3285, + + 3495, 3285, 3285, 3496, 3285, 3496, 3497, 3285, 3285, 3285, + 3285, 3285, 3497, 3285, 3285, 3497, 3497, 3497, 3285, 3498, + 3285, 3498, 3499, 3499, 3499, 3285, 3500, 3285, 3500, 3285, + 3285, 3285, 3501, 3285, 3502, 3285, 3502, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3503, 3285, 3285, 3285, 3503, 3503, 3285, 3504, 3285, 3504, + 3505, 3285, 3285, 3285, 3505, 3285, 3506, 3285, 3506, 3285, + 3285, 3285, 3507, 3285, 3508, 3285, 3508, 3509, 3509, 3285, + 3510, 3285, 3510, 3511, 3511, 3511, 3285, 3285, 3285, 3511, + 3511, 3285, 3512, 3285, 3512, 3285, 3285, 3513, 3285, 3514, + + 3285, 3514, 3515, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3516, 3285, 3516, 3517, 3517, 3517, 3517, 3285, 3285, 3285, + 3517, 3285, 3285, 3285, 3285, 3285, 3517, 3517, 3517, 3517, + 3517, 3517, 3517, 3517, 3517, 3285, 3518, 3285, 3518, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3519, 3519, 3519, + 3519, 3285, 3520, 3285, 3520, 3521, 3521, 3521, 3521, 3285, + 3285, 3285, 3285, 3285, 3521, 3521, 3285, 3522, 3285, 3522, + 3523, 3285, 3285, 3285, 3285, 3524, 3285, 3524, 3525, 3285, + 3285, 3285, 3525, 3285, 3526, 3285, 3526, 3527, 3285, 3285, + 3285, 3527, 3527, 3527, 3285, 3528, 3285, 3528, 3285, 3285, + + 3285, 3285, 3529, 3285, 3530, 3285, 3530, 3285, 3285, 3285, + 3531, 3531, 3285, 3285, 3531, 3285, 3532, 3285, 3532, 3533, + 3285, 3285, 3285, 3285, 3534, 3285, 3534, 3285, 3285, 3285, + 3285, 3285, 3535, 3285, 3535, 3285, 3285, 3536, 3536, 3285, + 3285, 3285, 3537, 3285, 3537, 3538, 3538, 3538, 3538, 3538, + 3285, 3539, 3285, 3539, 3285, 3540, 3285, 3541, 3285, 3541, + 3285, 3285, 3285, 3285, 3542, 3285, 3542, 3285, 3285, 3285, + 3543, 3285, 3544, 3285, 3544, 3545, 3546, 3285, 3285, 3285, + 3285, 3285, 3547, 3548, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3549, 3285, 3285, 3550, 3285, + 3551, 3552, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3552, 3285, 3285, 3552, 3553, 3554, 3285, 3285, 3554, 3555, + 3556, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3557, 3557, 3285, 3285, + 3558, 3559, 3559, 3560, 3285, 3285, 3561, 3285, 3285, 3562, + 3563, 3564, 3564, 3285, 3285, 3564, 3564, 3565, 3285, 3285, + 3285, 3285, 3566, 3285, 3285, 3567, 3568, 3568, 3568, 3568, + 3285, 3285, 3285, 3285, 3285, 3568, 3568, 3568, 3568, 3568, + + 3568, 3568, 3568, 3568, 3569, 3285, 3285, 3285, 3570, 3570, + 3570, 3570, 3571, 3572, 3572, 3572, 3572, 3285, 3285, 3285, + 3572, 3572, 3573, 3574, 3575, 3576, 3576, 3577, 3578, 3578, + 3578, 3578, 3579, 3285, 3285, 3285, 3285, 3285, 3285, 3580, + 3581, 3285, 3285, 3285, 3285, 3582, 3582, 3285, 3285, 3285, + 3582, 3583, 3584, 3585, 3285, 3285, 3285, 3285, 3285, 3285, + 3586, 3285, 3285, 3285, 3587, 3587, 3285, 3285, 3285, 3588, + 3589, 3285, 3285, 3589, 3589, 3589, 3590, 3285, 3591, 3592, + 3593, 3594, 3595, 3596, 3597, 3597, 3285, 3597, 3285, 3285, + 3285, 3598, 3599, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3600, 3285, 3285, 3285, + 3601, 3285, 3602, 3603, 3285, 3285, 3285, 3603, 3285, 3285, + 3285, 3603, 3604, 3605, 3285, 3285, 3285, 3285, 3285, 3606, + 3607, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3608, 3285, 3285, 3285, 3285, 3285, + 3609, 3610, 3610, 3611, 3285, 3285, 3285, 3612, 3285, 3285, + 3285, 3613, 3614, 3615, 3615, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3615, 3616, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3617, 3618, 3285, 3285, 3618, 3618, + 3285, 3285, 3285, 3618, 3618, 3285, 3285, 3618, 3618, 3618, + 3618, 3618, 3618, 3619, 3285, 3285, 3620, 3620, 3620, 3621, + 3622, 3285, 3285, 3622, 3622, 3285, 3285, 3622, 3623, 3624, + 3625, 3626, 3626, 3627, 3628, 3628, 3628, 3285, 3285, 3628, + 3629, 3630, 3631, 3285, 3632, 3632, 3632, 3633, 3634, 3635, + 3636, 3637, 3637, 3638, 3639, 3285, 3285, 3285, 3639, 3639, + 3639, 3640, 3285, 3285, 3285, 3641, 3642, 3285, 3285, 3643, + 3644, 3645, 3645, 3285, 3285, 3646, 3647, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3648, 3649, 3285, 3650, 3651, + 3651, 3651, 3652, 3653, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3654, 3655, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3656, 3285, 3285, 3285, + 3657, 3658, 3285, 3285, 3659, 3660, 3285, 3285, 3661, 3662, + 3662, 3285, 3285, 3285, 3285, 3285, 3285, 3662, 3285, 3285, + 3285, 3285, 3663, 3664, 3285, 3285, 3285, 3285, 3285, 3664, + 3664, 3664, 3285, 3285, 3285, 3285, 3285, 3664, 3664, 3664, + 3664, 3285, 3285, 3665, 3285, 3285, 3285, 3285, 3285, 3666, + + 3285, 3285, 3667, 3668, 3285, 3285, 3285, 3285, 3285, 3668, + 3285, 3285, 3285, 3668, 3285, 3285, 3669, 3670, 3671, 3671, + 3672, 3673, 3673, 3673, 3285, 3285, 3285, 3673, 3285, 3285, + 3674, 3675, 3285, 3285, 3285, 3285, 3285, 3676, 3677, 3678, + 3679, 3680, 3285, 3285, 3285, 3285, 3681, 3682, 3682, 3682, + 3682, 3683, 3285, 3285, 3285, 3285, 3684, 3685, 3285, 3285, + 3285, 3285, 3285, 3686, 3687, 3687, 3285, 3285, 3285, 3688, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3689, 3690, 3285, 3285, 3285, + + 3691, 3285, 3285, 3691, 3692, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3693, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3694, + 3285, 3285, 3285, 3285, 3285, 3695, 3285, 3285, 3285, 3285, + 3285, 3696, 3697, 3697, 3285, 3285, 3697, 3285, 3698, 3699, + 3285, 3285, 3285, 3699, 3699, 3699, 3285, 3285, 3285, 3285, + 3285, 3699, 3699, 3699, 3285, 3285, 3285, 3700, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3701, 3702, 3285, 3285, + 3285, 3702, 3702, 3703, 3704, 3705, 3285, 3285, 3706, 3707, + 3285, 3285, 3707, 3707, 3285, 3285, 3707, 3708, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3709, 3710, 3711, + 3712, 3713, 3285, 3285, 3285, 3285, 3285, 3285, 3714, 3715, + 3715, 3715, 3715, 3716, 3285, 3717, 3718, 3719, 3720, 3720, + 3285, 3285, 3285, 3285, 3721, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3722, 3723, 3285, 3724, + 3285, 3285, 3285, 3724, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3725, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3726, 3285, 3285, 3285, 3727, 3728, 3729, + + 3729, 3285, 3285, 3285, 3285, 3729, 3285, 3730, 3731, 3731, + 3731, 3731, 3285, 3285, 3285, 3731, 3731, 3731, 3732, 3285, + 3285, 3285, 3733, 3734, 3734, 3734, 3735, 3285, 3285, 3736, + 3285, 3285, 3285, 3737, 3738, 3285, 3285, 3285, 3738, 3738, + 3285, 3285, 3285, 3285, 3738, 3739, 3285, 3740, 3741, 3742, + 3743, 3744, 3745, 3285, 3285, 3746, 3746, 3746, 3747, 3285, + 3748, 3285, 3285, 3749, 3750, 3750, 3285, 3751, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3752, 3285, 3285, 3753, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3754, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3755, 3285, 3285, 3756, 3757, 3757, 3285, 3285, 3285, + 3285, 3757, 3285, 3758, 3759, 3759, 3759, 3759, 3759, 3285, + 3285, 3759, 3759, 3285, 3285, 3285, 3285, 3734, 3734, 3734, + 3735, 3285, 3285, 3737, 3285, 3285, 3738, 3738, 3738, 3285, + 3285, 3285, 3285, 3738, 3739, 3285, 3740, 3285, 3285, 3285, + 3285, 3743, 3744, 3745, 3285, 3285, 3285, 3285, 3285, 3746, + 3746, 3285, 3285, 3285, 3748, 3749, 3750, 3750, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3752, 3285, 3285, 3285, + 3753, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3754, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3755, 3285, + 3285, 3757, 3757, 3285, 3285, 3285, 3285, 3758, 3759, 3759, + 3759, 3759, 3759, 3285, 3285, 3285, 3759, 3285, 3285, 3734, + 3734, 3285, 3285, 3735, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3738, 3738, 3738, 3285, 3285, 3285, 3285, 3739, + 3740, 3285, 3285, 3285, 3285, 3285, 3744, 3745, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3750, 3750, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3753, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3754, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3755, 3757, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3759, + 3759, 3759, 3285, 3285, 3759, 3759, 3285, 3285, 3285, 3734, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3738, 3738, 3738, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3744, 3745, 3285, 3285, 3285, 3285, 3285, + 3285, 3749, 3750, 3750, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3753, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3754, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3755, 3285, 3285, 3757, 3285, + 3285, 3285, 3759, 3759, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3759, 3734, 3285, 3285, 3285, 3285, 3285, 3285, 3738, + 3285, 3285, 3738, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3744, 3745, 3285, 3285, 3285, + 3285, 3749, 3750, 3750, 3750, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3754, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3755, 3285, 3285, 3285, 3757, 3759, 3759, 3285, + 3285, 3285, 3285, 3285, 3285, 3759, 3734, 3738, 3285, 3285, + 3285, 3738, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3745, 3285, + 3285, 3285, 3285, 3749, 3750, 3750, 3750, 3760, 3761, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3754, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3757, 3759, 3759, 3285, 3285, 3734, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3745, 3285, 3285, 3285, 3285, 3749, 3750, + 3762, 3763, 3760, 3761, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3757, 3759, 3759, 3285, + 3285, 3285, 3734, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3762, 3750, + 3764, 3763, 3765, 3750, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3757, 3759, + 3759, 3285, 3285, 3285, 3285, 3734, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3764, 3285, 3765, + 3750, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3749, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3749, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3749, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3749, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3749, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, + 3749, 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3749, 3749, + + 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3285, 0, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285 } ; -static yyconst flex_int16_t yy_nxt[12113] = +static yyconst flex_int16_t yy_nxt[12182] = { 0, - 3298, 256, 257, 256, 256, 257, 256, 256, 257, 256, - 256, 257, 256, 261, 257, 261, 267, 258, 264, 267, - 258, 264, 3298, 259, 3298, 265, 259, 3298, 265, 262, - 261, 257, 261, 652, 268, 270, 271, 268, 270, 271, - 272, 273, 697, 272, 273, 652, 262, 277, 278, 653, - 274, 270, 271, 274, 275, 655, 272, 270, 271, 686, - 275, 654, 272, 277, 278, 1731, 274, 257, 257, 257, - 842, 654, 274, 257, 257, 257, 289, 257, 289, 289, - 257, 289, 843, 280, 289, 257, 289, 673, 1735, 280, - 727, 279, 290, 1350, 689, 290, 651, 651, 651, 1351, - - 291, 651, 651, 651, 651, 651, 651, 279, 281, 282, - 257, 282, 281, 281, 281, 281, 281, 281, 281, 283, - 281, 281, 281, 684, 281, 285, 281, 286, 281, 289, - 257, 289, 257, 257, 257, 257, 257, 257, 685, 289, - 257, 289, 289, 257, 289, 291, 690, 798, 292, 655, - 799, 292, 916, 281, 281, 290, 655, 655, 290, 289, - 257, 289, 651, 651, 651, 654, 651, 651, 651, 651, - 651, 651, 654, 654, 3298, 293, 917, 287, 281, 282, - 257, 282, 281, 281, 281, 281, 281, 281, 281, 283, - 281, 281, 281, 1737, 281, 285, 281, 286, 281, 289, - - 257, 289, 257, 257, 257, 257, 257, 257, 660, 289, - 257, 289, 289, 257, 289, 293, 666, 727, 294, 811, - 976, 294, 812, 281, 281, 291, 736, 728, 291, 257, - 257, 257, 257, 257, 257, 289, 257, 289, 289, 257, - 289, 289, 257, 289, 977, 295, 848, 287, 295, 655, - 661, 293, 791, 849, 293, 740, 662, 296, 289, 257, - 289, 663, 651, 651, 651, 654, 664, 651, 651, 651, - 651, 651, 651, 792, 296, 297, 298, 257, 298, 297, - 297, 297, 297, 297, 297, 297, 299, 297, 297, 297, - 714, 297, 301, 297, 302, 297, 305, 257, 305, 305, - - 257, 305, 257, 257, 257, 715, 257, 257, 257, 305, - 257, 305, 306, 904, 850, 306, 905, 1744, 294, 710, - 297, 297, 294, 711, 752, 306, 670, 712, 303, 297, - 298, 257, 298, 297, 297, 297, 297, 297, 297, 297, - 299, 297, 297, 297, 655, 297, 301, 297, 302, 297, - 305, 257, 305, 305, 257, 305, 305, 257, 305, 800, - 654, 858, 270, 271, 856, 691, 306, 272, 3298, 307, - 690, 857, 307, 801, 297, 297, 736, 317, 692, 752, - 685, 1745, 303, 308, 309, 257, 309, 308, 308, 308, - 308, 308, 308, 308, 310, 308, 308, 308, 1746, 308, - - 312, 308, 313, 308, 1747, 655, 318, 684, 331, 257, - 331, 331, 257, 331, 343, 257, 343, 690, 270, 271, - 693, 654, 685, 272, 332, 703, 795, 332, 308, 308, - 344, 689, 704, 317, 796, 1012, 314, 758, 1013, 315, - 797, 654, 651, 651, 651, 1752, 316, 308, 309, 257, - 309, 308, 308, 308, 308, 308, 308, 308, 310, 308, - 308, 308, 318, 308, 312, 308, 313, 308, 343, 257, - 343, 354, 257, 354, 354, 257, 354, 1753, 354, 257, - 354, 354, 257, 354, 344, 655, 741, 355, 655, 736, - 355, 851, 308, 308, 356, 716, 1493, 356, 1754, 690, - - 314, 654, 742, 315, 654, 651, 651, 651, 758, 1494, - 316, 319, 320, 257, 320, 319, 319, 319, 319, 319, - 319, 319, 321, 319, 319, 319, 1755, 319, 323, 319, - 324, 319, 257, 257, 257, 257, 257, 257, 354, 257, - 354, 776, 354, 257, 354, 354, 257, 354, 357, 1756, - 655, 357, 655, 655, 355, 1757, 319, 319, 355, 722, - 689, 358, 651, 651, 651, 325, 654, 326, 654, 654, - 776, 327, 651, 651, 651, 844, 328, 329, 319, 320, - 257, 320, 319, 319, 319, 319, 319, 319, 319, 321, - 319, 319, 319, 689, 319, 323, 319, 324, 319, 354, - - 257, 354, 257, 257, 257, 257, 257, 257, 883, 354, - 257, 354, 354, 257, 354, 358, 739, 1758, 359, 777, - 679, 359, 736, 319, 319, 360, 732, 736, 360, 651, - 651, 651, 325, 735, 326, 651, 651, 651, 327, 651, - 651, 651, 1765, 328, 329, 333, 334, 257, 334, 333, - 333, 333, 333, 333, 333, 333, 335, 333, 333, 333, - 686, 333, 337, 333, 338, 333, 354, 257, 354, 354, - 257, 354, 257, 257, 257, 898, 257, 257, 257, 354, - 257, 354, 361, 1766, 1775, 361, 898, 868, 362, 743, - 333, 333, 362, 730, 731, 358, 874, 339, 651, 651, - - 651, 899, 689, 340, 744, 651, 651, 651, 651, 651, - 651, 950, 341, 333, 334, 257, 334, 333, 333, 333, - 333, 333, 333, 333, 335, 333, 333, 333, 1777, 333, - 337, 333, 338, 333, 354, 257, 354, 257, 257, 257, - 257, 257, 257, 690, 354, 257, 354, 354, 257, 354, - 358, 655, 690, 363, 1778, 916, 363, 655, 333, 333, - 361, 655, 655, 361, 763, 339, 1788, 654, 651, 651, - 651, 340, 976, 654, 651, 651, 651, 654, 654, 985, - 341, 345, 346, 257, 346, 345, 345, 345, 345, 345, - 345, 345, 347, 345, 345, 345, 917, 345, 349, 345, - - 350, 345, 354, 257, 354, 354, 257, 354, 257, 257, - 257, 1789, 257, 257, 257, 354, 257, 354, 364, 655, - 1799, 364, 655, 1802, 365, 844, 345, 345, 365, 768, - 1803, 366, 651, 651, 651, 654, 3298, 351, 654, 651, - 651, 651, 651, 651, 651, 1807, 352, 345, 346, 257, - 346, 345, 345, 345, 345, 345, 345, 345, 347, 345, - 345, 345, 976, 345, 349, 345, 350, 345, 354, 257, - 354, 257, 257, 257, 257, 257, 257, 689, 354, 257, - 354, 354, 257, 354, 366, 777, 985, 367, 736, 916, - 367, 1808, 345, 345, 364, 655, 1811, 364, 354, 257, - - 354, 1812, 781, 351, 354, 257, 354, 651, 651, 651, - 882, 654, 352, 986, 368, 651, 651, 651, 727, 1813, - 368, 369, 370, 257, 370, 369, 369, 369, 369, 369, - 369, 369, 371, 369, 369, 369, 976, 369, 373, 369, - 374, 369, 380, 257, 380, 380, 257, 380, 257, 257, - 257, 925, 257, 257, 257, 926, 745, 655, 381, 1020, - 986, 381, 689, 1021, 357, 3298, 369, 369, 357, 655, - 655, 375, 734, 654, 891, 686, 787, 376, 651, 651, - 651, 377, 651, 651, 651, 654, 654, 378, 369, 370, - 257, 370, 369, 369, 369, 369, 369, 369, 369, 371, - - 369, 369, 369, 673, 369, 373, 369, 374, 369, 380, - 257, 380, 380, 257, 380, 380, 257, 380, 891, 380, - 257, 380, 651, 651, 651, 381, 736, 802, 381, 655, - 655, 382, 1138, 369, 369, 382, 805, 655, 375, 803, - 804, 651, 651, 651, 376, 654, 654, 1814, 377, 651, - 651, 651, 1677, 654, 378, 383, 384, 257, 384, 383, - 383, 383, 383, 383, 383, 383, 385, 383, 383, 383, - 689, 383, 387, 383, 388, 383, 393, 257, 393, 393, - 257, 393, 257, 257, 257, 930, 257, 257, 257, 651, - 651, 651, 394, 655, 655, 394, 655, 1815, 357, 931, - - 383, 383, 357, 815, 1816, 389, 651, 651, 651, 654, - 654, 390, 654, 651, 651, 651, 651, 651, 651, 651, - 651, 651, 391, 383, 384, 257, 384, 383, 383, 383, - 383, 383, 383, 383, 385, 383, 383, 383, 1824, 383, - 387, 383, 388, 383, 393, 257, 393, 393, 257, 393, - 393, 257, 393, 935, 393, 257, 393, 1138, 655, 1505, - 394, 1469, 655, 394, 655, 825, 395, 931, 383, 383, - 395, 830, 1494, 389, 654, 651, 651, 651, 654, 390, - 654, 651, 651, 651, 651, 651, 651, 651, 651, 651, - 391, 396, 397, 257, 397, 396, 396, 396, 396, 396, - - 396, 396, 398, 396, 396, 396, 1827, 396, 400, 396, - 401, 396, 405, 257, 405, 405, 257, 405, 416, 257, - 416, 1828, 416, 257, 416, 430, 257, 430, 406, 655, - 655, 406, 655, 1831, 417, 858, 396, 396, 417, 836, - 1833, 431, 651, 651, 651, 654, 654, 402, 654, 651, - 651, 651, 403, 396, 397, 257, 397, 396, 396, 396, - 396, 396, 396, 396, 398, 396, 396, 396, 1835, 396, - 400, 396, 401, 396, 430, 257, 430, 257, 257, 257, - 257, 257, 257, 851, 430, 257, 430, 430, 257, 430, - 431, 690, 1836, 432, 1838, 1839, 432, 655, 396, 396, - - 431, 1840, 1845, 431, 1848, 850, 651, 651, 651, 402, - 651, 651, 651, 654, 403, 407, 408, 257, 408, 407, - 407, 407, 407, 407, 407, 407, 409, 407, 407, 407, - 1849, 407, 411, 407, 412, 407, 430, 257, 430, 430, - 257, 430, 442, 257, 442, 935, 442, 257, 442, 454, - 257, 454, 433, 851, 1850, 433, 655, 689, 443, 982, - 407, 407, 443, 863, 655, 455, 651, 651, 651, 651, - 651, 651, 654, 651, 651, 651, 413, 651, 651, 651, - 654, 1852, 414, 407, 408, 257, 408, 407, 407, 407, - 407, 407, 407, 407, 409, 407, 407, 407, 1855, 407, - - 411, 407, 412, 407, 454, 257, 454, 471, 257, 471, - 471, 257, 471, 1856, 486, 257, 486, 486, 257, 486, - 455, 1858, 655, 472, 1862, 1863, 472, 655, 407, 407, - 487, 918, 655, 487, 651, 651, 651, 868, 654, 651, - 651, 651, 919, 654, 413, 920, 1864, 874, 654, 1866, - 414, 418, 419, 257, 419, 418, 418, 418, 418, 418, - 418, 418, 420, 418, 418, 418, 1680, 418, 422, 418, - 423, 418, 502, 257, 502, 502, 257, 502, 513, 257, - 513, 1877, 513, 257, 513, 851, 655, 1878, 503, 1879, - 1881, 503, 1882, 690, 514, 851, 418, 418, 514, 424, - - 655, 425, 654, 690, 651, 651, 651, 426, 651, 651, - 651, 651, 651, 651, 427, 882, 654, 428, 418, 419, - 257, 419, 418, 418, 418, 418, 418, 418, 418, 420, - 418, 418, 418, 1883, 418, 422, 418, 423, 418, 525, - 257, 525, 525, 257, 525, 538, 257, 538, 918, 538, - 257, 538, 883, 1884, 1885, 526, 1138, 1138, 526, 919, - 1505, 539, 934, 418, 418, 539, 424, 736, 425, 651, - 651, 651, 1140, 1543, 426, 651, 651, 651, 651, 651, - 651, 427, 1874, 1886, 428, 434, 435, 257, 435, 434, - 434, 434, 434, 434, 434, 434, 436, 434, 434, 434, - - 1887, 434, 438, 434, 439, 434, 257, 257, 257, 257, - 257, 257, 538, 257, 538, 935, 538, 257, 538, 538, - 257, 538, 357, 1888, 1889, 357, 655, 655, 539, 987, - 434, 434, 539, 887, 896, 540, 651, 651, 651, 651, - 651, 651, 654, 654, 1890, 1892, 440, 434, 435, 257, - 435, 434, 434, 434, 434, 434, 434, 434, 436, 434, - 434, 434, 1893, 434, 438, 434, 439, 434, 538, 257, - 538, 550, 257, 550, 550, 257, 550, 935, 257, 257, - 257, 257, 257, 257, 540, 1894, 1895, 551, 927, 1898, - 551, 988, 434, 434, 552, 928, 1901, 552, 651, 651, - - 651, 929, 902, 902, 902, 1155, 1155, 1155, 440, 444, - 445, 257, 445, 444, 444, 444, 444, 444, 444, 444, - 446, 444, 444, 444, 1902, 444, 448, 444, 449, 444, - 550, 257, 550, 550, 257, 550, 550, 257, 550, 937, - 550, 257, 550, 564, 257, 564, 551, 1903, 1904, 551, - 938, 940, 553, 920, 444, 444, 553, 937, 928, 565, - 450, 903, 940, 927, 941, 451, 1905, 1906, 938, 928, - 928, 934, 1485, 1485, 1485, 929, 941, 452, 444, 445, - 257, 445, 444, 444, 444, 444, 444, 444, 444, 446, - 444, 444, 444, 1910, 444, 448, 444, 449, 444, 564, - - 257, 564, 257, 257, 257, 257, 257, 257, 1911, 564, - 257, 564, 564, 257, 564, 565, 1913, 1914, 552, 927, - 940, 552, 1915, 444, 444, 565, 928, 928, 565, 450, - 918, 1917, 981, 981, 451, 902, 902, 902, 1930, 1142, - 1931, 938, 1932, 1933, 934, 1934, 452, 456, 457, 257, - 457, 456, 456, 456, 456, 456, 456, 456, 458, 456, - 456, 456, 459, 456, 460, 456, 461, 456, 459, 459, - 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, - 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, - 459, 459, 456, 456, 459, 462, 463, 464, 459, 459, - - 459, 459, 459, 465, 459, 459, 466, 459, 459, 459, - 467, 459, 468, 469, 459, 459, 459, 459, 459, 459, - 459, 473, 474, 257, 474, 473, 473, 473, 473, 473, - 473, 473, 475, 473, 473, 473, 1937, 473, 477, 473, - 478, 473, 564, 257, 564, 564, 257, 564, 576, 257, - 576, 1938, 576, 257, 576, 587, 257, 587, 566, 1308, - 1939, 566, 1940, 1945, 577, 1953, 473, 473, 577, 1309, - 479, 588, 1155, 1155, 1155, 1954, 1310, 480, 1961, 1965, - 481, 1178, 1178, 1178, 482, 1967, 483, 484, 473, 474, - 257, 474, 473, 473, 473, 473, 473, 473, 473, 475, - - 473, 473, 473, 1973, 473, 477, 473, 478, 473, 587, - 257, 587, 257, 257, 257, 257, 257, 257, 1974, 587, - 257, 587, 587, 257, 587, 588, 1975, 1981, 552, 1982, - 1983, 552, 1984, 473, 473, 588, 1156, 479, 588, 1191, - 1191, 1191, 1997, 1192, 480, 1156, 1193, 481, 1178, 1178, - 1178, 482, 2003, 483, 484, 488, 489, 257, 489, 488, - 488, 488, 488, 488, 488, 488, 490, 488, 488, 488, - 2007, 488, 492, 488, 493, 488, 587, 257, 587, 587, - 257, 587, 600, 257, 600, 2010, 600, 257, 600, 947, - 947, 947, 589, 2012, 2013, 589, 2015, 2016, 601, 2017, - - 488, 488, 601, 494, 495, 496, 948, 2021, 1201, 1201, - 1201, 497, 1202, 2024, 498, 1203, 2026, 2033, 499, 2041, - 2042, 500, 488, 489, 257, 489, 488, 488, 488, 488, - 488, 488, 488, 490, 488, 488, 488, 2043, 488, 492, - 488, 493, 488, 257, 257, 257, 257, 257, 257, 600, - 257, 600, 2044, 600, 257, 600, 955, 955, 955, 552, - 2046, 2060, 552, 1138, 2064, 601, 2065, 488, 488, 601, - 494, 495, 496, 956, 2066, 1223, 1223, 1223, 497, 1224, - 2057, 498, 1225, 2069, 2070, 499, 1680, 2072, 500, 504, - 505, 257, 505, 504, 504, 504, 504, 504, 504, 504, - - 506, 504, 504, 504, 1680, 504, 508, 504, 509, 504, - 600, 257, 600, 600, 257, 600, 615, 257, 615, 2073, - 615, 257, 615, 970, 970, 970, 602, 2074, 2058, 602, - 2075, 2076, 616, 2077, 504, 504, 616, 2059, 2080, 510, - 971, 1540, 1540, 1540, 2081, 511, 504, 505, 257, 505, - 504, 504, 504, 504, 504, 504, 504, 506, 504, 504, - 504, 2084, 504, 508, 504, 509, 504, 257, 257, 257, - 257, 257, 257, 615, 257, 615, 2085, 615, 257, 615, - 990, 990, 990, 617, 2086, 2067, 617, 2087, 2088, 616, - 2090, 504, 504, 616, 2091, 2094, 510, 991, 1485, 1485, - - 1485, 2068, 511, 515, 516, 257, 516, 515, 515, 515, - 515, 515, 515, 515, 517, 515, 515, 515, 2097, 515, - 519, 515, 520, 515, 615, 257, 615, 615, 257, 615, - 627, 257, 627, 2101, 627, 257, 627, 637, 257, 637, - 618, 2102, 2105, 618, 2106, 2107, 628, 2110, 515, 515, - 628, 2114, 521, 638, 1155, 1155, 1155, 2115, 2118, 522, - 2120, 2136, 523, 515, 516, 257, 516, 515, 515, 515, - 515, 515, 515, 515, 517, 515, 515, 515, 2137, 515, - 519, 515, 520, 515, 637, 257, 637, 257, 257, 257, - 257, 257, 257, 2103, 637, 257, 637, 637, 257, 637, - - 638, 2104, 2138, 357, 2116, 2116, 357, 2139, 515, 515, - 638, 2140, 521, 638, 1178, 1178, 1178, 2141, 1231, 522, - 2117, 2068, 523, 527, 528, 257, 528, 527, 527, 527, - 527, 527, 527, 527, 529, 527, 527, 527, 2143, 527, - 531, 527, 532, 527, 637, 257, 637, 637, 257, 637, - 649, 257, 649, 2108, 649, 257, 649, 997, 997, 997, - 639, 2109, 2147, 639, 2067, 2148, 650, 727, 527, 527, - 650, 2149, 533, 3298, 998, 2155, 2156, 737, 1231, 534, - 2117, 2157, 535, 686, 2171, 2175, 686, 2176, 2177, 536, - 527, 528, 257, 528, 527, 527, 527, 527, 527, 527, - - 527, 529, 527, 527, 527, 738, 527, 531, 527, 532, - 527, 2179, 687, 2183, 741, 1002, 1002, 1002, 688, 689, - 1014, 1014, 1014, 683, 2187, 689, 1026, 1026, 1026, 690, - 742, 2188, 1003, 2189, 2190, 527, 527, 1015, 2191, 533, - 1245, 1245, 1245, 1027, 1246, 2194, 534, 1247, 2201, 535, - 1694, 1694, 1694, 1697, 1697, 1697, 536, 541, 542, 257, - 542, 541, 541, 541, 541, 541, 541, 541, 543, 541, - 541, 541, 2203, 541, 545, 541, 546, 541, 1028, 1028, - 1028, 1034, 1034, 1034, 1037, 1037, 1037, 1051, 1051, 1051, - 1053, 1053, 1053, 2213, 2214, 1029, 1695, 2215, 1035, 1698, - - 2216, 1038, 541, 541, 1052, 2218, 1138, 1054, 547, 1255, - 1255, 1255, 2221, 1256, 1680, 2224, 1257, 1701, 1701, 1701, - 1704, 1704, 1704, 548, 541, 542, 257, 542, 541, 541, - 541, 541, 541, 541, 541, 543, 541, 541, 541, 2230, - 541, 545, 541, 546, 541, 1065, 1065, 1065, 1073, 1073, - 1073, 1078, 1078, 1078, 1084, 1084, 1084, 1104, 1104, 1104, - 2223, 2231, 1066, 2232, 2233, 1074, 2236, 2238, 1079, 541, - 541, 1085, 2239, 2240, 1105, 547, 1263, 1263, 1263, 2244, - 1264, 2249, 2251, 1265, 1714, 1714, 1714, 1540, 1540, 1540, - 548, 554, 555, 257, 555, 554, 554, 554, 554, 554, - - 554, 554, 556, 554, 554, 554, 2252, 554, 558, 554, - 559, 554, 1128, 1128, 1128, 1132, 1132, 1132, 1680, 2253, - 1151, 1151, 1151, 1151, 1151, 1151, 1186, 1186, 1186, 1129, - 2257, 2263, 1133, 1186, 1186, 1186, 554, 554, 1153, 2264, - 2265, 1153, 560, 2266, 1188, 561, 1280, 1280, 1280, 2222, - 1281, 1188, 2267, 1282, 1751, 1751, 1751, 562, 554, 555, - 257, 555, 554, 554, 554, 554, 554, 554, 554, 556, - 554, 554, 554, 2268, 554, 558, 554, 559, 554, 2269, - 2270, 1154, 947, 947, 947, 2271, 2272, 1196, 1196, 1196, - 1196, 1196, 1196, 1189, 955, 955, 955, 2278, 2279, 948, - - 1204, 1204, 1204, 554, 554, 1198, 2280, 2281, 1198, 560, - 2293, 956, 561, 2294, 1297, 1297, 1297, 1205, 1298, 2299, - 2300, 1299, 2302, 2303, 562, 567, 568, 257, 568, 567, - 567, 567, 567, 567, 567, 567, 569, 567, 567, 567, - 2304, 567, 571, 567, 572, 567, 1207, 1207, 1207, 1212, - 1212, 1212, 2305, 2309, 1199, 2310, 1212, 1212, 1212, 1219, - 1219, 1219, 2311, 1208, 1748, 1748, 1748, 1214, 2317, 2318, - 567, 567, 2319, 2320, 1214, 2323, 573, 1221, 1694, 1694, - 1694, 574, 567, 568, 257, 568, 567, 567, 567, 567, - 567, 567, 567, 569, 567, 567, 567, 2328, 567, 571, - - 567, 572, 567, 1215, 1219, 1219, 1219, 970, 970, 970, - 1749, 1227, 1227, 1227, 990, 990, 990, 1227, 1227, 1227, - 1918, 2332, 1221, 2333, 971, 2338, 1919, 567, 567, 1229, - 1920, 991, 2339, 573, 1921, 1229, 2340, 2341, 574, 578, - 579, 257, 579, 578, 578, 578, 578, 578, 578, 578, - 580, 578, 578, 578, 1230, 578, 582, 578, 583, 578, - 1250, 1250, 1250, 1250, 1250, 1250, 1922, 2343, 1222, 997, - 997, 997, 1923, 1259, 1259, 1259, 1924, 2353, 1252, 2364, - 1925, 1252, 2365, 2366, 578, 578, 998, 1002, 1002, 1002, - 584, 1261, 1300, 1300, 1300, 2370, 1301, 2371, 2372, 1302, - - 2375, 1750, 1750, 1750, 1003, 585, 578, 579, 257, 579, - 578, 578, 578, 578, 578, 578, 578, 580, 578, 578, - 578, 2379, 578, 582, 578, 583, 578, 2380, 1680, 1253, - 1259, 1259, 1259, 2381, 2382, 1267, 1267, 1267, 1267, 1267, - 1267, 1273, 1273, 1273, 1273, 1273, 1273, 1698, 1261, 2383, - 2295, 578, 578, 1269, 2384, 2385, 1269, 584, 2296, 1275, - 2297, 2334, 1275, 1311, 1311, 1311, 2386, 1312, 2298, 2335, - 1313, 2358, 585, 590, 591, 257, 591, 590, 590, 590, - 590, 590, 590, 590, 592, 590, 590, 590, 1680, 590, - 594, 590, 595, 590, 2387, 2388, 1262, 2403, 2404, 1270, - - 1014, 1014, 1014, 1285, 1285, 1285, 1026, 1026, 1026, 1276, - 1285, 1285, 1285, 1292, 1292, 1292, 2405, 1015, 590, 590, - 2406, 1287, 2336, 1027, 596, 2411, 2412, 597, 1287, 2413, - 2337, 1294, 1697, 1697, 1697, 2359, 1697, 1697, 1697, 598, - 590, 591, 257, 591, 590, 590, 590, 590, 590, 590, - 590, 592, 590, 590, 590, 2414, 590, 594, 590, 595, - 590, 1028, 1028, 1028, 2415, 2416, 1292, 1292, 1292, 2417, - 2420, 1288, 1303, 1303, 1303, 1303, 1303, 1303, 1029, 1034, - 1034, 1034, 1847, 2421, 1294, 590, 590, 1037, 1037, 1037, - 1305, 596, 2422, 1305, 597, 2427, 1035, 2428, 1315, 1315, - - 1315, 2433, 1316, 2434, 1038, 1317, 598, 603, 604, 257, - 604, 603, 603, 603, 603, 603, 603, 603, 605, 603, - 603, 603, 2435, 603, 607, 603, 608, 603, 1295, 1318, - 1318, 1318, 1329, 1329, 1329, 2436, 1306, 1329, 1329, 1329, - 1051, 1051, 1051, 1345, 1345, 1345, 1319, 1333, 1333, 1333, - 1331, 1334, 603, 603, 1335, 1331, 2445, 1052, 2446, 2447, - 609, 1347, 610, 2448, 2450, 611, 1891, 1891, 1891, 612, - 1701, 1701, 1701, 613, 603, 604, 257, 604, 603, 603, - 603, 603, 603, 603, 603, 605, 603, 603, 603, 2452, - 603, 607, 603, 608, 603, 1332, 1053, 1053, 1053, 1336, - - 1336, 1336, 1680, 1337, 2476, 1680, 1338, 1339, 1339, 1339, - 1360, 1360, 1360, 1054, 3298, 3298, 3298, 2477, 2479, 603, - 603, 3298, 3298, 3298, 1340, 2480, 2481, 609, 1362, 610, - 2482, 3298, 611, 1704, 1704, 1704, 612, 2472, 3298, 2473, - 613, 619, 620, 257, 620, 619, 619, 619, 619, 619, - 619, 619, 621, 619, 619, 619, 2486, 619, 623, 619, - 624, 619, 1345, 1345, 1345, 1341, 1065, 1065, 1065, 1714, - 1714, 1714, 2423, 1342, 3298, 3298, 3298, 3298, 3298, 3298, - 1347, 2487, 2424, 1066, 2488, 2489, 619, 619, 1353, 1353, - 1353, 3298, 1354, 2490, 3298, 1355, 1365, 1365, 1365, 2491, - - 1366, 2492, 2493, 1367, 2494, 1896, 1896, 1896, 2495, 1348, - 625, 619, 620, 257, 620, 619, 619, 619, 619, 619, - 619, 619, 621, 619, 619, 619, 1344, 619, 623, 619, - 624, 619, 1343, 1356, 1356, 1356, 1073, 1073, 1073, 2496, - 1368, 1368, 1368, 2498, 2499, 1360, 1360, 1360, 2502, 2503, - 1357, 2504, 2505, 1074, 2506, 2509, 619, 619, 1370, 1368, - 1368, 1368, 2510, 1362, 1373, 1373, 1373, 2511, 1374, 1897, - 2512, 1375, 1382, 1382, 1382, 2513, 1383, 1370, 2515, 1384, - 625, 629, 630, 257, 630, 629, 629, 629, 629, 629, - 629, 629, 631, 629, 629, 629, 1363, 629, 633, 629, - - 634, 629, 1078, 1078, 1078, 1377, 1377, 1377, 1084, 1084, - 1084, 2519, 1377, 1377, 1377, 1388, 1388, 1388, 2520, 1079, - 1371, 2521, 2500, 1379, 2522, 1085, 629, 629, 2526, 2527, - 1379, 2501, 2528, 1390, 1899, 1899, 1899, 635, 629, 630, - 257, 630, 629, 629, 629, 629, 629, 629, 629, 631, - 629, 629, 629, 2529, 629, 633, 629, 634, 629, 1380, - 2530, 1388, 1388, 1388, 1392, 1392, 1392, 2534, 1394, 1394, - 1394, 3298, 3298, 3298, 1397, 1397, 1397, 2507, 2537, 1390, - 1900, 1393, 2538, 629, 629, 1395, 2508, 2541, 3298, 1748, - 1748, 1748, 1399, 2553, 635, 640, 641, 257, 641, 640, - - 640, 640, 640, 640, 640, 640, 642, 640, 640, 640, - 2554, 640, 644, 640, 645, 640, 1391, 2557, 2558, 1397, - 1397, 1397, 1402, 1402, 1402, 1750, 1750, 1750, 2578, 2579, - 1396, 1406, 1406, 1406, 1409, 1409, 1409, 1399, 2580, 1403, - 640, 640, 3298, 3298, 3298, 3298, 3298, 3298, 1407, 1680, - 1138, 646, 1411, 1414, 1414, 1414, 2581, 1415, 2582, 3298, - 1416, 2591, 3298, 1680, 647, 640, 641, 257, 641, 640, - 640, 640, 640, 640, 640, 640, 642, 640, 640, 640, - 1400, 640, 644, 640, 645, 640, 2576, 1409, 1409, 1409, - 2575, 2592, 1404, 2593, 2594, 1104, 1104, 1104, 1417, 1417, - - 1417, 1417, 1417, 1417, 1408, 1411, 2577, 1405, 2595, 2596, - 640, 640, 1105, 1421, 1421, 1421, 1419, 2597, 2598, 1419, - 2599, 646, 2600, 2601, 1412, 2603, 1423, 1423, 1423, 2604, - 1422, 1425, 1425, 1425, 647, 655, 1425, 1425, 1425, 1435, - 1435, 1435, 670, 1424, 1429, 1429, 1429, 2605, 2606, 1427, - 2607, 654, 671, 2608, 1427, 2609, 1420, 1437, 3298, 3298, - 3298, 1430, 1751, 1751, 1751, 1433, 1433, 1433, 2610, 2611, - 1435, 1435, 1435, 2612, 2613, 3298, 1128, 1128, 1128, 672, - 673, 674, 1434, 2614, 2615, 675, 676, 677, 1437, 2616, - 678, 679, 2617, 1129, 680, 2618, 681, 682, 683, 655, - - 1444, 1444, 1444, 1444, 1444, 1444, 727, 1428, 1431, 1450, - 1450, 1450, 1450, 1450, 1450, 654, 728, 2619, 1446, 2585, - 2621, 1446, 2629, 1432, 1454, 1454, 1454, 1452, 1455, 2586, - 1452, 1456, 2587, 2630, 1457, 1457, 1457, 2631, 1457, 1457, - 1457, 1438, 2634, 672, 729, 684, 1132, 1132, 1132, 730, - 731, 677, 1459, 2635, 732, 679, 1459, 2639, 733, 2657, - 734, 735, 683, 1133, 1461, 1461, 1461, 1447, 1462, 2658, - 2674, 1463, 1465, 1465, 1465, 2659, 1453, 1465, 1465, 1465, - 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1680, - 1467, 1507, 1507, 1507, 2676, 1467, 2677, 1138, 1153, 1460, - - 2678, 1153, 2682, 2683, 1153, 1186, 1186, 1186, 1508, 1186, - 1186, 1186, 1186, 1186, 1186, 1510, 1510, 1510, 1191, 1191, - 1191, 2686, 1192, 1188, 2687, 1193, 2671, 1188, 2690, 1680, - 1188, 2672, 1511, 1477, 3298, 3298, 3298, 1196, 1196, 1196, - 2691, 1468, 1196, 1196, 1196, 1196, 1196, 1196, 1204, 1204, - 1204, 3298, 1201, 1201, 1201, 1198, 1202, 2692, 2693, 1203, - 1198, 1509, 2694, 1198, 2695, 1205, 1516, 1516, 1516, 2696, - 1517, 2673, 2684, 1518, 1519, 1519, 1519, 1207, 1207, 1207, - 1521, 1521, 1521, 2697, 1522, 2685, 2698, 1523, 1525, 1525, - 1525, 1520, 1514, 2700, 1208, 1512, 1212, 1212, 1212, 1212, - - 1212, 1212, 1212, 1212, 1212, 1526, 1530, 1530, 1530, 1219, - 1219, 1219, 2701, 2702, 1214, 2703, 2704, 1214, 2705, 2706, - 1214, 2688, 2707, 1531, 1219, 1219, 1219, 1221, 1219, 1219, - 1219, 1223, 1223, 1223, 2689, 1224, 2708, 2709, 1225, 1227, - 1227, 1227, 1221, 1227, 1227, 1227, 1221, 1535, 1535, 1535, - 2588, 1245, 1245, 1245, 2710, 1246, 2711, 1229, 1247, 2712, - 2589, 1229, 1528, 2590, 2713, 1536, 1552, 1552, 1552, 1250, - 1250, 1250, 1250, 1250, 1250, 1533, 1250, 1250, 1250, 1259, - 1259, 1259, 2714, 1553, 1255, 1255, 1255, 1252, 1256, 2716, - 1252, 1257, 2724, 2725, 1252, 2733, 2734, 1261, 1259, 1259, - - 1259, 1259, 1259, 1259, 1263, 1263, 1263, 2751, 1264, 2752, - 2753, 1265, 1558, 1558, 1558, 2754, 1261, 2755, 2756, 1261, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1559, - 1561, 1561, 1561, 3298, 3298, 3298, 2759, 1554, 1269, 1680, - 2767, 1269, 2769, 2770, 1269, 2771, 2772, 1562, 2773, 2760, - 3298, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, - 2774, 1563, 1557, 1567, 1567, 1567, 1280, 1280, 1280, 1275, - 1281, 1138, 1275, 1282, 2764, 1275, 1285, 1285, 1285, 2775, - 1568, 1285, 1285, 1285, 1285, 1285, 1285, 1574, 1574, 1574, - 1292, 1292, 1292, 1560, 1287, 1292, 1292, 1292, 2776, 1287, - - 2777, 2778, 1287, 2781, 1575, 1577, 1577, 1577, 1294, 1292, - 1292, 1292, 2782, 1294, 1297, 1297, 1297, 2761, 1298, 2763, - 2783, 1299, 1578, 1564, 1300, 1300, 1300, 1294, 1301, 2784, - 2762, 1302, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, - 1303, 1311, 1311, 1311, 2785, 1312, 2786, 2787, 1313, 1571, - 1305, 2788, 2790, 1305, 2791, 2792, 1305, 1584, 1584, 1584, - 1315, 1315, 1315, 2793, 1316, 2794, 2795, 1317, 1318, 1318, - 1318, 1586, 1586, 1586, 1585, 1587, 1576, 2796, 1588, 1329, - 1329, 1329, 1329, 1329, 1329, 1319, 1329, 1329, 1329, 1333, - 1333, 1333, 2660, 1334, 2797, 2798, 1335, 1331, 2799, 2800, - - 1331, 2801, 2661, 1579, 1331, 1336, 1336, 1336, 2662, 1337, - 2802, 2803, 1338, 1339, 1339, 1339, 1599, 1599, 1599, 2804, - 1600, 2810, 2811, 1601, 1345, 1345, 1345, 1345, 1345, 1345, - 1340, 1345, 1345, 1345, 1353, 1353, 1353, 2812, 1354, 2819, - 2820, 1355, 1347, 2834, 2835, 1347, 1356, 1356, 1356, 1347, - 1611, 1611, 1611, 1598, 1612, 2836, 2837, 1613, 1360, 1360, - 1360, 2838, 2839, 1357, 1360, 1360, 1360, 1360, 1360, 1360, - 1365, 1365, 1365, 2826, 1366, 2843, 1362, 1367, 2844, 1606, - 2845, 2846, 1362, 2827, 2856, 1362, 1368, 1368, 1368, 1368, - 1368, 1368, 1368, 1368, 1368, 1373, 1373, 1373, 2828, 1374, - - 2857, 2858, 1375, 2859, 1370, 2860, 2861, 1370, 2829, 2862, - 1370, 1377, 1377, 1377, 1377, 1377, 1377, 2863, 1616, 1377, - 1377, 1377, 2867, 1382, 1382, 1382, 2830, 1383, 2868, 1379, - 1384, 2832, 1379, 1388, 1388, 1388, 2831, 1379, 1388, 1388, - 1388, 2833, 1388, 1388, 1388, 1392, 1392, 1392, 1627, 1627, - 1627, 1390, 1628, 2869, 2870, 1629, 1390, 1138, 2871, 1618, - 1390, 2872, 1393, 1394, 1394, 1394, 2874, 2875, 1621, 1630, - 1630, 1630, 2876, 1631, 2877, 2878, 1632, 1397, 1397, 1397, - 1395, 1397, 1397, 1397, 2879, 1397, 1397, 1397, 1402, 1402, - 1402, 2847, 1406, 1406, 1406, 1399, 1907, 1907, 1907, 1399, - - 2880, 2881, 1626, 1399, 2882, 1403, 1636, 1636, 1636, 1407, - 1637, 2883, 2887, 1638, 1641, 1641, 1641, 2888, 1642, 2889, - 2892, 1643, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1414, 1414, 1414, 2897, 1415, 2898, 2899, 1416, 2900, - 1411, 2901, 1908, 1411, 2902, 2903, 1411, 1417, 1417, 1417, - 2904, 2905, 1634, 1417, 1417, 1417, 1417, 1417, 1417, 1421, - 1421, 1421, 1648, 1648, 1648, 1419, 1649, 2906, 2907, 1650, - 2908, 1419, 2910, 2911, 1419, 2912, 1422, 1423, 1423, 1423, - 1651, 1651, 1651, 2913, 1652, 1138, 2920, 1653, 1425, 1425, - 1425, 2921, 1645, 2922, 1424, 1425, 1425, 1425, 2923, 1425, - - 1425, 1425, 1429, 1429, 1429, 2924, 1427, 1655, 1655, 1655, - 2925, 1656, 2926, 1427, 1657, 2927, 1647, 1427, 2928, 1430, - 1433, 1433, 1433, 1660, 1660, 1660, 2929, 1661, 2914, 2930, - 1662, 1435, 1435, 1435, 1435, 1435, 1435, 1434, 1435, 1435, - 1435, 1665, 1665, 1665, 1444, 1444, 1444, 2931, 2932, 1437, - 2933, 2936, 1437, 1444, 1444, 1444, 1437, 2937, 1666, 2938, - 2939, 1654, 1446, 1444, 1444, 1444, 1450, 1450, 1450, 2940, - 2941, 1446, 1450, 1450, 1450, 1450, 1450, 1450, 1454, 1454, - 1454, 1446, 1455, 2942, 1452, 1456, 1457, 1457, 1457, 2943, - 1452, 2944, 2945, 1452, 1457, 1457, 1457, 1457, 1457, 1457, - - 1663, 1461, 1461, 1461, 1459, 1462, 2946, 2950, 1463, 1465, - 1465, 1465, 1459, 2957, 2958, 1459, 1465, 1465, 1465, 1465, - 1465, 1465, 2959, 2960, 1670, 2961, 2962, 1467, 1673, 1679, - 1679, 1679, 2963, 2964, 1467, 2965, 2966, 1467, 1151, 1151, - 1151, 1507, 1507, 1507, 1186, 1186, 1186, 1680, 1681, 2967, - 1510, 1510, 1510, 1535, 1535, 1535, 1153, 1674, 1508, 1717, - 1717, 1717, 1188, 1718, 2968, 2971, 1719, 1511, 1721, 1721, - 1721, 1536, 1722, 2972, 2973, 1723, 1196, 1196, 1196, 2974, - 1676, 1516, 1516, 1516, 1138, 1517, 2982, 2977, 1518, 1519, - 1519, 1519, 2983, 2984, 1198, 2985, 1728, 1728, 1728, 2977, - - 1729, 2978, 1720, 1730, 1686, 2986, 1520, 1521, 1521, 1521, - 2980, 1522, 2987, 2988, 1523, 1525, 1525, 1525, 2989, 1732, - 1732, 1732, 2990, 1733, 2991, 1726, 1734, 1212, 1212, 1212, - 2975, 2992, 1526, 1530, 1530, 1530, 1738, 1738, 1738, 2993, - 1739, 2994, 2995, 1740, 2996, 1214, 1741, 1741, 1741, 2997, - 1531, 1219, 1219, 1219, 1759, 1759, 1759, 1552, 1552, 1552, - 1761, 1761, 1761, 1742, 1762, 2998, 2999, 1763, 3000, 1221, - 3005, 1760, 3010, 3011, 1553, 3012, 3013, 1736, 1250, 1250, - 1250, 1259, 1259, 1259, 1558, 1558, 1558, 1768, 1768, 1768, - 3014, 1769, 3015, 3018, 1770, 3018, 1252, 1138, 3021, 1261, - - 1743, 1559, 1267, 1267, 1267, 1561, 1561, 1561, 1772, 1772, - 1772, 3022, 1773, 1680, 1681, 1774, 1273, 1273, 1273, 3001, - 1269, 3023, 1562, 1567, 1567, 1567, 1779, 1779, 1779, 3003, - 1780, 3002, 3006, 1781, 1275, 1782, 1782, 1782, 3016, 3024, - 1568, 3004, 1764, 3027, 3007, 1767, 1784, 1784, 1784, 1285, - 1285, 1285, 1783, 1574, 1574, 1574, 3008, 1790, 1790, 1790, - 3030, 1791, 1771, 1785, 1792, 3039, 3025, 1287, 3009, 2977, - 1575, 1793, 1793, 1793, 1577, 1577, 1577, 1776, 1795, 1795, - 1795, 3042, 1796, 2978, 3026, 1797, 1303, 1303, 1303, 1794, - 3028, 1578, 1786, 1800, 1800, 1800, 1584, 1584, 1584, 1804, - - 1804, 1804, 3047, 1805, 1305, 3029, 1806, 1586, 1586, 1586, - 1801, 1587, 3050, 1585, 1588, 1787, 1809, 1809, 1809, 1329, - 1329, 1329, 1599, 1599, 1599, 3051, 1600, 3052, 3018, 1601, - 1818, 1818, 1818, 1810, 3298, 3298, 3298, 1331, 3298, 3298, - 3298, 3298, 3298, 3298, 1345, 1345, 1345, 1819, 1825, 1825, - 1825, 3298, 1798, 2977, 3054, 3298, 3018, 3055, 3298, 1611, - 1611, 1611, 1347, 1612, 2980, 1826, 1613, 3056, 3057, 1829, - 1829, 1829, 1360, 1360, 1360, 1368, 1368, 1368, 1377, 1377, - 1377, 1841, 1841, 1841, 1817, 1821, 1830, 1388, 1388, 1388, - 1362, 3058, 3059, 1370, 3060, 3061, 1379, 3062, 1842, 1823, - - 3072, 1397, 1397, 1397, 1820, 1390, 1627, 1627, 1627, 3037, - 1628, 1822, 3073, 1629, 1630, 1630, 1630, 3074, 1631, 1399, - 3075, 1632, 1636, 1636, 1636, 3076, 1637, 1843, 3038, 1638, - 1641, 1641, 1641, 3077, 1642, 1837, 1832, 1643, 1409, 1409, - 1409, 1834, 3081, 3040, 1844, 1417, 1417, 1417, 1648, 1648, - 1648, 3082, 1649, 3083, 3084, 1650, 1411, 1651, 1651, 1651, - 3045, 1652, 3041, 1419, 1653, 3085, 3048, 1846, 1425, 1425, - 1425, 1655, 1655, 1655, 3086, 1656, 3087, 3088, 1657, 3046, - 1660, 1660, 1660, 3090, 1661, 3049, 1427, 1662, 1435, 1435, - 1435, 1665, 1665, 1665, 1859, 1859, 1859, 3091, 1860, 1851, - - 3092, 1861, 1853, 1444, 1444, 1444, 1437, 3093, 1666, 1867, - 1867, 1867, 1450, 1450, 1450, 1854, 1457, 1457, 1457, 3094, - 3099, 1446, 1871, 1871, 1871, 3100, 1868, 1465, 1465, 1465, - 1452, 1679, 1679, 1679, 1459, 1857, 1151, 1151, 1151, 1872, - 1717, 1717, 1717, 3101, 1718, 1467, 3102, 1719, 3103, 1680, - 3104, 3095, 1865, 3105, 1153, 1186, 1186, 1186, 1721, 1721, - 1721, 3106, 1722, 3096, 3107, 1723, 3108, 3109, 1870, 1196, - 1196, 1196, 3110, 1188, 1728, 1728, 1728, 3111, 1729, 1869, - 3112, 1730, 1875, 1212, 1212, 1212, 3097, 1198, 1880, 1873, - 1732, 1732, 1732, 3114, 1733, 3115, 3116, 1734, 3098, 1876, - - 3117, 1214, 1738, 1738, 1738, 3118, 1739, 3119, 3120, 1740, - 1741, 1741, 1741, 3121, 1926, 1926, 1926, 1138, 1927, 3122, - 1912, 1928, 1909, 1219, 1219, 1219, 3123, 1742, 1935, 1935, - 1935, 1935, 1935, 1935, 1896, 1896, 1896, 1759, 1759, 1759, - 3124, 1221, 3113, 3125, 1916, 1941, 1941, 1941, 3126, 1942, - 3127, 3128, 1943, 3129, 1760, 1761, 1761, 1761, 3130, 1762, - 3131, 3132, 1763, 1250, 1250, 1250, 1946, 1946, 1946, 1259, - 1259, 1259, 3133, 3135, 1929, 1768, 1768, 1768, 1138, 1769, - 3136, 1252, 1770, 1947, 1267, 1267, 1267, 1261, 3137, 1772, - 1772, 1772, 1936, 1773, 3138, 1897, 1774, 3134, 1936, 1273, - - 1273, 1273, 1269, 1950, 1950, 1950, 3139, 1779, 1779, 1779, - 1944, 1780, 3140, 3141, 1781, 3142, 1948, 1275, 3143, 3144, - 1951, 1782, 1782, 1782, 1955, 1955, 1955, 3145, 1956, 3146, - 3147, 1957, 1784, 1784, 1784, 1958, 1958, 1958, 1783, 1959, - 3148, 3149, 1960, 1962, 1962, 1962, 1964, 1964, 1964, 1785, - 1949, 1790, 1790, 1790, 3150, 1791, 3151, 3152, 1792, 3154, - 3155, 1963, 3156, 1952, 1793, 1793, 1793, 1795, 1795, 1795, - 3157, 1796, 1138, 3158, 1797, 1303, 1303, 1303, 1800, 1800, - 1800, 3159, 1794, 1968, 1968, 1968, 3160, 1969, 3161, 3162, - 1970, 3163, 3153, 1305, 3164, 1801, 1971, 1971, 1971, 1804, - - 1804, 1804, 3165, 1805, 3166, 3167, 1806, 1809, 1809, 1809, - 1976, 1976, 1976, 1972, 1977, 3168, 3169, 1978, 1979, 1979, - 1979, 1966, 3170, 3171, 1810, 1985, 1985, 1985, 1329, 1329, - 1329, 1818, 1818, 1818, 3173, 1980, 1988, 1988, 1988, 1138, - 1989, 3174, 1986, 1990, 3175, 3172, 1331, 3176, 1819, 1991, - 1991, 1991, 3298, 3298, 3298, 1994, 1994, 1994, 1345, 1345, - 1345, 1825, 1825, 1825, 3177, 3178, 1992, 3179, 3180, 3298, - 3181, 3182, 1995, 1998, 1998, 1998, 1347, 1999, 1826, 3183, - 2000, 2001, 2001, 2001, 1829, 1829, 1829, 3184, 2004, 2004, - 2004, 3186, 2005, 3187, 1987, 2006, 3188, 3189, 2002, 3190, - - 3191, 1830, 2008, 2008, 2008, 1368, 1368, 1368, 1138, 3192, - 1993, 1377, 1377, 1377, 1841, 1841, 1841, 3193, 1996, 3195, - 2009, 3196, 3185, 1370, 3197, 3198, 2018, 2018, 2018, 1379, - 2019, 1842, 3199, 2020, 2022, 2022, 2022, 1397, 1397, 1397, - 2027, 2027, 2027, 2029, 2029, 2029, 3298, 3298, 3298, 1409, - 1409, 1409, 2023, 3200, 3201, 1399, 2011, 2028, 3202, 2014, - 2030, 3205, 3206, 3298, 1425, 1425, 1425, 1411, 1417, 1417, - 1417, 3207, 2036, 2036, 2036, 2038, 2038, 2038, 1435, 1435, - 1435, 3208, 1427, 1859, 1859, 1859, 1419, 1860, 2025, 2037, - 1861, 3209, 2039, 1444, 1444, 1444, 1437, 3210, 1867, 1867, - - 1867, 2047, 2047, 2047, 3221, 2048, 1138, 1138, 2049, 3219, - 2031, 1446, 1138, 1138, 2034, 1868, 2032, 1450, 1450, 1450, - 1457, 1457, 1457, 1871, 1871, 1871, 2052, 2052, 2052, 2035, - 2053, 3222, 3220, 2054, 1727, 1452, 1138, 1138, 1459, 1138, - 1872, 3243, 3211, 2040, 2045, 2055, 2055, 2055, 2061, 2061, - 2061, 1151, 1151, 1151, 2071, 2071, 2071, 1891, 1891, 1891, - 2078, 2078, 2078, 2056, 1138, 2062, 1896, 1896, 1896, 1153, - 2079, 2079, 2079, 3212, 1138, 2051, 2050, 1899, 1899, 1899, - 2082, 2082, 2082, 2083, 2083, 2083, 1907, 1907, 1907, 1186, - 1186, 1186, 2092, 2092, 2092, 3295, 2095, 2095, 2095, 1212, - - 1212, 1212, 2099, 2099, 2099, 1138, 1138, 1188, 3217, 1138, - 2093, 3227, 2063, 2096, 1926, 1926, 1926, 1214, 1927, 2100, - 1138, 1928, 1219, 1219, 1219, 2112, 2112, 2112, 1935, 1935, - 1935, 2119, 2119, 2119, 2121, 2121, 2121, 1138, 1138, 2089, - 1221, 1138, 2113, 1941, 1941, 1941, 3228, 1942, 1138, 3218, - 1943, 2122, 1250, 1250, 1250, 2124, 2124, 2124, 2098, 1946, - 1946, 1946, 2126, 2126, 2126, 1138, 2127, 3225, 2111, 2128, - 1252, 3244, 2125, 1259, 1259, 1259, 1947, 2130, 2130, 2130, - 1950, 1950, 1950, 2132, 2132, 2132, 3213, 2133, 1138, 3214, - 2134, 1261, 1273, 1273, 1273, 2131, 3215, 1951, 1138, 1955, - - 1955, 1955, 1725, 1956, 3223, 2123, 1957, 1958, 1958, 1958, - 1275, 1959, 1138, 3216, 1960, 1962, 1962, 1962, 1964, 1964, - 1964, 3251, 1303, 1303, 1303, 1138, 2129, 1968, 1968, 1968, - 3224, 1969, 1138, 1963, 1970, 1971, 1971, 1971, 1138, 2135, - 1305, 2144, 2144, 2144, 3233, 2145, 1138, 1138, 2146, 1976, - 1976, 1976, 1972, 1977, 1138, 1138, 1978, 1979, 1979, 1979, - 2150, 2150, 2150, 1138, 2151, 1724, 3229, 2152, 2153, 2153, - 2153, 1985, 1985, 1985, 1980, 2158, 2158, 2158, 3234, 2159, - 2142, 1138, 2160, 1138, 3235, 2154, 3237, 3230, 1986, 1329, - 1329, 1329, 1988, 1988, 1988, 1138, 1989, 1138, 1138, 1990, - - 1991, 1991, 1991, 3291, 2162, 2162, 2162, 1331, 2163, 1138, - 3226, 2164, 2165, 2165, 2165, 3238, 3231, 1992, 1994, 1994, - 1994, 2167, 2167, 2167, 3263, 2168, 1716, 3239, 2169, 2166, - 1345, 1345, 1345, 3232, 3236, 1995, 1138, 1998, 1998, 1998, - 2161, 1999, 1138, 3240, 2000, 2001, 2001, 2001, 1347, 2172, - 2172, 2172, 1138, 2173, 1715, 3247, 2174, 2004, 2004, 2004, - 1138, 2005, 2002, 1138, 2006, 2008, 2008, 2008, 1368, 1368, - 1368, 2180, 2180, 2180, 1377, 1377, 1377, 2184, 2184, 2184, - 1138, 2170, 1138, 2009, 1138, 3245, 1370, 1138, 2181, 2018, - 2018, 2018, 1379, 2019, 2185, 3241, 2020, 2022, 2022, 2022, - - 2192, 2192, 2192, 2027, 2027, 2027, 2195, 2195, 2195, 3248, - 2196, 1138, 1713, 2197, 3267, 2023, 1138, 3242, 2193, 3249, - 2028, 1138, 1138, 2186, 2029, 2029, 2029, 2198, 2198, 2198, - 3246, 2199, 2178, 1712, 2200, 2182, 1409, 1409, 1409, 1138, - 3264, 2030, 1417, 1417, 1417, 1425, 1425, 1425, 2036, 2036, - 2036, 2206, 2206, 2206, 1411, 2207, 3250, 1138, 2208, 3255, - 1419, 1711, 3259, 1427, 1138, 2037, 2038, 2038, 2038, 2209, - 2209, 2209, 3252, 2210, 1138, 3253, 2211, 1435, 1435, 1435, - 1444, 1444, 1444, 2039, 1138, 2047, 2047, 2047, 3254, 2048, - 1138, 2204, 2049, 1138, 3256, 1437, 1138, 1138, 1446, 1450, - - 1450, 1450, 2202, 1457, 1457, 1457, 3257, 2052, 2052, 2052, - 2205, 2053, 1138, 1710, 2054, 1709, 3258, 1452, 2055, 2055, - 2055, 1459, 2061, 2061, 2061, 2225, 2225, 2225, 3265, 2226, - 3261, 3266, 2227, 1151, 1151, 1151, 2056, 1138, 3292, 2062, - 1138, 3295, 2212, 3273, 1708, 2217, 2229, 2229, 2229, 3262, - 2219, 1153, 2234, 2234, 2234, 1138, 2220, 2235, 2235, 2235, - 2071, 2071, 2071, 2237, 2237, 2237, 2241, 2241, 2241, 2078, - 2078, 2078, 2079, 2079, 2079, 2242, 2242, 2242, 2082, 2082, - 2082, 2083, 2083, 2083, 2245, 2245, 2245, 2246, 2246, 2246, - 2247, 2247, 2247, 2248, 2248, 2248, 1138, 2228, 1186, 1186, - - 1186, 2092, 2092, 2092, 1707, 2095, 2095, 2095, 2254, 2254, - 2254, 3287, 2255, 1138, 1706, 2256, 1188, 1705, 1703, 2093, - 1138, 2243, 2096, 2258, 2258, 2258, 2099, 2099, 2099, 2260, - 2260, 2260, 3271, 2261, 1702, 1700, 2262, 1219, 1219, 1219, - 1138, 2259, 3260, 2100, 2112, 2112, 2112, 3268, 3272, 2250, - 2274, 2274, 2274, 1138, 2275, 1221, 1138, 2276, 2277, 2277, - 2277, 2113, 2119, 2119, 2119, 2282, 2282, 2282, 2121, 2121, - 2121, 2284, 2284, 2284, 1138, 2285, 1138, 1699, 2286, 1250, - 1250, 1250, 2124, 2124, 2124, 2122, 2273, 2288, 2288, 2288, - 3275, 2289, 1138, 1138, 2290, 1696, 1693, 1252, 1138, 2125, - - 2126, 2126, 2126, 1138, 2127, 1138, 1138, 2128, 1259, 1259, - 1259, 2283, 1138, 2130, 2130, 2130, 2132, 2132, 2132, 1138, - 2133, 3274, 3269, 2134, 1692, 3285, 1261, 1273, 1273, 1273, - 2287, 2131, 1303, 1303, 1303, 2144, 2144, 2144, 3270, 2145, - 3276, 3279, 2146, 1138, 3281, 1275, 3277, 2150, 2150, 2150, - 1305, 2151, 1138, 3278, 2152, 2153, 2153, 2153, 1691, 2291, - 2306, 2306, 2306, 1138, 2307, 3282, 1138, 2308, 1138, 2158, - 2158, 2158, 2154, 2159, 1690, 3286, 2160, 1329, 1329, 1329, - 2292, 2162, 2162, 2162, 3289, 2163, 1689, 2301, 2164, 2165, - 2165, 2165, 2313, 2313, 2313, 1331, 2314, 1688, 3280, 2315, - - 2167, 2167, 2167, 3283, 2168, 3284, 2166, 2169, 1345, 1345, - 1345, 2172, 2172, 2172, 1687, 2173, 3288, 1685, 2174, 2321, - 2321, 2321, 2180, 2180, 2180, 1138, 1347, 2324, 2324, 2324, - 1684, 2325, 1683, 1682, 2326, 1675, 1138, 2322, 1672, 2181, - 1671, 2312, 1377, 1377, 1377, 2184, 2184, 2184, 2329, 2329, - 2329, 1669, 2330, 1668, 1667, 2331, 1138, 2192, 2192, 2192, - 1379, 1664, 2185, 2195, 2195, 2195, 1138, 2196, 3290, 1659, - 2197, 1409, 1409, 1409, 2316, 2193, 2198, 2198, 2198, 1658, - 2199, 1646, 1644, 2200, 1640, 1417, 1417, 1417, 3293, 1411, - 1425, 1425, 1425, 2206, 2206, 2206, 1639, 2207, 3294, 1635, - - 2208, 1633, 2327, 1419, 1625, 2209, 2209, 2209, 1427, 2210, - 1624, 1623, 2211, 1435, 1435, 1435, 1622, 2347, 2347, 2347, - 1620, 1619, 2342, 3298, 3298, 3298, 2345, 3298, 3298, 3298, - 1617, 1437, 1615, 2346, 2348, 3298, 3298, 3298, 1614, 1610, - 3298, 1444, 1444, 1444, 3298, 1450, 1450, 1450, 2355, 2355, - 2355, 2344, 3298, 2357, 2357, 2357, 2360, 2360, 2360, 1446, - 2225, 2225, 2225, 1452, 2226, 1609, 2356, 2227, 1151, 1151, - 1151, 1138, 1608, 1607, 2349, 2229, 2229, 2229, 2362, 2362, - 2362, 2363, 2363, 2363, 1605, 1604, 1153, 2234, 2234, 2234, - 1603, 2350, 1602, 1597, 2351, 2235, 2235, 2235, 2237, 2237, - - 2237, 2367, 2367, 2367, 1596, 2354, 2352, 2368, 2368, 2368, - 2369, 2369, 2369, 2241, 2241, 2241, 2242, 2242, 2242, 2245, - 2245, 2245, 2246, 2246, 2246, 1595, 1594, 2361, 2247, 2247, - 2247, 2248, 2248, 2248, 2373, 2373, 2373, 2376, 2376, 2376, - 2254, 2254, 2254, 1593, 2255, 1592, 1591, 2256, 3298, 3298, - 3298, 1590, 2374, 1589, 2377, 2258, 2258, 2258, 1583, 2260, - 2260, 2260, 1582, 2261, 1581, 3298, 2262, 1219, 1219, 1219, - 2274, 2274, 2274, 2259, 2275, 2390, 2391, 2276, 2392, 1580, - 2396, 2397, 1573, 2398, 1572, 1221, 2393, 1570, 1569, 2394, - 1566, 2399, 1565, 2395, 2400, 2277, 2277, 2277, 2401, 2402, - - 2402, 2402, 2282, 2282, 2282, 2284, 2284, 2284, 1556, 2285, - 1555, 1551, 2286, 1550, 2378, 1250, 1250, 1250, 2288, 2288, - 2288, 1549, 2289, 1548, 1547, 2290, 1546, 1545, 2389, 2408, - 2408, 2408, 1544, 1252, 1273, 1273, 1273, 2418, 2418, 2418, - 1303, 1303, 1303, 1542, 2306, 2306, 2306, 2409, 2307, 1541, - 1539, 2308, 1275, 2425, 2425, 2425, 1538, 1537, 1305, 1534, - 1532, 2407, 2429, 2429, 2429, 2313, 2313, 2313, 1529, 2314, - 2426, 1527, 2315, 2431, 2431, 2431, 2321, 2321, 2321, 1524, - 2430, 2437, 2437, 2437, 1515, 2410, 2324, 2324, 2324, 1513, - 2325, 2432, 1506, 2326, 2322, 1377, 1377, 1377, 2438, 1504, - - 2419, 2440, 2440, 2440, 2329, 2329, 2329, 1503, 2330, 1502, - 1501, 2331, 1500, 1379, 3298, 3298, 3298, 1499, 2441, 3298, - 3298, 3298, 3298, 3298, 3298, 2451, 2451, 2451, 2455, 2455, - 2455, 3298, 2453, 2453, 2453, 1498, 3298, 1497, 1496, 3298, - 1417, 1417, 1417, 1495, 1492, 2456, 2439, 2442, 1491, 1490, - 2454, 1489, 1425, 1425, 1425, 2347, 2347, 2347, 1419, 1435, - 1435, 1435, 1488, 1487, 2460, 2460, 2460, 1486, 2461, 2443, - 1427, 2462, 2348, 2449, 2463, 2463, 2463, 1437, 1484, 1483, - 2444, 3298, 3298, 3298, 3298, 3298, 3298, 2467, 2467, 2467, - 1482, 2464, 2469, 2469, 2469, 1481, 2459, 1480, 3298, 1479, - - 2457, 3298, 1450, 1450, 1450, 2468, 2355, 2355, 2355, 2357, - 2357, 2357, 1478, 2458, 2360, 2360, 2360, 2362, 2362, 2362, - 1452, 2474, 2474, 2474, 2356, 1476, 1475, 1138, 2363, 2363, - 2363, 1474, 2465, 1473, 1472, 2466, 2478, 2478, 2478, 2475, - 2367, 2367, 2367, 2368, 2368, 2368, 2369, 2369, 2369, 2373, - 2373, 2373, 2376, 2376, 2376, 2483, 2483, 2483, 1471, 2484, - 1470, 1138, 2485, 1219, 1219, 1219, 1464, 2374, 2470, 2377, - 1449, 2471, 2402, 2402, 2402, 2514, 2514, 2514, 1250, 1250, - 1250, 1221, 2408, 2408, 2408, 2517, 2517, 2517, 2523, 2523, - 2523, 2418, 2418, 2418, 1448, 1443, 1252, 1303, 1303, 1303, - - 2409, 1442, 1441, 2518, 1440, 2524, 1439, 2425, 2425, 2425, - 2531, 2531, 2531, 1413, 2532, 1305, 1401, 2533, 2535, 2535, - 2535, 1387, 1386, 2497, 2426, 2429, 2429, 2429, 2431, 2431, - 2431, 2539, 2539, 2539, 1385, 2536, 2437, 2437, 2437, 1381, - 2545, 2545, 2545, 2430, 2516, 1376, 2432, 1372, 2540, 2440, - 2440, 2440, 1364, 2438, 2525, 2542, 2542, 2542, 2546, 2543, - 1359, 1358, 2544, 2547, 2547, 2547, 2441, 2548, 1352, 1349, - 2549, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 2555, 2555, 2555, 2451, 2451, 2451, 1328, 1327, 3298, 1326, - 1325, 3298, 1324, 1323, 3298, 1322, 1321, 2556, 2453, 2453, - - 2453, 2455, 2455, 2455, 2559, 2559, 2559, 1320, 2560, 1314, - 1307, 2561, 2562, 2562, 2562, 1296, 2454, 1291, 2456, 1425, - 1425, 1425, 1290, 2550, 1435, 1435, 1435, 2460, 2460, 2460, - 2563, 2461, 2551, 1289, 2462, 2552, 1284, 1427, 2463, 2463, - 2463, 1283, 1437, 2566, 2566, 2566, 1279, 2567, 1278, 1277, - 2568, 2569, 2569, 2569, 1272, 2464, 2571, 2571, 2571, 2467, - 2467, 2467, 2469, 2469, 2469, 2573, 2573, 2573, 2570, 2474, - 2474, 2474, 1271, 2572, 2478, 2478, 2478, 2468, 2583, 2583, - 2583, 1266, 1258, 2574, 1254, 1249, 2564, 2475, 2565, 2483, - 2483, 2483, 1248, 2484, 1244, 2584, 2485, 1219, 1219, 1219, - - 2514, 2514, 2514, 1250, 1250, 1250, 2517, 2517, 2517, 2622, - 2622, 2622, 2523, 2523, 2523, 1221, 2624, 2624, 2624, 1243, - 2625, 1252, 1242, 2626, 2518, 1241, 2623, 1240, 1239, 2524, - 2627, 2627, 2627, 2632, 2632, 2632, 2531, 2531, 2531, 1238, - 2532, 1237, 1236, 2533, 2535, 2535, 2535, 1235, 2628, 1234, - 2633, 2636, 2636, 2636, 1233, 2637, 1232, 2602, 2638, 1226, - 1218, 2536, 2640, 2640, 2640, 2539, 2539, 2539, 2642, 2642, - 2642, 1217, 2643, 1216, 2620, 2644, 2645, 2645, 2645, 2641, - 1211, 1210, 2540, 2542, 2542, 2542, 1209, 2543, 1206, 1200, - 2544, 1195, 1194, 2646, 2545, 2545, 2545, 2547, 2547, 2547, - - 1190, 2548, 1185, 1184, 2549, 3298, 3298, 3298, 3298, 3298, - 3298, 1183, 2546, 3298, 3298, 3298, 2555, 2555, 2555, 2650, - 2650, 2650, 3298, 2651, 1182, 3298, 2652, 2653, 2653, 2653, - 3298, 1181, 1180, 2556, 2655, 2655, 2655, 1179, 2559, 2559, - 2559, 1177, 2560, 1176, 2654, 2561, 2562, 2562, 2562, 1175, - 1174, 2656, 1425, 1425, 1425, 1435, 1435, 1435, 1173, 2648, - 2647, 2569, 2569, 2569, 2563, 2566, 2566, 2566, 2649, 2567, - 1427, 1172, 2568, 1437, 1171, 2665, 2665, 2665, 2570, 2666, - 1170, 1169, 2667, 2571, 2571, 2571, 2668, 2668, 2668, 1168, - 2669, 1167, 1166, 2670, 2573, 2573, 2573, 2675, 2675, 2675, - - 2572, 1165, 2583, 2583, 2583, 1164, 2679, 2679, 2679, 1163, - 2680, 1162, 2574, 2681, 1161, 1160, 2664, 1159, 2663, 2584, - 1219, 1219, 1219, 2715, 2715, 2715, 1250, 1250, 1250, 2718, - 2718, 2718, 2622, 2622, 2622, 2721, 2721, 2721, 1221, 2722, - 1158, 1157, 2723, 1150, 1252, 1149, 2719, 1148, 1147, 2623, - 2624, 2624, 2624, 1146, 2625, 1145, 1144, 2626, 2627, 2627, - 2627, 2726, 2726, 2726, 2632, 2632, 2632, 1141, 2731, 2731, - 2731, 2699, 2675, 2675, 2675, 2720, 2628, 1139, 2727, 1138, - 1136, 2633, 2728, 2728, 2728, 2732, 2729, 1134, 2717, 2730, - 2636, 2636, 2636, 1131, 2637, 1127, 1125, 2638, 2640, 2640, - - 2640, 2735, 2735, 2735, 1124, 2736, 1123, 1121, 2737, 2642, - 2642, 2642, 1120, 2643, 1119, 2641, 2644, 2645, 2645, 2645, - 2738, 2738, 2738, 1118, 2739, 1117, 1116, 2740, 3298, 3298, - 3298, 2742, 2742, 2742, 2646, 3298, 3298, 3298, 1114, 2650, - 2650, 2650, 1113, 2651, 1112, 3298, 2652, 1111, 2743, 2653, - 2653, 2653, 3298, 2745, 2745, 2745, 1109, 2746, 1108, 1107, - 2747, 2655, 2655, 2655, 1103, 1102, 2654, 2748, 2748, 2748, - 1100, 2749, 1099, 1098, 2750, 1425, 1425, 1425, 2656, 1435, - 1435, 1435, 1097, 1096, 2744, 1095, 2741, 2665, 2665, 2665, - 1093, 2666, 1092, 1427, 2667, 1091, 1090, 1437, 2668, 2668, - - 2668, 1088, 2669, 1087, 1086, 2670, 2765, 2765, 2765, 2768, - 2768, 2768, 2679, 2679, 2679, 1083, 2680, 1082, 1080, 2681, - 2779, 2779, 2779, 2766, 1680, 1077, 2757, 1219, 1219, 1219, - 2715, 2715, 2715, 2805, 2805, 2805, 1076, 2780, 1250, 1250, - 1250, 2718, 2718, 2718, 1072, 1221, 2758, 2807, 2807, 2807, - 1071, 2808, 1069, 1068, 2809, 1067, 1252, 1064, 2719, 2721, - 2721, 2721, 1063, 2722, 1062, 1061, 2723, 2726, 2726, 2726, - 2813, 2813, 2813, 1059, 2814, 1058, 2789, 2815, 2728, 2728, - 2728, 1057, 2729, 1056, 2727, 2730, 2731, 2731, 2731, 2806, - 2816, 2816, 2816, 1055, 2817, 1050, 1048, 2818, 2735, 2735, - - 2735, 1047, 2736, 2732, 1046, 2737, 2738, 2738, 2738, 1045, - 2739, 1044, 1043, 2740, 3298, 3298, 3298, 2742, 2742, 2742, - 2822, 2822, 2822, 1042, 2823, 1041, 1040, 2824, 3298, 3298, - 3298, 3298, 1039, 1036, 2743, 2745, 2745, 2745, 1033, 2746, - 1032, 1031, 2747, 1025, 1024, 3298, 2748, 2748, 2748, 1022, - 2749, 1019, 1017, 2750, 2840, 2840, 2840, 1435, 1435, 1435, - 2848, 2848, 2848, 1016, 1011, 2821, 2765, 2765, 2765, 2850, - 2850, 2850, 2841, 2851, 1010, 1437, 2852, 2849, 1680, 2853, - 2853, 2853, 1008, 2766, 1680, 1007, 1006, 1680, 2768, 2768, - 2768, 2854, 2854, 2854, 2855, 2855, 2855, 1004, 1001, 2825, - - 2779, 2779, 2779, 2864, 2864, 2864, 999, 2865, 996, 995, - 2866, 1219, 1219, 1219, 2884, 2884, 2884, 2780, 2805, 2805, - 2805, 993, 992, 2842, 2885, 2885, 2885, 989, 984, 1221, - 2807, 2807, 2807, 983, 2808, 980, 979, 2809, 978, 2813, - 2813, 2813, 2886, 2814, 975, 974, 2815, 2816, 2816, 2816, - 972, 2817, 969, 967, 2818, 2890, 2890, 2890, 2893, 2893, - 2893, 2822, 2822, 2822, 966, 2823, 965, 964, 2824, 2895, - 2895, 2895, 2891, 962, 961, 2894, 960, 2873, 2840, 2840, - 2840, 1435, 1435, 1435, 959, 958, 2896, 2848, 2848, 2848, - 2915, 2915, 2915, 957, 2916, 954, 2841, 2917, 953, 1437, - - 2853, 2853, 2853, 952, 2849, 1680, 949, 946, 1680, 2850, - 2850, 2850, 945, 2851, 943, 942, 2852, 2854, 2854, 2854, - 2855, 2855, 2855, 939, 2864, 2864, 2864, 1680, 2865, 936, - 933, 2866, 2909, 1678, 1678, 1678, 1678, 1678, 1678, 1678, - 1678, 1678, 932, 924, 1678, 2934, 2934, 2934, 923, 1678, - 1678, 1678, 1680, 1678, 2884, 2884, 2884, 2885, 2885, 2885, - 2890, 2890, 2890, 2935, 2947, 2947, 2947, 922, 2948, 921, - 915, 2949, 2893, 2893, 2893, 2886, 914, 2891, 1678, 1678, - 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 2894, - 913, 1678, 2895, 2895, 2895, 911, 1678, 1678, 1678, 1680, - - 1678, 2951, 2951, 2951, 910, 2952, 909, 908, 2953, 2896, - 2954, 2954, 2954, 907, 2955, 906, 901, 2956, 2969, 2969, - 2969, 2934, 2934, 2934, 898, 1678, 1678, 2915, 2915, 2915, - 900, 2916, 895, 894, 2917, 892, 2970, 890, 888, 2935, - 2969, 2969, 2969, 886, 884, 1680, 1678, 1678, 1678, 1678, - 1678, 2981, 1678, 1678, 1678, 881, 880, 1678, 2970, 879, - 878, 877, 1678, 1678, 1678, 1680, 1678, 2947, 2947, 2947, - 875, 2948, 873, 872, 2949, 2951, 2951, 2951, 871, 2952, - 869, 867, 2953, 2954, 2954, 2954, 866, 2955, 864, 862, - 2956, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, - - 1678, 2981, 861, 859, 1678, 3020, 3020, 3020, 855, 1678, - 1678, 1678, 1680, 1678, 3031, 3031, 3031, 3033, 3033, 3033, - 3035, 3035, 3035, 1680, 1681, 3043, 3043, 3043, 3053, 3053, - 3053, 3032, 854, 852, 3034, 847, 845, 3036, 1678, 1678, - 841, 840, 3044, 3020, 3020, 3020, 1138, 3031, 3031, 3031, - 3063, 3063, 3063, 839, 3064, 837, 835, 3065, 3033, 3033, - 3033, 1680, 834, 833, 3032, 3066, 3066, 3066, 831, 3067, - 829, 828, 3068, 826, 824, 3034, 3035, 3035, 3035, 3069, - 3069, 3069, 823, 3070, 822, 821, 3071, 3043, 3043, 3043, - 3053, 3053, 3053, 3036, 1875, 3078, 3078, 3078, 820, 3079, - - 819, 818, 3080, 816, 3044, 3063, 3063, 3063, 1138, 3064, - 814, 813, 3065, 3066, 3066, 3066, 810, 3067, 809, 808, - 3068, 3069, 3069, 3069, 806, 3070, 794, 3089, 3071, 3078, - 3078, 3078, 793, 3079, 790, 788, 3080, 3194, 3194, 3194, - 3194, 3194, 3194, 786, 3203, 785, 784, 3204, 3296, 3296, - 3296, 3296, 3296, 3296, 782, 1138, 780, 778, 1138, 775, - 774, 773, 772, 771, 769, 767, 3297, 766, 764, 3297, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 260, 260, - 260, 260, 260, 260, 260, 260, 260, 263, 263, 263, - - 263, 263, 263, 263, 263, 263, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 288, 288, 288, 288, 288, 288, 288, 288, - 288, 300, 300, 300, 300, 300, 300, 300, 300, 300, - 304, 304, 304, 304, 304, 304, 304, 304, 304, 311, - 311, 311, 311, 311, 311, 311, 311, 311, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 336, 336, 336, 336, - + 3285, 262, 263, 262, 262, 263, 262, 262, 263, 262, + 262, 263, 262, 267, 263, 267, 273, 264, 270, 273, + 264, 270, 3285, 265, 3285, 271, 265, 3285, 271, 268, + 267, 263, 267, 659, 274, 276, 277, 274, 276, 277, + 278, 279, 704, 278, 279, 659, 268, 283, 284, 660, + 280, 276, 277, 280, 281, 662, 278, 276, 277, 693, + 281, 661, 278, 283, 284, 1738, 280, 263, 263, 263, + 849, 661, 280, 263, 263, 263, 295, 263, 295, 295, + 263, 295, 850, 286, 295, 263, 295, 680, 1742, 286, + 734, 285, 296, 1357, 696, 296, 658, 658, 658, 1358, + + 297, 658, 658, 658, 658, 658, 658, 285, 287, 288, + 263, 288, 287, 287, 287, 287, 287, 287, 287, 289, + 287, 287, 287, 691, 287, 291, 287, 292, 287, 295, + 263, 295, 263, 263, 263, 263, 263, 263, 692, 295, + 263, 295, 295, 263, 295, 297, 697, 805, 298, 662, + 806, 298, 923, 287, 287, 296, 662, 662, 296, 295, + 263, 295, 658, 658, 658, 661, 658, 658, 658, 658, + 658, 658, 661, 661, 3285, 299, 924, 293, 287, 288, + 263, 288, 287, 287, 287, 287, 287, 287, 287, 289, + 287, 287, 287, 1744, 287, 291, 287, 292, 287, 295, + + 263, 295, 263, 263, 263, 263, 263, 263, 667, 295, + 263, 295, 295, 263, 295, 299, 673, 734, 300, 818, + 983, 300, 819, 287, 287, 297, 743, 735, 297, 263, + 263, 263, 263, 263, 263, 295, 263, 295, 295, 263, + 295, 295, 263, 295, 984, 301, 855, 293, 301, 662, + 668, 299, 798, 856, 299, 747, 669, 302, 295, 263, + 295, 670, 658, 658, 658, 661, 671, 658, 658, 658, + 658, 658, 658, 799, 302, 303, 304, 263, 304, 303, + 303, 303, 303, 303, 303, 303, 305, 303, 303, 303, + 721, 303, 307, 303, 308, 303, 311, 263, 311, 311, + + 263, 311, 263, 263, 263, 722, 263, 263, 263, 311, + 263, 311, 312, 911, 857, 312, 912, 1751, 300, 717, + 303, 303, 300, 718, 759, 312, 677, 719, 309, 303, + 304, 263, 304, 303, 303, 303, 303, 303, 303, 303, + 305, 303, 303, 303, 662, 303, 307, 303, 308, 303, + 311, 263, 311, 311, 263, 311, 311, 263, 311, 807, + 661, 865, 276, 277, 863, 698, 312, 278, 3285, 313, + 697, 864, 313, 808, 303, 303, 743, 323, 699, 759, + 692, 1752, 309, 314, 315, 263, 315, 314, 314, 314, + 314, 314, 314, 314, 316, 314, 314, 314, 1753, 314, + + 318, 314, 319, 314, 1754, 662, 324, 691, 337, 263, + 337, 337, 263, 337, 349, 263, 349, 697, 276, 277, + 700, 661, 692, 278, 338, 710, 802, 338, 314, 314, + 350, 696, 711, 323, 803, 1019, 320, 765, 1020, 321, + 804, 661, 658, 658, 658, 1759, 322, 314, 315, 263, + 315, 314, 314, 314, 314, 314, 314, 314, 316, 314, + 314, 314, 324, 314, 318, 314, 319, 314, 349, 263, + 349, 360, 263, 360, 360, 263, 360, 1760, 360, 263, + 360, 360, 263, 360, 350, 662, 748, 361, 662, 743, + 361, 858, 314, 314, 362, 723, 1500, 362, 1761, 697, + + 320, 661, 749, 321, 661, 658, 658, 658, 765, 1501, + 322, 325, 326, 263, 326, 325, 325, 325, 325, 325, + 325, 325, 327, 325, 325, 325, 1762, 325, 329, 325, + 330, 325, 263, 263, 263, 263, 263, 263, 360, 263, + 360, 783, 360, 263, 360, 360, 263, 360, 363, 1763, + 662, 363, 662, 662, 361, 1764, 325, 325, 361, 729, + 696, 364, 658, 658, 658, 331, 661, 332, 661, 661, + 783, 333, 658, 658, 658, 812, 334, 335, 325, 326, + 263, 326, 325, 325, 325, 325, 325, 325, 325, 327, + 325, 325, 325, 696, 325, 329, 325, 330, 325, 360, + + 263, 360, 263, 263, 263, 263, 263, 263, 890, 360, + 263, 360, 360, 263, 360, 364, 746, 1765, 365, 784, + 686, 365, 743, 325, 325, 366, 739, 743, 366, 658, + 658, 658, 331, 742, 332, 658, 658, 658, 333, 658, + 658, 658, 1772, 334, 335, 339, 340, 263, 340, 339, + 339, 339, 339, 339, 339, 339, 341, 339, 339, 339, + 693, 339, 343, 339, 344, 339, 360, 263, 360, 360, + 263, 360, 263, 263, 263, 905, 263, 263, 263, 360, + 263, 360, 367, 1773, 1782, 367, 905, 875, 368, 750, + 339, 339, 368, 737, 738, 364, 881, 345, 658, 658, + + 658, 906, 696, 346, 751, 658, 658, 658, 658, 658, + 658, 957, 347, 339, 340, 263, 340, 339, 339, 339, + 339, 339, 339, 339, 341, 339, 339, 339, 1784, 339, + 343, 339, 344, 339, 360, 263, 360, 263, 263, 263, + 263, 263, 263, 697, 360, 263, 360, 360, 263, 360, + 364, 662, 697, 369, 1785, 923, 369, 662, 339, 339, + 367, 662, 662, 367, 770, 345, 1795, 661, 658, 658, + 658, 346, 983, 661, 658, 658, 658, 661, 661, 992, + 347, 351, 352, 263, 352, 351, 351, 351, 351, 351, + 351, 351, 353, 351, 351, 351, 924, 351, 355, 351, + + 356, 351, 360, 263, 360, 360, 263, 360, 263, 263, + 263, 1796, 263, 263, 263, 360, 263, 360, 370, 662, + 1806, 370, 662, 1809, 371, 812, 351, 351, 371, 775, + 1810, 372, 658, 658, 658, 661, 3285, 357, 661, 658, + 658, 658, 658, 658, 658, 1814, 358, 351, 352, 263, + 352, 351, 351, 351, 351, 351, 351, 351, 353, 351, + 351, 351, 983, 351, 355, 351, 356, 351, 360, 263, + 360, 263, 263, 263, 263, 263, 263, 696, 360, 263, + 360, 360, 263, 360, 372, 784, 992, 373, 743, 923, + 373, 1815, 351, 351, 370, 662, 1818, 370, 360, 263, + + 360, 1819, 788, 357, 360, 263, 360, 658, 658, 658, + 851, 661, 358, 993, 374, 658, 658, 658, 734, 1820, + 374, 375, 376, 263, 376, 375, 375, 375, 375, 375, + 375, 375, 377, 375, 375, 375, 983, 375, 379, 375, + 380, 375, 386, 263, 386, 386, 263, 386, 263, 263, + 263, 932, 263, 263, 263, 933, 752, 662, 387, 1027, + 993, 387, 743, 1028, 363, 3285, 375, 375, 363, 662, + 662, 381, 741, 661, 851, 693, 794, 382, 658, 658, + 658, 383, 658, 658, 658, 661, 661, 384, 375, 376, + 263, 376, 375, 375, 375, 375, 375, 375, 375, 377, + + 375, 375, 375, 680, 375, 379, 375, 380, 375, 386, + 263, 386, 386, 263, 386, 386, 263, 386, 889, 386, + 263, 386, 658, 658, 658, 387, 696, 809, 387, 1821, + 1822, 388, 1823, 375, 375, 388, 662, 662, 381, 810, + 811, 658, 658, 658, 382, 658, 658, 658, 383, 658, + 658, 658, 661, 661, 384, 389, 390, 263, 390, 389, + 389, 389, 389, 389, 389, 389, 391, 389, 389, 389, + 696, 389, 393, 389, 394, 389, 399, 263, 399, 399, + 263, 399, 263, 263, 263, 925, 263, 263, 263, 1145, + 662, 1831, 400, 1476, 1834, 400, 926, 822, 363, 927, + + 389, 389, 363, 662, 662, 395, 661, 658, 658, 658, + 832, 396, 658, 658, 658, 658, 658, 658, 1145, 661, + 661, 1835, 397, 389, 390, 263, 390, 389, 389, 389, + 389, 389, 389, 389, 391, 389, 389, 389, 1684, 389, + 393, 389, 394, 389, 399, 263, 399, 399, 263, 399, + 399, 263, 399, 937, 399, 263, 399, 658, 658, 658, + 400, 662, 662, 400, 662, 1838, 401, 938, 389, 389, + 401, 837, 1840, 395, 658, 658, 658, 661, 661, 396, + 661, 658, 658, 658, 658, 658, 658, 658, 658, 658, + 397, 402, 403, 263, 403, 402, 402, 402, 402, 402, + + 402, 402, 404, 402, 402, 402, 1842, 402, 406, 402, + 407, 402, 411, 263, 411, 411, 263, 411, 422, 263, + 422, 1843, 422, 263, 422, 436, 263, 436, 412, 662, + 662, 412, 662, 1845, 423, 865, 402, 402, 423, 843, + 898, 437, 658, 658, 658, 661, 661, 408, 661, 658, + 658, 658, 409, 402, 403, 263, 403, 402, 402, 402, + 402, 402, 402, 402, 404, 402, 402, 402, 1846, 402, + 406, 402, 407, 402, 436, 263, 436, 263, 263, 263, + 263, 263, 263, 858, 436, 263, 436, 436, 263, 436, + 437, 697, 743, 438, 1847, 1852, 438, 662, 402, 402, + + 437, 1855, 898, 437, 1856, 857, 658, 658, 658, 408, + 658, 658, 658, 661, 409, 413, 414, 263, 414, 413, + 413, 413, 413, 413, 413, 413, 415, 413, 413, 413, + 1857, 413, 417, 413, 418, 413, 436, 263, 436, 436, + 263, 436, 448, 263, 448, 942, 448, 263, 448, 460, + 263, 460, 439, 858, 696, 439, 662, 696, 449, 938, + 413, 413, 449, 870, 662, 461, 658, 658, 658, 658, + 658, 658, 661, 658, 658, 658, 419, 658, 658, 658, + 661, 1859, 420, 413, 414, 263, 414, 413, 413, 413, + 413, 413, 413, 413, 415, 413, 413, 413, 1862, 413, + + 417, 413, 418, 413, 460, 263, 460, 477, 263, 477, + 477, 263, 477, 1863, 263, 263, 263, 263, 263, 263, + 461, 1865, 662, 478, 1869, 1870, 478, 662, 413, 413, + 363, 925, 662, 363, 658, 658, 658, 875, 661, 658, + 658, 658, 926, 661, 419, 941, 1871, 881, 661, 1873, + 420, 424, 425, 263, 425, 424, 424, 424, 424, 424, + 424, 424, 426, 424, 424, 424, 1687, 424, 428, 424, + 429, 424, 477, 263, 477, 477, 263, 477, 477, 263, + 477, 1884, 477, 263, 477, 858, 662, 1885, 478, 1886, + 1888, 478, 1889, 697, 479, 858, 424, 424, 479, 430, + + 662, 431, 661, 697, 658, 658, 658, 432, 658, 658, + 658, 658, 658, 658, 433, 889, 661, 434, 424, 425, + 263, 425, 424, 424, 424, 424, 424, 424, 424, 426, + 424, 424, 424, 1890, 424, 428, 424, 429, 424, 493, + 263, 493, 493, 263, 493, 509, 263, 509, 944, 509, + 263, 509, 890, 1891, 1892, 494, 1145, 1145, 494, 945, + 1512, 510, 927, 424, 424, 510, 430, 743, 431, 658, + 658, 658, 1147, 1501, 432, 658, 658, 658, 658, 658, + 658, 433, 1881, 1893, 434, 440, 441, 263, 441, 440, + 440, 440, 440, 440, 440, 440, 442, 440, 440, 440, + + 1894, 440, 444, 440, 445, 440, 520, 263, 520, 520, + 263, 520, 532, 263, 532, 942, 532, 263, 532, 545, + 263, 545, 521, 1895, 1896, 521, 662, 662, 533, 989, + 440, 440, 533, 894, 903, 546, 658, 658, 658, 658, + 658, 658, 661, 661, 1897, 1899, 446, 440, 441, 263, + 441, 440, 440, 440, 440, 440, 440, 440, 442, 440, + 440, 440, 1900, 440, 444, 440, 445, 440, 545, 263, + 545, 263, 263, 263, 263, 263, 263, 942, 545, 263, + 545, 545, 263, 545, 546, 1901, 1902, 363, 934, 1905, + 363, 994, 440, 440, 546, 935, 1908, 546, 658, 658, + + 658, 936, 909, 909, 909, 1162, 1162, 1162, 446, 450, + 451, 263, 451, 450, 450, 450, 450, 450, 450, 450, + 452, 450, 450, 450, 1909, 450, 454, 450, 455, 450, + 545, 263, 545, 545, 263, 545, 557, 263, 557, 1910, + 557, 263, 557, 263, 263, 263, 547, 1911, 1912, 547, + 947, 1913, 558, 944, 450, 450, 558, 935, 942, 559, + 456, 910, 947, 948, 945, 457, 1917, 941, 1918, 935, + 1920, 1921, 995, 1922, 1924, 936, 1937, 458, 450, 451, + 263, 451, 450, 450, 450, 450, 450, 450, 450, 452, + 450, 450, 450, 1938, 450, 454, 450, 455, 450, 263, + + 263, 263, 557, 263, 557, 557, 263, 557, 1939, 557, + 263, 557, 557, 263, 557, 559, 1940, 1941, 558, 934, + 934, 558, 1512, 450, 450, 560, 935, 935, 560, 456, + 947, 925, 948, 988, 457, 1550, 1944, 935, 1492, 1492, + 1492, 1945, 945, 988, 1946, 941, 458, 462, 463, 263, + 463, 462, 462, 462, 462, 462, 462, 462, 464, 462, + 462, 462, 465, 462, 466, 462, 467, 462, 465, 465, + 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 462, 462, 465, 468, 469, 470, 465, 465, + + 465, 465, 465, 471, 465, 465, 472, 465, 465, 465, + 473, 465, 474, 475, 465, 465, 465, 465, 465, 465, + 465, 480, 481, 263, 481, 480, 480, 480, 480, 480, + 480, 480, 482, 480, 480, 480, 1947, 480, 484, 480, + 485, 480, 571, 263, 571, 571, 263, 571, 263, 263, + 263, 1952, 263, 263, 263, 571, 263, 571, 572, 1960, + 1961, 572, 1968, 1972, 559, 1974, 480, 480, 559, 1980, + 486, 572, 909, 909, 909, 1981, 1149, 487, 1982, 1988, + 488, 1162, 1162, 1162, 489, 1989, 490, 491, 480, 481, + 263, 481, 480, 480, 480, 480, 480, 480, 480, 482, + + 480, 480, 480, 1990, 480, 484, 480, 485, 480, 571, + 263, 571, 571, 263, 571, 571, 263, 571, 1991, 583, + 263, 583, 583, 263, 583, 572, 2004, 2010, 573, 2014, + 2017, 573, 2019, 480, 480, 584, 2020, 486, 584, 1198, + 1198, 1198, 2022, 1199, 487, 1163, 1200, 488, 1185, 1185, + 1185, 489, 2023, 490, 491, 495, 496, 263, 496, 495, + 495, 495, 495, 495, 495, 495, 497, 495, 495, 495, + 2024, 495, 499, 495, 500, 495, 594, 263, 594, 594, + 263, 594, 263, 263, 263, 2028, 263, 263, 263, 954, + 954, 954, 595, 2031, 2033, 595, 2040, 2048, 559, 1315, + + 495, 495, 559, 501, 502, 503, 955, 2049, 2050, 1316, + 2051, 504, 1163, 2053, 505, 2067, 1317, 2071, 506, 1687, + 1145, 507, 495, 496, 263, 496, 495, 495, 495, 495, + 495, 495, 495, 497, 495, 495, 495, 2064, 495, 499, + 495, 500, 495, 594, 263, 594, 594, 263, 594, 594, + 263, 594, 2072, 594, 263, 594, 962, 962, 962, 595, + 2073, 2065, 595, 2076, 2074, 596, 2077, 495, 495, 596, + 501, 502, 503, 963, 2079, 1208, 1208, 1208, 504, 1209, + 2075, 505, 1210, 2080, 2081, 506, 1687, 2082, 507, 511, + 512, 263, 512, 511, 511, 511, 511, 511, 511, 511, + + 513, 511, 511, 511, 2083, 511, 515, 511, 516, 511, + 607, 263, 607, 607, 263, 607, 263, 263, 263, 2066, + 263, 263, 263, 977, 977, 977, 608, 2084, 2087, 608, + 2088, 2091, 559, 2092, 511, 511, 559, 2093, 2094, 517, + 978, 1185, 1185, 1185, 2095, 518, 511, 512, 263, 512, + 511, 511, 511, 511, 511, 511, 511, 513, 511, 511, + 511, 2097, 511, 515, 511, 516, 511, 607, 263, 607, + 607, 263, 607, 607, 263, 607, 2098, 607, 263, 607, + 997, 997, 997, 608, 2101, 2104, 608, 2108, 2109, 609, + 2112, 511, 511, 609, 2113, 2114, 517, 998, 1547, 1547, + + 1547, 2117, 518, 522, 523, 263, 523, 522, 522, 522, + 522, 522, 522, 522, 524, 522, 522, 522, 2121, 522, + 526, 522, 527, 522, 622, 263, 622, 622, 263, 622, + 263, 263, 263, 2110, 263, 263, 263, 622, 263, 622, + 623, 2111, 2122, 623, 2123, 2125, 624, 2127, 522, 522, + 624, 2143, 528, 623, 1230, 1230, 1230, 2144, 1231, 529, + 2124, 1232, 530, 522, 523, 263, 523, 522, 522, 522, + 522, 522, 522, 522, 524, 522, 522, 522, 2145, 522, + 526, 522, 527, 522, 622, 263, 622, 622, 263, 622, + 622, 263, 622, 2115, 634, 263, 634, 634, 263, 634, + + 623, 2116, 2123, 625, 2074, 2146, 625, 2147, 522, 522, + 635, 2148, 528, 635, 1162, 1162, 1162, 2150, 2075, 529, + 2124, 2154, 530, 534, 535, 263, 535, 534, 534, 534, + 534, 534, 534, 534, 536, 534, 534, 534, 2155, 534, + 538, 534, 539, 534, 644, 263, 644, 644, 263, 644, + 263, 263, 263, 2156, 263, 263, 263, 644, 263, 644, + 645, 2162, 2163, 645, 2164, 2178, 363, 2182, 534, 534, + 363, 2183, 540, 645, 1185, 1185, 1185, 2184, 1238, 541, + 2186, 2190, 542, 1492, 1492, 1492, 1701, 1701, 1701, 543, + 534, 535, 263, 535, 534, 534, 534, 534, 534, 534, + + 534, 536, 534, 534, 534, 2194, 534, 538, 534, 539, + 534, 644, 263, 644, 644, 263, 644, 644, 263, 644, + 2195, 656, 263, 656, 656, 263, 656, 645, 2196, 2197, + 646, 2198, 1702, 646, 2201, 534, 534, 657, 1238, 540, + 657, 3285, 2208, 734, 693, 2210, 541, 2220, 2221, 542, + 2222, 693, 2223, 744, 2225, 1687, 543, 548, 549, 263, + 549, 548, 548, 548, 548, 548, 548, 548, 550, 548, + 548, 548, 748, 548, 552, 548, 553, 548, 2231, 2237, + 694, 745, 2238, 1004, 1004, 1004, 695, 2239, 749, 1009, + 1009, 1009, 1145, 696, 2240, 696, 2243, 697, 2228, 690, + + 1005, 2230, 548, 548, 2245, 2246, 1010, 2247, 554, 1252, + 1252, 1252, 2251, 1253, 2256, 2258, 1254, 1704, 1704, 1704, + 1708, 1708, 1708, 555, 548, 549, 263, 549, 548, 548, + 548, 548, 548, 548, 548, 550, 548, 548, 548, 2259, + 548, 552, 548, 553, 548, 1021, 1021, 1021, 1033, 1033, + 1033, 1035, 1035, 1035, 1041, 1041, 1041, 1044, 1044, 1044, + 2260, 2264, 1022, 1705, 2270, 1034, 2271, 2272, 1036, 548, + 548, 1042, 2273, 2274, 1045, 554, 1262, 1262, 1262, 2275, + 1263, 2276, 2277, 1264, 1711, 1711, 1711, 1721, 1721, 1721, + 555, 561, 562, 263, 562, 561, 561, 561, 561, 561, + + 561, 561, 563, 561, 561, 561, 2278, 561, 565, 561, + 566, 561, 1058, 1058, 1058, 1060, 1060, 1060, 1072, 1072, + 1072, 1080, 1080, 1080, 1085, 1085, 1085, 2279, 2285, 1059, + 2286, 2287, 1061, 2288, 2300, 1073, 561, 561, 1081, 2301, + 2306, 1086, 567, 2302, 2304, 568, 1270, 1270, 1270, 2307, + 1271, 2303, 2305, 1272, 1547, 1547, 1547, 569, 561, 562, + 263, 562, 561, 561, 561, 561, 561, 561, 561, 563, + 561, 561, 561, 2309, 561, 565, 561, 566, 561, 1091, + 1091, 1091, 1111, 1111, 1111, 1135, 1135, 1135, 1139, 1139, + 1139, 1687, 1158, 1158, 1158, 2310, 1092, 2311, 2312, 1112, + + 2316, 2317, 1136, 561, 561, 1140, 954, 954, 954, 567, + 1160, 2318, 568, 1287, 1287, 1287, 2324, 1288, 2325, 2326, + 1289, 2327, 2229, 955, 569, 574, 575, 263, 575, 574, + 574, 574, 574, 574, 574, 574, 576, 574, 574, 574, + 2330, 574, 578, 574, 579, 574, 1158, 1158, 1158, 1193, + 1193, 1193, 2335, 2339, 1193, 1193, 1193, 1203, 1203, 1203, + 1203, 1203, 1203, 1925, 1160, 2340, 2341, 1195, 2345, 1926, + 574, 574, 1195, 1927, 2342, 1205, 580, 1928, 1205, 2346, + 2347, 581, 574, 575, 263, 575, 574, 574, 574, 574, + 574, 574, 574, 576, 574, 574, 574, 2348, 574, 578, + + 574, 579, 574, 2350, 1161, 962, 962, 962, 1211, 1211, + 1211, 1219, 1219, 1219, 1196, 1214, 1214, 1214, 1219, 1219, + 1219, 2360, 963, 2343, 1206, 1212, 2371, 574, 574, 1221, + 2372, 2344, 1215, 580, 2373, 1687, 1221, 2377, 581, 585, + 586, 263, 586, 585, 585, 585, 585, 585, 585, 585, + 587, 585, 585, 585, 2378, 585, 589, 585, 590, 585, + 1226, 1226, 1226, 2379, 2382, 1222, 2386, 2387, 1226, 1226, + 1226, 977, 977, 977, 1234, 1234, 1234, 1929, 1228, 997, + 997, 997, 2366, 1930, 585, 585, 1228, 1931, 978, 2388, + 591, 1932, 1236, 1304, 1304, 1304, 998, 1305, 2389, 2390, + + 1306, 1758, 1758, 1758, 2391, 592, 585, 586, 263, 586, + 585, 585, 585, 585, 585, 585, 585, 587, 585, 585, + 585, 2392, 585, 589, 585, 590, 585, 1234, 1234, 1234, + 2393, 2394, 1229, 2395, 2408, 1257, 1257, 1257, 1257, 1257, + 1257, 1004, 1004, 1004, 2409, 1236, 2410, 1266, 1266, 1266, + 2411, 585, 585, 1259, 2416, 2417, 1259, 591, 1005, 1307, + 1307, 1307, 2418, 1308, 1237, 1268, 1309, 2419, 1755, 1755, + 1755, 2420, 592, 597, 598, 263, 598, 597, 597, 597, + 597, 597, 597, 597, 599, 597, 597, 597, 1687, 597, + 601, 597, 602, 597, 2421, 1266, 1266, 1266, 1009, 1009, + + 1009, 1701, 1701, 1701, 1260, 1274, 1274, 1274, 1274, 1274, + 1274, 2422, 2425, 1268, 1756, 1010, 2426, 2427, 597, 597, + 1280, 1280, 1280, 1276, 603, 2432, 1276, 604, 1318, 1318, + 1318, 2365, 1319, 2433, 2438, 1320, 2439, 2440, 1282, 605, + 597, 598, 263, 598, 597, 597, 597, 597, 597, 597, + 597, 599, 597, 597, 597, 2441, 597, 601, 597, 602, + 597, 1269, 2450, 1280, 1280, 1280, 1021, 1021, 1021, 1277, + 1292, 1292, 1292, 2451, 1292, 1292, 1292, 1299, 1299, 1299, + 2428, 1282, 2452, 1022, 2453, 597, 597, 2455, 1294, 2457, + 2429, 603, 1294, 2481, 604, 1301, 1322, 1322, 1322, 2482, + + 1323, 2484, 2485, 1324, 2486, 1687, 605, 610, 611, 263, + 611, 610, 610, 610, 610, 610, 610, 610, 612, 610, + 610, 610, 2487, 610, 614, 610, 615, 610, 1283, 1033, + 1033, 1033, 1035, 1035, 1035, 1295, 1299, 1299, 1299, 1310, + 1310, 1310, 2478, 1310, 1310, 1310, 1034, 2491, 2492, 1036, + 2493, 2494, 610, 610, 1301, 2495, 2496, 1312, 2497, 2498, + 616, 1312, 617, 2499, 2500, 618, 1704, 1704, 1704, 619, + 1898, 1898, 1898, 620, 610, 611, 263, 611, 610, 610, + 610, 610, 610, 610, 610, 612, 610, 610, 610, 1687, + 610, 614, 610, 615, 610, 1041, 1041, 1041, 1302, 1044, + + 1044, 1044, 2501, 2503, 1313, 1325, 1325, 1325, 1336, 1336, + 1336, 2504, 1042, 1336, 1336, 1336, 1045, 2507, 2508, 610, + 610, 2477, 1326, 1708, 1708, 1708, 1338, 616, 2509, 617, + 2510, 1338, 618, 1711, 1711, 1711, 619, 1721, 1721, 1721, + 620, 626, 627, 263, 627, 626, 626, 626, 626, 626, + 626, 626, 628, 626, 626, 626, 2513, 626, 630, 626, + 631, 626, 1058, 1058, 1058, 1340, 1340, 1340, 2514, 1341, + 2515, 1339, 1342, 1060, 1060, 1060, 1343, 1343, 1343, 1059, + 1344, 2516, 2518, 1345, 2522, 2523, 626, 626, 2505, 2524, + 1061, 1346, 1346, 1346, 1360, 1360, 1360, 2506, 1361, 2525, + + 2529, 1362, 1372, 1372, 1372, 2530, 1373, 2531, 1347, 1374, + 632, 626, 627, 263, 627, 626, 626, 626, 626, 626, + 626, 626, 628, 626, 626, 626, 2532, 626, 630, 626, + 631, 626, 1072, 1072, 1072, 1380, 1380, 1380, 2533, 1381, + 2537, 2540, 1382, 2541, 2544, 3285, 3285, 3285, 2556, 1073, + 3285, 3285, 3285, 3285, 3285, 3285, 626, 626, 3285, 3285, + 3285, 2557, 3285, 2560, 1389, 1389, 1389, 3285, 1390, 2511, + 3285, 1391, 1421, 1421, 1421, 3285, 1422, 2561, 2512, 1423, + 632, 636, 637, 263, 637, 636, 636, 636, 636, 636, + 636, 636, 638, 636, 636, 636, 1348, 636, 640, 636, + + 641, 636, 1349, 1352, 1352, 1352, 2581, 2582, 1350, 2583, + 1351, 2584, 1352, 1352, 1352, 1363, 1363, 1363, 1367, 1367, + 1367, 1354, 1903, 1903, 1903, 2585, 636, 636, 2594, 1687, + 1354, 2595, 1364, 1757, 1757, 1757, 1369, 642, 636, 637, + 263, 637, 636, 636, 636, 636, 636, 636, 636, 638, + 636, 636, 636, 2596, 636, 640, 636, 641, 636, 1355, + 1080, 1080, 1080, 1375, 1375, 1375, 2579, 1367, 1367, 1367, + 1375, 1375, 1375, 1085, 1085, 1085, 1145, 1081, 2597, 1705, + 2598, 1377, 1687, 636, 636, 1369, 1904, 2599, 1377, 2600, + 1086, 1755, 1755, 1755, 642, 647, 648, 263, 648, 647, + + 647, 647, 647, 647, 647, 647, 649, 647, 647, 647, + 2601, 647, 651, 647, 652, 647, 2578, 2602, 1370, 1384, + 1384, 1384, 1091, 1091, 1091, 2580, 2603, 1395, 1395, 1395, + 2604, 1378, 1395, 1395, 1395, 2606, 2607, 1386, 2608, 1092, + 647, 647, 1384, 1384, 1384, 1397, 1399, 1399, 1399, 2609, + 1397, 653, 1461, 1461, 1461, 2610, 1462, 2611, 2612, 1463, + 1386, 2613, 2614, 1400, 654, 647, 648, 263, 648, 647, + 647, 647, 647, 647, 647, 647, 649, 647, 647, 647, + 2615, 647, 651, 647, 652, 647, 2616, 1398, 2617, 1387, + 1401, 1401, 1401, 2618, 2619, 3285, 3285, 3285, 1404, 1404, + + 1404, 1404, 1404, 1404, 1416, 1416, 1416, 1402, 2620, 2622, + 647, 647, 3285, 1409, 1409, 1409, 1406, 2630, 2631, 1406, + 2632, 653, 1418, 3285, 3285, 3285, 1413, 1413, 1413, 2635, + 1410, 1416, 1416, 1416, 654, 662, 3285, 3285, 3285, 2636, + 3285, 2640, 677, 1414, 1111, 1111, 1111, 1687, 2675, 1418, + 2588, 661, 678, 3285, 1403, 1145, 1424, 1424, 1424, 2677, + 2589, 1112, 1407, 2590, 1424, 1424, 1424, 2678, 1419, 1757, + 1757, 1757, 1687, 1411, 1426, 1428, 1428, 1428, 2679, 679, + 680, 681, 1426, 2683, 2672, 682, 683, 684, 1412, 2673, + 685, 686, 1429, 2684, 687, 1415, 688, 689, 690, 662, + + 1430, 1430, 1430, 1432, 1432, 1432, 734, 1432, 1432, 1432, + 1436, 1436, 1436, 2685, 2674, 661, 735, 1431, 2687, 1427, + 2688, 1434, 3285, 3285, 3285, 1434, 2686, 1437, 2691, 1440, + 1440, 1440, 2692, 2693, 1442, 1442, 1442, 2658, 2694, 3285, + 1135, 1135, 1135, 679, 736, 691, 1441, 2659, 2695, 737, + 738, 684, 1444, 2660, 739, 686, 2696, 1136, 740, 2697, + 741, 742, 690, 1442, 1442, 1442, 1451, 1451, 1451, 1139, + 1139, 1139, 1438, 1451, 1451, 1451, 2698, 2699, 1435, 2701, + 2702, 1444, 2703, 2704, 1453, 2705, 1140, 1439, 1457, 1457, + 1457, 1453, 1457, 1457, 1457, 1464, 1464, 1464, 1464, 1464, + + 1464, 1468, 1468, 1468, 2706, 1469, 1459, 2707, 1470, 2708, + 1459, 2709, 2710, 1466, 2711, 2712, 1466, 1472, 1472, 1472, + 1472, 1472, 1472, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 2591, 2689, 1445, 1474, 2713, 1454, 1474, 2715, + 2723, 1160, 2592, 2724, 1160, 2593, 2690, 1160, 1514, 1514, + 1514, 1193, 1193, 1193, 2732, 2733, 1460, 2750, 2751, 1467, + 1193, 1193, 1193, 2752, 2753, 1515, 1517, 1517, 1517, 1195, + 1193, 1193, 1193, 1198, 1198, 1198, 1484, 1199, 1195, 2754, + 1200, 2755, 2766, 1518, 1475, 3285, 3285, 3285, 1195, 1203, + 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 2758, 1208, + + 1208, 1208, 3285, 1209, 2760, 2768, 1210, 1205, 2769, 1687, + 1205, 2759, 2770, 1205, 1211, 1211, 1211, 2761, 1145, 1516, + 1523, 1523, 1523, 2771, 1524, 2661, 2772, 1525, 1526, 1526, + 1526, 1212, 1214, 1214, 1214, 2662, 1528, 1528, 1528, 2773, + 1529, 2663, 1521, 1530, 2763, 1527, 1519, 2774, 2775, 1215, + 1532, 1532, 1532, 1219, 1219, 1219, 1219, 1219, 1219, 1219, + 1219, 1219, 1537, 1537, 1537, 2776, 2762, 1533, 1226, 1226, + 1226, 1221, 2777, 2780, 1221, 2781, 2782, 1221, 2783, 1538, + 1226, 1226, 1226, 1226, 1226, 1226, 1228, 1230, 1230, 1230, + 2784, 1231, 2785, 2786, 1232, 1234, 1234, 1234, 1228, 2787, + + 2789, 1228, 1234, 1234, 1234, 1542, 1542, 1542, 1252, 1252, + 1252, 2790, 1253, 1236, 2791, 1254, 1559, 1559, 1559, 1535, + 1236, 2792, 2793, 1543, 1257, 1257, 1257, 1257, 1257, 1257, + 1540, 2794, 2795, 1560, 1257, 1257, 1257, 1262, 1262, 1262, + 2796, 1263, 1259, 2797, 1264, 1259, 1266, 1266, 1266, 1266, + 1266, 1266, 1259, 1266, 1266, 1266, 1270, 1270, 1270, 2798, + 1271, 2799, 2800, 1272, 1268, 2801, 2807, 1268, 1565, 1565, + 1565, 1268, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, + 1274, 1568, 1568, 1568, 2808, 1566, 2809, 3285, 3285, 3285, + 1276, 2816, 2817, 1276, 2831, 1561, 1276, 2832, 1569, 1280, + + 1280, 1280, 2833, 2834, 3285, 1280, 1280, 1280, 1280, 1280, + 1280, 1574, 1574, 1574, 1564, 1570, 2835, 1282, 1287, 1287, + 1287, 2836, 1288, 1282, 2840, 1289, 1282, 2841, 1575, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1581, 1581, + 1581, 1299, 1299, 1299, 2823, 1567, 2842, 1294, 2843, 2853, + 1294, 1145, 2854, 1294, 2824, 1582, 1584, 1584, 1584, 1301, + 1299, 1299, 1299, 1299, 1299, 1299, 2825, 2827, 1304, 1304, + 1304, 2855, 1305, 1585, 1571, 1306, 2826, 2828, 1301, 2856, + 2857, 1301, 1307, 1307, 1307, 2844, 1308, 2858, 2859, 1309, + 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 2860, + + 1578, 2864, 1318, 1318, 1318, 2865, 1319, 2866, 1312, 1320, + 2867, 1312, 2868, 2829, 1312, 1591, 1591, 1591, 1322, 1322, + 1322, 2869, 1323, 2830, 2871, 1324, 1325, 1325, 1325, 2872, + 1583, 2873, 1592, 1593, 1593, 1593, 2874, 1594, 2875, 2876, + 1595, 2877, 2878, 1326, 1336, 1336, 1336, 1336, 1336, 1336, + 1336, 1336, 1336, 1340, 1340, 1340, 2882, 1341, 2883, 2884, + 1342, 1586, 1338, 2887, 2892, 1338, 2893, 2894, 1338, 1343, + 1343, 1343, 2895, 1344, 2896, 2897, 1345, 1346, 1346, 1346, + 1606, 1606, 1606, 2898, 1607, 2899, 2900, 1608, 1352, 1352, + 1352, 1352, 1352, 1352, 1347, 1352, 1352, 1352, 1360, 1360, + + 1360, 2901, 1361, 2902, 2903, 1362, 1354, 2905, 2906, 1354, + 1363, 1363, 1363, 1354, 1618, 1618, 1618, 1605, 1619, 2907, + 2908, 1620, 1367, 1367, 1367, 2915, 1145, 1364, 1367, 1367, + 1367, 1367, 1367, 1367, 1372, 1372, 1372, 2916, 1373, 2917, + 1369, 1374, 2918, 1613, 2919, 2920, 1369, 2921, 2922, 1369, + 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1380, + 1380, 1380, 2923, 1381, 2924, 2925, 1382, 2926, 1377, 2909, + 2927, 1377, 2928, 2931, 1377, 1384, 1384, 1384, 1384, 1384, + 1384, 2932, 1623, 1384, 1384, 1384, 2933, 1389, 1389, 1389, + 2934, 1390, 2935, 1386, 1391, 2936, 1386, 1395, 1395, 1395, + + 2937, 1386, 1395, 1395, 1395, 2938, 1395, 1395, 1395, 1399, + 1399, 1399, 1634, 1634, 1634, 1397, 1635, 2939, 2943, 1636, + 1397, 2950, 2951, 1625, 1397, 2952, 1400, 1401, 1401, 1401, + 2953, 2954, 1628, 1637, 1637, 1637, 2955, 1638, 2956, 2957, + 1639, 1404, 1404, 1404, 1402, 1404, 1404, 1404, 2958, 1404, + 1404, 1404, 1409, 1409, 1409, 2959, 1413, 1413, 1413, 1406, + 1704, 1704, 1704, 1406, 2960, 2961, 1633, 1406, 2964, 1410, + 1643, 1643, 1643, 1414, 1644, 2965, 2966, 1645, 1648, 1648, + 1648, 2967, 1649, 2975, 2970, 1650, 1416, 1416, 1416, 1416, + 1416, 1416, 1416, 1416, 1416, 1421, 1421, 1421, 2971, 1422, + + 2976, 1145, 1423, 2970, 1418, 2977, 1854, 1418, 2978, 2979, + 1418, 1424, 1424, 1424, 2973, 2980, 1641, 1424, 1424, 1424, + 1424, 1424, 1424, 1428, 1428, 1428, 1655, 1655, 1655, 1426, + 1656, 2981, 2982, 1657, 2983, 1426, 2984, 2985, 1426, 2986, + 1429, 1430, 1430, 1430, 1658, 1658, 1658, 2968, 1659, 2987, + 2988, 1660, 1432, 1432, 1432, 2989, 1652, 2990, 1431, 1432, + 1432, 1432, 2991, 1432, 1432, 1432, 1436, 1436, 1436, 2996, + 1434, 1662, 1662, 1662, 3001, 1663, 3002, 1434, 1664, 3003, + 1654, 1434, 3004, 1437, 1440, 1440, 1440, 1667, 1667, 1667, + 3005, 1668, 3006, 1145, 1669, 1442, 1442, 1442, 1442, 1442, + + 1442, 1441, 1442, 1442, 1442, 1672, 1672, 1672, 1451, 1451, + 1451, 2992, 2994, 1444, 1687, 1688, 1444, 1451, 1451, 1451, + 1444, 2997, 1673, 2993, 2995, 1661, 1453, 1451, 1451, 1451, + 1457, 1457, 1457, 2998, 3007, 1453, 1457, 1457, 1457, 1457, + 1457, 1457, 1461, 1461, 1461, 1453, 1462, 3009, 1459, 1463, + 1464, 1464, 1464, 3009, 1459, 3012, 2970, 1459, 1464, 1464, + 1464, 1464, 1464, 1464, 1670, 1468, 1468, 1468, 1466, 1469, + 2971, 3013, 1470, 1472, 1472, 1472, 1466, 2999, 3014, 1466, + 1472, 1472, 1472, 1472, 1472, 1472, 2970, 3015, 1677, 3000, + 3028, 1474, 1680, 1686, 1686, 1686, 3031, 2973, 1474, 3036, + + 3039, 1474, 1158, 1158, 1158, 1514, 1514, 1514, 1193, 1193, + 1193, 1687, 1688, 3018, 1517, 1517, 1517, 1542, 1542, 1542, + 1160, 1681, 1515, 1724, 1724, 1724, 1195, 1725, 3019, 3026, + 1726, 1518, 1728, 1728, 1728, 1543, 1729, 3040, 3016, 1730, + 1203, 1203, 1203, 3041, 1683, 1523, 1523, 1523, 3027, 1524, + 3029, 3009, 1525, 1526, 1526, 1526, 3017, 3034, 1205, 3043, + 1735, 1735, 1735, 3037, 1736, 3009, 1727, 1737, 1693, 3030, + 1527, 1528, 1528, 1528, 3044, 1529, 3035, 3045, 1530, 1532, + 1532, 1532, 3038, 1739, 1739, 1739, 3046, 1740, 3047, 1733, + 1741, 1219, 1219, 1219, 3048, 3049, 1533, 1537, 1537, 1537, + + 1745, 1745, 1745, 3059, 1746, 3060, 3061, 1747, 3062, 1221, + 1748, 1748, 1748, 3063, 1538, 1226, 1226, 1226, 1766, 1766, + 1766, 1559, 1559, 1559, 1768, 1768, 1768, 1749, 1769, 3064, + 3068, 1770, 3069, 1228, 3070, 1767, 3071, 3072, 1560, 3073, + 3074, 1743, 1257, 1257, 1257, 1266, 1266, 1266, 1565, 1565, + 1565, 1775, 1775, 1775, 3075, 1776, 3077, 3078, 1777, 3079, + 1259, 3080, 3081, 1268, 1750, 1566, 1274, 1274, 1274, 1568, + 1568, 1568, 1779, 1779, 1779, 3086, 1780, 3087, 3088, 1781, + 1280, 1280, 1280, 3082, 1276, 3089, 1569, 1574, 1574, 1574, + 1786, 1786, 1786, 3084, 1787, 3083, 3090, 1788, 1282, 1789, + + 1789, 1789, 3091, 3092, 1575, 3085, 1771, 3093, 3094, 1774, + 1791, 1791, 1791, 1292, 1292, 1292, 1790, 1581, 1581, 1581, + 3095, 1797, 1797, 1797, 3096, 1798, 1778, 1792, 1799, 3097, + 3098, 1294, 3099, 3101, 1582, 1800, 1800, 1800, 1584, 1584, + 1584, 1783, 1802, 1802, 1802, 3102, 1803, 3103, 3104, 1804, + 1310, 1310, 1310, 1801, 3105, 1585, 1793, 1807, 1807, 1807, + 1591, 1591, 1591, 1811, 1811, 1811, 1145, 1812, 1312, 3106, + 1813, 1593, 1593, 1593, 1808, 1594, 3107, 1592, 1595, 1794, + 1816, 1816, 1816, 1336, 1336, 1336, 1606, 1606, 1606, 3108, + 1607, 3100, 3109, 1608, 1825, 1825, 1825, 1817, 3285, 3285, + + 3285, 1338, 3285, 3285, 3285, 3285, 3285, 3285, 1352, 1352, + 1352, 1826, 1832, 1832, 1832, 3285, 1805, 3110, 3111, 3285, + 3112, 3113, 3285, 1618, 1618, 1618, 1354, 1619, 3114, 1833, + 1620, 3115, 3116, 1836, 1836, 1836, 1367, 1367, 1367, 1375, + 1375, 1375, 1384, 1384, 1384, 1848, 1848, 1848, 1824, 1828, + 1837, 1395, 1395, 1395, 1369, 3117, 3118, 1377, 3119, 3120, + 1386, 3122, 1849, 1830, 3123, 1404, 1404, 1404, 1827, 1397, + 1634, 1634, 1634, 1145, 1635, 1829, 3124, 1636, 1637, 1637, + 1637, 3125, 1638, 1406, 3126, 1639, 1643, 1643, 1643, 3127, + 1644, 1850, 3121, 1645, 1648, 1648, 1648, 3128, 1649, 1844, + + 1839, 1650, 1416, 1416, 1416, 1841, 3129, 3130, 1851, 1424, + 1424, 1424, 1655, 1655, 1655, 3131, 1656, 3132, 3133, 1657, + 1418, 1658, 1658, 1658, 3134, 1659, 3135, 1426, 1660, 3136, + 3137, 1853, 1432, 1432, 1432, 1662, 1662, 1662, 3138, 1663, + 3139, 1145, 1664, 3141, 1667, 1667, 1667, 3142, 1668, 3143, + 1434, 1669, 1442, 1442, 1442, 1672, 1672, 1672, 1866, 1866, + 1866, 3140, 1867, 1858, 3144, 1868, 1860, 1451, 1451, 1451, + 1444, 3145, 1673, 1874, 1874, 1874, 1457, 1457, 1457, 1861, + 1464, 1464, 1464, 3146, 3147, 1453, 1878, 1878, 1878, 3148, + 1875, 1472, 1472, 1472, 1459, 1686, 1686, 1686, 1466, 1864, + + 1158, 1158, 1158, 1879, 1906, 1906, 1906, 3149, 3150, 1474, + 1914, 1914, 1914, 1687, 3151, 3152, 1872, 3153, 1160, 1724, + 1724, 1724, 3154, 1725, 3155, 3156, 1726, 1193, 1193, 1193, + 3157, 3158, 1877, 1728, 1728, 1728, 1145, 1729, 3160, 3161, + 1730, 3162, 3159, 1876, 3163, 1195, 1882, 1203, 1203, 1203, + 1907, 3164, 1887, 1880, 3165, 3166, 1915, 1735, 1735, 1735, + 3167, 1736, 3168, 1883, 1737, 1205, 1739, 1739, 1739, 3169, + 1740, 3170, 3171, 1741, 1219, 1219, 1219, 1745, 1745, 1745, + 3173, 1746, 3174, 1145, 1747, 1748, 1748, 1748, 3175, 1933, + 1933, 1933, 1221, 1934, 1916, 3176, 1935, 3172, 1919, 1226, + + 1226, 1226, 1749, 1758, 1758, 1758, 1942, 1942, 1942, 1942, + 1942, 1942, 1903, 1903, 1903, 3177, 3178, 1228, 3179, 1766, + 1766, 1766, 1948, 1948, 1948, 3180, 1949, 3182, 3183, 1950, + 1768, 1768, 1768, 3184, 1769, 1923, 1767, 1770, 1257, 1257, + 1257, 1953, 1953, 1953, 1266, 1266, 1266, 1775, 1775, 1775, + 1936, 1776, 3185, 3186, 1777, 3187, 1259, 3188, 1954, 1274, + 1274, 1274, 1268, 3189, 1779, 1779, 1779, 3192, 1780, 3193, + 1943, 1781, 3194, 1904, 3195, 3196, 1943, 1276, 1957, 1957, + 1957, 1280, 1280, 1280, 3197, 1951, 1786, 1786, 1786, 1734, + 1787, 1955, 3282, 1788, 1145, 1958, 1789, 1789, 1789, 1282, + + 1962, 1962, 1962, 1145, 1963, 1145, 1145, 1964, 1145, 1791, + 1791, 1791, 1732, 1790, 1965, 1965, 1965, 1731, 1966, 1145, + 1145, 1967, 1969, 1969, 1969, 1956, 1792, 1971, 1971, 1971, + 1797, 1797, 1797, 1145, 1798, 1145, 1145, 1799, 3204, 3198, + 1970, 1800, 1800, 1800, 3199, 1959, 1802, 1802, 1802, 3205, + 1803, 3224, 1145, 1804, 1310, 1310, 1310, 1145, 3208, 1801, + 1807, 1807, 1807, 1975, 1975, 1975, 1145, 1976, 3200, 1723, + 1977, 1145, 1312, 1978, 1978, 1978, 1145, 1808, 1811, 1811, + 1811, 3201, 1812, 3202, 3203, 1813, 1816, 1816, 1816, 3225, + 1979, 1983, 1983, 1983, 3209, 1984, 1722, 3206, 1985, 3212, + + 1973, 1145, 1145, 1817, 1986, 1986, 1986, 1992, 1992, 1992, + 1336, 1336, 1336, 1825, 1825, 1825, 1995, 1995, 1995, 3278, + 1996, 1987, 3220, 1997, 1993, 1998, 1998, 1998, 1338, 1145, + 1826, 3285, 3285, 3285, 2001, 2001, 2001, 1352, 1352, 1352, + 1145, 3210, 1999, 1832, 1832, 1832, 3207, 1145, 3285, 1145, + 1145, 2002, 2005, 2005, 2005, 1354, 2006, 1145, 1145, 2007, + 1833, 2008, 2008, 2008, 1836, 1836, 1836, 2011, 2011, 2011, + 3216, 2012, 3211, 1145, 2013, 1720, 1994, 3214, 2009, 1145, + 1145, 1837, 2015, 2015, 2015, 1375, 1375, 1375, 3217, 2000, + 1384, 1384, 1384, 1848, 1848, 1848, 1145, 2003, 1145, 1145, + + 2016, 3232, 1145, 1377, 3213, 2025, 2025, 2025, 1386, 2026, + 1849, 3272, 2027, 2029, 2029, 2029, 1404, 1404, 1404, 3221, + 2034, 2034, 2034, 2036, 2036, 2036, 3285, 3285, 3285, 1145, + 1719, 2030, 3226, 3215, 1406, 3222, 2018, 2035, 2021, 3223, + 2037, 1145, 3233, 3285, 1416, 1416, 1416, 1424, 1424, 1424, + 1432, 1432, 1432, 2043, 2043, 2043, 2045, 2045, 2045, 1442, + 1442, 1442, 1418, 1145, 3218, 1426, 1718, 2032, 1434, 1717, + 2044, 3227, 1145, 2046, 1866, 1866, 1866, 1444, 1867, 1145, + 1145, 1868, 1451, 1451, 1451, 1874, 1874, 1874, 2397, 2398, + 2038, 2399, 1145, 2041, 2054, 2054, 2054, 3230, 2055, 2400, + + 1453, 2056, 1875, 1457, 1457, 1457, 2401, 3219, 1464, 1464, + 1464, 2039, 1878, 1878, 1878, 2042, 2059, 2059, 2059, 3240, + 2060, 1459, 1716, 2061, 2047, 3234, 1466, 3228, 1145, 1879, + 2062, 2062, 2062, 2052, 2068, 2068, 2068, 1158, 1158, 1158, + 2078, 2078, 2078, 1898, 1898, 1898, 1715, 1714, 2063, 1145, + 1713, 2069, 2085, 2085, 2085, 1160, 1903, 1903, 1903, 2086, + 2086, 2086, 2057, 2058, 1906, 1906, 1906, 2089, 2089, 2089, + 2090, 2090, 2090, 1914, 1914, 1914, 1193, 1193, 1193, 2099, + 2099, 2099, 2102, 2102, 2102, 1219, 1219, 1219, 2106, 2106, + 2106, 1226, 1226, 1226, 1195, 3235, 1145, 2100, 2070, 2103, + + 1933, 1933, 1933, 1221, 1934, 2107, 1712, 1935, 1710, 1228, + 2119, 2119, 2119, 1942, 1942, 1942, 2126, 2126, 2126, 2128, + 2128, 2128, 1257, 1257, 1257, 3241, 2096, 2120, 1948, 1948, + 1948, 3229, 1949, 1709, 1145, 1950, 2129, 2118, 1145, 1145, + 1259, 2131, 2131, 2131, 2105, 1953, 1953, 1953, 2133, 2133, + 2133, 1145, 2134, 1145, 1145, 2135, 1145, 1145, 2132, 1266, + 1266, 1266, 1954, 2137, 2137, 2137, 1957, 1957, 1957, 2139, + 2139, 2139, 3231, 2140, 3236, 2130, 2141, 1268, 1280, 1280, + 1280, 2138, 3250, 1958, 1962, 1962, 1962, 1145, 1963, 3237, + 3238, 1964, 3264, 1965, 1965, 1965, 1282, 1966, 3244, 1145, + + 1967, 1969, 1969, 1969, 1971, 1971, 1971, 1145, 1310, 1310, + 1310, 1145, 2136, 1975, 1975, 1975, 1145, 1976, 1145, 1970, + 1977, 1978, 1978, 1978, 3242, 2142, 1312, 2151, 2151, 2151, + 1145, 2152, 3239, 1145, 2153, 1983, 1983, 1983, 1979, 1984, + 3251, 1707, 1985, 1986, 1986, 1986, 2157, 2157, 2157, 3245, + 2158, 3266, 1145, 2159, 2160, 2160, 2160, 1992, 1992, 1992, + 1987, 2165, 2165, 2165, 3246, 2166, 2149, 3243, 2167, 1706, + 3248, 2161, 3252, 1145, 1993, 1336, 1336, 1336, 1995, 1995, + 1995, 1145, 1996, 1703, 1700, 1997, 1998, 1998, 1998, 3249, + 2169, 2169, 2169, 1338, 2170, 1145, 1145, 2171, 2172, 2172, + + 2172, 3253, 3282, 1999, 2001, 2001, 2001, 2174, 2174, 2174, + 1145, 2175, 1145, 1145, 2176, 2173, 1352, 1352, 1352, 3247, + 1145, 2002, 1145, 2005, 2005, 2005, 2168, 2006, 3273, 3254, + 2007, 2008, 2008, 2008, 1354, 2179, 2179, 2179, 1699, 2180, + 1698, 3258, 2181, 2011, 2011, 2011, 3255, 2012, 2009, 1145, + 2013, 2015, 2015, 2015, 1375, 1375, 1375, 2187, 2187, 2187, + 1384, 1384, 1384, 2191, 2191, 2191, 3256, 2177, 3257, 2016, + 1145, 1145, 1377, 3259, 2188, 2025, 2025, 2025, 1386, 2026, + 2192, 1145, 2027, 2029, 2029, 2029, 2199, 2199, 2199, 2034, + 2034, 2034, 2202, 2202, 2202, 1145, 2203, 1697, 1145, 2204, + + 1696, 2030, 1145, 1695, 2200, 1694, 2035, 3262, 3263, 2193, + 2036, 2036, 2036, 2205, 2205, 2205, 1145, 2206, 2185, 1692, + 2207, 2189, 1416, 1416, 1416, 1145, 1145, 2037, 1424, 1424, + 1424, 1432, 1432, 1432, 2043, 2043, 2043, 2213, 2213, 2213, + 1418, 2214, 3260, 3265, 2215, 3261, 1426, 1145, 3276, 1434, + 1145, 2044, 2045, 2045, 2045, 2216, 2216, 2216, 3277, 2217, + 3267, 1145, 2218, 1442, 1442, 1442, 1451, 1451, 1451, 2046, + 1145, 2054, 2054, 2054, 3274, 2055, 1145, 2211, 2056, 3280, + 1145, 1444, 3281, 1145, 1453, 1457, 1457, 1457, 2209, 1464, + 1464, 1464, 1145, 2059, 2059, 2059, 2212, 2060, 3270, 1691, + + 2061, 1690, 1689, 1459, 2062, 2062, 2062, 1466, 2068, 2068, + 2068, 2232, 2232, 2232, 3275, 2233, 3268, 1682, 2234, 1158, + 1158, 1158, 2063, 1145, 3279, 2069, 3269, 1679, 2219, 3271, + 1678, 2224, 2236, 2236, 2236, 1676, 2226, 1160, 2241, 2241, + 2241, 1675, 2227, 2242, 2242, 2242, 2078, 2078, 2078, 2244, + 2244, 2244, 2248, 2248, 2248, 2085, 2085, 2085, 2086, 2086, + 2086, 2249, 2249, 2249, 2089, 2089, 2089, 2090, 2090, 2090, + 2252, 2252, 2252, 2253, 2253, 2253, 2254, 2254, 2254, 2255, + 2255, 2255, 1674, 2235, 1193, 1193, 1193, 2099, 2099, 2099, + 1671, 2102, 2102, 2102, 2261, 2261, 2261, 1666, 2262, 1665, + + 1653, 2263, 1195, 1651, 1647, 2100, 1646, 2250, 2103, 2265, + 2265, 2265, 2106, 2106, 2106, 2267, 2267, 2267, 1642, 2268, + 1640, 1632, 2269, 1226, 1226, 1226, 1631, 2266, 1630, 2107, + 2119, 2119, 2119, 1629, 1627, 2257, 2281, 2281, 2281, 1626, + 2282, 1228, 1624, 2283, 2284, 2284, 2284, 2120, 2126, 2126, + 2126, 2289, 2289, 2289, 2128, 2128, 2128, 2291, 2291, 2291, + 1622, 2292, 1621, 1617, 2293, 1257, 1257, 1257, 2131, 2131, + 2131, 2129, 2280, 2295, 2295, 2295, 1616, 2296, 1615, 1614, + 2297, 1612, 1611, 1259, 1610, 2132, 2133, 2133, 2133, 1609, + 2134, 1604, 1603, 2135, 1266, 1266, 1266, 2290, 1602, 2137, + + 2137, 2137, 2139, 2139, 2139, 1601, 2140, 1600, 1599, 2141, + 1598, 1597, 1268, 1280, 1280, 1280, 2294, 2138, 1310, 1310, + 1310, 2151, 2151, 2151, 1596, 2152, 1590, 1589, 2153, 1588, + 1587, 1282, 1580, 2157, 2157, 2157, 1312, 2158, 1579, 1577, + 2159, 2160, 2160, 2160, 1576, 2298, 2313, 2313, 2313, 1573, + 2314, 1572, 1563, 2315, 1562, 2165, 2165, 2165, 2161, 2166, + 1558, 1557, 2167, 1336, 1336, 1336, 2299, 2169, 2169, 2169, + 1556, 2170, 1555, 2308, 2171, 2172, 2172, 2172, 2320, 2320, + 2320, 1338, 2321, 1554, 1553, 2322, 2174, 2174, 2174, 1552, + 2175, 1551, 2173, 2176, 1352, 1352, 1352, 2179, 2179, 2179, + + 1549, 2180, 1548, 1546, 2181, 2328, 2328, 2328, 2187, 2187, + 2187, 1545, 1354, 2331, 2331, 2331, 1544, 2332, 1541, 1539, + 2333, 1536, 1534, 2329, 1531, 2188, 1522, 2319, 1384, 1384, + 1384, 2191, 2191, 2191, 2336, 2336, 2336, 1520, 2337, 1513, + 1511, 2338, 1510, 2199, 2199, 2199, 1386, 1509, 2192, 2202, + 2202, 2202, 1508, 2203, 1507, 1506, 2204, 1416, 1416, 1416, + 2323, 2200, 2205, 2205, 2205, 1505, 2206, 1504, 1503, 2207, + 1502, 1424, 1424, 1424, 1499, 1418, 1432, 1432, 1432, 2213, + 2213, 2213, 1498, 2214, 1497, 1496, 2215, 1495, 2334, 1426, + 1494, 2216, 2216, 2216, 1434, 2217, 1493, 1491, 2218, 1442, + + 1442, 1442, 1490, 2354, 2354, 2354, 1489, 1488, 2349, 3285, + 3285, 3285, 2352, 3285, 3285, 3285, 1487, 1444, 1486, 2353, + 2355, 3285, 3285, 3285, 1485, 1483, 3285, 1451, 1451, 1451, + 3285, 1457, 1457, 1457, 2362, 2362, 2362, 2351, 3285, 2364, + 2364, 2364, 2367, 2367, 2367, 1453, 2232, 2232, 2232, 1459, + 2233, 1482, 2363, 2234, 1158, 1158, 1158, 1145, 1481, 1480, + 2356, 2236, 2236, 2236, 2369, 2369, 2369, 2370, 2370, 2370, + 1479, 1478, 1160, 2241, 2241, 2241, 1477, 2357, 1145, 1471, + 2358, 2242, 2242, 2242, 2244, 2244, 2244, 2374, 2374, 2374, + 1456, 2361, 2359, 2375, 2375, 2375, 2376, 2376, 2376, 2248, + + 2248, 2248, 2249, 2249, 2249, 2252, 2252, 2252, 2253, 2253, + 2253, 1455, 1450, 2368, 2254, 2254, 2254, 2255, 2255, 2255, + 2380, 2380, 2380, 2383, 2383, 2383, 2261, 2261, 2261, 1449, + 2262, 1448, 1447, 2263, 3285, 3285, 3285, 1446, 2381, 1420, + 2384, 2265, 2265, 2265, 1408, 2267, 2267, 2267, 1394, 2268, + 1393, 3285, 2269, 1226, 1226, 1226, 2281, 2281, 2281, 2266, + 2282, 2402, 2403, 2283, 2404, 2284, 2284, 2284, 2407, 2407, + 2407, 1228, 2405, 2289, 2289, 2289, 2291, 2291, 2291, 2406, + 2292, 1392, 1388, 2293, 1257, 1257, 1257, 2295, 2295, 2295, + 1383, 2296, 1379, 1371, 2297, 2413, 2413, 2413, 1366, 1365, + + 2385, 1359, 1259, 1280, 1280, 1280, 2423, 2423, 2423, 1310, + 1310, 1310, 1356, 2414, 2396, 2313, 2313, 2313, 1335, 2314, + 1334, 1282, 2315, 2430, 2430, 2430, 1333, 1312, 1332, 1331, + 2412, 2434, 2434, 2434, 2320, 2320, 2320, 1330, 2321, 1329, + 2431, 2322, 2436, 2436, 2436, 2328, 2328, 2328, 1328, 2435, + 2442, 2442, 2442, 1327, 2415, 2331, 2331, 2331, 1321, 2332, + 2437, 1314, 2333, 2329, 1384, 1384, 1384, 2443, 1303, 2424, + 2445, 2445, 2445, 2336, 2336, 2336, 1298, 2337, 1297, 1296, + 2338, 1291, 1386, 3285, 3285, 3285, 1290, 2446, 3285, 3285, + 3285, 3285, 3285, 3285, 2456, 2456, 2456, 2460, 2460, 2460, + + 3285, 2458, 2458, 2458, 1286, 3285, 1285, 1284, 3285, 1424, + 1424, 1424, 1279, 1278, 2461, 2444, 2447, 1273, 1265, 2459, + 1261, 1432, 1432, 1432, 2354, 2354, 2354, 1426, 1442, 1442, + 1442, 1256, 1255, 2465, 2465, 2465, 1251, 2466, 2448, 1434, + 2467, 2355, 2454, 2468, 2468, 2468, 1444, 1250, 1249, 2449, + 3285, 3285, 3285, 3285, 3285, 3285, 2472, 2472, 2472, 1248, + 2469, 2474, 2474, 2474, 1247, 2464, 1246, 3285, 1245, 2462, + 3285, 1457, 1457, 1457, 2473, 2362, 2362, 2362, 2364, 2364, + 2364, 1244, 2463, 2367, 2367, 2367, 2369, 2369, 2369, 1459, + 2479, 2479, 2479, 2363, 1243, 1242, 1145, 2370, 2370, 2370, + + 1241, 2470, 1240, 1239, 2471, 2483, 2483, 2483, 2480, 2374, + 2374, 2374, 2375, 2375, 2375, 2376, 2376, 2376, 2380, 2380, + 2380, 2383, 2383, 2383, 2488, 2488, 2488, 1233, 2489, 1225, + 1224, 2490, 1226, 1226, 1226, 1223, 2381, 2475, 2384, 1218, + 2476, 2407, 2407, 2407, 2517, 2517, 2517, 1257, 1257, 1257, + 1228, 2413, 2413, 2413, 2520, 2520, 2520, 2526, 2526, 2526, + 2423, 2423, 2423, 1217, 1216, 1259, 1310, 1310, 1310, 2414, + 1213, 1207, 2521, 1202, 2527, 1201, 2430, 2430, 2430, 2534, + 2534, 2534, 1197, 2535, 1312, 1192, 2536, 2538, 2538, 2538, + 1191, 1190, 2502, 2431, 2434, 2434, 2434, 2436, 2436, 2436, + + 2542, 2542, 2542, 1189, 2539, 2442, 2442, 2442, 1188, 2548, + 2548, 2548, 2435, 2519, 1187, 2437, 1186, 2543, 2445, 2445, + 2445, 1184, 2443, 2528, 2545, 2545, 2545, 2549, 2546, 1183, + 1182, 2547, 2550, 2550, 2550, 2446, 2551, 1181, 1180, 2552, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 2558, + 2558, 2558, 2456, 2456, 2456, 1179, 1178, 3285, 1177, 1176, + 3285, 1175, 1174, 3285, 1173, 1172, 2559, 2458, 2458, 2458, + 2460, 2460, 2460, 2562, 2562, 2562, 1171, 2563, 1170, 1169, + 2564, 2565, 2565, 2565, 1168, 2459, 1167, 2461, 1432, 1432, + 1432, 1166, 2553, 1442, 1442, 1442, 2465, 2465, 2465, 2566, + + 2466, 2554, 1165, 2467, 2555, 1164, 1434, 2468, 2468, 2468, + 1157, 1444, 2569, 2569, 2569, 1156, 2570, 1155, 1154, 2571, + 2572, 2572, 2572, 1153, 2469, 2574, 2574, 2574, 2472, 2472, + 2472, 2474, 2474, 2474, 2576, 2576, 2576, 2573, 2479, 2479, + 2479, 1152, 2575, 2483, 2483, 2483, 2473, 2586, 2586, 2586, + 1151, 1148, 2577, 1146, 1145, 2567, 2480, 2568, 2488, 2488, + 2488, 1143, 2489, 1141, 2587, 2490, 1226, 1226, 1226, 2517, + 2517, 2517, 1257, 1257, 1257, 2520, 2520, 2520, 2623, 2623, + 2623, 2526, 2526, 2526, 1228, 2625, 2625, 2625, 1138, 2626, + 1259, 1134, 2627, 2521, 1132, 2624, 1131, 1130, 2527, 2628, + + 2628, 2628, 2633, 2633, 2633, 2534, 2534, 2534, 1128, 2535, + 1127, 1126, 2536, 2538, 2538, 2538, 1125, 2629, 1124, 2634, + 2637, 2637, 2637, 1123, 2638, 1121, 2605, 2639, 1120, 1119, + 2539, 2641, 2641, 2641, 2542, 2542, 2542, 2643, 2643, 2643, + 1118, 2644, 1116, 2621, 2645, 2646, 2646, 2646, 2642, 1115, + 1114, 2543, 2545, 2545, 2545, 1110, 2546, 1109, 1107, 2547, + 1106, 1105, 2647, 2548, 2548, 2548, 2550, 2550, 2550, 1104, + 2551, 1103, 1102, 2552, 3285, 3285, 3285, 3285, 3285, 3285, + 1100, 2549, 3285, 3285, 3285, 2558, 2558, 2558, 2651, 2651, + 2651, 3285, 2652, 1099, 3285, 2653, 2654, 2654, 2654, 3285, + + 1098, 1097, 2559, 2656, 2656, 2656, 1095, 2562, 2562, 2562, + 1094, 2563, 1093, 2655, 2564, 2565, 2565, 2565, 1090, 1089, + 2657, 1432, 1432, 1432, 1442, 1442, 1442, 1087, 2649, 2648, + 2572, 2572, 2572, 2566, 2569, 2569, 2569, 2650, 2570, 1434, + 1084, 2571, 1444, 1083, 2666, 2666, 2666, 2573, 2667, 1079, + 1078, 2668, 2574, 2574, 2574, 2669, 2669, 2669, 1076, 2670, + 1075, 1074, 2671, 2576, 2576, 2576, 2676, 2676, 2676, 2575, + 1071, 2586, 2586, 2586, 1070, 2680, 2680, 2680, 1069, 2681, + 1068, 2577, 2682, 1066, 1065, 2665, 1064, 2664, 2587, 1226, + 1226, 1226, 2714, 2714, 2714, 1257, 1257, 1257, 2717, 2717, + + 2717, 2623, 2623, 2623, 2720, 2720, 2720, 1228, 2721, 1063, + 1062, 2722, 1057, 1259, 1055, 2718, 1054, 1053, 2624, 2625, + 2625, 2625, 1052, 2626, 1051, 1050, 2627, 2628, 2628, 2628, + 2725, 2725, 2725, 2633, 2633, 2633, 1049, 2730, 2730, 2730, + 2700, 2676, 2676, 2676, 2719, 2629, 1048, 2726, 1047, 1046, + 2634, 2727, 2727, 2727, 2731, 2728, 1043, 2716, 2729, 2637, + 2637, 2637, 1040, 2638, 1039, 1038, 2639, 2641, 2641, 2641, + 2734, 2734, 2734, 1032, 2735, 1031, 1029, 2736, 2643, 2643, + 2643, 1026, 2644, 1024, 2642, 2645, 2646, 2646, 2646, 2737, + 2737, 2737, 1023, 2738, 1018, 1017, 2739, 3285, 3285, 3285, + + 2741, 2741, 2741, 2647, 3285, 3285, 3285, 1015, 2651, 2651, + 2651, 1014, 2652, 1013, 3285, 2653, 1011, 2742, 2654, 2654, + 2654, 3285, 2744, 2744, 2744, 1008, 2745, 1006, 1003, 2746, + 2656, 2656, 2656, 1002, 1000, 2655, 2747, 2747, 2747, 999, + 2748, 996, 991, 2749, 1432, 1432, 1432, 2657, 1442, 1442, + 1442, 990, 987, 2743, 986, 2740, 2666, 2666, 2666, 985, + 2667, 982, 1434, 2668, 981, 979, 1444, 2669, 2669, 2669, + 976, 2670, 974, 973, 2671, 2764, 2764, 2764, 2767, 2767, + 2767, 2680, 2680, 2680, 972, 2681, 971, 969, 2682, 2778, + 2778, 2778, 2765, 1687, 968, 2756, 1226, 1226, 1226, 2714, + + 2714, 2714, 2802, 2802, 2802, 967, 2779, 1257, 1257, 1257, + 2717, 2717, 2717, 966, 1228, 2757, 2804, 2804, 2804, 965, + 2805, 964, 961, 2806, 960, 1259, 959, 2718, 2720, 2720, + 2720, 956, 2721, 953, 952, 2722, 2725, 2725, 2725, 2810, + 2810, 2810, 950, 2811, 949, 2788, 2812, 2727, 2727, 2727, + 946, 2728, 943, 2726, 2729, 2730, 2730, 2730, 2803, 2813, + 2813, 2813, 940, 2814, 939, 931, 2815, 2734, 2734, 2734, + 930, 2735, 2731, 929, 2736, 2737, 2737, 2737, 928, 2738, + 922, 921, 2739, 3285, 3285, 3285, 2741, 2741, 2741, 2819, + 2819, 2819, 920, 2820, 918, 917, 2821, 3285, 3285, 3285, + + 3285, 916, 915, 2742, 2744, 2744, 2744, 914, 2745, 913, + 908, 2746, 905, 907, 3285, 2747, 2747, 2747, 902, 2748, + 901, 899, 2749, 2837, 2837, 2837, 1442, 1442, 1442, 2845, + 2845, 2845, 897, 895, 2818, 2764, 2764, 2764, 2847, 2847, + 2847, 2838, 2848, 893, 1444, 2849, 2846, 1687, 2850, 2850, + 2850, 891, 2765, 1687, 888, 887, 1687, 2767, 2767, 2767, + 2851, 2851, 2851, 2852, 2852, 2852, 886, 885, 2822, 2778, + 2778, 2778, 2861, 2861, 2861, 884, 2862, 882, 880, 2863, + 1226, 1226, 1226, 2879, 2879, 2879, 2779, 2802, 2802, 2802, + 879, 878, 2839, 2880, 2880, 2880, 876, 874, 1228, 2804, + + 2804, 2804, 873, 2805, 871, 869, 2806, 868, 2810, 2810, + 2810, 2881, 2811, 866, 862, 2812, 2813, 2813, 2813, 861, + 2814, 859, 854, 2815, 2885, 2885, 2885, 2888, 2888, 2888, + 2819, 2819, 2819, 852, 2820, 848, 847, 2821, 2890, 2890, + 2890, 2886, 846, 844, 2889, 842, 2870, 2837, 2837, 2837, + 1442, 1442, 1442, 841, 840, 2891, 2845, 2845, 2845, 2910, + 2910, 2910, 838, 2911, 836, 2838, 2912, 835, 1444, 2850, + 2850, 2850, 833, 2846, 1687, 831, 830, 1687, 2847, 2847, + 2847, 829, 2848, 828, 827, 2849, 2851, 2851, 2851, 2852, + 2852, 2852, 826, 2861, 2861, 2861, 1687, 2862, 825, 823, + + 2863, 2904, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, + 1685, 821, 820, 1685, 2929, 2929, 2929, 817, 1685, 1685, + 1685, 1687, 1685, 2879, 2879, 2879, 2880, 2880, 2880, 2885, + 2885, 2885, 2930, 2940, 2940, 2940, 816, 2941, 815, 813, + 2942, 2888, 2888, 2888, 2881, 801, 2886, 1685, 1685, 1685, + 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 2889, 800, + 1685, 2890, 2890, 2890, 797, 1685, 1685, 1685, 1687, 1685, + 2944, 2944, 2944, 795, 2945, 793, 792, 2946, 2891, 2947, + 2947, 2947, 791, 2948, 789, 787, 2949, 2962, 2962, 2962, + 2929, 2929, 2929, 785, 1685, 1685, 2910, 2910, 2910, 782, + + 2911, 781, 780, 2912, 779, 2963, 778, 776, 2930, 2962, + 2962, 2962, 774, 773, 1687, 1685, 1685, 1685, 1685, 1685, + 2974, 1685, 1685, 1685, 771, 769, 1685, 2963, 768, 766, + 764, 1685, 1685, 1685, 1687, 1685, 2940, 2940, 2940, 763, + 2941, 762, 760, 2942, 2944, 2944, 2944, 758, 2945, 757, + 756, 2946, 2947, 2947, 2947, 755, 2948, 753, 3285, 2949, + 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, + 2974, 700, 733, 1685, 3011, 3011, 3011, 732, 1685, 1685, + 1685, 1687, 1685, 3020, 3020, 3020, 3022, 3022, 3022, 3024, + 3024, 3024, 1687, 1688, 3032, 3032, 3032, 3042, 3042, 3042, + + 3021, 730, 728, 3023, 727, 726, 3025, 1685, 1685, 724, + 720, 3033, 3011, 3011, 3011, 1145, 3020, 3020, 3020, 3050, + 3050, 3050, 716, 3051, 715, 713, 3052, 3022, 3022, 3022, + 1687, 712, 709, 3021, 3053, 3053, 3053, 708, 3054, 707, + 705, 3055, 704, 703, 3023, 3024, 3024, 3024, 3056, 3056, + 3056, 701, 3057, 696, 3285, 3058, 3032, 3032, 3032, 3042, + 3042, 3042, 3025, 1882, 3065, 3065, 3065, 676, 3066, 674, + 672, 3067, 666, 3033, 3050, 3050, 3050, 1145, 3051, 665, + 666, 3052, 3053, 3053, 3053, 665, 3054, 664, 663, 3055, + 3056, 3056, 3056, 3285, 3057, 3285, 3076, 3058, 3065, 3065, + + 3065, 3285, 3066, 3285, 3285, 3067, 3181, 3181, 3181, 3181, + 3181, 3181, 3285, 3190, 3285, 3285, 3191, 3283, 3283, 3283, + 3283, 3283, 3283, 3285, 1145, 3285, 3285, 1145, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3284, 3285, 3285, 3284, 260, + 260, 260, 260, 260, 260, 260, 260, 260, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 282, 282, 282, 282, 282, 282, 282, + + 282, 282, 290, 290, 290, 290, 290, 290, 290, 290, + 290, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 317, 317, + 317, 317, 317, 317, 317, 317, 317, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 336, 336, 336, 336, 336, 336, 336, 336, 336, 342, 342, 342, 342, 342, 342, 342, 342, 342, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 372, 372, 372, 372, 372, 372, 372, 372, - 372, 379, 379, 379, 379, 379, 379, 379, 379, 379, - 386, 386, 386, 386, 386, 386, 386, 386, 386, 392, - 392, 392, 392, 392, 392, 392, 392, 392, 399, 399, - 399, 399, 399, 399, 399, 399, 399, 404, 404, 404, - 404, 404, 404, 404, 404, 404, 410, 410, 410, 410, - 410, 410, 410, 410, 410, 415, 415, 415, 415, 415, - - 415, 415, 415, 415, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 437, 437, 437, 437, 437, 437, 437, 437, - 437, 441, 441, 441, 441, 441, 441, 441, 441, 441, + 348, 348, 348, 354, 354, 354, 354, 354, 354, 354, + 354, 354, 359, 359, 359, 359, 359, 359, 359, 359, + + 359, 378, 378, 378, 378, 378, 378, 378, 378, 378, + 385, 385, 385, 385, 385, 385, 385, 385, 385, 392, + 392, 392, 392, 392, 392, 392, 392, 392, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 405, 405, 405, + 405, 405, 405, 405, 405, 405, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 416, 416, 416, 416, 416, + 416, 416, 416, 416, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 427, 427, 427, 427, 427, 427, 427, + 427, 427, 435, 435, 435, 435, 435, 435, 435, 435, + 435, 443, 443, 443, 443, 443, 443, 443, 443, 443, + 447, 447, 447, 447, 447, 447, 447, 447, 447, 453, - 453, 453, 453, 453, 453, 453, 453, 453, 470, 470, - 470, 470, 470, 470, 470, 470, 470, 476, 476, 476, - 476, 476, 476, 476, 476, 476, 485, 485, 485, 485, - 485, 485, 485, 485, 485, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 501, 501, 501, 501, 501, 501, - - 501, 501, 501, 507, 507, 507, 507, 507, 507, 507, - 507, 507, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 524, 524, 524, 524, 524, 524, 524, 524, 524, 530, - 530, 530, 530, 530, 530, 530, 530, 530, 537, 537, + 453, 453, 453, 453, 453, 453, 453, 453, 459, 459, + 459, 459, 459, 459, 459, 459, 459, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 483, 483, 483, 483, + 483, 483, 483, 483, 483, 492, 492, 492, 492, 492, + 492, 492, 492, 492, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 525, 525, 525, 525, 525, 525, 525, 525, 525, 531, + + 531, 531, 531, 531, 531, 531, 531, 531, 537, 537, 537, 537, 537, 537, 537, 537, 537, 544, 544, 544, - 544, 544, 544, 544, 544, 544, 549, 549, 549, 549, - 549, 549, 549, 549, 549, 557, 557, 557, 557, 557, - 557, 557, 557, 557, 563, 563, 563, 563, 563, 563, - 563, 563, 563, 570, 570, 570, 570, 570, 570, 570, - - 570, 570, 575, 575, 575, 575, 575, 575, 575, 575, - 575, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 586, 586, 586, 586, 586, 586, 586, 586, 586, 593, - 593, 593, 593, 593, 593, 593, 593, 593, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 614, 614, 614, 614, - 614, 614, 614, 614, 614, 622, 622, 622, 622, 622, - 622, 622, 622, 622, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 632, 632, 632, 632, 632, 632, 632, - 632, 632, 636, 636, 636, 636, 636, 636, 636, 636, - - 636, 643, 643, 643, 643, 643, 643, 643, 643, 643, - 648, 648, 648, 648, 648, 648, 648, 648, 648, 668, - 668, 668, 762, 761, 759, 668, 695, 695, 695, 757, - 756, 755, 695, 699, 699, 699, 753, 751, 750, 699, - 707, 707, 707, 749, 748, 746, 707, 718, 718, 718, - 3298, 693, 726, 718, 724, 724, 724, 725, 723, 721, - 724, 747, 747, 747, 720, 719, 717, 747, 754, 754, - 754, 713, 709, 708, 754, 760, 760, 760, 706, 705, - 702, 760, 765, 765, 765, 701, 700, 698, 765, 770, - 770, 770, 697, 696, 694, 770, 779, 779, 779, 689, - - 3298, 669, 779, 783, 783, 783, 667, 665, 659, 783, - 789, 789, 789, 658, 659, 658, 789, 807, 807, 807, - 657, 656, 3298, 807, 817, 817, 817, 3298, 3298, 3298, - 817, 827, 827, 827, 3298, 3298, 3298, 827, 832, 832, - 832, 3298, 3298, 3298, 832, 838, 838, 838, 3298, 3298, - 3298, 838, 846, 846, 846, 3298, 3298, 3298, 846, 853, - 853, 853, 3298, 3298, 3298, 853, 860, 860, 860, 3298, - 3298, 3298, 860, 865, 865, 865, 3298, 3298, 3298, 865, - 870, 870, 870, 3298, 3298, 3298, 870, 876, 876, 876, - 3298, 3298, 3298, 876, 885, 885, 885, 3298, 3298, 3298, - - 885, 889, 889, 889, 3298, 3298, 3298, 889, 893, 893, - 893, 3298, 3298, 3298, 893, 897, 897, 897, 897, 897, - 897, 897, 3298, 897, 668, 668, 668, 3298, 3298, 3298, - 668, 912, 3298, 3298, 3298, 912, 695, 695, 695, 3298, - 3298, 3298, 695, 944, 3298, 3298, 3298, 944, 699, 699, - 699, 3298, 3298, 3298, 699, 951, 3298, 3298, 3298, 951, - 707, 707, 707, 3298, 3298, 3298, 707, 963, 3298, 3298, - 3298, 963, 718, 718, 718, 3298, 3298, 3298, 718, 968, - 3298, 3298, 3298, 968, 724, 724, 724, 3298, 3298, 3298, - 724, 973, 3298, 3298, 3298, 973, 747, 747, 747, 3298, - - 3298, 3298, 747, 994, 3298, 3298, 3298, 994, 754, 754, - 754, 3298, 3298, 3298, 754, 1000, 3298, 3298, 3298, 1000, - 760, 760, 760, 3298, 3298, 3298, 760, 1005, 3298, 3298, - 3298, 1005, 765, 765, 765, 3298, 3298, 3298, 765, 1009, - 3298, 3298, 3298, 1009, 770, 770, 770, 3298, 3298, 3298, - 770, 1018, 3298, 3298, 3298, 1018, 779, 779, 779, 3298, - 3298, 3298, 779, 1023, 3298, 3298, 3298, 1023, 783, 783, - 783, 3298, 3298, 3298, 783, 1030, 3298, 3298, 3298, 1030, - 789, 789, 789, 3298, 3298, 3298, 789, 1049, 3298, 3298, - 3298, 1049, 807, 807, 807, 3298, 3298, 3298, 807, 1060, - - 3298, 3298, 3298, 1060, 817, 817, 817, 3298, 3298, 3298, - 817, 1070, 3298, 3298, 3298, 1070, 827, 827, 827, 3298, - 3298, 3298, 827, 1075, 3298, 3298, 3298, 1075, 832, 832, - 832, 3298, 3298, 3298, 832, 1081, 3298, 3298, 3298, 1081, - 838, 838, 838, 3298, 3298, 3298, 838, 1089, 3298, 3298, - 3298, 1089, 846, 846, 846, 3298, 3298, 3298, 846, 1094, - 3298, 3298, 3298, 1094, 853, 853, 853, 3298, 3298, 3298, - 853, 1101, 3298, 3298, 3298, 1101, 860, 860, 860, 3298, - 3298, 3298, 860, 1106, 3298, 3298, 3298, 1106, 865, 865, - 865, 3298, 3298, 3298, 865, 1110, 3298, 3298, 3298, 1110, - - 870, 870, 870, 3298, 3298, 3298, 870, 1115, 3298, 3298, - 3298, 1115, 876, 876, 876, 3298, 3298, 3298, 876, 1122, - 3298, 3298, 3298, 1122, 885, 885, 885, 3298, 3298, 3298, - 885, 1126, 3298, 3298, 3298, 1126, 889, 889, 889, 3298, - 3298, 3298, 889, 1130, 3298, 3298, 3298, 1130, 893, 893, - 893, 3298, 3298, 3298, 893, 1135, 3298, 3298, 3298, 1135, - 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1143, - 3298, 3298, 3298, 3298, 1143, 668, 668, 668, 3298, 3298, - 3298, 668, 1152, 1152, 1152, 1152, 3298, 3298, 1152, 1152, - 695, 695, 695, 3298, 3298, 3298, 695, 1187, 1187, 1187, - - 1187, 3298, 3298, 1187, 1187, 699, 699, 699, 3298, 3298, - 3298, 699, 1197, 1197, 1197, 1197, 3298, 3298, 1197, 1197, - 707, 707, 707, 3298, 3298, 3298, 707, 1213, 1213, 1213, - 1213, 3298, 3298, 1213, 1213, 718, 718, 718, 3298, 3298, - 3298, 718, 1220, 1220, 1220, 1220, 3298, 3298, 1220, 1220, - 724, 724, 724, 3298, 3298, 3298, 724, 1228, 1228, 1228, - 1228, 3298, 3298, 1228, 1228, 747, 747, 747, 3298, 3298, - 3298, 747, 1251, 1251, 1251, 1251, 3298, 3298, 1251, 1251, - 754, 754, 754, 3298, 3298, 3298, 754, 1260, 1260, 1260, - 1260, 3298, 3298, 1260, 1260, 760, 760, 760, 3298, 3298, - - 3298, 760, 1268, 1268, 1268, 1268, 3298, 3298, 1268, 1268, - 765, 765, 765, 3298, 3298, 3298, 765, 1274, 1274, 1274, - 1274, 3298, 3298, 1274, 1274, 770, 770, 770, 3298, 3298, - 3298, 770, 1286, 1286, 1286, 1286, 3298, 3298, 1286, 1286, - 779, 779, 779, 3298, 3298, 3298, 779, 1293, 1293, 1293, - 1293, 3298, 3298, 1293, 1293, 783, 783, 783, 3298, 3298, - 3298, 783, 1304, 1304, 1304, 1304, 3298, 3298, 1304, 1304, - 789, 789, 789, 3298, 3298, 3298, 789, 1330, 1330, 1330, - 1330, 3298, 3298, 1330, 1330, 807, 807, 807, 807, 3298, - 807, 3298, 807, 1346, 1346, 1346, 1346, 3298, 3298, 1346, - - 1346, 817, 817, 817, 3298, 3298, 3298, 817, 1361, 1361, - 1361, 1361, 3298, 3298, 1361, 1361, 827, 827, 827, 3298, - 3298, 3298, 827, 1369, 1369, 1369, 1369, 3298, 3298, 1369, - 1369, 832, 832, 832, 3298, 3298, 3298, 832, 1378, 1378, - 1378, 1378, 3298, 3298, 1378, 1378, 838, 838, 838, 3298, - 3298, 3298, 838, 1389, 1389, 1389, 1389, 3298, 3298, 1389, - 1389, 846, 846, 846, 846, 3298, 846, 3298, 846, 1398, - 1398, 1398, 1398, 3298, 3298, 1398, 1398, 853, 853, 853, - 853, 3298, 853, 3298, 853, 1410, 1410, 1410, 1410, 3298, - 3298, 1410, 1410, 860, 860, 860, 3298, 3298, 3298, 860, - - 1418, 1418, 1418, 1418, 3298, 3298, 1418, 1418, 865, 865, - 865, 865, 3298, 865, 3298, 865, 1426, 1426, 1426, 1426, - 3298, 3298, 1426, 1426, 870, 870, 870, 870, 3298, 870, - 3298, 870, 1436, 1436, 1436, 1436, 3298, 3298, 1436, 1436, - 876, 876, 876, 3298, 3298, 3298, 876, 1445, 1445, 1445, - 1445, 3298, 3298, 1445, 1445, 885, 885, 885, 3298, 3298, - 3298, 885, 1451, 1451, 1451, 1451, 3298, 3298, 1451, 1451, - 1458, 1458, 1458, 1458, 3298, 3298, 1458, 1458, 893, 893, - 893, 3298, 3298, 3298, 893, 1466, 1466, 1466, 1466, 3298, - 3298, 1466, 1466, 1137, 1137, 1137, 1137, 1137, 1137, 1137, - - 1137, 1137, 1143, 3298, 1143, 3298, 3298, 1143, 668, 668, - 668, 3298, 3298, 3298, 668, 1152, 1152, 1152, 1152, 3298, - 3298, 1152, 1152, 695, 695, 695, 695, 3298, 695, 3298, - 695, 1187, 1187, 1187, 1187, 3298, 3298, 1187, 1187, 699, - 699, 699, 699, 3298, 699, 3298, 699, 1197, 1197, 1197, - 1197, 3298, 3298, 1197, 1197, 707, 707, 707, 3298, 3298, - 3298, 707, 1213, 1213, 1213, 1213, 3298, 3298, 1213, 1213, - 718, 718, 718, 3298, 3298, 3298, 718, 1220, 1220, 1220, - 1220, 3298, 3298, 1220, 1220, 724, 724, 724, 3298, 3298, - 3298, 724, 1228, 1228, 1228, 1228, 3298, 3298, 1228, 1228, - - 747, 747, 747, 3298, 3298, 3298, 747, 1251, 1251, 1251, - 1251, 3298, 3298, 1251, 1251, 754, 754, 754, 3298, 3298, - 3298, 754, 1260, 1260, 1260, 1260, 3298, 3298, 1260, 1260, - 760, 760, 760, 760, 3298, 760, 3298, 760, 1268, 1268, - 1268, 1268, 3298, 3298, 1268, 1268, 765, 765, 765, 765, - 3298, 765, 3298, 765, 1274, 1274, 1274, 1274, 3298, 3298, - 1274, 1274, 770, 770, 770, 3298, 3298, 3298, 770, 1286, - 1286, 1286, 1286, 3298, 3298, 1286, 1286, 779, 779, 779, - 779, 3298, 779, 3298, 779, 1293, 1293, 1293, 1293, 3298, - 3298, 1293, 1293, 783, 783, 783, 783, 3298, 783, 3298, - - 783, 1304, 1304, 1304, 1304, 3298, 3298, 1304, 1304, 789, - 789, 789, 3298, 3298, 3298, 789, 1330, 1330, 1330, 1330, - 3298, 3298, 1330, 1330, 807, 807, 807, 3298, 3298, 3298, - 807, 1346, 1346, 1346, 1346, 3298, 3298, 1346, 1346, 817, - 817, 817, 3298, 3298, 3298, 817, 1361, 1361, 1361, 1361, - 3298, 3298, 1361, 1361, 827, 827, 827, 3298, 3298, 3298, - 827, 1369, 1369, 1369, 1369, 3298, 3298, 1369, 1369, 832, - 832, 832, 3298, 3298, 3298, 832, 1378, 1378, 1378, 1378, - 3298, 3298, 1378, 1378, 838, 838, 838, 3298, 3298, 3298, - 838, 1389, 1389, 1389, 1389, 3298, 3298, 1389, 1389, 846, - - 846, 846, 3298, 3298, 3298, 846, 1398, 1398, 1398, 1398, - 3298, 3298, 1398, 1398, 853, 853, 853, 3298, 3298, 3298, - 853, 1410, 1410, 1410, 1410, 3298, 3298, 1410, 1410, 860, - 860, 860, 3298, 3298, 3298, 860, 1418, 1418, 1418, 1418, - 3298, 3298, 1418, 1418, 1426, 1426, 1426, 1426, 3298, 3298, - 1426, 1426, 870, 870, 870, 3298, 3298, 3298, 870, 1436, - 1436, 1436, 1436, 3298, 3298, 1436, 1436, 876, 876, 876, - 3298, 3298, 3298, 876, 1445, 1445, 1445, 1445, 3298, 3298, - 1445, 1445, 885, 885, 885, 3298, 3298, 3298, 885, 1451, - 1451, 1451, 1451, 3298, 3298, 1451, 1451, 1458, 1458, 1458, - - 1458, 3298, 3298, 1458, 1458, 893, 893, 893, 3298, 3298, - 3298, 893, 1466, 1466, 1466, 1466, 3298, 3298, 1466, 1466, - 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1678, - 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 668, 668, - 668, 3298, 3298, 3298, 668, 1152, 1152, 1152, 1152, 3298, - 3298, 1152, 1152, 1187, 1187, 1187, 1187, 3298, 3298, 1187, - 1187, 699, 699, 699, 3298, 3298, 3298, 699, 1197, 1197, - 1197, 1197, 3298, 3298, 1197, 1197, 707, 707, 707, 3298, - 3298, 3298, 707, 1213, 1213, 1213, 1213, 3298, 3298, 1213, - 1213, 718, 718, 718, 3298, 3298, 3298, 718, 1220, 1220, - - 1220, 1220, 3298, 3298, 1220, 1220, 724, 724, 724, 3298, - 3298, 3298, 724, 747, 747, 747, 3298, 3298, 3298, 747, - 1251, 1251, 1251, 1251, 3298, 3298, 1251, 1251, 754, 754, - 754, 3298, 3298, 3298, 754, 1260, 1260, 1260, 1260, 3298, - 3298, 1260, 1260, 1268, 1268, 1268, 1268, 3298, 3298, 1268, - 1268, 765, 765, 765, 3298, 3298, 3298, 765, 1274, 1274, - 1274, 1274, 3298, 3298, 1274, 1274, 770, 770, 770, 3298, - 3298, 3298, 770, 1286, 1286, 1286, 1286, 3298, 3298, 1286, - 1286, 1293, 1293, 1293, 1293, 3298, 3298, 1293, 1293, 1304, - 1304, 1304, 1304, 3298, 3298, 1304, 1304, 789, 789, 789, - - 3298, 3298, 3298, 789, 1330, 1330, 1330, 1330, 3298, 3298, - 1330, 1330, 807, 807, 807, 807, 3298, 807, 3298, 807, - 1346, 1346, 1346, 1346, 3298, 3298, 1346, 1346, 817, 817, - 817, 3298, 3298, 3298, 817, 1361, 1361, 1361, 1361, 3298, - 3298, 1361, 1361, 827, 827, 827, 3298, 3298, 3298, 827, - 1369, 1369, 1369, 1369, 3298, 3298, 1369, 1369, 832, 832, - 832, 3298, 3298, 3298, 832, 1378, 1378, 1378, 1378, 3298, - 3298, 1378, 1378, 838, 838, 838, 3298, 3298, 3298, 838, - 1389, 1389, 1389, 1389, 3298, 3298, 1389, 1389, 846, 846, - 846, 3298, 3298, 3298, 846, 1398, 1398, 1398, 1398, 3298, - - 3298, 1398, 1398, 853, 853, 853, 3298, 3298, 3298, 853, - 1410, 1410, 1410, 1410, 3298, 3298, 1410, 1410, 860, 860, - 860, 3298, 3298, 3298, 860, 1418, 1418, 1418, 1418, 3298, - 3298, 1418, 1418, 1426, 1426, 1426, 1426, 3298, 3298, 1426, - 1426, 870, 870, 870, 3298, 3298, 3298, 870, 1436, 1436, - 1436, 1436, 3298, 3298, 1436, 1436, 876, 876, 876, 3298, - 3298, 3298, 876, 1445, 1445, 1445, 1445, 3298, 3298, 1445, - 1445, 885, 885, 885, 885, 3298, 885, 3298, 885, 1451, - 1451, 1451, 1451, 3298, 3298, 1451, 1451, 1458, 1458, 1458, - 1458, 3298, 3298, 1458, 1458, 893, 893, 893, 893, 3298, - - 893, 3298, 893, 1466, 1466, 1466, 1466, 3298, 3298, 1466, - 1466, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, - 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 668, - 668, 668, 3298, 3298, 3298, 668, 1152, 1152, 1152, 1152, - 3298, 3298, 1152, 1152, 1187, 1187, 1187, 1187, 3298, 3298, - 1187, 1187, 699, 699, 699, 3298, 3298, 3298, 699, 1197, - 1197, 1197, 1197, 3298, 3298, 1197, 1197, 707, 707, 707, - 3298, 3298, 3298, 707, 1213, 1213, 1213, 1213, 3298, 3298, - 1213, 1213, 718, 718, 718, 3298, 3298, 3298, 718, 1220, - 1220, 1220, 1220, 3298, 3298, 1220, 1220, 724, 724, 724, - - 3298, 3298, 3298, 724, 747, 747, 747, 3298, 3298, 3298, - 747, 1251, 1251, 1251, 1251, 3298, 3298, 1251, 1251, 754, - 754, 754, 3298, 3298, 3298, 754, 1260, 1260, 1260, 1260, - 3298, 3298, 1260, 1260, 1268, 1268, 1268, 1268, 3298, 3298, - 1268, 1268, 765, 765, 765, 765, 3298, 765, 3298, 765, - 1274, 1274, 1274, 1274, 3298, 3298, 1274, 1274, 770, 770, - 770, 3298, 3298, 3298, 770, 1286, 1286, 1286, 1286, 3298, - 3298, 1286, 1286, 1304, 1304, 1304, 1304, 3298, 3298, 1304, - 1304, 789, 789, 789, 3298, 3298, 3298, 789, 1330, 1330, - 1330, 1330, 3298, 3298, 1330, 1330, 807, 807, 807, 807, - - 3298, 807, 3298, 807, 1346, 1346, 1346, 1346, 3298, 3298, - 1346, 1346, 817, 817, 817, 3298, 3298, 3298, 817, 1361, - 1361, 1361, 1361, 3298, 3298, 1361, 1361, 827, 827, 827, - 3298, 3298, 3298, 827, 1369, 1369, 1369, 1369, 3298, 3298, - 1369, 1369, 832, 832, 832, 3298, 3298, 3298, 832, 1378, - 1378, 1378, 1378, 3298, 3298, 1378, 1378, 838, 838, 838, - 3298, 3298, 3298, 838, 1389, 1389, 1389, 1389, 3298, 3298, - 1389, 1389, 846, 846, 846, 3298, 3298, 3298, 846, 1398, - 1398, 1398, 1398, 3298, 3298, 1398, 1398, 853, 853, 853, - 853, 3298, 853, 3298, 853, 1410, 1410, 1410, 1410, 3298, - - 3298, 1410, 1410, 860, 860, 860, 3298, 3298, 3298, 860, - 1418, 1418, 1418, 1418, 3298, 3298, 1418, 1418, 1426, 1426, - 1426, 1426, 3298, 3298, 1426, 1426, 870, 870, 870, 870, - 3298, 870, 3298, 870, 1436, 1436, 1436, 1436, 3298, 3298, - 1436, 1436, 876, 876, 876, 3298, 3298, 3298, 876, 1445, - 1445, 1445, 1445, 3298, 3298, 1445, 1445, 1451, 1451, 1451, - 1451, 3298, 3298, 1451, 1451, 1458, 1458, 1458, 1458, 3298, - 3298, 1458, 1458, 1466, 1466, 1466, 1466, 3298, 3298, 1466, - 1466, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, - 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 668, - - 668, 668, 668, 3298, 668, 3298, 668, 1152, 1152, 1152, - 1152, 3298, 3298, 1152, 1152, 1187, 1187, 1187, 1187, 3298, - 3298, 1187, 1187, 699, 699, 699, 3298, 3298, 3298, 699, - 1197, 1197, 1197, 1197, 3298, 3298, 1197, 1197, 707, 707, - 707, 3298, 3298, 3298, 707, 1213, 1213, 1213, 1213, 3298, - 3298, 1213, 1213, 718, 718, 718, 718, 3298, 718, 3298, - 718, 1220, 1220, 1220, 1220, 3298, 3298, 1220, 1220, 724, - 724, 724, 724, 3298, 724, 3298, 724, 747, 747, 747, - 747, 3298, 747, 3298, 747, 1251, 1251, 1251, 1251, 3298, - 3298, 1251, 1251, 754, 754, 754, 754, 3298, 754, 3298, - - 754, 1260, 1260, 1260, 1260, 3298, 3298, 1260, 1260, 1268, - 1268, 1268, 1268, 3298, 3298, 1268, 1268, 1274, 1274, 1274, - 1274, 3298, 3298, 1274, 1274, 770, 770, 770, 3298, 3298, - 3298, 770, 1304, 1304, 1304, 1304, 3298, 3298, 1304, 1304, - 789, 789, 789, 3298, 3298, 3298, 789, 1330, 1330, 1330, - 1330, 3298, 3298, 1330, 1330, 807, 807, 807, 807, 3298, - 807, 3298, 807, 1346, 1346, 1346, 1346, 3298, 3298, 1346, - 1346, 817, 817, 817, 3298, 3298, 3298, 817, 827, 827, - 827, 3298, 3298, 3298, 827, 1369, 1369, 1369, 1369, 3298, - 3298, 1369, 1369, 832, 832, 832, 3298, 3298, 3298, 832, - - 1378, 1378, 1378, 1378, 3298, 3298, 1378, 1378, 838, 838, - 838, 3298, 3298, 3298, 838, 846, 846, 846, 3298, 3298, - 3298, 846, 1398, 1398, 1398, 1398, 3298, 3298, 1398, 1398, - 853, 853, 853, 3298, 3298, 3298, 853, 1410, 1410, 1410, - 1410, 3298, 3298, 1410, 1410, 860, 860, 860, 3298, 3298, - 3298, 860, 1418, 1418, 1418, 1418, 3298, 3298, 1418, 1418, - 1426, 1426, 1426, 1426, 3298, 3298, 1426, 1426, 1436, 1436, - 1436, 1436, 3298, 3298, 1436, 1436, 876, 876, 876, 3298, - 3298, 3298, 876, 1445, 1445, 1445, 1445, 3298, 3298, 1445, - 1445, 1451, 1451, 1451, 1451, 3298, 3298, 1451, 1451, 1458, - - 1458, 1458, 1458, 3298, 3298, 1458, 1458, 1137, 1137, 1137, - 1137, 1137, 1137, 1137, 1137, 1137, 1678, 1678, 1678, 1678, - 1678, 1678, 1678, 1678, 1678, 1152, 1152, 1152, 1152, 3298, - 3298, 1152, 1152, 1187, 1187, 1187, 1187, 3298, 3298, 1187, - 1187, 699, 699, 699, 3298, 3298, 3298, 699, 707, 707, - 707, 3298, 3298, 3298, 707, 1213, 1213, 1213, 1213, 3298, - 3298, 1213, 1213, 1220, 1220, 1220, 1220, 3298, 3298, 1220, - 1220, 1251, 1251, 1251, 1251, 3298, 3298, 1251, 1251, 1260, - 1260, 1260, 1260, 3298, 3298, 1260, 1260, 1274, 1274, 1274, - 1274, 3298, 3298, 1274, 1274, 770, 770, 770, 3298, 3298, - - 3298, 770, 1304, 1304, 1304, 1304, 3298, 3298, 1304, 1304, - 789, 789, 789, 3298, 3298, 3298, 789, 1330, 1330, 1330, - 1330, 3298, 3298, 1330, 1330, 1346, 1346, 1346, 1346, 3298, - 3298, 1346, 1346, 817, 817, 817, 3298, 3298, 3298, 817, - 827, 827, 827, 3298, 3298, 3298, 827, 1369, 1369, 1369, - 1369, 3298, 3298, 1369, 1369, 832, 832, 832, 3298, 3298, - 3298, 832, 1378, 1378, 1378, 1378, 3298, 3298, 1378, 1378, - 838, 838, 838, 3298, 3298, 3298, 838, 846, 846, 846, - 3298, 3298, 3298, 846, 853, 853, 853, 3298, 3298, 3298, - 853, 1410, 1410, 1410, 1410, 3298, 3298, 1410, 1410, 860, - - 860, 860, 3298, 3298, 3298, 860, 1418, 1418, 1418, 1418, - 3298, 3298, 1418, 1418, 1426, 1426, 1426, 1426, 3298, 3298, - 1426, 1426, 1436, 1436, 1436, 1436, 3298, 3298, 1436, 1436, - 876, 876, 876, 876, 3298, 876, 3298, 876, 1445, 1445, - 1445, 1445, 3298, 3298, 1445, 1445, 1451, 1451, 1451, 1451, - 3298, 3298, 1451, 1451, 1458, 1458, 1458, 1458, 3298, 3298, - 1458, 1458, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, - 1137, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, - 1152, 1152, 1152, 1152, 3298, 3298, 1152, 1152, 1187, 1187, - 1187, 1187, 3298, 3298, 1187, 1187, 699, 699, 699, 3298, - - 3298, 3298, 699, 707, 707, 707, 707, 3298, 707, 3298, - 707, 1220, 1220, 1220, 1220, 3298, 3298, 1220, 1220, 1251, - 1251, 1251, 1251, 3298, 3298, 1251, 1251, 1260, 1260, 1260, - 1260, 3298, 3298, 1260, 1260, 1274, 1274, 1274, 1274, 3298, - 3298, 1274, 1274, 770, 770, 770, 3298, 3298, 3298, 770, - 1304, 1304, 1304, 1304, 3298, 3298, 1304, 1304, 789, 789, - 789, 3298, 3298, 3298, 789, 1330, 1330, 1330, 1330, 3298, - 3298, 1330, 1330, 1346, 1346, 1346, 1346, 3298, 3298, 1346, - 1346, 817, 817, 817, 3298, 3298, 3298, 817, 827, 827, - 827, 3298, 3298, 3298, 827, 832, 832, 832, 832, 3298, - - 832, 3298, 832, 1378, 1378, 1378, 1378, 3298, 3298, 1378, - 1378, 838, 838, 838, 838, 3298, 838, 3298, 838, 846, - 846, 846, 3298, 3298, 3298, 846, 853, 853, 853, 3298, - 3298, 3298, 853, 1410, 1410, 1410, 1410, 3298, 3298, 1410, - 1410, 860, 860, 860, 860, 3298, 860, 3298, 860, 1418, - 1418, 1418, 1418, 3298, 3298, 1418, 1418, 1426, 1426, 1426, - 1426, 3298, 3298, 1426, 1426, 1436, 1436, 1436, 1436, 3298, - 3298, 1436, 1436, 876, 876, 876, 876, 3298, 876, 3298, - 876, 1445, 1445, 1445, 1445, 3298, 3298, 1445, 1445, 1451, - 1451, 1451, 1451, 3298, 3298, 1451, 1451, 1137, 1137, 1137, - - 1137, 1137, 1137, 1137, 1137, 1137, 1678, 1678, 1678, 1678, - 1678, 1678, 1678, 1678, 1678, 1152, 1152, 1152, 1152, 3298, - 3298, 1152, 1152, 699, 699, 699, 3298, 3298, 3298, 699, - 707, 707, 707, 3298, 3298, 3298, 707, 1220, 1220, 1220, - 1220, 3298, 3298, 1220, 1220, 1251, 1251, 1251, 1251, 3298, - 3298, 1251, 1251, 1274, 1274, 1274, 1274, 3298, 3298, 1274, - 1274, 770, 770, 770, 3298, 3298, 3298, 770, 1304, 1304, - 1304, 1304, 3298, 3298, 1304, 1304, 789, 789, 789, 3298, - 3298, 3298, 789, 2918, 2918, 2918, 2918, 2918, 2918, 2918, - 2918, 2918, 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, - - 2919, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, - 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 3017, - 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3019, 3019, - 3019, 3019, 3019, 3019, 3019, 3019, 3019, 253, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298 + 544, 544, 544, 544, 544, 544, 551, 551, 551, 551, + 551, 551, 551, 551, 551, 556, 556, 556, 556, 556, + 556, 556, 556, 556, 564, 564, 564, 564, 564, 564, + 564, 564, 564, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 577, 577, 577, 577, 577, 577, 577, 577, + 577, 582, 582, 582, 582, 582, 582, 582, 582, 582, + 588, 588, 588, 588, 588, 588, 588, 588, 588, 593, + 593, 593, 593, 593, 593, 593, 593, 593, 600, 600, + + 600, 600, 600, 600, 600, 600, 600, 606, 606, 606, + 606, 606, 606, 606, 606, 606, 613, 613, 613, 613, + 613, 613, 613, 613, 613, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 629, 629, 629, 629, 629, 629, + 629, 629, 629, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 639, 639, 639, 639, 639, 639, 639, 639, + 639, 643, 643, 643, 643, 643, 643, 643, 643, 643, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 655, + 655, 655, 655, 655, 655, 655, 655, 655, 675, 675, + 675, 3285, 3285, 3285, 675, 702, 702, 702, 3285, 3285, + + 3285, 702, 706, 706, 706, 3285, 3285, 3285, 706, 714, + 714, 714, 3285, 3285, 3285, 714, 725, 725, 725, 3285, + 3285, 3285, 725, 731, 731, 731, 3285, 3285, 3285, 731, + 754, 754, 754, 3285, 3285, 3285, 754, 761, 761, 761, + 3285, 3285, 3285, 761, 767, 767, 767, 3285, 3285, 3285, + 767, 772, 772, 772, 3285, 3285, 3285, 772, 777, 777, + 777, 3285, 3285, 3285, 777, 786, 786, 786, 3285, 3285, + 3285, 786, 790, 790, 790, 3285, 3285, 3285, 790, 796, + 796, 796, 3285, 3285, 3285, 796, 814, 814, 814, 3285, + 3285, 3285, 814, 824, 824, 824, 3285, 3285, 3285, 824, + + 834, 834, 834, 3285, 3285, 3285, 834, 839, 839, 839, + 3285, 3285, 3285, 839, 845, 845, 845, 3285, 3285, 3285, + 845, 853, 853, 853, 3285, 3285, 3285, 853, 860, 860, + 860, 3285, 3285, 3285, 860, 867, 867, 867, 3285, 3285, + 3285, 867, 872, 872, 872, 3285, 3285, 3285, 872, 877, + 877, 877, 3285, 3285, 3285, 877, 883, 883, 883, 3285, + 3285, 3285, 883, 892, 892, 892, 3285, 3285, 3285, 892, + 896, 896, 896, 3285, 3285, 3285, 896, 900, 900, 900, + 3285, 3285, 3285, 900, 904, 904, 904, 904, 904, 904, + 904, 3285, 904, 675, 675, 675, 3285, 3285, 3285, 675, + + 919, 3285, 3285, 3285, 919, 702, 702, 702, 3285, 3285, + 3285, 702, 951, 3285, 3285, 3285, 951, 706, 706, 706, + 3285, 3285, 3285, 706, 958, 3285, 3285, 3285, 958, 714, + 714, 714, 3285, 3285, 3285, 714, 970, 3285, 3285, 3285, + 970, 725, 725, 725, 3285, 3285, 3285, 725, 975, 3285, + 3285, 3285, 975, 731, 731, 731, 3285, 3285, 3285, 731, + 980, 3285, 3285, 3285, 980, 754, 754, 754, 3285, 3285, + 3285, 754, 1001, 3285, 3285, 3285, 1001, 761, 761, 761, + 3285, 3285, 3285, 761, 1007, 3285, 3285, 3285, 1007, 767, + 767, 767, 3285, 3285, 3285, 767, 1012, 3285, 3285, 3285, + + 1012, 772, 772, 772, 3285, 3285, 3285, 772, 1016, 3285, + 3285, 3285, 1016, 777, 777, 777, 3285, 3285, 3285, 777, + 1025, 3285, 3285, 3285, 1025, 786, 786, 786, 3285, 3285, + 3285, 786, 1030, 3285, 3285, 3285, 1030, 790, 790, 790, + 3285, 3285, 3285, 790, 1037, 3285, 3285, 3285, 1037, 796, + 796, 796, 3285, 3285, 3285, 796, 1056, 3285, 3285, 3285, + 1056, 814, 814, 814, 3285, 3285, 3285, 814, 1067, 3285, + 3285, 3285, 1067, 824, 824, 824, 3285, 3285, 3285, 824, + 1077, 3285, 3285, 3285, 1077, 834, 834, 834, 3285, 3285, + 3285, 834, 1082, 3285, 3285, 3285, 1082, 839, 839, 839, + + 3285, 3285, 3285, 839, 1088, 3285, 3285, 3285, 1088, 845, + 845, 845, 3285, 3285, 3285, 845, 1096, 3285, 3285, 3285, + 1096, 853, 853, 853, 3285, 3285, 3285, 853, 1101, 3285, + 3285, 3285, 1101, 860, 860, 860, 3285, 3285, 3285, 860, + 1108, 3285, 3285, 3285, 1108, 867, 867, 867, 3285, 3285, + 3285, 867, 1113, 3285, 3285, 3285, 1113, 872, 872, 872, + 3285, 3285, 3285, 872, 1117, 3285, 3285, 3285, 1117, 877, + 877, 877, 3285, 3285, 3285, 877, 1122, 3285, 3285, 3285, + 1122, 883, 883, 883, 3285, 3285, 3285, 883, 1129, 3285, + 3285, 3285, 1129, 892, 892, 892, 3285, 3285, 3285, 892, + + 1133, 3285, 3285, 3285, 1133, 896, 896, 896, 3285, 3285, + 3285, 896, 1137, 3285, 3285, 3285, 1137, 900, 900, 900, + 3285, 3285, 3285, 900, 1142, 3285, 3285, 3285, 1142, 1144, + 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1150, 3285, + 3285, 3285, 3285, 1150, 675, 675, 675, 3285, 3285, 3285, + 675, 1159, 1159, 1159, 1159, 3285, 3285, 1159, 1159, 702, + 702, 702, 3285, 3285, 3285, 702, 1194, 1194, 1194, 1194, + 3285, 3285, 1194, 1194, 706, 706, 706, 3285, 3285, 3285, + 706, 1204, 1204, 1204, 1204, 3285, 3285, 1204, 1204, 714, + 714, 714, 3285, 3285, 3285, 714, 1220, 1220, 1220, 1220, + + 3285, 3285, 1220, 1220, 725, 725, 725, 3285, 3285, 3285, + 725, 1227, 1227, 1227, 1227, 3285, 3285, 1227, 1227, 731, + 731, 731, 3285, 3285, 3285, 731, 1235, 1235, 1235, 1235, + 3285, 3285, 1235, 1235, 754, 754, 754, 3285, 3285, 3285, + 754, 1258, 1258, 1258, 1258, 3285, 3285, 1258, 1258, 761, + 761, 761, 3285, 3285, 3285, 761, 1267, 1267, 1267, 1267, + 3285, 3285, 1267, 1267, 767, 767, 767, 3285, 3285, 3285, + 767, 1275, 1275, 1275, 1275, 3285, 3285, 1275, 1275, 772, + 772, 772, 3285, 3285, 3285, 772, 1281, 1281, 1281, 1281, + 3285, 3285, 1281, 1281, 777, 777, 777, 3285, 3285, 3285, + + 777, 1293, 1293, 1293, 1293, 3285, 3285, 1293, 1293, 786, + 786, 786, 3285, 3285, 3285, 786, 1300, 1300, 1300, 1300, + 3285, 3285, 1300, 1300, 790, 790, 790, 3285, 3285, 3285, + 790, 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311, 796, + 796, 796, 3285, 3285, 3285, 796, 1337, 1337, 1337, 1337, + 3285, 3285, 1337, 1337, 814, 814, 814, 814, 3285, 814, + 3285, 814, 1353, 1353, 1353, 1353, 3285, 3285, 1353, 1353, + 824, 824, 824, 3285, 3285, 3285, 824, 1368, 1368, 1368, + 1368, 3285, 3285, 1368, 1368, 834, 834, 834, 3285, 3285, + 3285, 834, 1376, 1376, 1376, 1376, 3285, 3285, 1376, 1376, + + 839, 839, 839, 3285, 3285, 3285, 839, 1385, 1385, 1385, + 1385, 3285, 3285, 1385, 1385, 845, 845, 845, 3285, 3285, + 3285, 845, 1396, 1396, 1396, 1396, 3285, 3285, 1396, 1396, + 853, 853, 853, 853, 3285, 853, 3285, 853, 1405, 1405, + 1405, 1405, 3285, 3285, 1405, 1405, 860, 860, 860, 860, + 3285, 860, 3285, 860, 1417, 1417, 1417, 1417, 3285, 3285, + 1417, 1417, 867, 867, 867, 3285, 3285, 3285, 867, 1425, + 1425, 1425, 1425, 3285, 3285, 1425, 1425, 872, 872, 872, + 872, 3285, 872, 3285, 872, 1433, 1433, 1433, 1433, 3285, + 3285, 1433, 1433, 877, 877, 877, 877, 3285, 877, 3285, + + 877, 1443, 1443, 1443, 1443, 3285, 3285, 1443, 1443, 883, + 883, 883, 3285, 3285, 3285, 883, 1452, 1452, 1452, 1452, + 3285, 3285, 1452, 1452, 892, 892, 892, 3285, 3285, 3285, + 892, 1458, 1458, 1458, 1458, 3285, 3285, 1458, 1458, 1465, + 1465, 1465, 1465, 3285, 3285, 1465, 1465, 900, 900, 900, + 3285, 3285, 3285, 900, 1473, 1473, 1473, 1473, 3285, 3285, + 1473, 1473, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, + 1144, 1150, 3285, 1150, 3285, 3285, 1150, 675, 675, 675, + 3285, 3285, 3285, 675, 1159, 1159, 1159, 1159, 3285, 3285, + 1159, 1159, 702, 702, 702, 702, 3285, 702, 3285, 702, + + 1194, 1194, 1194, 1194, 3285, 3285, 1194, 1194, 706, 706, + 706, 706, 3285, 706, 3285, 706, 1204, 1204, 1204, 1204, + 3285, 3285, 1204, 1204, 714, 714, 714, 3285, 3285, 3285, + 714, 1220, 1220, 1220, 1220, 3285, 3285, 1220, 1220, 725, + 725, 725, 3285, 3285, 3285, 725, 1227, 1227, 1227, 1227, + 3285, 3285, 1227, 1227, 731, 731, 731, 3285, 3285, 3285, + 731, 1235, 1235, 1235, 1235, 3285, 3285, 1235, 1235, 754, + 754, 754, 3285, 3285, 3285, 754, 1258, 1258, 1258, 1258, + 3285, 3285, 1258, 1258, 761, 761, 761, 3285, 3285, 3285, + 761, 1267, 1267, 1267, 1267, 3285, 3285, 1267, 1267, 767, + + 767, 767, 767, 3285, 767, 3285, 767, 1275, 1275, 1275, + 1275, 3285, 3285, 1275, 1275, 772, 772, 772, 772, 3285, + 772, 3285, 772, 1281, 1281, 1281, 1281, 3285, 3285, 1281, + 1281, 777, 777, 777, 3285, 3285, 3285, 777, 1293, 1293, + 1293, 1293, 3285, 3285, 1293, 1293, 786, 786, 786, 786, + 3285, 786, 3285, 786, 1300, 1300, 1300, 1300, 3285, 3285, + 1300, 1300, 790, 790, 790, 790, 3285, 790, 3285, 790, + 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311, 796, 796, + 796, 3285, 3285, 3285, 796, 1337, 1337, 1337, 1337, 3285, + 3285, 1337, 1337, 814, 814, 814, 3285, 3285, 3285, 814, + + 1353, 1353, 1353, 1353, 3285, 3285, 1353, 1353, 824, 824, + 824, 3285, 3285, 3285, 824, 1368, 1368, 1368, 1368, 3285, + 3285, 1368, 1368, 834, 834, 834, 3285, 3285, 3285, 834, + 1376, 1376, 1376, 1376, 3285, 3285, 1376, 1376, 839, 839, + 839, 3285, 3285, 3285, 839, 1385, 1385, 1385, 1385, 3285, + 3285, 1385, 1385, 845, 845, 845, 3285, 3285, 3285, 845, + 1396, 1396, 1396, 1396, 3285, 3285, 1396, 1396, 853, 853, + 853, 3285, 3285, 3285, 853, 1405, 1405, 1405, 1405, 3285, + 3285, 1405, 1405, 860, 860, 860, 3285, 3285, 3285, 860, + 1417, 1417, 1417, 1417, 3285, 3285, 1417, 1417, 867, 867, + + 867, 3285, 3285, 3285, 867, 1425, 1425, 1425, 1425, 3285, + 3285, 1425, 1425, 1433, 1433, 1433, 1433, 3285, 3285, 1433, + 1433, 877, 877, 877, 3285, 3285, 3285, 877, 1443, 1443, + 1443, 1443, 3285, 3285, 1443, 1443, 883, 883, 883, 3285, + 3285, 3285, 883, 1452, 1452, 1452, 1452, 3285, 3285, 1452, + 1452, 892, 892, 892, 3285, 3285, 3285, 892, 1458, 1458, + 1458, 1458, 3285, 3285, 1458, 1458, 1465, 1465, 1465, 1465, + 3285, 3285, 1465, 1465, 900, 900, 900, 3285, 3285, 3285, + 900, 1473, 1473, 1473, 1473, 3285, 3285, 1473, 1473, 1144, + 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1685, 1685, + + 1685, 1685, 1685, 1685, 1685, 1685, 1685, 675, 675, 675, + 3285, 3285, 3285, 675, 1159, 1159, 1159, 1159, 3285, 3285, + 1159, 1159, 1194, 1194, 1194, 1194, 3285, 3285, 1194, 1194, + 706, 706, 706, 3285, 3285, 3285, 706, 1204, 1204, 1204, + 1204, 3285, 3285, 1204, 1204, 714, 714, 714, 3285, 3285, + 3285, 714, 1220, 1220, 1220, 1220, 3285, 3285, 1220, 1220, + 725, 725, 725, 3285, 3285, 3285, 725, 1227, 1227, 1227, + 1227, 3285, 3285, 1227, 1227, 731, 731, 731, 3285, 3285, + 3285, 731, 754, 754, 754, 3285, 3285, 3285, 754, 1258, + 1258, 1258, 1258, 3285, 3285, 1258, 1258, 761, 761, 761, + + 3285, 3285, 3285, 761, 1267, 1267, 1267, 1267, 3285, 3285, + 1267, 1267, 1275, 1275, 1275, 1275, 3285, 3285, 1275, 1275, + 772, 772, 772, 3285, 3285, 3285, 772, 1281, 1281, 1281, + 1281, 3285, 3285, 1281, 1281, 777, 777, 777, 3285, 3285, + 3285, 777, 1293, 1293, 1293, 1293, 3285, 3285, 1293, 1293, + 1300, 1300, 1300, 1300, 3285, 3285, 1300, 1300, 1311, 1311, + 1311, 1311, 3285, 3285, 1311, 1311, 796, 796, 796, 3285, + 3285, 3285, 796, 1337, 1337, 1337, 1337, 3285, 3285, 1337, + 1337, 814, 814, 814, 814, 3285, 814, 3285, 814, 1353, + 1353, 1353, 1353, 3285, 3285, 1353, 1353, 824, 824, 824, + + 3285, 3285, 3285, 824, 1368, 1368, 1368, 1368, 3285, 3285, + 1368, 1368, 834, 834, 834, 3285, 3285, 3285, 834, 1376, + 1376, 1376, 1376, 3285, 3285, 1376, 1376, 839, 839, 839, + 3285, 3285, 3285, 839, 1385, 1385, 1385, 1385, 3285, 3285, + 1385, 1385, 845, 845, 845, 3285, 3285, 3285, 845, 1396, + 1396, 1396, 1396, 3285, 3285, 1396, 1396, 853, 853, 853, + 3285, 3285, 3285, 853, 1405, 1405, 1405, 1405, 3285, 3285, + 1405, 1405, 860, 860, 860, 3285, 3285, 3285, 860, 1417, + 1417, 1417, 1417, 3285, 3285, 1417, 1417, 867, 867, 867, + 3285, 3285, 3285, 867, 1425, 1425, 1425, 1425, 3285, 3285, + + 1425, 1425, 1433, 1433, 1433, 1433, 3285, 3285, 1433, 1433, + 877, 877, 877, 3285, 3285, 3285, 877, 1443, 1443, 1443, + 1443, 3285, 3285, 1443, 1443, 883, 883, 883, 3285, 3285, + 3285, 883, 1452, 1452, 1452, 1452, 3285, 3285, 1452, 1452, + 892, 892, 892, 892, 3285, 892, 3285, 892, 1458, 1458, + 1458, 1458, 3285, 3285, 1458, 1458, 1465, 1465, 1465, 1465, + 3285, 3285, 1465, 1465, 900, 900, 900, 900, 3285, 900, + 3285, 900, 1473, 1473, 1473, 1473, 3285, 3285, 1473, 1473, + 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1685, + 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 675, 675, + + 675, 3285, 3285, 3285, 675, 1159, 1159, 1159, 1159, 3285, + 3285, 1159, 1159, 1194, 1194, 1194, 1194, 3285, 3285, 1194, + 1194, 706, 706, 706, 3285, 3285, 3285, 706, 1204, 1204, + 1204, 1204, 3285, 3285, 1204, 1204, 714, 714, 714, 3285, + 3285, 3285, 714, 1220, 1220, 1220, 1220, 3285, 3285, 1220, + 1220, 725, 725, 725, 3285, 3285, 3285, 725, 1227, 1227, + 1227, 1227, 3285, 3285, 1227, 1227, 731, 731, 731, 3285, + 3285, 3285, 731, 754, 754, 754, 3285, 3285, 3285, 754, + 1258, 1258, 1258, 1258, 3285, 3285, 1258, 1258, 761, 761, + 761, 3285, 3285, 3285, 761, 1267, 1267, 1267, 1267, 3285, + + 3285, 1267, 1267, 1275, 1275, 1275, 1275, 3285, 3285, 1275, + 1275, 772, 772, 772, 772, 3285, 772, 3285, 772, 1281, + 1281, 1281, 1281, 3285, 3285, 1281, 1281, 777, 777, 777, + 3285, 3285, 3285, 777, 1293, 1293, 1293, 1293, 3285, 3285, + 1293, 1293, 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311, + 796, 796, 796, 3285, 3285, 3285, 796, 1337, 1337, 1337, + 1337, 3285, 3285, 1337, 1337, 814, 814, 814, 814, 3285, + 814, 3285, 814, 1353, 1353, 1353, 1353, 3285, 3285, 1353, + 1353, 824, 824, 824, 3285, 3285, 3285, 824, 1368, 1368, + 1368, 1368, 3285, 3285, 1368, 1368, 834, 834, 834, 3285, + + 3285, 3285, 834, 1376, 1376, 1376, 1376, 3285, 3285, 1376, + 1376, 839, 839, 839, 3285, 3285, 3285, 839, 1385, 1385, + 1385, 1385, 3285, 3285, 1385, 1385, 845, 845, 845, 3285, + 3285, 3285, 845, 1396, 1396, 1396, 1396, 3285, 3285, 1396, + 1396, 853, 853, 853, 3285, 3285, 3285, 853, 1405, 1405, + 1405, 1405, 3285, 3285, 1405, 1405, 860, 860, 860, 860, + 3285, 860, 3285, 860, 1417, 1417, 1417, 1417, 3285, 3285, + 1417, 1417, 867, 867, 867, 3285, 3285, 3285, 867, 1425, + 1425, 1425, 1425, 3285, 3285, 1425, 1425, 1433, 1433, 1433, + 1433, 3285, 3285, 1433, 1433, 877, 877, 877, 877, 3285, + + 877, 3285, 877, 1443, 1443, 1443, 1443, 3285, 3285, 1443, + 1443, 883, 883, 883, 3285, 3285, 3285, 883, 1452, 1452, + 1452, 1452, 3285, 3285, 1452, 1452, 1458, 1458, 1458, 1458, + 3285, 3285, 1458, 1458, 1465, 1465, 1465, 1465, 3285, 3285, + 1465, 1465, 1473, 1473, 1473, 1473, 3285, 3285, 1473, 1473, + 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1685, + 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 675, 675, + 675, 675, 3285, 675, 3285, 675, 1159, 1159, 1159, 1159, + 3285, 3285, 1159, 1159, 1194, 1194, 1194, 1194, 3285, 3285, + 1194, 1194, 706, 706, 706, 3285, 3285, 3285, 706, 1204, + + 1204, 1204, 1204, 3285, 3285, 1204, 1204, 714, 714, 714, + 3285, 3285, 3285, 714, 1220, 1220, 1220, 1220, 3285, 3285, + 1220, 1220, 725, 725, 725, 725, 3285, 725, 3285, 725, + 1227, 1227, 1227, 1227, 3285, 3285, 1227, 1227, 731, 731, + 731, 731, 3285, 731, 3285, 731, 754, 754, 754, 754, + 3285, 754, 3285, 754, 1258, 1258, 1258, 1258, 3285, 3285, + 1258, 1258, 761, 761, 761, 761, 3285, 761, 3285, 761, + 1267, 1267, 1267, 1267, 3285, 3285, 1267, 1267, 1275, 1275, + 1275, 1275, 3285, 3285, 1275, 1275, 1281, 1281, 1281, 1281, + 3285, 3285, 1281, 1281, 777, 777, 777, 3285, 3285, 3285, + + 777, 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311, 796, + 796, 796, 3285, 3285, 3285, 796, 1337, 1337, 1337, 1337, + 3285, 3285, 1337, 1337, 814, 814, 814, 814, 3285, 814, + 3285, 814, 1353, 1353, 1353, 1353, 3285, 3285, 1353, 1353, + 824, 824, 824, 3285, 3285, 3285, 824, 834, 834, 834, + 3285, 3285, 3285, 834, 1376, 1376, 1376, 1376, 3285, 3285, + 1376, 1376, 839, 839, 839, 3285, 3285, 3285, 839, 1385, + 1385, 1385, 1385, 3285, 3285, 1385, 1385, 845, 845, 845, + 3285, 3285, 3285, 845, 853, 853, 853, 3285, 3285, 3285, + 853, 1405, 1405, 1405, 1405, 3285, 3285, 1405, 1405, 860, + + 860, 860, 3285, 3285, 3285, 860, 1417, 1417, 1417, 1417, + 3285, 3285, 1417, 1417, 867, 867, 867, 3285, 3285, 3285, + 867, 1425, 1425, 1425, 1425, 3285, 3285, 1425, 1425, 1433, + 1433, 1433, 1433, 3285, 3285, 1433, 1433, 1443, 1443, 1443, + 1443, 3285, 3285, 1443, 1443, 883, 883, 883, 3285, 3285, + 3285, 883, 1452, 1452, 1452, 1452, 3285, 3285, 1452, 1452, + 1458, 1458, 1458, 1458, 3285, 3285, 1458, 1458, 1465, 1465, + 1465, 1465, 3285, 3285, 1465, 1465, 1144, 1144, 1144, 1144, + 1144, 1144, 1144, 1144, 1144, 1685, 1685, 1685, 1685, 1685, + 1685, 1685, 1685, 1685, 1159, 1159, 1159, 1159, 3285, 3285, + + 1159, 1159, 1194, 1194, 1194, 1194, 3285, 3285, 1194, 1194, + 706, 706, 706, 3285, 3285, 3285, 706, 714, 714, 714, + 3285, 3285, 3285, 714, 1220, 1220, 1220, 1220, 3285, 3285, + 1220, 1220, 1227, 1227, 1227, 1227, 3285, 3285, 1227, 1227, + 1258, 1258, 1258, 1258, 3285, 3285, 1258, 1258, 1267, 1267, + 1267, 1267, 3285, 3285, 1267, 1267, 1281, 1281, 1281, 1281, + 3285, 3285, 1281, 1281, 777, 777, 777, 3285, 3285, 3285, + 777, 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311, 796, + 796, 796, 3285, 3285, 3285, 796, 1337, 1337, 1337, 1337, + 3285, 3285, 1337, 1337, 1353, 1353, 1353, 1353, 3285, 3285, + + 1353, 1353, 824, 824, 824, 3285, 3285, 3285, 824, 834, + 834, 834, 3285, 3285, 3285, 834, 1376, 1376, 1376, 1376, + 3285, 3285, 1376, 1376, 839, 839, 839, 3285, 3285, 3285, + 839, 1385, 1385, 1385, 1385, 3285, 3285, 1385, 1385, 845, + 845, 845, 3285, 3285, 3285, 845, 853, 853, 853, 3285, + 3285, 3285, 853, 860, 860, 860, 3285, 3285, 3285, 860, + 1417, 1417, 1417, 1417, 3285, 3285, 1417, 1417, 867, 867, + 867, 3285, 3285, 3285, 867, 1425, 1425, 1425, 1425, 3285, + 3285, 1425, 1425, 1433, 1433, 1433, 1433, 3285, 3285, 1433, + 1433, 1443, 1443, 1443, 1443, 3285, 3285, 1443, 1443, 883, + + 883, 883, 883, 3285, 883, 3285, 883, 1452, 1452, 1452, + 1452, 3285, 3285, 1452, 1452, 1458, 1458, 1458, 1458, 3285, + 3285, 1458, 1458, 1465, 1465, 1465, 1465, 3285, 3285, 1465, + 1465, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, + 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1159, + 1159, 1159, 1159, 3285, 3285, 1159, 1159, 1194, 1194, 1194, + 1194, 3285, 3285, 1194, 1194, 706, 706, 706, 3285, 3285, + 3285, 706, 714, 714, 714, 714, 3285, 714, 3285, 714, + 1227, 1227, 1227, 1227, 3285, 3285, 1227, 1227, 1258, 1258, + 1258, 1258, 3285, 3285, 1258, 1258, 1267, 1267, 1267, 1267, + + 3285, 3285, 1267, 1267, 1281, 1281, 1281, 1281, 3285, 3285, + 1281, 1281, 777, 777, 777, 3285, 3285, 3285, 777, 1311, + 1311, 1311, 1311, 3285, 3285, 1311, 1311, 796, 796, 796, + 3285, 3285, 3285, 796, 1337, 1337, 1337, 1337, 3285, 3285, + 1337, 1337, 1353, 1353, 1353, 1353, 3285, 3285, 1353, 1353, + 824, 824, 824, 3285, 3285, 3285, 824, 834, 834, 834, + 3285, 3285, 3285, 834, 839, 839, 839, 839, 3285, 839, + 3285, 839, 1385, 1385, 1385, 1385, 3285, 3285, 1385, 1385, + 845, 845, 845, 845, 3285, 845, 3285, 845, 853, 853, + 853, 3285, 3285, 3285, 853, 860, 860, 860, 3285, 3285, + + 3285, 860, 1417, 1417, 1417, 1417, 3285, 3285, 1417, 1417, + 867, 867, 867, 867, 3285, 867, 3285, 867, 1425, 1425, + 1425, 1425, 3285, 3285, 1425, 1425, 1433, 1433, 1433, 1433, + 3285, 3285, 1433, 1433, 1443, 1443, 1443, 1443, 3285, 3285, + 1443, 1443, 883, 883, 883, 883, 3285, 883, 3285, 883, + 1452, 1452, 1452, 1452, 3285, 3285, 1452, 1452, 1458, 1458, + 1458, 1458, 3285, 3285, 1458, 1458, 1144, 1144, 1144, 1144, + 1144, 1144, 1144, 1144, 1144, 1685, 1685, 1685, 1685, 1685, + 1685, 1685, 1685, 1685, 1159, 1159, 1159, 1159, 3285, 3285, + 1159, 1159, 706, 706, 706, 3285, 3285, 3285, 706, 714, + + 714, 714, 3285, 3285, 3285, 714, 1227, 1227, 1227, 1227, + 3285, 3285, 1227, 1227, 1258, 1258, 1258, 1258, 3285, 3285, + 1258, 1258, 1281, 1281, 1281, 1281, 3285, 3285, 1281, 1281, + 777, 777, 777, 3285, 3285, 3285, 777, 1311, 1311, 1311, + 1311, 3285, 3285, 1311, 1311, 796, 796, 796, 3285, 3285, + 3285, 796, 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913, + 2913, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, + 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2972, + 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972, 3008, 3008, + 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3010, 3010, 3010, + + 3010, 3010, 3010, 3010, 3010, 3010, 259, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285 } ; -static yyconst flex_int16_t yy_chk[12113] = +static yyconst flex_int16_t yy_chk[12182] = { 0, 0, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 11, 3, 9, 12, 4, 10, 0, 5, 0, 9, 6, 0, 10, 7, - 8, 8, 8, 258, 11, 13, 13, 12, 14, 14, - 13, 13, 307, 14, 14, 259, 8, 17, 17, 258, - 13, 15, 15, 14, 15, 262, 15, 16, 16, 361, - 16, 259, 16, 18, 18, 1524, 15, 19, 19, 19, - 536, 262, 16, 20, 20, 20, 23, 23, 23, 24, - 24, 24, 536, 19, 25, 25, 25, 361, 1527, 20, - 368, 17, 23, 1063, 307, 24, 256, 256, 256, 1063, - - 25, 257, 257, 257, 261, 261, 261, 18, 21, 21, + 8, 8, 8, 264, 11, 13, 13, 12, 14, 14, + 13, 13, 313, 14, 14, 265, 8, 17, 17, 264, + 13, 15, 15, 14, 15, 268, 15, 16, 16, 367, + 16, 265, 16, 18, 18, 1531, 15, 19, 19, 19, + 543, 268, 16, 20, 20, 20, 23, 23, 23, 24, + 24, 24, 543, 19, 25, 25, 25, 367, 1534, 20, + 374, 17, 23, 1070, 313, 24, 262, 262, 262, 1070, + + 25, 263, 263, 263, 267, 267, 267, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 291, 21, 21, 21, 21, 21, 26, - 26, 26, 27, 27, 27, 28, 28, 28, 291, 29, - 29, 29, 30, 30, 30, 26, 368, 467, 27, 285, - 467, 28, 673, 21, 21, 29, 301, 280, 30, 31, - 31, 31, 282, 282, 282, 285, 289, 289, 289, 298, - 298, 298, 301, 280, 357, 31, 673, 21, 22, 22, + 21, 21, 21, 297, 21, 21, 21, 21, 21, 26, + 26, 26, 27, 27, 27, 28, 28, 28, 297, 29, + 29, 29, 30, 30, 30, 26, 374, 473, 27, 291, + 473, 28, 680, 21, 21, 29, 307, 286, 30, 31, + 31, 31, 288, 288, 288, 291, 295, 295, 295, 304, + 304, 304, 307, 286, 363, 31, 680, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 1529, 22, 22, 22, 22, 22, 32, + 22, 22, 22, 1536, 22, 22, 22, 22, 22, 32, - 32, 32, 33, 33, 33, 34, 34, 34, 272, 35, - 35, 35, 36, 36, 36, 32, 280, 360, 33, 482, - 729, 34, 482, 22, 22, 35, 357, 360, 36, 37, + 32, 32, 33, 33, 33, 34, 34, 34, 278, 35, + 35, 35, 36, 36, 36, 32, 286, 366, 33, 489, + 736, 34, 489, 22, 22, 35, 363, 366, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, - 40, 41, 41, 41, 729, 37, 548, 22, 38, 312, - 272, 39, 463, 548, 40, 360, 272, 41, 42, 42, - 42, 272, 305, 305, 305, 312, 272, 309, 309, 309, - 320, 320, 320, 463, 42, 43, 43, 43, 43, 43, + 40, 41, 41, 41, 736, 37, 555, 22, 38, 318, + 278, 39, 469, 555, 40, 366, 278, 41, 42, 42, + 42, 278, 311, 311, 311, 318, 278, 315, 315, 315, + 326, 326, 326, 469, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 329, 43, 43, 43, 43, 43, 45, 45, 45, 46, + 335, 43, 43, 43, 43, 43, 45, 45, 45, 46, - 46, 46, 47, 47, 47, 329, 48, 48, 48, 49, - 49, 49, 45, 661, 553, 46, 661, 1534, 47, 327, - 43, 43, 48, 327, 381, 49, 293, 327, 43, 44, + 46, 46, 47, 47, 47, 335, 48, 48, 48, 49, + 49, 49, 45, 668, 560, 46, 668, 1541, 47, 333, + 43, 43, 48, 333, 387, 49, 299, 333, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 323, 44, 44, 44, 44, 44, - 50, 50, 50, 51, 51, 51, 52, 52, 52, 468, - 323, 566, 55, 55, 562, 293, 50, 55, 294, 51, - 553, 562, 52, 468, 44, 44, 381, 55, 293, 382, - 293, 1537, 44, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 1538, 53, - - 53, 53, 53, 53, 1539, 337, 55, 294, 59, 59, - 59, 60, 60, 60, 63, 63, 63, 566, 56, 56, - 294, 337, 294, 56, 59, 317, 466, 60, 53, 53, - 63, 382, 317, 56, 466, 772, 53, 394, 772, 53, - 466, 317, 331, 331, 331, 1544, 53, 54, 54, 54, + 44, 44, 44, 44, 329, 44, 44, 44, 44, 44, + 50, 50, 50, 51, 51, 51, 52, 52, 52, 474, + 329, 573, 55, 55, 569, 299, 50, 55, 300, 51, + 560, 569, 52, 474, 44, 44, 387, 55, 299, 388, + 299, 1544, 44, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 1545, 53, + + 53, 53, 53, 53, 1546, 343, 55, 300, 59, 59, + 59, 60, 60, 60, 63, 63, 63, 573, 56, 56, + 300, 343, 300, 56, 59, 323, 472, 60, 53, 53, + 63, 388, 323, 56, 472, 779, 53, 400, 779, 53, + 472, 323, 337, 337, 337, 1551, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 56, 54, 54, 54, 54, 54, 64, 64, - 64, 67, 67, 67, 68, 68, 68, 1545, 69, 69, - 69, 70, 70, 70, 64, 349, 367, 67, 332, 394, - 68, 552, 54, 54, 69, 332, 1171, 70, 1546, 552, + 64, 67, 67, 67, 68, 68, 68, 1552, 69, 69, + 69, 70, 70, 70, 64, 355, 373, 67, 338, 400, + 68, 559, 54, 54, 69, 338, 1178, 70, 1553, 559, - 54, 349, 367, 54, 332, 334, 334, 334, 395, 1171, + 54, 355, 373, 54, 338, 340, 340, 340, 401, 1178, 54, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 1547, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 1554, 57, 57, 57, 57, 57, 71, 71, 71, 72, 72, 72, 73, 73, - 73, 433, 74, 74, 74, 75, 75, 75, 71, 1548, - 373, 72, 344, 387, 73, 1549, 57, 57, 74, 344, - 395, 75, 343, 343, 343, 57, 373, 57, 344, 387, - 431, 57, 346, 346, 346, 539, 57, 57, 58, 58, + 73, 439, 74, 74, 74, 75, 75, 75, 71, 1555, + 379, 72, 350, 393, 73, 1556, 57, 57, 74, 350, + 401, 75, 349, 349, 349, 57, 379, 57, 350, 393, + 437, 57, 352, 352, 352, 478, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 433, 58, 58, 58, 58, 58, 76, + 58, 58, 58, 439, 58, 58, 58, 58, 58, 76, - 76, 76, 77, 77, 77, 78, 78, 78, 617, 79, - 79, 79, 80, 80, 80, 76, 359, 1550, 77, 431, - 617, 78, 431, 58, 58, 79, 359, 539, 80, 354, - 354, 354, 58, 359, 58, 370, 370, 370, 58, 380, - 380, 380, 1555, 58, 58, 61, 61, 61, 61, 61, + 76, 76, 77, 77, 77, 78, 78, 78, 624, 79, + 79, 79, 80, 80, 80, 76, 365, 1557, 77, 437, + 624, 78, 437, 58, 58, 79, 365, 478, 80, 360, + 360, 360, 58, 365, 58, 376, 376, 376, 58, 386, + 386, 386, 1562, 58, 58, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, - 365, 61, 61, 61, 61, 61, 81, 81, 81, 82, - 82, 82, 83, 83, 83, 703, 84, 84, 84, 85, - 85, 85, 81, 1556, 1563, 82, 652, 589, 83, 365, - 61, 61, 84, 365, 365, 85, 602, 61, 384, 384, - - 384, 652, 365, 61, 365, 393, 393, 393, 397, 397, - 397, 703, 61, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 1565, 62, + 371, 61, 61, 61, 61, 61, 81, 81, 81, 82, + 82, 82, 83, 83, 83, 710, 84, 84, 84, 85, + 85, 85, 81, 1563, 1570, 82, 659, 596, 83, 371, + 61, 61, 84, 371, 371, 85, 609, 61, 390, 390, + + 390, 659, 371, 61, 371, 399, 399, 399, 403, 403, + 403, 710, 61, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 1572, 62, 62, 62, 62, 62, 86, 86, 86, 87, 87, 87, - 88, 88, 88, 589, 89, 89, 89, 90, 90, 90, - 86, 400, 602, 87, 1566, 738, 88, 406, 62, 62, - 89, 411, 422, 90, 406, 62, 1572, 400, 405, 405, - 405, 62, 739, 406, 408, 408, 408, 411, 422, 738, + 88, 88, 88, 596, 89, 89, 89, 90, 90, 90, + 86, 406, 609, 87, 1573, 745, 88, 412, 62, 62, + 89, 417, 428, 90, 412, 62, 1579, 406, 411, 411, + 411, 62, 746, 412, 414, 414, 414, 417, 428, 745, 62, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 739, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 746, 65, 65, 65, 65, 65, 91, 91, 91, 92, 92, 92, 93, 93, - 93, 1573, 94, 94, 94, 95, 95, 95, 91, 438, - 1580, 92, 417, 1582, 93, 540, 65, 65, 94, 417, - 1583, 95, 416, 416, 416, 438, 432, 65, 417, 419, - 419, 419, 430, 430, 430, 1589, 65, 66, 66, 66, + 93, 1580, 94, 94, 94, 95, 95, 95, 91, 444, + 1587, 92, 423, 1589, 93, 479, 65, 65, 94, 423, + 1590, 95, 422, 422, 422, 444, 438, 65, 423, 425, + 425, 425, 436, 436, 436, 1596, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 740, 66, 66, 66, 66, 66, 96, 96, - 96, 97, 97, 97, 98, 98, 98, 540, 99, 99, - 99, 100, 100, 100, 96, 432, 740, 97, 432, 741, - 98, 1590, 66, 66, 99, 443, 1592, 100, 101, 101, + 66, 66, 747, 66, 66, 66, 66, 66, 96, 96, + 96, 97, 97, 97, 98, 98, 98, 479, 99, 99, + 99, 100, 100, 100, 96, 438, 747, 97, 438, 748, + 98, 1597, 66, 66, 99, 449, 1599, 100, 101, 101, - 101, 1593, 443, 66, 102, 102, 102, 435, 435, 435, - 618, 443, 66, 741, 101, 442, 442, 442, 366, 1594, + 101, 1600, 449, 66, 102, 102, 102, 441, 441, 441, + 546, 449, 66, 748, 101, 448, 448, 448, 372, 1601, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 745, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 752, 103, 103, 103, 103, 103, 105, 105, 105, 106, 106, 106, 107, 107, - 107, 679, 108, 108, 108, 679, 366, 448, 105, 777, - 745, 106, 618, 777, 107, 363, 103, 103, 108, 455, - 460, 103, 366, 448, 638, 363, 455, 103, 445, 445, - 445, 103, 454, 454, 454, 455, 460, 103, 104, 104, + 107, 686, 108, 108, 108, 686, 372, 454, 105, 784, + 752, 106, 546, 784, 107, 369, 103, 103, 108, 461, + 466, 103, 372, 454, 547, 369, 461, 103, 451, 451, + 451, 103, 460, 460, 460, 461, 466, 103, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 363, 104, 104, 104, 104, 104, 109, - 109, 109, 110, 110, 110, 111, 111, 111, 639, 112, - 112, 112, 457, 457, 457, 109, 638, 469, 110, 472, - 477, 111, 1469, 104, 104, 112, 472, 492, 104, 469, - 469, 471, 471, 471, 104, 472, 477, 1595, 104, 474, - 474, 474, 1469, 492, 104, 113, 113, 113, 113, 113, + 104, 104, 104, 369, 104, 104, 104, 104, 104, 109, + 109, 109, 110, 110, 110, 111, 111, 111, 625, 112, + 112, 112, 463, 463, 463, 109, 547, 475, 110, 1602, + 1603, 111, 1604, 104, 104, 112, 484, 499, 104, 475, + 475, 477, 477, 477, 104, 481, 481, 481, 104, 493, + 493, 493, 484, 499, 104, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 639, 113, 113, 113, 113, 113, 115, 115, 115, 116, - 116, 116, 117, 117, 117, 681, 118, 118, 118, 486, - 486, 486, 115, 508, 519, 116, 487, 1596, 117, 681, - - 113, 113, 118, 487, 1597, 113, 489, 489, 489, 508, - 519, 113, 487, 502, 502, 502, 505, 505, 505, 513, - 513, 513, 113, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, 1607, 114, + 625, 113, 113, 113, 113, 113, 115, 115, 115, 116, + 116, 116, 117, 117, 117, 681, 118, 118, 118, 1147, + 494, 1614, 115, 1147, 1616, 116, 681, 494, 117, 681, + + 113, 113, 118, 510, 515, 113, 494, 496, 496, 496, + 510, 113, 509, 509, 509, 512, 512, 512, 1476, 510, + 515, 1617, 113, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 1476, 114, 114, 114, 114, 114, 119, 119, 119, 120, 120, 120, - 121, 121, 121, 685, 122, 122, 122, 1140, 503, 1183, - 119, 1140, 531, 120, 514, 503, 121, 685, 114, 114, - 122, 514, 1183, 114, 503, 516, 516, 516, 531, 114, - 514, 525, 525, 525, 528, 528, 528, 538, 538, 538, + 121, 121, 121, 688, 122, 122, 122, 520, 520, 520, + 119, 526, 538, 120, 521, 1622, 121, 688, 114, 114, + 122, 521, 1624, 114, 523, 523, 523, 526, 538, 114, + 521, 532, 532, 532, 535, 535, 535, 545, 545, 545, 114, 123, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 123, 1609, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 1626, 123, 123, 123, 123, 123, 125, 125, 125, 126, 126, 126, 129, 129, - 129, 1610, 130, 130, 130, 133, 133, 133, 125, 545, - 558, 126, 526, 1615, 129, 565, 123, 123, 130, 526, - 1617, 133, 542, 542, 542, 545, 558, 123, 526, 550, - 550, 550, 123, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 1619, 124, + 129, 1627, 130, 130, 130, 133, 133, 133, 125, 552, + 565, 126, 533, 1629, 129, 572, 123, 123, 130, 533, + 645, 133, 549, 549, 549, 552, 565, 123, 533, 557, + 557, 557, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 1630, 124, 124, 124, 124, 124, 134, 134, 134, 135, 135, 135, - 136, 136, 136, 565, 137, 137, 137, 138, 138, 138, - 134, 565, 1620, 135, 1622, 1623, 136, 571, 124, 124, + 136, 136, 136, 572, 137, 137, 137, 138, 138, 138, + 134, 572, 645, 135, 1631, 1640, 136, 578, 124, 124, - 137, 1624, 1633, 138, 1639, 551, 555, 555, 555, 124, - 564, 564, 564, 571, 124, 127, 127, 127, 127, 127, + 137, 1646, 646, 138, 1647, 558, 562, 562, 562, 124, + 571, 571, 571, 578, 124, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 1640, 127, 127, 127, 127, 127, 139, 139, 139, 140, - 140, 140, 143, 143, 143, 734, 144, 144, 144, 147, - 147, 147, 139, 551, 1644, 140, 577, 551, 143, 734, - 127, 127, 144, 577, 582, 147, 568, 568, 568, 576, - 576, 576, 577, 579, 579, 579, 127, 587, 587, 587, - 582, 1646, 127, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 1658, 128, + 1651, 127, 127, 127, 127, 127, 139, 139, 139, 140, + 140, 140, 143, 143, 143, 692, 144, 144, 144, 147, + 147, 147, 139, 558, 646, 140, 584, 558, 143, 692, + 127, 127, 144, 584, 589, 147, 575, 575, 575, 583, + 583, 583, 584, 586, 586, 586, 127, 594, 594, 594, + 589, 1653, 127, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 1665, 128, 128, 128, 128, 128, 148, 148, 148, 151, 151, 151, - 152, 152, 152, 1659, 155, 155, 155, 156, 156, 156, - 148, 1664, 594, 151, 1667, 1668, 152, 607, 128, 128, - 155, 674, 623, 156, 591, 591, 591, 588, 594, 600, - 600, 600, 674, 607, 128, 674, 1669, 601, 623, 1671, + 152, 152, 152, 1666, 153, 153, 153, 154, 154, 154, + 148, 1671, 601, 151, 1674, 1675, 152, 614, 128, 128, + 153, 691, 630, 154, 598, 598, 598, 595, 601, 607, + 607, 607, 691, 614, 128, 691, 1676, 608, 630, 1678, 128, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 1678, 131, 131, 131, - 131, 131, 159, 159, 159, 160, 160, 160, 163, 163, - 163, 1681, 164, 164, 164, 588, 633, 1684, 159, 1685, - 1687, 160, 1688, 588, 163, 601, 131, 131, 164, 131, + 131, 131, 131, 131, 131, 131, 1685, 131, 131, 131, + 131, 131, 155, 155, 155, 156, 156, 156, 157, 157, + 157, 1688, 158, 158, 158, 595, 640, 1691, 155, 1692, + 1694, 156, 1695, 595, 157, 608, 131, 131, 158, 131, - 644, 131, 633, 601, 604, 604, 604, 131, 615, 615, - 615, 620, 620, 620, 131, 616, 644, 131, 132, 132, + 651, 131, 640, 608, 611, 611, 611, 131, 622, 622, + 622, 627, 627, 627, 131, 623, 651, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 1689, 132, 132, 132, 132, 132, 167, - 167, 167, 168, 168, 168, 171, 171, 171, 684, 172, - 172, 172, 616, 1690, 1691, 167, 899, 1677, 168, 684, - 1237, 171, 684, 132, 132, 172, 132, 616, 132, 627, - 627, 627, 899, 1237, 132, 630, 630, 630, 637, 637, - 637, 132, 1677, 1692, 132, 141, 141, 141, 141, 141, + 132, 132, 132, 1696, 132, 132, 132, 132, 132, 161, + 161, 161, 162, 162, 162, 165, 165, 165, 694, 166, + 166, 166, 623, 1697, 1698, 161, 906, 1684, 162, 694, + 1190, 165, 694, 132, 132, 166, 132, 623, 132, 634, + 634, 634, 906, 1190, 132, 637, 637, 637, 644, 644, + 644, 132, 1684, 1699, 132, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 1693, 141, 141, 141, 141, 141, 173, 173, 173, 174, - 174, 174, 175, 175, 175, 742, 176, 176, 176, 177, - 177, 177, 173, 1695, 1696, 174, 628, 650, 175, 742, - 141, 141, 176, 628, 650, 177, 641, 641, 641, 649, - 649, 649, 628, 650, 1698, 1700, 141, 142, 142, 142, + 1700, 141, 141, 141, 141, 141, 169, 169, 169, 170, + 170, 170, 173, 173, 173, 741, 174, 174, 174, 177, + 177, 177, 169, 1702, 1703, 170, 635, 657, 173, 741, + 141, 141, 174, 635, 657, 177, 648, 648, 648, 656, + 656, 656, 635, 657, 1705, 1707, 141, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 1702, 142, 142, 142, 142, 142, 178, 178, - 178, 181, 181, 181, 182, 182, 182, 744, 183, 183, - 183, 184, 184, 184, 178, 1703, 1705, 181, 680, 1707, - 182, 744, 142, 142, 183, 680, 1709, 184, 651, 651, + 142, 142, 1709, 142, 142, 142, 142, 142, 178, 178, + 178, 179, 179, 179, 180, 180, 180, 749, 181, 181, + 181, 182, 182, 182, 178, 1710, 1712, 179, 687, 1714, + 180, 749, 142, 142, 181, 687, 1716, 182, 658, 658, - 651, 680, 660, 660, 660, 1155, 1155, 1155, 142, 145, + 658, 687, 667, 667, 667, 1162, 1162, 1162, 142, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 1710, 145, 145, 145, 145, 145, - 185, 185, 185, 186, 186, 186, 187, 187, 187, 687, - 188, 188, 188, 191, 191, 191, 185, 1711, 1712, 186, - 687, 689, 187, 687, 145, 145, 188, 691, 689, 191, - 145, 660, 692, 693, 689, 145, 1713, 1715, 691, 692, - 693, 691, 1163, 1163, 1163, 692, 693, 145, 146, 146, + 145, 145, 145, 145, 1717, 145, 145, 145, 145, 145, + 183, 183, 183, 184, 184, 184, 187, 187, 187, 1718, + 188, 188, 188, 189, 189, 189, 183, 1719, 1720, 184, + 696, 1722, 187, 698, 145, 145, 188, 696, 751, 189, + 145, 667, 699, 696, 698, 145, 1731, 698, 1732, 699, + 1734, 1738, 751, 1742, 1744, 699, 1751, 145, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 1724, 146, 146, 146, 146, 146, 192, + 146, 146, 146, 1752, 146, 146, 146, 146, 146, 190, - 192, 192, 193, 193, 193, 194, 194, 194, 1725, 195, - 195, 195, 196, 196, 196, 192, 1727, 1731, 193, 733, - 736, 194, 1735, 146, 146, 195, 733, 736, 196, 146, - 743, 1737, 733, 736, 146, 902, 902, 902, 1744, 902, - 1745, 743, 1746, 1747, 743, 1749, 146, 149, 149, 149, + 190, 190, 191, 191, 191, 192, 192, 192, 1753, 193, + 193, 193, 194, 194, 194, 190, 1754, 1756, 191, 700, + 740, 192, 1244, 146, 146, 193, 700, 740, 194, 146, + 743, 750, 700, 740, 146, 1244, 1760, 743, 1170, 1170, + 1170, 1761, 750, 743, 1762, 750, 146, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, @@ -3211,1132 +3214,1139 @@ static yyconst flex_int16_t yy_chk[12113] = 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 1753, 153, 153, 153, - 153, 153, 197, 197, 197, 198, 198, 198, 201, 201, - 201, 1754, 202, 202, 202, 205, 205, 205, 197, 1033, - 1755, 198, 1758, 1765, 201, 1777, 153, 153, 202, 1033, - 153, 205, 914, 914, 914, 1778, 1033, 153, 1786, 1789, - 153, 936, 936, 936, 153, 1799, 153, 153, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - - 154, 154, 154, 1803, 154, 154, 154, 154, 154, 206, - 206, 206, 207, 207, 207, 208, 208, 208, 1807, 209, - 209, 209, 210, 210, 210, 206, 1808, 1812, 207, 1813, - 1814, 208, 1815, 154, 154, 209, 914, 154, 210, 948, - 948, 948, 1824, 948, 154, 936, 948, 154, 1178, 1178, - 1178, 154, 1828, 154, 154, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 1831, 157, 157, 157, 157, 157, 211, 211, 211, 212, - 212, 212, 215, 215, 215, 1833, 216, 216, 216, 701, - 701, 701, 211, 1835, 1836, 212, 1838, 1839, 215, 1840, - - 157, 157, 216, 157, 157, 157, 701, 1843, 956, 956, - 956, 157, 956, 1845, 157, 956, 1847, 1852, 157, 1858, - 1862, 157, 158, 158, 158, 158, 158, 158, 158, 158, - 158, 158, 158, 158, 158, 158, 158, 1863, 158, 158, - 158, 158, 158, 217, 217, 217, 218, 218, 218, 219, - 219, 219, 1864, 220, 220, 220, 709, 709, 709, 217, - 1866, 1878, 218, 1874, 1881, 219, 1882, 158, 158, 220, - 158, 158, 158, 709, 1883, 971, 971, 971, 158, 971, - 1874, 158, 971, 1885, 1886, 158, 1875, 1888, 158, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - - 161, 161, 161, 161, 1876, 161, 161, 161, 161, 161, - 221, 221, 221, 222, 222, 222, 225, 225, 225, 1889, - 226, 226, 226, 725, 725, 725, 221, 1890, 1875, 222, - 1892, 1893, 225, 1894, 161, 161, 226, 1876, 1898, 161, - 725, 1234, 1234, 1234, 1900, 161, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 1903, 162, 162, 162, 162, 162, 227, 227, 227, - 228, 228, 228, 229, 229, 229, 1904, 230, 230, 230, - 749, 749, 749, 227, 1905, 1884, 228, 1906, 1908, 229, - 1910, 162, 162, 230, 1911, 1913, 162, 749, 1485, 1485, - - 1485, 1884, 162, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 1915, 165, - 165, 165, 165, 165, 231, 231, 231, 232, 232, 232, - 235, 235, 235, 1918, 236, 236, 236, 239, 239, 239, - 231, 1919, 1921, 232, 1922, 1923, 235, 1925, 165, 165, - 236, 1931, 165, 239, 975, 975, 975, 1932, 1934, 165, - 1937, 1953, 165, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, 1954, 166, - 166, 166, 166, 166, 240, 240, 240, 241, 241, 241, - 242, 242, 242, 1920, 243, 243, 243, 244, 244, 244, - - 240, 1920, 1959, 241, 1933, 1938, 242, 1960, 166, 166, - 243, 1961, 166, 244, 984, 984, 984, 1965, 975, 166, - 1933, 1938, 166, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 1967, 169, - 169, 169, 169, 169, 245, 245, 245, 246, 246, 246, - 249, 249, 249, 1924, 250, 250, 250, 756, 756, 756, - 245, 1924, 1973, 246, 1939, 1974, 249, 358, 169, 169, - 250, 1975, 169, 292, 756, 1982, 1983, 358, 984, 169, - 1939, 1984, 169, 292, 1997, 2003, 364, 2007, 2010, 169, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - - 170, 170, 170, 170, 170, 358, 170, 170, 170, 170, - 170, 2012, 292, 2015, 364, 761, 761, 761, 292, 358, - 773, 773, 773, 358, 2017, 292, 785, 785, 785, 292, - 364, 2019, 761, 2020, 2021, 170, 170, 773, 2024, 170, - 991, 991, 991, 785, 991, 2026, 170, 991, 2031, 170, - 1486, 1486, 1486, 1488, 1488, 1488, 170, 179, 179, 179, - 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - 179, 179, 2033, 179, 179, 179, 179, 179, 786, 786, - 786, 792, 792, 792, 794, 794, 794, 808, 808, 808, - 809, 809, 809, 2041, 2042, 786, 1486, 2043, 792, 1488, - - 2044, 794, 179, 179, 808, 2046, 2057, 809, 179, 998, - 998, 998, 2057, 998, 2059, 2060, 998, 1491, 1491, 1491, - 1494, 1494, 1494, 179, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 2065, - 180, 180, 180, 180, 180, 821, 821, 821, 829, 829, - 829, 834, 834, 834, 840, 840, 840, 862, 862, 862, - 2059, 2066, 821, 2067, 2068, 829, 2072, 2074, 834, 180, - 180, 840, 2075, 2076, 862, 180, 1003, 1003, 1003, 2081, - 1003, 2088, 2090, 1003, 1504, 1504, 1504, 1540, 1540, 1540, - 180, 189, 189, 189, 189, 189, 189, 189, 189, 189, - - 189, 189, 189, 189, 189, 189, 2091, 189, 189, 189, - 189, 189, 890, 890, 890, 894, 894, 894, 2058, 2094, - 912, 912, 912, 913, 913, 913, 944, 944, 944, 890, - 2097, 2101, 894, 945, 945, 945, 189, 189, 912, 2102, - 2103, 913, 189, 2104, 944, 189, 1015, 1015, 1015, 2058, - 1015, 945, 2105, 1015, 1543, 1543, 1543, 189, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, - 190, 190, 190, 2106, 190, 190, 190, 190, 190, 2107, - 2108, 913, 947, 947, 947, 2109, 2110, 951, 951, 951, - 952, 952, 952, 945, 955, 955, 955, 2115, 2116, 947, - - 957, 957, 957, 190, 190, 951, 2117, 2118, 952, 190, - 2136, 955, 190, 2137, 1027, 1027, 1027, 957, 1027, 2140, - 2141, 1027, 2143, 2147, 190, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 2148, 199, 199, 199, 199, 199, 959, 959, 959, 963, - 963, 963, 2149, 2155, 952, 2156, 964, 964, 964, 968, - 968, 968, 2157, 959, 1541, 1541, 1541, 963, 2171, 2175, - 199, 199, 2176, 2177, 964, 2179, 199, 968, 1694, 1694, - 1694, 199, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 2183, 200, 200, - - 200, 200, 200, 964, 969, 969, 969, 970, 970, 970, - 1541, 973, 973, 973, 990, 990, 990, 974, 974, 974, - 1739, 2186, 969, 2187, 970, 2190, 1739, 200, 200, 973, - 1739, 990, 2191, 200, 1739, 974, 2194, 2201, 200, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 974, 203, 203, 203, 203, 203, - 994, 994, 994, 995, 995, 995, 1740, 2203, 969, 997, - 997, 997, 1740, 1000, 1000, 1000, 1740, 2218, 994, 2232, - 1740, 995, 2233, 2236, 203, 203, 997, 1002, 1002, 1002, - 203, 1000, 1029, 1029, 1029, 2243, 1029, 2244, 2249, 1029, - - 2251, 1542, 1542, 1542, 1002, 203, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 2263, 204, 204, 204, 204, 204, 2264, 2222, 995, - 1001, 1001, 1001, 2265, 2266, 1005, 1005, 1005, 1006, 1006, - 1006, 1009, 1009, 1009, 1010, 1010, 1010, 1542, 1001, 2267, - 2138, 204, 204, 1005, 2268, 2269, 1006, 204, 2138, 1009, - 2139, 2188, 1010, 1035, 1035, 1035, 2270, 1035, 2139, 2188, - 1035, 2222, 204, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 2223, 213, - 213, 213, 213, 213, 2271, 2272, 1001, 2279, 2280, 1006, - - 1014, 1014, 1014, 1018, 1018, 1018, 1026, 1026, 1026, 1010, - 1019, 1019, 1019, 1023, 1023, 1023, 2281, 1014, 213, 213, - 2283, 1018, 2189, 1026, 213, 2293, 2294, 213, 1019, 2295, - 2189, 1023, 1697, 1697, 1697, 2223, 1635, 1635, 1635, 213, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 2296, 214, 214, 214, 214, - 214, 1028, 1028, 1028, 2297, 2298, 1024, 1024, 1024, 2299, - 2302, 1019, 1030, 1030, 1030, 1031, 1031, 1031, 1028, 1034, - 1034, 1034, 1635, 2303, 1024, 214, 214, 1037, 1037, 1037, - 1030, 214, 2304, 1031, 214, 2310, 1034, 2311, 1038, 1038, - - 1038, 2317, 1038, 2318, 1037, 1038, 214, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 2319, 223, 223, 223, 223, 223, 1024, 1039, - 1039, 1039, 1049, 1049, 1049, 2320, 1031, 1050, 1050, 1050, - 1051, 1051, 1051, 1060, 1060, 1060, 1039, 1052, 1052, 1052, - 1049, 1052, 223, 223, 1052, 1050, 2334, 1051, 2335, 2336, - 223, 1060, 223, 2337, 2339, 223, 1699, 1699, 1699, 223, - 1701, 1701, 1701, 223, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, 224, 2341, - 224, 224, 224, 224, 224, 1050, 1053, 1053, 1053, 1054, - - 1054, 1054, 2359, 1054, 2364, 2358, 1054, 1055, 1055, 1055, - 1070, 1070, 1070, 1053, 1056, 1056, 1056, 2365, 2370, 224, - 224, 1057, 1057, 1057, 1055, 2371, 2372, 224, 1070, 224, - 2375, 1056, 224, 1704, 1704, 1704, 224, 2358, 1057, 2359, - 224, 233, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 2378, 233, 233, 233, - 233, 233, 1061, 1061, 1061, 1056, 1065, 1065, 1065, 1714, - 1714, 1714, 2305, 1057, 1059, 1059, 1059, 1058, 1058, 1058, - 1061, 2379, 2305, 1065, 2380, 2381, 233, 233, 1066, 1066, - 1066, 1059, 1066, 2382, 1058, 1066, 1074, 1074, 1074, 2383, - - 1074, 2384, 2385, 1074, 2386, 1706, 1706, 1706, 2387, 1061, - 233, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 1059, 234, 234, 234, - 234, 234, 1058, 1067, 1067, 1067, 1073, 1073, 1073, 2388, - 1075, 1075, 1075, 2390, 2391, 1071, 1071, 1071, 2393, 2394, - 1067, 2395, 2396, 1073, 2397, 2399, 234, 234, 1075, 1076, - 1076, 1076, 2400, 1071, 1079, 1079, 1079, 2401, 1079, 1706, - 2403, 1079, 1085, 1085, 1085, 2404, 1085, 1076, 2406, 1085, - 234, 237, 237, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 1071, 237, 237, 237, - - 237, 237, 1078, 1078, 1078, 1081, 1081, 1081, 1084, 1084, - 1084, 2411, 1082, 1082, 1082, 1089, 1089, 1089, 2412, 1078, - 1076, 2413, 2392, 1081, 2415, 1084, 237, 237, 2420, 2421, - 1082, 2392, 2422, 1089, 1708, 1708, 1708, 237, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 2423, 238, 238, 238, 238, 238, 1082, - 2424, 1090, 1090, 1090, 1091, 1091, 1091, 2427, 1092, 1092, - 1092, 1093, 1093, 1093, 1094, 1094, 1094, 2398, 2433, 1090, - 1708, 1091, 2434, 238, 238, 1092, 2398, 2436, 1093, 1748, - 1748, 1748, 1094, 2445, 238, 247, 247, 247, 247, 247, - - 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, - 2447, 247, 247, 247, 247, 247, 1090, 2450, 2452, 1095, - 1095, 1095, 1097, 1097, 1097, 1750, 1750, 1750, 2476, 2477, - 1093, 1099, 1099, 1099, 1101, 1101, 1101, 1095, 2479, 1097, - 247, 247, 1098, 1098, 1098, 1100, 1100, 1100, 1099, 2472, - 2471, 247, 1101, 1105, 1105, 1105, 2480, 1105, 2481, 1098, - 1105, 2486, 1100, 2473, 247, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 1095, 248, 248, 248, 248, 248, 2472, 1102, 1102, 1102, - 2471, 2487, 1098, 2488, 2489, 1104, 1104, 1104, 1106, 1106, - - 1106, 1107, 1107, 1107, 1100, 1102, 2473, 1098, 2490, 2491, - 248, 248, 1104, 1108, 1108, 1108, 1106, 2492, 2493, 1107, - 2494, 248, 2495, 2496, 1102, 2498, 1109, 1109, 1109, 2499, - 1108, 1110, 1110, 1110, 248, 290, 1111, 1111, 1111, 1115, - 1115, 1115, 290, 1109, 1112, 1112, 1112, 2500, 2501, 1110, - 2502, 290, 290, 2503, 1111, 2504, 1107, 1115, 1113, 1113, - 1113, 1112, 1751, 1751, 1751, 1114, 1114, 1114, 2505, 2506, - 1116, 1116, 1116, 2507, 2508, 1113, 1128, 1128, 1128, 290, - 290, 290, 1114, 2509, 2510, 290, 290, 290, 1116, 2511, - 290, 290, 2512, 1128, 290, 2513, 290, 290, 290, 355, - - 1122, 1122, 1122, 1123, 1123, 1123, 355, 1111, 1113, 1126, - 1126, 1126, 1127, 1127, 1127, 355, 355, 2515, 1122, 2484, - 2519, 1123, 2526, 1113, 1129, 1129, 1129, 1126, 1129, 2484, - 1127, 1129, 2484, 2527, 1130, 1130, 1130, 2528, 1131, 1131, - 1131, 1116, 2530, 355, 355, 355, 1132, 1132, 1132, 355, - 355, 355, 1130, 2534, 355, 355, 1131, 2537, 355, 2560, - 355, 355, 355, 1132, 1133, 1133, 1133, 1123, 1133, 2560, - 2578, 1133, 1135, 1135, 1135, 2560, 1127, 1136, 1136, 1136, - 1151, 1151, 1151, 1152, 1152, 1152, 1154, 1154, 1154, 2576, - 1135, 1185, 1185, 1185, 2580, 1136, 2581, 2575, 1151, 1131, - - 2582, 1152, 2585, 2586, 1154, 1186, 1186, 1186, 1185, 1187, - 1187, 1187, 1189, 1189, 1189, 1190, 1190, 1190, 1191, 1191, - 1191, 2588, 1191, 1186, 2589, 1191, 2575, 1187, 2591, 2577, - 1189, 2576, 1190, 1154, 1194, 1194, 1194, 1196, 1196, 1196, - 2592, 1136, 1197, 1197, 1197, 1199, 1199, 1199, 1204, 1204, - 1204, 1194, 1201, 1201, 1201, 1196, 1201, 2593, 2594, 1201, - 1197, 1189, 2595, 1199, 2597, 1204, 1205, 1205, 1205, 2598, - 1205, 2577, 2587, 1205, 1206, 1206, 1206, 1207, 1207, 1207, - 1208, 1208, 1208, 2599, 1208, 2587, 2600, 1208, 1210, 1210, - 1210, 1206, 1199, 2603, 1207, 1194, 1212, 1212, 1212, 1213, - - 1213, 1213, 1215, 1215, 1215, 1210, 1217, 1217, 1217, 1219, - 1219, 1219, 2604, 2605, 1212, 2606, 2607, 1213, 2608, 2609, - 1215, 2590, 2610, 1217, 1220, 1220, 1220, 1219, 1222, 1222, - 1222, 1223, 1223, 1223, 2590, 1223, 2611, 2612, 1223, 1227, - 1227, 1227, 1220, 1228, 1228, 1228, 1222, 1230, 1230, 1230, - 2485, 1245, 1245, 1245, 2613, 1245, 2614, 1227, 1245, 2615, - 2485, 1228, 1215, 2485, 2616, 1230, 1249, 1249, 1249, 1250, - 1250, 1250, 1251, 1251, 1251, 1222, 1253, 1253, 1253, 1259, - 1259, 1259, 2617, 1249, 1255, 1255, 1255, 1250, 1255, 2619, - 1251, 1255, 2629, 2630, 1253, 2635, 2639, 1259, 1260, 1260, - - 1260, 1262, 1262, 1262, 1263, 1263, 1263, 2657, 1263, 2658, - 2659, 1263, 1266, 1266, 1266, 2660, 1260, 2661, 2662, 1262, - 1267, 1267, 1267, 1268, 1268, 1268, 1270, 1270, 1270, 1266, - 1271, 1271, 1271, 1272, 1272, 1272, 2666, 1253, 1267, 2672, - 2674, 1268, 2677, 2678, 1270, 2682, 2683, 1271, 2684, 2666, - 1272, 1273, 1273, 1273, 1274, 1274, 1274, 1276, 1276, 1276, - 2685, 1272, 1262, 1279, 1279, 1279, 1280, 1280, 1280, 1273, - 1280, 2671, 1274, 1280, 2672, 1276, 1285, 1285, 1285, 2686, - 1279, 1286, 1286, 1286, 1288, 1288, 1288, 1291, 1291, 1291, - 1292, 1292, 1292, 1270, 1285, 1293, 1293, 1293, 2687, 1286, - - 2688, 2689, 1288, 2691, 1291, 1296, 1296, 1296, 1292, 1295, - 1295, 1295, 2692, 1293, 1297, 1297, 1297, 2667, 1297, 2671, - 2693, 1297, 1296, 1276, 1300, 1300, 1300, 1295, 1300, 2694, - 2667, 1300, 1303, 1303, 1303, 1304, 1304, 1304, 1306, 1306, - 1306, 1311, 1311, 1311, 2695, 1311, 2696, 2697, 1311, 1288, - 1303, 2698, 2700, 1304, 2701, 2702, 1306, 1314, 1314, 1314, - 1315, 1315, 1315, 2703, 1315, 2704, 2705, 1315, 1318, 1318, - 1318, 1319, 1319, 1319, 1314, 1319, 1295, 2706, 1319, 1329, - 1329, 1329, 1330, 1330, 1330, 1318, 1332, 1332, 1332, 1333, - 1333, 1333, 2561, 1333, 2707, 2708, 1333, 1329, 2709, 2710, - - 1330, 2711, 2561, 1306, 1332, 1336, 1336, 1336, 2561, 1336, - 2712, 2713, 1336, 1339, 1339, 1339, 1340, 1340, 1340, 2714, - 1340, 2720, 2724, 1340, 1345, 1345, 1345, 1346, 1346, 1346, - 1339, 1348, 1348, 1348, 1353, 1353, 1353, 2725, 1353, 2733, - 2734, 1353, 1345, 2751, 2752, 1346, 1356, 1356, 1356, 1348, - 1357, 1357, 1357, 1332, 1357, 2753, 2754, 1357, 1360, 1360, - 1360, 2755, 2756, 1356, 1361, 1361, 1361, 1363, 1363, 1363, - 1365, 1365, 1365, 2746, 1365, 2759, 1360, 1365, 2760, 1348, - 2761, 2762, 1361, 2746, 2771, 1363, 1368, 1368, 1368, 1369, - 1369, 1369, 1371, 1371, 1371, 1373, 1373, 1373, 2747, 1373, - - 2772, 2773, 1373, 2774, 1368, 2775, 2776, 1369, 2747, 2777, - 1371, 1377, 1377, 1377, 1378, 1378, 1378, 2778, 1363, 1380, - 1380, 1380, 2781, 1382, 1382, 1382, 2749, 1382, 2782, 1377, - 1382, 2750, 1378, 1388, 1388, 1388, 2749, 1380, 1389, 1389, - 1389, 2750, 1391, 1391, 1391, 1392, 1392, 1392, 1393, 1393, - 1393, 1388, 1393, 2784, 2785, 1393, 1389, 2763, 2786, 1371, - 1391, 2788, 1392, 1394, 1394, 1394, 2790, 2791, 1380, 1395, - 1395, 1395, 2792, 1395, 2795, 2796, 1395, 1397, 1397, 1397, - 1394, 1398, 1398, 1398, 2797, 1400, 1400, 1400, 1402, 1402, - 1402, 2763, 1406, 1406, 1406, 1397, 1716, 1716, 1716, 1398, - - 2798, 2799, 1391, 1400, 2802, 1402, 1403, 1403, 1403, 1406, - 1403, 2803, 2810, 1403, 1407, 1407, 1407, 2811, 1407, 2812, - 2820, 1407, 1409, 1409, 1409, 1410, 1410, 1410, 1412, 1412, - 1412, 1414, 1414, 1414, 2826, 1414, 2827, 2828, 1414, 2829, - 1409, 2830, 1716, 1410, 2831, 2832, 1412, 1417, 1417, 1417, - 2833, 2834, 1400, 1418, 1418, 1418, 1420, 1420, 1420, 1421, - 1421, 1421, 1422, 1422, 1422, 1417, 1422, 2835, 2837, 1422, - 2838, 1418, 2843, 2844, 1420, 2845, 1421, 1423, 1423, 1423, - 1424, 1424, 1424, 2846, 1424, 2847, 2856, 1424, 1425, 1425, - 1425, 2857, 1412, 2858, 1423, 1426, 1426, 1426, 2859, 1428, - - 1428, 1428, 1429, 1429, 1429, 2860, 1425, 1430, 1430, 1430, - 2861, 1430, 2862, 1426, 1430, 2863, 1420, 1428, 2867, 1429, - 1433, 1433, 1433, 1434, 1434, 1434, 2868, 1434, 2847, 2869, - 1434, 1435, 1435, 1435, 1436, 1436, 1436, 1433, 1438, 1438, - 1438, 1440, 1440, 1440, 1444, 1444, 1444, 2870, 2871, 1435, - 2872, 2874, 1436, 1445, 1445, 1445, 1438, 2875, 1440, 2877, - 2878, 1428, 1444, 1447, 1447, 1447, 1450, 1450, 1450, 2879, - 2880, 1445, 1451, 1451, 1451, 1453, 1453, 1453, 1454, 1454, - 1454, 1447, 1454, 2882, 1450, 1454, 1457, 1457, 1457, 2883, - 1451, 2887, 2888, 1453, 1458, 1458, 1458, 1460, 1460, 1460, - - 1438, 1461, 1461, 1461, 1457, 1461, 2889, 2892, 1461, 1465, - 1465, 1465, 1458, 2897, 2898, 1460, 1466, 1466, 1466, 1468, - 1468, 1468, 2899, 2900, 1447, 2901, 2902, 1465, 1453, 1470, - 1470, 1470, 2903, 2904, 1466, 2905, 2906, 1468, 1477, 1477, - 1477, 1507, 1507, 1507, 1509, 1509, 1509, 1470, 1470, 2907, - 1510, 1510, 1510, 1535, 1535, 1535, 1477, 1460, 1507, 1508, - 1508, 1508, 1509, 1508, 2908, 2910, 1508, 1510, 1511, 1511, - 1511, 1535, 1511, 2911, 2912, 1511, 1514, 1514, 1514, 2913, - 1468, 1516, 1516, 1516, 2914, 1516, 2920, 2916, 1516, 1519, - 1519, 1519, 2923, 2924, 1514, 2927, 1520, 1520, 1520, 2917, - - 1520, 2916, 1509, 1520, 1477, 2929, 1519, 1521, 1521, 1521, - 2917, 1521, 2930, 2932, 1521, 1525, 1525, 1525, 2933, 1526, - 1526, 1526, 2936, 1526, 2937, 1514, 1526, 1528, 1528, 1528, - 2914, 2938, 1525, 1530, 1530, 1530, 1531, 1531, 1531, 2939, - 1531, 2940, 2941, 1531, 2942, 1528, 1532, 1532, 1532, 2943, - 1530, 1533, 1533, 1533, 1551, 1551, 1551, 1552, 1552, 1552, - 1553, 1553, 1553, 1532, 1553, 2944, 2945, 1553, 2946, 1533, - 2950, 1551, 2958, 2960, 1552, 2962, 2964, 1528, 1554, 1554, - 1554, 1557, 1557, 1557, 1558, 1558, 1558, 1559, 1559, 1559, - 2972, 1559, 2974, 2978, 1559, 2980, 1554, 2975, 2982, 1557, - - 1533, 1558, 1560, 1560, 1560, 1561, 1561, 1561, 1562, 1562, - 1562, 2983, 1562, 2977, 2977, 1562, 1564, 1564, 1564, 2948, - 1560, 2984, 1561, 1567, 1567, 1567, 1568, 1568, 1568, 2949, - 1568, 2948, 2955, 1568, 1564, 1569, 1569, 1569, 2975, 2985, - 1567, 2949, 1554, 2992, 2955, 1557, 1570, 1570, 1570, 1571, - 1571, 1571, 1569, 1574, 1574, 1574, 2956, 1575, 1575, 1575, - 2996, 1575, 1560, 1570, 1575, 3002, 2991, 1571, 2956, 2976, - 1574, 1576, 1576, 1576, 1577, 1577, 1577, 1564, 1578, 1578, - 1578, 3004, 1578, 2976, 2991, 1578, 1579, 1579, 1579, 1576, - 2995, 1577, 1570, 1581, 1581, 1581, 1584, 1584, 1584, 1585, - - 1585, 1585, 3007, 1585, 1579, 2995, 1585, 1586, 1586, 1586, - 1581, 1586, 3009, 1584, 1586, 1571, 1591, 1591, 1591, 1598, - 1598, 1598, 1599, 1599, 1599, 3014, 1599, 3015, 3017, 1599, - 1602, 1602, 1602, 1591, 1603, 1603, 1603, 1598, 1604, 1604, - 1604, 1605, 1605, 1605, 1606, 1606, 1606, 1602, 1608, 1608, - 1608, 1603, 1579, 2979, 3018, 1604, 3019, 3021, 1605, 1611, - 1611, 1611, 1606, 1611, 2979, 1608, 1611, 3022, 3023, 1614, - 1614, 1614, 1616, 1616, 1616, 1618, 1618, 1618, 1621, 1621, - 1621, 1625, 1625, 1625, 1598, 1604, 1614, 1626, 1626, 1626, - 1616, 3024, 3026, 1618, 3027, 3029, 1621, 3030, 1625, 1606, - - 3037, 1634, 1634, 1634, 1603, 1626, 1627, 1627, 1627, 3001, - 1627, 1605, 3038, 1627, 1630, 1630, 1630, 3039, 1630, 1634, - 3040, 1630, 1636, 1636, 1636, 3041, 1636, 1625, 3001, 1636, - 1641, 1641, 1641, 3042, 1641, 1621, 1616, 1641, 1645, 1645, - 1645, 1618, 3045, 3003, 1626, 1647, 1647, 1647, 1648, 1648, - 1648, 3046, 1648, 3047, 3048, 1648, 1645, 1651, 1651, 1651, - 3006, 1651, 3003, 1647, 1651, 3049, 3008, 1634, 1654, 1654, - 1654, 1655, 1655, 1655, 3050, 1655, 3051, 3052, 1655, 3006, - 1660, 1660, 1660, 3054, 1660, 3008, 1654, 1660, 1663, 1663, - 1663, 1665, 1665, 1665, 1666, 1666, 1666, 3056, 1666, 1645, - - 3058, 1666, 1647, 1670, 1670, 1670, 1663, 3059, 1665, 1672, - 1672, 1672, 1673, 1673, 1673, 1654, 1674, 1674, 1674, 3061, - 3072, 1670, 1675, 1675, 1675, 3073, 1672, 1676, 1676, 1676, - 1673, 1679, 1679, 1679, 1674, 1663, 1686, 1686, 1686, 1675, - 1717, 1717, 1717, 3074, 1717, 1676, 3075, 1717, 3076, 1679, - 3077, 3070, 1670, 3081, 1686, 1720, 1720, 1720, 1721, 1721, - 1721, 3082, 1721, 3070, 3083, 1721, 3084, 3085, 1674, 1726, - 1726, 1726, 3086, 1720, 1728, 1728, 1728, 3087, 1728, 1673, - 3088, 1728, 1679, 1736, 1736, 1736, 3071, 1726, 1686, 1676, - 1732, 1732, 1732, 3091, 1732, 3092, 3093, 1732, 3071, 1679, - - 3094, 1736, 1738, 1738, 1738, 3095, 1738, 3096, 3097, 1738, - 1741, 1741, 1741, 3098, 1742, 1742, 1742, 3089, 1742, 3099, - 1726, 1742, 1720, 1743, 1743, 1743, 3100, 1741, 1752, 1752, - 1752, 1756, 1756, 1756, 1757, 1757, 1757, 1759, 1759, 1759, - 3101, 1743, 3089, 3102, 1736, 1760, 1760, 1760, 3103, 1760, - 3104, 3105, 1760, 3106, 1759, 1761, 1761, 1761, 3107, 1761, - 3108, 3109, 1761, 1764, 1764, 1764, 1766, 1766, 1766, 1767, - 1767, 1767, 3110, 3116, 1743, 1768, 1768, 1768, 3113, 1768, - 3117, 1764, 1768, 1766, 1771, 1771, 1771, 1767, 3118, 1772, - 1772, 1772, 1752, 1772, 3119, 1756, 1772, 3113, 1757, 1776, - - 1776, 1776, 1771, 1775, 1775, 1775, 3120, 1779, 1779, 1779, - 1764, 1779, 3121, 3122, 1779, 3123, 1767, 1776, 3124, 3125, - 1775, 1782, 1782, 1782, 1783, 1783, 1783, 3126, 1783, 3127, - 3128, 1783, 1784, 1784, 1784, 1785, 1785, 1785, 1782, 1785, - 3129, 3130, 1785, 1787, 1787, 1787, 1788, 1788, 1788, 1784, - 1771, 1790, 1790, 1790, 3131, 1790, 3132, 3133, 1790, 3135, - 3136, 1787, 3137, 1776, 1793, 1793, 1793, 1795, 1795, 1795, - 3138, 1795, 3134, 3139, 1795, 1798, 1798, 1798, 1800, 1800, - 1800, 3140, 1793, 1801, 1801, 1801, 3141, 1801, 3142, 3143, - 1801, 3144, 3134, 1798, 3145, 1800, 1802, 1802, 1802, 1804, - - 1804, 1804, 3146, 1804, 3147, 3148, 1804, 1809, 1809, 1809, - 1810, 1810, 1810, 1802, 1810, 3149, 3150, 1810, 1811, 1811, - 1811, 1798, 3151, 3152, 1809, 1816, 1816, 1816, 1817, 1817, - 1817, 1818, 1818, 1818, 3156, 1811, 1819, 1819, 1819, 3153, - 1819, 3157, 1816, 1819, 3158, 3153, 1817, 3159, 1818, 1820, - 1820, 1820, 1821, 1821, 1821, 1822, 1822, 1822, 1823, 1823, - 1823, 1825, 1825, 1825, 3160, 3161, 1820, 3163, 3164, 1821, - 3166, 3167, 1822, 1826, 1826, 1826, 1823, 1826, 1825, 3169, - 1826, 1827, 1827, 1827, 1829, 1829, 1829, 3170, 1830, 1830, - 1830, 3173, 1830, 3174, 1817, 1830, 3175, 3176, 1827, 3178, - - 3180, 1829, 1832, 1832, 1832, 1834, 1834, 1834, 3172, 3182, - 1821, 1837, 1837, 1837, 1841, 1841, 1841, 3184, 1823, 3186, - 1832, 3187, 3172, 1834, 3188, 3189, 1842, 1842, 1842, 1837, - 1842, 1841, 3190, 1842, 1844, 1844, 1844, 1846, 1846, 1846, - 1848, 1848, 1848, 1849, 1849, 1849, 1850, 1850, 1850, 1851, - 1851, 1851, 1844, 3191, 3192, 1846, 1834, 1848, 3193, 1837, - 1849, 3195, 3197, 1850, 1854, 1854, 1854, 1851, 1853, 1853, - 1853, 3199, 1855, 1855, 1855, 1856, 1856, 1856, 1857, 1857, - 1857, 3200, 1854, 1859, 1859, 1859, 1853, 1859, 1846, 1855, - 1859, 3201, 1856, 1865, 1865, 1865, 1857, 3202, 1867, 1867, - - 1867, 1868, 1868, 1868, 3219, 1868, 3203, 3241, 1868, 3217, - 1850, 1865, 3219, 3217, 1853, 1867, 1851, 1869, 1869, 1869, - 1870, 1870, 1870, 1871, 1871, 1871, 1872, 1872, 1872, 1854, - 1872, 3220, 3218, 1872, 1515, 1869, 3218, 3204, 1870, 3220, - 1871, 3241, 3203, 1857, 1865, 1873, 1873, 1873, 1879, 1879, - 1879, 1880, 1880, 1880, 1887, 1887, 1887, 1891, 1891, 1891, - 1895, 1895, 1895, 1873, 3215, 1879, 1896, 1896, 1896, 1880, - 1897, 1897, 1897, 3204, 3225, 1870, 1869, 1899, 1899, 1899, - 1901, 1901, 1901, 1902, 1902, 1902, 1907, 1907, 1907, 1909, - 1909, 1909, 1912, 1912, 1912, 3294, 1914, 1914, 1914, 1916, - - 1916, 1916, 1917, 1917, 1917, 3216, 3294, 1909, 3215, 3226, - 1912, 3225, 1880, 1914, 1926, 1926, 1926, 1916, 1926, 1917, - 3223, 1926, 1929, 1929, 1929, 1930, 1930, 1930, 1935, 1935, - 1935, 1936, 1936, 1936, 1940, 1940, 1940, 3242, 3211, 1909, - 1929, 3212, 1930, 1941, 1941, 1941, 3226, 1941, 3213, 3216, - 1941, 1940, 1944, 1944, 1944, 1945, 1945, 1945, 1916, 1946, - 1946, 1946, 1947, 1947, 1947, 3214, 1947, 3223, 1929, 1947, - 1944, 3242, 1945, 1948, 1948, 1948, 1946, 1949, 1949, 1949, - 1950, 1950, 1950, 1951, 1951, 1951, 3211, 1951, 3249, 3212, - 1951, 1948, 1952, 1952, 1952, 1949, 3213, 1950, 3231, 1955, - - 1955, 1955, 1513, 1955, 3221, 1944, 1955, 1958, 1958, 1958, - 1952, 1958, 3221, 3214, 1958, 1962, 1962, 1962, 1964, 1964, - 1964, 3249, 1966, 1966, 1966, 3227, 1948, 1968, 1968, 1968, - 3222, 1968, 3232, 1962, 1968, 1971, 1971, 1971, 3222, 1952, - 1966, 1972, 1972, 1972, 3231, 1972, 3228, 3233, 1972, 1976, - 1976, 1976, 1971, 1976, 3235, 3289, 1976, 1979, 1979, 1979, - 1980, 1980, 1980, 3224, 1980, 1512, 3227, 1980, 1981, 1981, - 1981, 1985, 1985, 1985, 1979, 1986, 1986, 1986, 3232, 1986, - 1966, 3229, 1986, 3236, 3233, 1981, 3235, 3228, 1985, 1987, - 1987, 1987, 1988, 1988, 1988, 3261, 1988, 3234, 3230, 1988, - - 1991, 1991, 1991, 3289, 1992, 1992, 1992, 1987, 1992, 3245, - 3224, 1992, 1993, 1993, 1993, 3236, 3229, 1991, 1994, 1994, - 1994, 1995, 1995, 1995, 3261, 1995, 1506, 3237, 1995, 1993, - 1996, 1996, 1996, 3230, 3234, 1994, 3237, 1998, 1998, 1998, - 1987, 1998, 3243, 3238, 1998, 2001, 2001, 2001, 1996, 2002, - 2002, 2002, 3238, 2002, 1505, 3245, 2002, 2004, 2004, 2004, - 3239, 2004, 2001, 3246, 2004, 2008, 2008, 2008, 2011, 2011, - 2011, 2013, 2013, 2013, 2014, 2014, 2014, 2016, 2016, 2016, - 3265, 1996, 3240, 2008, 3247, 3243, 2011, 3244, 2013, 2018, - 2018, 2018, 2014, 2018, 2016, 3239, 2018, 2022, 2022, 2022, - - 2025, 2025, 2025, 2027, 2027, 2027, 2028, 2028, 2028, 3246, - 2028, 3262, 1503, 2028, 3265, 2022, 3257, 3240, 2025, 3247, - 2027, 3248, 3253, 2016, 2029, 2029, 2029, 2030, 2030, 2030, - 3244, 2030, 2011, 1502, 2030, 2014, 2032, 2032, 2032, 3250, - 3262, 2029, 2034, 2034, 2034, 2035, 2035, 2035, 2036, 2036, - 2036, 2037, 2037, 2037, 2032, 2037, 3248, 3254, 2037, 3253, - 2034, 1501, 3257, 2035, 3255, 2036, 2038, 2038, 2038, 2039, - 2039, 2039, 3250, 2039, 3256, 3251, 2039, 2040, 2040, 2040, - 2045, 2045, 2045, 2038, 3251, 2047, 2047, 2047, 3252, 2047, - 3290, 2034, 2047, 3259, 3254, 2040, 3271, 3252, 2045, 2050, - - 2050, 2050, 2032, 2051, 2051, 2051, 3255, 2052, 2052, 2052, - 2035, 2052, 3260, 1500, 2052, 1499, 3256, 2050, 2055, 2055, - 2055, 2051, 2061, 2061, 2061, 2062, 2062, 2062, 3263, 2062, - 3259, 3264, 2062, 2063, 2063, 2063, 2055, 3263, 3290, 2061, - 3264, 3293, 2040, 3271, 1498, 2045, 2064, 2064, 2064, 3260, - 2050, 2063, 2069, 2069, 2069, 3293, 2051, 2070, 2070, 2070, - 2071, 2071, 2071, 2073, 2073, 2073, 2077, 2077, 2077, 2078, - 2078, 2078, 2079, 2079, 2079, 2080, 2080, 2080, 2082, 2082, - 2082, 2083, 2083, 2083, 2084, 2084, 2084, 2085, 2085, 2085, - 2086, 2086, 2086, 2087, 2087, 2087, 3258, 2063, 2089, 2089, - - 2089, 2092, 2092, 2092, 1497, 2095, 2095, 2095, 2096, 2096, - 2096, 3285, 2096, 3266, 1496, 2096, 2089, 1495, 1493, 2092, - 3285, 2080, 2095, 2098, 2098, 2098, 2099, 2099, 2099, 2100, - 2100, 2100, 3269, 2100, 1492, 1490, 2100, 2111, 2111, 2111, - 3269, 2098, 3258, 2099, 2112, 2112, 2112, 3266, 3270, 2089, - 2113, 2113, 2113, 3273, 2113, 2111, 3270, 2113, 2114, 2114, - 2114, 2112, 2119, 2119, 2119, 2120, 2120, 2120, 2121, 2121, - 2121, 2122, 2122, 2122, 3272, 2122, 3267, 1489, 2122, 2123, - 2123, 2123, 2124, 2124, 2124, 2121, 2111, 2125, 2125, 2125, - 3273, 2125, 3268, 3283, 2125, 1487, 1484, 2123, 3279, 2124, - - 2126, 2126, 2126, 3274, 2126, 3275, 3277, 2126, 2129, 2129, - 2129, 2120, 3276, 2130, 2130, 2130, 2132, 2132, 2132, 3280, - 2132, 3272, 3267, 2132, 1483, 3283, 2129, 2135, 2135, 2135, - 2123, 2130, 2142, 2142, 2142, 2144, 2144, 2144, 3268, 2144, - 3274, 3277, 2144, 3284, 3279, 2135, 3275, 2150, 2150, 2150, - 2142, 2150, 3287, 3276, 2150, 2153, 2153, 2153, 1482, 2129, - 2154, 2154, 2154, 3278, 2154, 3280, 3281, 2154, 3282, 2158, - 2158, 2158, 2153, 2158, 1481, 3284, 2158, 2161, 2161, 2161, - 2135, 2162, 2162, 2162, 3287, 2162, 1480, 2142, 2162, 2165, - 2165, 2165, 2166, 2166, 2166, 2161, 2166, 1479, 3278, 2166, - - 2167, 2167, 2167, 3281, 2167, 3282, 2165, 2167, 2170, 2170, - 2170, 2172, 2172, 2172, 1478, 2172, 3286, 1476, 2172, 2178, - 2178, 2178, 2180, 2180, 2180, 3286, 2170, 2181, 2181, 2181, - 1475, 2181, 1474, 1473, 2181, 1464, 3288, 2178, 1449, 2180, - 1448, 2161, 2182, 2182, 2182, 2184, 2184, 2184, 2185, 2185, - 2185, 1443, 2185, 1442, 1441, 2185, 3291, 2192, 2192, 2192, - 2182, 1439, 2184, 2195, 2195, 2195, 3292, 2195, 3288, 1432, - 2195, 2202, 2202, 2202, 2170, 2192, 2198, 2198, 2198, 1431, - 2198, 1413, 1408, 2198, 1405, 2204, 2204, 2204, 3291, 2202, - 2205, 2205, 2205, 2206, 2206, 2206, 1404, 2206, 3292, 1401, - - 2206, 1396, 2182, 2204, 1387, 2209, 2209, 2209, 2205, 2209, - 1386, 1385, 2209, 2212, 2212, 2212, 1381, 2213, 2213, 2213, - 1376, 1372, 2202, 2214, 2214, 2214, 2205, 2215, 2215, 2215, - 1364, 2212, 1359, 2212, 2213, 2216, 2216, 2216, 1358, 1352, - 2214, 2217, 2217, 2217, 2215, 2219, 2219, 2219, 2220, 2220, - 2220, 2204, 2216, 2221, 2221, 2221, 2224, 2224, 2224, 2217, - 2225, 2225, 2225, 2219, 2225, 1351, 2220, 2225, 2228, 2228, - 2228, 2221, 1350, 1349, 2214, 2229, 2229, 2229, 2230, 2230, - 2230, 2231, 2231, 2231, 1344, 1343, 2228, 2234, 2234, 2234, - 1342, 2215, 1341, 1328, 2216, 2235, 2235, 2235, 2237, 2237, - - 2237, 2238, 2238, 2238, 1327, 2219, 2217, 2239, 2239, 2239, - 2240, 2240, 2240, 2241, 2241, 2241, 2242, 2242, 2242, 2245, - 2245, 2245, 2246, 2246, 2246, 1326, 1325, 2228, 2247, 2247, - 2247, 2248, 2248, 2248, 2250, 2250, 2250, 2253, 2253, 2253, - 2254, 2254, 2254, 1324, 2254, 1323, 1322, 2254, 2257, 2257, - 2257, 1321, 2250, 1320, 2253, 2258, 2258, 2258, 1310, 2260, - 2260, 2260, 1309, 2260, 1308, 2257, 2260, 2273, 2273, 2273, - 2274, 2274, 2274, 2258, 2274, 2275, 2275, 2274, 2275, 1307, - 2276, 2276, 1290, 2276, 1289, 2273, 2275, 1284, 1283, 2275, - 1278, 2276, 1277, 2275, 2276, 2277, 2277, 2277, 2276, 2278, - - 2278, 2278, 2282, 2282, 2282, 2284, 2284, 2284, 1258, 2284, - 1254, 1248, 2284, 1244, 2257, 2287, 2287, 2287, 2288, 2288, - 2288, 1243, 2288, 1242, 1241, 2288, 1240, 1239, 2273, 2291, - 2291, 2291, 1238, 2287, 2292, 2292, 2292, 2300, 2300, 2300, - 2301, 2301, 2301, 1236, 2306, 2306, 2306, 2291, 2306, 1235, - 1233, 2306, 2292, 2309, 2309, 2309, 1232, 1231, 2301, 1226, - 1218, 2287, 2312, 2312, 2312, 2313, 2313, 2313, 1216, 2313, - 2309, 1211, 2313, 2316, 2316, 2316, 2321, 2321, 2321, 1209, - 2312, 2323, 2323, 2323, 1200, 2292, 2324, 2324, 2324, 1195, - 2324, 2316, 1184, 2324, 2321, 2327, 2327, 2327, 2323, 1182, - - 2301, 2328, 2328, 2328, 2329, 2329, 2329, 1181, 2329, 1180, - 1179, 2329, 1177, 2327, 2332, 2332, 2332, 1176, 2328, 2333, - 2333, 2333, 2338, 2338, 2338, 2340, 2340, 2340, 2343, 2343, - 2343, 2332, 2342, 2342, 2342, 1175, 2333, 1174, 1173, 2338, - 2344, 2344, 2344, 1172, 1170, 2343, 2327, 2328, 1169, 1168, - 2342, 1167, 2345, 2345, 2345, 2347, 2347, 2347, 2344, 2346, - 2346, 2346, 1166, 1165, 2348, 2348, 2348, 1164, 2348, 2332, - 2345, 2348, 2347, 2338, 2349, 2349, 2349, 2346, 1162, 1161, - 2333, 2350, 2350, 2350, 2351, 2351, 2351, 2352, 2352, 2352, - 1160, 2349, 2353, 2353, 2353, 1159, 2346, 1158, 2350, 1157, - - 2344, 2351, 2354, 2354, 2354, 2352, 2355, 2355, 2355, 2357, - 2357, 2357, 1156, 2345, 2360, 2360, 2360, 2362, 2362, 2362, - 2354, 2361, 2361, 2361, 2355, 1150, 1149, 2357, 2363, 2363, - 2363, 1148, 2350, 1145, 1144, 2351, 2366, 2366, 2366, 2361, - 2367, 2367, 2367, 2368, 2368, 2368, 2369, 2369, 2369, 2373, - 2373, 2373, 2376, 2376, 2376, 2377, 2377, 2377, 1143, 2377, - 1141, 1137, 2377, 2389, 2389, 2389, 1134, 2373, 2354, 2376, - 1125, 2357, 2402, 2402, 2402, 2405, 2405, 2405, 2407, 2407, - 2407, 2389, 2408, 2408, 2408, 2410, 2410, 2410, 2417, 2417, - 2417, 2418, 2418, 2418, 1124, 1121, 2407, 2419, 2419, 2419, - - 2408, 1120, 1119, 2410, 1118, 2417, 1117, 2425, 2425, 2425, - 2426, 2426, 2426, 1103, 2426, 2419, 1096, 2426, 2428, 2428, - 2428, 1088, 1087, 2389, 2425, 2429, 2429, 2429, 2431, 2431, - 2431, 2435, 2435, 2435, 1086, 2428, 2437, 2437, 2437, 1083, - 2439, 2439, 2439, 2429, 2407, 1080, 2431, 1077, 2435, 2440, - 2440, 2440, 1072, 2437, 2419, 2438, 2438, 2438, 2439, 2438, - 1069, 1068, 2438, 2441, 2441, 2441, 2440, 2441, 1064, 1062, - 2441, 2442, 2442, 2442, 2443, 2443, 2443, 2444, 2444, 2444, - 2449, 2449, 2449, 2451, 2451, 2451, 1048, 1047, 2442, 1046, - 1045, 2443, 1044, 1043, 2444, 1042, 1041, 2449, 2453, 2453, - - 2453, 2455, 2455, 2455, 2456, 2456, 2456, 1040, 2456, 1036, - 1032, 2456, 2457, 2457, 2457, 1025, 2453, 1022, 2455, 2458, - 2458, 2458, 1021, 2442, 2459, 2459, 2459, 2460, 2460, 2460, - 2457, 2460, 2443, 1020, 2460, 2444, 1017, 2458, 2463, 2463, - 2463, 1016, 2459, 2464, 2464, 2464, 1013, 2464, 1012, 1011, - 2464, 2465, 2465, 2465, 1008, 2463, 2466, 2466, 2466, 2467, - 2467, 2467, 2469, 2469, 2469, 2470, 2470, 2470, 2465, 2474, - 2474, 2474, 1007, 2466, 2478, 2478, 2478, 2467, 2482, 2482, - 2482, 1004, 999, 2470, 996, 993, 2458, 2474, 2459, 2483, - 2483, 2483, 992, 2483, 989, 2482, 2483, 2497, 2497, 2497, - - 2514, 2514, 2514, 2516, 2516, 2516, 2517, 2517, 2517, 2520, - 2520, 2520, 2523, 2523, 2523, 2497, 2524, 2524, 2524, 988, - 2524, 2516, 987, 2524, 2517, 986, 2520, 985, 983, 2523, - 2525, 2525, 2525, 2529, 2529, 2529, 2531, 2531, 2531, 982, - 2531, 981, 980, 2531, 2535, 2535, 2535, 979, 2525, 978, - 2529, 2536, 2536, 2536, 977, 2536, 976, 2497, 2536, 972, - 967, 2535, 2538, 2538, 2538, 2539, 2539, 2539, 2540, 2540, - 2540, 966, 2540, 965, 2516, 2540, 2541, 2541, 2541, 2538, - 962, 961, 2539, 2542, 2542, 2542, 960, 2542, 958, 954, - 2542, 950, 949, 2541, 2545, 2545, 2545, 2547, 2547, 2547, - - 946, 2547, 943, 942, 2547, 2550, 2550, 2550, 2551, 2551, - 2551, 941, 2545, 2552, 2552, 2552, 2555, 2555, 2555, 2556, - 2556, 2556, 2550, 2556, 940, 2551, 2556, 2557, 2557, 2557, - 2552, 939, 938, 2555, 2558, 2558, 2558, 937, 2559, 2559, - 2559, 935, 2559, 934, 2557, 2559, 2562, 2562, 2562, 933, - 932, 2558, 2564, 2564, 2564, 2565, 2565, 2565, 931, 2551, - 2550, 2569, 2569, 2569, 2562, 2566, 2566, 2566, 2552, 2566, - 2564, 930, 2566, 2565, 929, 2570, 2570, 2570, 2569, 2570, - 928, 927, 2570, 2571, 2571, 2571, 2572, 2572, 2572, 926, - 2572, 925, 924, 2572, 2573, 2573, 2573, 2579, 2579, 2579, - - 2571, 923, 2583, 2583, 2583, 922, 2584, 2584, 2584, 921, - 2584, 920, 2573, 2584, 919, 918, 2565, 917, 2564, 2583, - 2602, 2602, 2602, 2618, 2618, 2618, 2620, 2620, 2620, 2621, - 2621, 2621, 2622, 2622, 2622, 2623, 2623, 2623, 2602, 2623, - 916, 915, 2623, 911, 2620, 910, 2621, 908, 907, 2622, - 2624, 2624, 2624, 906, 2624, 905, 904, 2624, 2627, 2627, - 2627, 2631, 2631, 2631, 2632, 2632, 2632, 900, 2634, 2634, - 2634, 2602, 2675, 2675, 2675, 2621, 2627, 898, 2631, 897, - 896, 2632, 2633, 2633, 2633, 2634, 2633, 895, 2620, 2633, - 2636, 2636, 2636, 891, 2636, 887, 886, 2636, 2640, 2640, - - 2640, 2641, 2641, 2641, 883, 2641, 882, 881, 2641, 2642, - 2642, 2642, 880, 2642, 879, 2640, 2642, 2645, 2645, 2645, - 2646, 2646, 2646, 878, 2646, 877, 874, 2646, 2647, 2647, - 2647, 2648, 2648, 2648, 2645, 2649, 2649, 2649, 873, 2650, - 2650, 2650, 872, 2650, 871, 2647, 2650, 868, 2648, 2653, - 2653, 2653, 2649, 2654, 2654, 2654, 867, 2654, 866, 863, - 2654, 2655, 2655, 2655, 861, 858, 2653, 2656, 2656, 2656, - 857, 2656, 856, 855, 2656, 2663, 2663, 2663, 2655, 2664, - 2664, 2664, 854, 851, 2649, 850, 2647, 2665, 2665, 2665, - 849, 2665, 848, 2663, 2665, 847, 844, 2664, 2668, 2668, - - 2668, 843, 2668, 842, 841, 2668, 2673, 2673, 2673, 2676, - 2676, 2676, 2679, 2679, 2679, 839, 2679, 836, 835, 2679, - 2690, 2690, 2690, 2673, 2673, 833, 2663, 2699, 2699, 2699, - 2715, 2715, 2715, 2716, 2716, 2716, 830, 2690, 2717, 2717, - 2717, 2718, 2718, 2718, 828, 2699, 2664, 2719, 2719, 2719, - 825, 2719, 824, 823, 2719, 822, 2717, 820, 2718, 2721, - 2721, 2721, 819, 2721, 818, 815, 2721, 2726, 2726, 2726, - 2727, 2727, 2727, 814, 2727, 813, 2699, 2727, 2728, 2728, - 2728, 812, 2728, 811, 2726, 2728, 2731, 2731, 2731, 2717, - 2732, 2732, 2732, 810, 2732, 805, 804, 2732, 2735, 2735, - - 2735, 803, 2735, 2731, 802, 2735, 2738, 2738, 2738, 801, - 2738, 800, 799, 2738, 2741, 2741, 2741, 2742, 2742, 2742, - 2743, 2743, 2743, 798, 2743, 797, 796, 2743, 2744, 2744, - 2744, 2741, 795, 793, 2742, 2745, 2745, 2745, 791, 2745, - 790, 787, 2745, 784, 781, 2744, 2748, 2748, 2748, 780, - 2748, 776, 775, 2748, 2757, 2757, 2757, 2758, 2758, 2758, - 2764, 2764, 2764, 774, 771, 2741, 2765, 2765, 2765, 2766, - 2766, 2766, 2757, 2766, 768, 2758, 2766, 2764, 2764, 2767, - 2767, 2767, 767, 2765, 2765, 766, 763, 2766, 2768, 2768, - 2768, 2769, 2769, 2769, 2770, 2770, 2770, 762, 758, 2744, - - 2779, 2779, 2779, 2780, 2780, 2780, 757, 2780, 755, 752, - 2780, 2789, 2789, 2789, 2804, 2804, 2804, 2779, 2805, 2805, - 2805, 751, 750, 2758, 2806, 2806, 2806, 748, 737, 2789, - 2807, 2807, 2807, 735, 2807, 732, 731, 2807, 730, 2813, - 2813, 2813, 2806, 2813, 728, 727, 2813, 2816, 2816, 2816, - 726, 2816, 722, 721, 2816, 2819, 2819, 2819, 2821, 2821, - 2821, 2822, 2822, 2822, 720, 2822, 719, 716, 2822, 2825, - 2825, 2825, 2819, 715, 714, 2821, 713, 2789, 2840, 2840, - 2840, 2842, 2842, 2842, 712, 711, 2825, 2848, 2848, 2848, - 2849, 2849, 2849, 710, 2849, 708, 2840, 2849, 705, 2842, - - 2853, 2853, 2853, 704, 2848, 2848, 702, 700, 2849, 2850, - 2850, 2850, 697, 2850, 696, 690, 2850, 2854, 2854, 2854, - 2855, 2855, 2855, 688, 2864, 2864, 2864, 2850, 2864, 686, - 683, 2864, 2842, 2851, 2851, 2851, 2851, 2851, 2851, 2851, - 2851, 2851, 682, 678, 2851, 2873, 2873, 2873, 677, 2851, - 2851, 2851, 2851, 2851, 2884, 2884, 2884, 2885, 2885, 2885, - 2890, 2890, 2890, 2873, 2891, 2891, 2891, 676, 2891, 675, - 672, 2891, 2893, 2893, 2893, 2885, 671, 2890, 2851, 2851, - 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2893, - 670, 2852, 2895, 2895, 2895, 669, 2852, 2852, 2852, 2852, - - 2852, 2894, 2894, 2894, 666, 2894, 665, 664, 2894, 2895, - 2896, 2896, 2896, 663, 2896, 662, 656, 2896, 2909, 2909, - 2909, 2934, 2934, 2934, 655, 2852, 2852, 2915, 2915, 2915, - 653, 2915, 647, 646, 2915, 642, 2909, 635, 631, 2934, - 2969, 2969, 2969, 625, 621, 2915, 2918, 2918, 2918, 2918, - 2918, 2918, 2918, 2918, 2918, 613, 612, 2918, 2969, 611, - 610, 609, 2918, 2918, 2918, 2918, 2918, 2947, 2947, 2947, - 605, 2947, 598, 597, 2947, 2951, 2951, 2951, 596, 2951, - 592, 585, 2951, 2954, 2954, 2954, 584, 2954, 580, 574, - 2954, 2918, 2918, 2919, 2919, 2919, 2919, 2919, 2919, 2919, - - 2919, 2919, 573, 569, 2919, 2981, 2981, 2981, 561, 2919, - 2919, 2919, 2919, 2919, 2998, 2998, 2998, 2999, 2999, 2999, - 3000, 3000, 3000, 2981, 2981, 3005, 3005, 3005, 3016, 3016, - 3016, 2998, 560, 556, 2999, 547, 543, 3000, 2919, 2919, - 535, 534, 3005, 3020, 3020, 3020, 3016, 3031, 3031, 3031, - 3032, 3032, 3032, 533, 3032, 529, 523, 3032, 3033, 3033, - 3033, 3020, 522, 521, 3031, 3034, 3034, 3034, 517, 3034, - 511, 510, 3034, 506, 500, 3033, 3035, 3035, 3035, 3036, - 3036, 3036, 499, 3036, 498, 497, 3036, 3043, 3043, 3043, - 3053, 3053, 3053, 3035, 3020, 3044, 3044, 3044, 496, 3044, - - 495, 494, 3044, 490, 3043, 3063, 3063, 3063, 3053, 3063, - 484, 483, 3063, 3066, 3066, 3066, 481, 3066, 480, 479, - 3066, 3069, 3069, 3069, 475, 3069, 465, 3053, 3069, 3078, - 3078, 3078, 464, 3078, 462, 458, 3078, 3185, 3185, 3185, - 3194, 3194, 3194, 452, 3194, 451, 450, 3194, 3295, 3295, - 3295, 3296, 3296, 3296, 446, 3185, 440, 436, 3194, 428, - 427, 426, 425, 424, 420, 414, 3295, 413, 409, 3296, - 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3300, - 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3301, 3301, - 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3302, 3302, 3302, - - 3302, 3302, 3302, 3302, 3302, 3302, 3303, 3303, 3303, 3303, - 3303, 3303, 3303, 3303, 3303, 3304, 3304, 3304, 3304, 3304, - 3304, 3304, 3304, 3304, 3305, 3305, 3305, 3305, 3305, 3305, - 3305, 3305, 3305, 3306, 3306, 3306, 3306, 3306, 3306, 3306, - 3306, 3306, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3308, 3308, 3308, 3308, 3308, 3308, 3308, 3308, 3308, - 3309, 3309, 3309, 3309, 3309, 3309, 3309, 3309, 3309, 3310, - 3310, 3310, 3310, 3310, 3310, 3310, 3310, 3310, 3311, 3311, - 3311, 3311, 3311, 3311, 3311, 3311, 3311, 3312, 3312, 3312, - 3312, 3312, 3312, 3312, 3312, 3312, 3313, 3313, 3313, 3313, - - 3313, 3313, 3313, 3313, 3313, 3314, 3314, 3314, 3314, 3314, - 3314, 3314, 3314, 3314, 3315, 3315, 3315, 3315, 3315, 3315, - 3315, 3315, 3315, 3316, 3316, 3316, 3316, 3316, 3316, 3316, - 3316, 3316, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, - 3317, 3318, 3318, 3318, 3318, 3318, 3318, 3318, 3318, 3318, - 3319, 3319, 3319, 3319, 3319, 3319, 3319, 3319, 3319, 3320, - 3320, 3320, 3320, 3320, 3320, 3320, 3320, 3320, 3321, 3321, - 3321, 3321, 3321, 3321, 3321, 3321, 3321, 3322, 3322, 3322, - 3322, 3322, 3322, 3322, 3322, 3322, 3323, 3323, 3323, 3323, - 3323, 3323, 3323, 3323, 3323, 3324, 3324, 3324, 3324, 3324, - - 3324, 3324, 3324, 3324, 3325, 3325, 3325, 3325, 3325, 3325, - 3325, 3325, 3325, 3326, 3326, 3326, 3326, 3326, 3326, 3326, - 3326, 3326, 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3327, - 3327, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, - 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3330, - 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3331, 3331, - 3331, 3331, 3331, 3331, 3331, 3331, 3331, 3332, 3332, 3332, - 3332, 3332, 3332, 3332, 3332, 3332, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3334, 3334, 3334, 3334, 3334, - 3334, 3334, 3334, 3334, 3335, 3335, 3335, 3335, 3335, 3335, - - 3335, 3335, 3335, 3336, 3336, 3336, 3336, 3336, 3336, 3336, - 3336, 3336, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, - 3337, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, - 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3340, - 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3341, 3341, - 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3342, 3342, 3342, - 3342, 3342, 3342, 3342, 3342, 3342, 3343, 3343, 3343, 3343, - 3343, 3343, 3343, 3343, 3343, 3344, 3344, 3344, 3344, 3344, - 3344, 3344, 3344, 3344, 3345, 3345, 3345, 3345, 3345, 3345, - 3345, 3345, 3345, 3346, 3346, 3346, 3346, 3346, 3346, 3346, - - 3346, 3346, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, - 3347, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, - 3349, 3349, 3349, 3349, 3349, 3349, 3349, 3349, 3349, 3350, - 3350, 3350, 3350, 3350, 3350, 3350, 3350, 3350, 3351, 3351, - 3351, 3351, 3351, 3351, 3351, 3351, 3351, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3354, 3354, 3354, 3354, 3354, - 3354, 3354, 3354, 3354, 3355, 3355, 3355, 3355, 3355, 3355, - 3355, 3355, 3355, 3356, 3356, 3356, 3356, 3356, 3356, 3356, - 3356, 3356, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, - - 3357, 3358, 3358, 3358, 3358, 3358, 3358, 3358, 3358, 3358, - 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3360, - 3360, 3360, 403, 402, 398, 3360, 3361, 3361, 3361, 391, - 390, 389, 3361, 3362, 3362, 3362, 385, 378, 377, 3362, - 3363, 3363, 3363, 376, 375, 371, 3363, 3364, 3364, 3364, - 362, 356, 352, 3364, 3365, 3365, 3365, 351, 347, 341, - 3365, 3366, 3366, 3366, 340, 339, 335, 3366, 3367, 3367, - 3367, 328, 326, 325, 3367, 3368, 3368, 3368, 321, 318, - 316, 3368, 3369, 3369, 3369, 315, 314, 310, 3369, 3370, - 3370, 3370, 306, 303, 299, 3370, 3371, 3371, 3371, 296, - - 295, 287, 3371, 3372, 3372, 3372, 283, 279, 278, 3372, - 3373, 3373, 3373, 277, 271, 270, 3373, 3374, 3374, 3374, - 268, 265, 253, 3374, 3375, 3375, 3375, 0, 0, 0, - 3375, 3376, 3376, 3376, 0, 0, 0, 3376, 3377, 3377, + 149, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 1765, 159, 159, 159, + 159, 159, 197, 197, 197, 198, 198, 198, 199, 199, + 199, 1772, 200, 200, 200, 201, 201, 201, 197, 1784, + 1785, 198, 1793, 1796, 199, 1806, 159, 159, 200, 1810, + 159, 201, 909, 909, 909, 1814, 909, 159, 1815, 1819, + 159, 921, 921, 921, 159, 1820, 159, 159, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + + 160, 160, 160, 1821, 160, 160, 160, 160, 160, 202, + 202, 202, 203, 203, 203, 204, 204, 204, 1822, 207, + 207, 207, 208, 208, 208, 202, 1831, 1835, 203, 1838, + 1840, 204, 1842, 160, 160, 207, 1843, 160, 208, 955, + 955, 955, 1845, 955, 160, 921, 955, 160, 943, 943, + 943, 160, 1846, 160, 160, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 1847, 163, 163, 163, 163, 163, 211, 211, 211, 212, + 212, 212, 213, 213, 213, 1850, 214, 214, 214, 708, + 708, 708, 211, 1852, 1854, 212, 1859, 1865, 213, 1040, + + 163, 163, 214, 163, 163, 163, 708, 1869, 1870, 1040, + 1871, 163, 943, 1873, 163, 1885, 1040, 1888, 163, 1882, + 1881, 163, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 1881, 164, 164, + 164, 164, 164, 215, 215, 215, 216, 216, 216, 217, + 217, 217, 1889, 218, 218, 218, 716, 716, 716, 215, + 1890, 1882, 216, 1892, 1891, 217, 1893, 164, 164, 218, + 164, 164, 164, 716, 1895, 963, 963, 963, 164, 963, + 1891, 164, 963, 1896, 1897, 164, 1883, 1899, 164, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + + 167, 167, 167, 167, 1900, 167, 167, 167, 167, 167, + 221, 221, 221, 222, 222, 222, 223, 223, 223, 1883, + 224, 224, 224, 732, 732, 732, 221, 1901, 1905, 222, + 1907, 1910, 223, 1911, 167, 167, 224, 1912, 1913, 167, + 732, 1185, 1185, 1185, 1915, 167, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 1917, 168, 168, 168, 168, 168, 225, 225, 225, + 226, 226, 226, 227, 227, 227, 1918, 228, 228, 228, + 756, 756, 756, 225, 1920, 1922, 226, 1925, 1926, 227, + 1928, 168, 168, 228, 1929, 1930, 168, 756, 1241, 1241, + + 1241, 1932, 168, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 1938, 171, + 171, 171, 171, 171, 231, 231, 231, 232, 232, 232, + 233, 233, 233, 1927, 234, 234, 234, 235, 235, 235, + 231, 1927, 1939, 232, 1940, 1941, 233, 1944, 171, 171, + 234, 1960, 171, 235, 978, 978, 978, 1961, 978, 171, + 1940, 978, 171, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 1966, 172, + 172, 172, 172, 172, 236, 236, 236, 237, 237, 237, + 238, 238, 238, 1931, 241, 241, 241, 242, 242, 242, + + 236, 1931, 1945, 237, 1946, 1967, 238, 1968, 172, 172, + 241, 1972, 172, 242, 982, 982, 982, 1974, 1945, 172, + 1946, 1980, 172, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 1981, 175, + 175, 175, 175, 175, 245, 245, 245, 246, 246, 246, + 247, 247, 247, 1982, 248, 248, 248, 249, 249, 249, + 245, 1989, 1990, 246, 1991, 2004, 247, 2010, 175, 175, + 248, 2014, 175, 249, 991, 991, 991, 2017, 982, 175, + 2019, 2022, 175, 1492, 1492, 1492, 1493, 1493, 1493, 175, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + + 176, 176, 176, 176, 176, 2024, 176, 176, 176, 176, + 176, 250, 250, 250, 251, 251, 251, 252, 252, 252, + 2026, 255, 255, 255, 256, 256, 256, 250, 2027, 2028, + 251, 2031, 1493, 252, 2033, 176, 176, 255, 991, 176, + 256, 298, 2038, 364, 370, 2040, 176, 2048, 2049, 176, + 2050, 298, 2051, 364, 2053, 2066, 176, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 370, 185, 185, 185, 185, 185, 2067, 2072, + 298, 364, 2073, 763, 763, 763, 298, 2074, 370, 768, + 768, 768, 2064, 298, 2075, 364, 2079, 298, 2064, 364, + + 763, 2066, 185, 185, 2081, 2082, 768, 2083, 185, 998, + 998, 998, 2088, 998, 2095, 2097, 998, 1495, 1495, 1495, + 1498, 1498, 1498, 185, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 2098, + 186, 186, 186, 186, 186, 780, 780, 780, 792, 792, + 792, 793, 793, 793, 799, 799, 799, 801, 801, 801, + 2101, 2104, 780, 1495, 2108, 792, 2109, 2110, 793, 186, + 186, 799, 2111, 2112, 801, 186, 1005, 1005, 1005, 2113, + 1005, 2114, 2115, 1005, 1501, 1501, 1501, 1511, 1511, 1511, + 186, 195, 195, 195, 195, 195, 195, 195, 195, 195, + + 195, 195, 195, 195, 195, 195, 2116, 195, 195, 195, + 195, 195, 815, 815, 815, 816, 816, 816, 828, 828, + 828, 836, 836, 836, 841, 841, 841, 2117, 2122, 815, + 2123, 2124, 816, 2125, 2143, 828, 195, 195, 836, 2144, + 2147, 841, 195, 2145, 2146, 195, 1010, 1010, 1010, 2148, + 1010, 2145, 2146, 1010, 1547, 1547, 1547, 195, 196, 196, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, + 196, 196, 196, 2150, 196, 196, 196, 196, 196, 847, + 847, 847, 869, 869, 869, 897, 897, 897, 901, 901, + 901, 2065, 919, 919, 919, 2154, 847, 2155, 2156, 869, + + 2162, 2163, 897, 196, 196, 901, 954, 954, 954, 196, + 919, 2164, 196, 1022, 1022, 1022, 2178, 1022, 2182, 2183, + 1022, 2184, 2065, 954, 196, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 2186, 205, 205, 205, 205, 205, 920, 920, 920, 951, + 951, 951, 2190, 2193, 952, 952, 952, 958, 958, 958, + 959, 959, 959, 1746, 920, 2194, 2195, 951, 2197, 1746, + 205, 205, 952, 1746, 2195, 958, 205, 1746, 959, 2198, + 2201, 205, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 2208, 206, 206, + + 206, 206, 206, 2210, 920, 962, 962, 962, 964, 964, + 964, 970, 970, 970, 952, 966, 966, 966, 971, 971, + 971, 2225, 962, 2196, 959, 964, 2239, 206, 206, 970, + 2240, 2196, 966, 206, 2243, 2230, 971, 2250, 206, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 2251, 209, 209, 209, 209, 209, + 975, 975, 975, 2256, 2258, 971, 2270, 2271, 976, 976, + 976, 977, 977, 977, 980, 980, 980, 1747, 975, 997, + 997, 997, 2230, 1747, 209, 209, 976, 1747, 977, 2272, + 209, 1747, 980, 1034, 1034, 1034, 997, 1034, 2273, 2274, + + 1034, 1550, 1550, 1550, 2275, 209, 210, 210, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, + 210, 2276, 210, 210, 210, 210, 210, 981, 981, 981, + 2277, 2278, 976, 2279, 2286, 1001, 1001, 1001, 1002, 1002, + 1002, 1004, 1004, 1004, 2287, 981, 2288, 1007, 1007, 1007, + 2290, 210, 210, 1001, 2300, 2301, 1002, 210, 1004, 1036, + 1036, 1036, 2302, 1036, 981, 1007, 1036, 2303, 1548, 1548, + 1548, 2304, 210, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 2229, 219, + 219, 219, 219, 219, 2305, 1008, 1008, 1008, 1009, 1009, + + 1009, 1701, 1701, 1701, 1002, 1012, 1012, 1012, 1013, 1013, + 1013, 2306, 2309, 1008, 1548, 1009, 2310, 2311, 219, 219, + 1016, 1016, 1016, 1012, 219, 2317, 1013, 219, 1042, 1042, + 1042, 2229, 1042, 2318, 2324, 1042, 2325, 2326, 1016, 219, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 2327, 220, 220, 220, 220, + 220, 1008, 2341, 1017, 1017, 1017, 1021, 1021, 1021, 1013, + 1025, 1025, 1025, 2342, 1026, 1026, 1026, 1030, 1030, 1030, + 2312, 1017, 2343, 1021, 2344, 220, 220, 2346, 1025, 2348, + 2312, 220, 1026, 2371, 220, 1030, 1045, 1045, 1045, 2372, + + 1045, 2377, 2378, 1045, 2379, 2366, 220, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 2382, 229, 229, 229, 229, 229, 1017, 1033, + 1033, 1033, 1035, 1035, 1035, 1026, 1031, 1031, 1031, 1037, + 1037, 1037, 2366, 1038, 1038, 1038, 1033, 2385, 2386, 1035, + 2387, 2388, 229, 229, 1031, 2389, 2390, 1037, 2391, 2392, + 229, 1038, 229, 2393, 2394, 229, 1704, 1704, 1704, 229, + 1706, 1706, 1706, 229, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 2365, + 230, 230, 230, 230, 230, 1041, 1041, 1041, 1031, 1044, + + 1044, 1044, 2395, 2397, 1038, 1046, 1046, 1046, 1056, 1056, + 1056, 2398, 1041, 1057, 1057, 1057, 1044, 2400, 2401, 230, + 230, 2365, 1046, 1708, 1708, 1708, 1056, 230, 2402, 230, + 2403, 1057, 230, 1711, 1711, 1711, 230, 1721, 1721, 1721, + 230, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 2405, 239, 239, 239, + 239, 239, 1058, 1058, 1058, 1059, 1059, 1059, 2406, 1059, + 2408, 1057, 1059, 1060, 1060, 1060, 1061, 1061, 1061, 1058, + 1061, 2409, 2411, 1061, 2416, 2417, 239, 239, 2399, 2418, + 1060, 1062, 1062, 1062, 1073, 1073, 1073, 2399, 1073, 2420, + + 2425, 1073, 1081, 1081, 1081, 2426, 1081, 2427, 1062, 1081, + 239, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 2428, 240, 240, 240, + 240, 240, 1072, 1072, 1072, 1086, 1086, 1086, 2429, 1086, + 2432, 2438, 1086, 2439, 2441, 1063, 1063, 1063, 2450, 1072, + 1064, 1064, 1064, 1065, 1065, 1065, 240, 240, 1066, 1066, + 1066, 2452, 1063, 2455, 1092, 1092, 1092, 1064, 1092, 2404, + 1065, 1092, 1112, 1112, 1112, 1066, 1112, 2457, 2404, 1112, + 240, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 1063, 243, 243, 243, + + 243, 243, 1064, 1067, 1067, 1067, 2481, 2482, 1065, 2484, + 1066, 2485, 1068, 1068, 1068, 1074, 1074, 1074, 1077, 1077, + 1077, 1067, 1713, 1713, 1713, 2486, 243, 243, 2491, 2477, + 1068, 2492, 1074, 1549, 1549, 1549, 1077, 243, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 2493, 244, 244, 244, 244, 244, 1068, + 1080, 1080, 1080, 1082, 1082, 1082, 2477, 1078, 1078, 1078, + 1083, 1083, 1083, 1085, 1085, 1085, 2476, 1080, 2494, 1549, + 2495, 1082, 2478, 244, 244, 1078, 1713, 2496, 1083, 2497, + 1085, 1755, 1755, 1755, 244, 253, 253, 253, 253, 253, + + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 2498, 253, 253, 253, 253, 253, 2476, 2499, 1078, 1088, + 1088, 1088, 1091, 1091, 1091, 2478, 2500, 1096, 1096, 1096, + 2501, 1083, 1097, 1097, 1097, 2503, 2504, 1088, 2505, 1091, + 253, 253, 1089, 1089, 1089, 1096, 1098, 1098, 1098, 2506, + 1097, 253, 1136, 1136, 1136, 2507, 1136, 2508, 2509, 1136, + 1089, 2510, 2511, 1098, 253, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 2512, 254, 254, 254, 254, 254, 2513, 1097, 2514, 1089, + 1099, 1099, 1099, 2515, 2516, 1100, 1100, 1100, 1101, 1101, + + 1101, 1102, 1102, 1102, 1108, 1108, 1108, 1099, 2518, 2522, + 254, 254, 1100, 1104, 1104, 1104, 1101, 2529, 2530, 1102, + 2531, 254, 1108, 1105, 1105, 1105, 1106, 1106, 1106, 2533, + 1104, 1109, 1109, 1109, 254, 296, 1107, 1107, 1107, 2537, + 1105, 2540, 296, 1106, 1111, 1111, 1111, 2579, 2581, 1109, + 2489, 296, 296, 1107, 1100, 2578, 1113, 1113, 1113, 2583, + 2489, 1111, 1102, 2489, 1114, 1114, 1114, 2584, 1109, 1757, + 1757, 1757, 2580, 1105, 1113, 1115, 1115, 1115, 2585, 296, + 296, 296, 1114, 2588, 2578, 296, 296, 296, 1105, 2579, + 296, 296, 1115, 2589, 296, 1107, 296, 296, 296, 361, + + 1116, 1116, 1116, 1117, 1117, 1117, 361, 1118, 1118, 1118, + 1119, 1119, 1119, 2590, 2580, 361, 361, 1116, 2591, 1114, + 2592, 1117, 1120, 1120, 1120, 1118, 2590, 1119, 2594, 1121, + 1121, 1121, 2595, 2596, 1122, 1122, 1122, 2563, 2597, 1120, + 1135, 1135, 1135, 361, 361, 361, 1121, 2563, 2598, 361, + 361, 361, 1122, 2563, 361, 361, 2600, 1135, 361, 2601, + 361, 361, 361, 1123, 1123, 1123, 1129, 1129, 1129, 1139, + 1139, 1139, 1120, 1130, 1130, 1130, 2602, 2603, 1118, 2606, + 2607, 1123, 2608, 2609, 1129, 2610, 1139, 1120, 1133, 1133, + 1133, 1130, 1134, 1134, 1134, 1137, 1137, 1137, 1138, 1138, + + 1138, 1140, 1140, 1140, 2611, 1140, 1133, 2612, 1140, 2613, + 1134, 2614, 2615, 1137, 2616, 2617, 1138, 1142, 1142, 1142, + 1143, 1143, 1143, 1158, 1158, 1158, 1159, 1159, 1159, 1161, + 1161, 1161, 2490, 2593, 1123, 1142, 2618, 1130, 1143, 2620, + 2630, 1158, 2490, 2631, 1159, 2490, 2593, 1161, 1192, 1192, + 1192, 1193, 1193, 1193, 2636, 2640, 1134, 2658, 2659, 1138, + 1194, 1194, 1194, 2660, 2661, 1192, 1197, 1197, 1197, 1193, + 1196, 1196, 1196, 1198, 1198, 1198, 1161, 1198, 1194, 2662, + 1198, 2663, 2675, 1197, 1143, 1201, 1201, 1201, 1196, 1203, + 1203, 1203, 1204, 1204, 1204, 1206, 1206, 1206, 2667, 1208, + + 1208, 1208, 1201, 1208, 2668, 2678, 1208, 1203, 2679, 2673, + 1204, 2667, 2683, 1206, 1211, 1211, 1211, 2668, 2672, 1196, + 1212, 1212, 1212, 2684, 1212, 2564, 2685, 1212, 1213, 1213, + 1213, 1211, 1214, 1214, 1214, 2564, 1215, 1215, 1215, 2686, + 1215, 2564, 1206, 1215, 2673, 1213, 1201, 2687, 2688, 1214, + 1217, 1217, 1217, 1219, 1219, 1219, 1220, 1220, 1220, 1222, + 1222, 1222, 1224, 1224, 1224, 2689, 2672, 1217, 1226, 1226, + 1226, 1219, 2690, 2692, 1220, 2693, 2694, 1222, 2695, 1224, + 1227, 1227, 1227, 1229, 1229, 1229, 1226, 1230, 1230, 1230, + 2696, 1230, 2697, 2698, 1230, 1234, 1234, 1234, 1227, 2699, + + 2701, 1229, 1235, 1235, 1235, 1237, 1237, 1237, 1252, 1252, + 1252, 2702, 1252, 1234, 2703, 1252, 1256, 1256, 1256, 1222, + 1235, 2704, 2705, 1237, 1257, 1257, 1257, 1258, 1258, 1258, + 1229, 2706, 2707, 1256, 1260, 1260, 1260, 1262, 1262, 1262, + 2708, 1262, 1257, 2709, 1262, 1258, 1266, 1266, 1266, 1267, + 1267, 1267, 1260, 1269, 1269, 1269, 1270, 1270, 1270, 2710, + 1270, 2711, 2712, 1270, 1266, 2713, 2719, 1267, 1273, 1273, + 1273, 1269, 1274, 1274, 1274, 1275, 1275, 1275, 1277, 1277, + 1277, 1278, 1278, 1278, 2723, 1273, 2724, 1279, 1279, 1279, + 1274, 2732, 2733, 1275, 2750, 1260, 1277, 2751, 1278, 1280, + + 1280, 1280, 2752, 2753, 1279, 1281, 1281, 1281, 1283, 1283, + 1283, 1286, 1286, 1286, 1269, 1279, 2754, 1280, 1287, 1287, + 1287, 2755, 1287, 1281, 2758, 1287, 1283, 2759, 1286, 1292, + 1292, 1292, 1293, 1293, 1293, 1295, 1295, 1295, 1298, 1298, + 1298, 1299, 1299, 1299, 2745, 1277, 2760, 1292, 2761, 2770, + 1293, 2762, 2771, 1295, 2745, 1298, 1303, 1303, 1303, 1299, + 1300, 1300, 1300, 1302, 1302, 1302, 2746, 2748, 1304, 1304, + 1304, 2772, 1304, 1303, 1283, 1304, 2746, 2748, 1300, 2773, + 2774, 1302, 1307, 1307, 1307, 2762, 1307, 2775, 2776, 1307, + 1310, 1310, 1310, 1311, 1311, 1311, 1313, 1313, 1313, 2777, + + 1295, 2780, 1318, 1318, 1318, 2781, 1318, 2783, 1310, 1318, + 2784, 1311, 2785, 2749, 1313, 1321, 1321, 1321, 1322, 1322, + 1322, 2787, 1322, 2749, 2789, 1322, 1325, 1325, 1325, 2790, + 1302, 2791, 1321, 1326, 1326, 1326, 2794, 1326, 2795, 2796, + 1326, 2797, 2800, 1325, 1336, 1336, 1336, 1337, 1337, 1337, + 1339, 1339, 1339, 1340, 1340, 1340, 2807, 1340, 2808, 2809, + 1340, 1313, 1336, 2817, 2823, 1337, 2824, 2825, 1339, 1343, + 1343, 1343, 2826, 1343, 2827, 2828, 1343, 1346, 1346, 1346, + 1347, 1347, 1347, 2829, 1347, 2830, 2831, 1347, 1352, 1352, + 1352, 1353, 1353, 1353, 1346, 1355, 1355, 1355, 1360, 1360, + + 1360, 2832, 1360, 2834, 2835, 1360, 1352, 2840, 2841, 1353, + 1363, 1363, 1363, 1355, 1364, 1364, 1364, 1339, 1364, 2842, + 2843, 1364, 1367, 1367, 1367, 2853, 2844, 1363, 1368, 1368, + 1368, 1370, 1370, 1370, 1372, 1372, 1372, 2854, 1372, 2855, + 1367, 1372, 2856, 1355, 2857, 2858, 1368, 2859, 2860, 1370, + 1375, 1375, 1375, 1376, 1376, 1376, 1378, 1378, 1378, 1380, + 1380, 1380, 2864, 1380, 2865, 2866, 1380, 2867, 1375, 2844, + 2868, 1376, 2869, 2871, 1378, 1384, 1384, 1384, 1385, 1385, + 1385, 2872, 1370, 1387, 1387, 1387, 2874, 1389, 1389, 1389, + 2875, 1389, 2876, 1384, 1389, 2878, 1385, 1395, 1395, 1395, + + 2882, 1387, 1396, 1396, 1396, 2883, 1398, 1398, 1398, 1399, + 1399, 1399, 1400, 1400, 1400, 1395, 1400, 2884, 2887, 1400, + 1396, 2892, 2893, 1378, 1398, 2894, 1399, 1401, 1401, 1401, + 2895, 2896, 1387, 1402, 1402, 1402, 2897, 1402, 2898, 2899, + 1402, 1404, 1404, 1404, 1401, 1405, 1405, 1405, 2900, 1407, + 1407, 1407, 1409, 1409, 1409, 2901, 1413, 1413, 1413, 1404, + 1642, 1642, 1642, 1405, 2902, 2903, 1398, 1407, 2905, 1409, + 1410, 1410, 1410, 1413, 1410, 2906, 2907, 1410, 1414, 1414, + 1414, 2908, 1414, 2915, 2911, 1414, 1416, 1416, 1416, 1417, + 1417, 1417, 1419, 1419, 1419, 1421, 1421, 1421, 2911, 1421, + + 2918, 2909, 1421, 2912, 1416, 2919, 1642, 1417, 2922, 2924, + 1419, 1424, 1424, 1424, 2912, 2925, 1407, 1425, 1425, 1425, + 1427, 1427, 1427, 1428, 1428, 1428, 1429, 1429, 1429, 1424, + 1429, 2927, 2928, 1429, 2931, 1425, 2932, 2933, 1427, 2934, + 1428, 1430, 1430, 1430, 1431, 1431, 1431, 2909, 1431, 2935, + 2936, 1431, 1432, 1432, 1432, 2937, 1419, 2938, 1430, 1433, + 1433, 1433, 2939, 1435, 1435, 1435, 1436, 1436, 1436, 2943, + 1432, 1437, 1437, 1437, 2951, 1437, 2953, 1433, 1437, 2955, + 1427, 1435, 2957, 1436, 1440, 1440, 1440, 1441, 1441, 1441, + 2965, 1441, 2967, 2968, 1441, 1442, 1442, 1442, 1443, 1443, + + 1443, 1440, 1445, 1445, 1445, 1447, 1447, 1447, 1451, 1451, + 1451, 2941, 2942, 1442, 2970, 2970, 1443, 1452, 1452, 1452, + 1445, 2948, 1447, 2941, 2942, 1435, 1451, 1454, 1454, 1454, + 1457, 1457, 1457, 2948, 2968, 1452, 1458, 1458, 1458, 1460, + 1460, 1460, 1461, 1461, 1461, 1454, 1461, 2971, 1457, 1461, + 1464, 1464, 1464, 2973, 1458, 2975, 2969, 1460, 1465, 1465, + 1465, 1467, 1467, 1467, 1445, 1468, 1468, 1468, 1464, 1468, + 2969, 2976, 1468, 1472, 1472, 1472, 1465, 2949, 2977, 1467, + 1473, 1473, 1473, 1475, 1475, 1475, 2972, 2978, 1454, 2949, + 2993, 1472, 1460, 1477, 1477, 1477, 2995, 2972, 1473, 2998, + + 3000, 1475, 1484, 1484, 1484, 1514, 1514, 1514, 1516, 1516, + 1516, 1477, 1477, 2987, 1517, 1517, 1517, 1542, 1542, 1542, + 1484, 1467, 1514, 1515, 1515, 1515, 1516, 1515, 2987, 2992, + 1515, 1517, 1518, 1518, 1518, 1542, 1518, 3005, 2984, 1518, + 1521, 1521, 1521, 3006, 1475, 1523, 1523, 1523, 2992, 1523, + 2994, 3008, 1523, 1526, 1526, 1526, 2984, 2997, 1521, 3009, + 1527, 1527, 1527, 2999, 1527, 3010, 1516, 1527, 1484, 2994, + 1526, 1528, 1528, 1528, 3012, 1528, 2997, 3013, 1528, 1532, + 1532, 1532, 2999, 1533, 1533, 1533, 3014, 1533, 3015, 1521, + 1533, 1535, 1535, 1535, 3017, 3019, 1532, 1537, 1537, 1537, + + 1538, 1538, 1538, 3026, 1538, 3027, 3028, 1538, 3029, 1535, + 1539, 1539, 1539, 3030, 1537, 1540, 1540, 1540, 1558, 1558, + 1558, 1559, 1559, 1559, 1560, 1560, 1560, 1539, 1560, 3031, + 3034, 1560, 3035, 1540, 3036, 1558, 3037, 3038, 1559, 3039, + 3040, 1535, 1561, 1561, 1561, 1564, 1564, 1564, 1565, 1565, + 1565, 1566, 1566, 1566, 3041, 1566, 3043, 3045, 1566, 3047, + 1561, 3048, 3049, 1564, 1540, 1565, 1567, 1567, 1567, 1568, + 1568, 1568, 1569, 1569, 1569, 3059, 1569, 3060, 3061, 1569, + 1571, 1571, 1571, 3057, 1567, 3062, 1568, 1574, 1574, 1574, + 1575, 1575, 1575, 3058, 1575, 3057, 3063, 1575, 1571, 1576, + + 1576, 1576, 3064, 3068, 1574, 3058, 1561, 3069, 3070, 1564, + 1577, 1577, 1577, 1578, 1578, 1578, 1576, 1581, 1581, 1581, + 3071, 1582, 1582, 1582, 3072, 1582, 1567, 1577, 1582, 3073, + 3074, 1578, 3075, 3078, 1581, 1583, 1583, 1583, 1584, 1584, + 1584, 1571, 1585, 1585, 1585, 3079, 1585, 3080, 3081, 1585, + 1586, 1586, 1586, 1583, 3082, 1584, 1577, 1588, 1588, 1588, + 1591, 1591, 1591, 1592, 1592, 1592, 3076, 1592, 1586, 3083, + 1592, 1593, 1593, 1593, 1588, 1593, 3084, 1591, 1593, 1578, + 1598, 1598, 1598, 1605, 1605, 1605, 1606, 1606, 1606, 3085, + 1606, 3076, 3086, 1606, 1609, 1609, 1609, 1598, 1610, 1610, + + 1610, 1605, 1611, 1611, 1611, 1612, 1612, 1612, 1613, 1613, + 1613, 1609, 1615, 1615, 1615, 1610, 1586, 3087, 3088, 1611, + 3089, 3090, 1612, 1618, 1618, 1618, 1613, 1618, 3091, 1615, + 1618, 3092, 3093, 1621, 1621, 1621, 1623, 1623, 1623, 1625, + 1625, 1625, 1628, 1628, 1628, 1632, 1632, 1632, 1605, 1611, + 1621, 1633, 1633, 1633, 1623, 3094, 3095, 1625, 3096, 3097, + 1628, 3103, 1632, 1613, 3104, 1641, 1641, 1641, 1610, 1633, + 1634, 1634, 1634, 3100, 1634, 1612, 3105, 1634, 1637, 1637, + 1637, 3106, 1637, 1641, 3107, 1637, 1643, 1643, 1643, 3108, + 1643, 1632, 3100, 1643, 1648, 1648, 1648, 3109, 1648, 1628, + + 1623, 1648, 1652, 1652, 1652, 1625, 3110, 3111, 1633, 1654, + 1654, 1654, 1655, 1655, 1655, 3112, 1655, 3113, 3114, 1655, + 1652, 1658, 1658, 1658, 3115, 1658, 3116, 1654, 1658, 3117, + 3118, 1641, 1661, 1661, 1661, 1662, 1662, 1662, 3119, 1662, + 3120, 3121, 1662, 3122, 1667, 1667, 1667, 3123, 1667, 3124, + 1661, 1667, 1670, 1670, 1670, 1672, 1672, 1672, 1673, 1673, + 1673, 3121, 1673, 1652, 3125, 1673, 1654, 1677, 1677, 1677, + 1670, 3126, 1672, 1679, 1679, 1679, 1680, 1680, 1680, 1661, + 1681, 1681, 1681, 3127, 3128, 1677, 1682, 1682, 1682, 3129, + 1679, 1683, 1683, 1683, 1680, 1686, 1686, 1686, 1681, 1670, + + 1693, 1693, 1693, 1682, 1715, 1715, 1715, 3130, 3131, 1683, + 1723, 1723, 1723, 1686, 3132, 3133, 1677, 3134, 1693, 1724, + 1724, 1724, 3135, 1724, 3136, 3137, 1724, 1727, 1727, 1727, + 3138, 3139, 1681, 1728, 1728, 1728, 3140, 1728, 3143, 3144, + 1728, 3145, 3140, 1680, 3146, 1727, 1686, 1733, 1733, 1733, + 1715, 3147, 1693, 1683, 3148, 3150, 1723, 1735, 1735, 1735, + 3151, 1735, 3153, 1686, 1735, 1733, 1739, 1739, 1739, 3154, + 1739, 3156, 3157, 1739, 1743, 1743, 1743, 1745, 1745, 1745, + 3160, 1745, 3161, 3159, 1745, 1748, 1748, 1748, 3162, 1749, + 1749, 1749, 1743, 1749, 1727, 3163, 1749, 3159, 1733, 1750, + + 1750, 1750, 1748, 1758, 1758, 1758, 1759, 1759, 1759, 1763, + 1763, 1763, 1764, 1764, 1764, 3165, 3167, 1750, 3169, 1766, + 1766, 1766, 1767, 1767, 1767, 3171, 1767, 3173, 3174, 1767, + 1768, 1768, 1768, 3175, 1768, 1743, 1766, 1768, 1771, 1771, + 1771, 1773, 1773, 1773, 1774, 1774, 1774, 1775, 1775, 1775, + 1750, 1775, 3176, 3177, 1775, 3178, 1771, 3179, 1773, 1778, + 1778, 1778, 1774, 3180, 1779, 1779, 1779, 3182, 1779, 3184, + 1759, 1779, 3186, 1763, 3187, 3188, 1764, 1778, 1782, 1782, + 1782, 1783, 1783, 1783, 3189, 1771, 1786, 1786, 1786, 1522, + 1786, 1774, 3280, 1786, 3202, 1782, 1789, 1789, 1789, 1783, + + 1790, 1790, 1790, 3190, 1790, 3203, 3280, 1790, 3191, 1791, + 1791, 1791, 1520, 1789, 1792, 1792, 1792, 1519, 1792, 3222, + 3198, 1792, 1794, 1794, 1794, 1778, 1791, 1795, 1795, 1795, + 1797, 1797, 1797, 3199, 1797, 3200, 3201, 1797, 3202, 3190, + 1794, 1800, 1800, 1800, 3191, 1783, 1802, 1802, 1802, 3203, + 1802, 3222, 3210, 1802, 1805, 1805, 1805, 3223, 3206, 1800, + 1807, 1807, 1807, 1808, 1808, 1808, 3206, 1808, 3198, 1513, + 1808, 3276, 1805, 1809, 1809, 1809, 3218, 1807, 1811, 1811, + 1811, 3199, 1811, 3200, 3201, 1811, 1816, 1816, 1816, 3223, + 1809, 1817, 1817, 1817, 3207, 1817, 1512, 3204, 1817, 3210, + + 1805, 3204, 3207, 1816, 1818, 1818, 1818, 1823, 1823, 1823, + 1824, 1824, 1824, 1825, 1825, 1825, 1826, 1826, 1826, 3276, + 1826, 1818, 3218, 1826, 1823, 1827, 1827, 1827, 1824, 3214, + 1825, 1828, 1828, 1828, 1829, 1829, 1829, 1830, 1830, 1830, + 3212, 3208, 1827, 1832, 1832, 1832, 3205, 3215, 1828, 3208, + 3205, 1829, 1833, 1833, 1833, 1830, 1833, 3211, 3230, 1833, + 1832, 1834, 1834, 1834, 1836, 1836, 1836, 1837, 1837, 1837, + 3214, 1837, 3209, 3219, 1837, 1510, 1824, 3212, 1834, 3270, + 3209, 1836, 1839, 1839, 1839, 1841, 1841, 1841, 3215, 1828, + 1844, 1844, 1844, 1848, 1848, 1848, 3213, 1830, 3220, 3231, + + 1839, 3230, 3221, 1841, 3211, 1849, 1849, 1849, 1844, 1849, + 1848, 3270, 1849, 1851, 1851, 1851, 1853, 1853, 1853, 3219, + 1855, 1855, 1855, 1856, 1856, 1856, 1857, 1857, 1857, 3216, + 1509, 1851, 3224, 3213, 1853, 3220, 1841, 1855, 1844, 3221, + 1856, 3224, 3231, 1857, 1858, 1858, 1858, 1860, 1860, 1860, + 1861, 1861, 1861, 1862, 1862, 1862, 1863, 1863, 1863, 1864, + 1864, 1864, 1858, 3228, 3216, 1860, 1508, 1853, 1861, 1507, + 1862, 3225, 3217, 1863, 1866, 1866, 1866, 1864, 1866, 3232, + 3225, 1866, 1872, 1872, 1872, 1874, 1874, 1874, 2282, 2282, + 1857, 2282, 3226, 1860, 1875, 1875, 1875, 3228, 1875, 2282, + + 1872, 1875, 1874, 1876, 1876, 1876, 2282, 3217, 1877, 1877, + 1877, 1858, 1878, 1878, 1878, 1861, 1879, 1879, 1879, 3238, + 1879, 1876, 1506, 1879, 1864, 3232, 1877, 3226, 3238, 1878, + 1880, 1880, 1880, 1872, 1886, 1886, 1886, 1887, 1887, 1887, + 1894, 1894, 1894, 1898, 1898, 1898, 1505, 1504, 1880, 3233, + 1503, 1886, 1902, 1902, 1902, 1887, 1903, 1903, 1903, 1904, + 1904, 1904, 1876, 1877, 1906, 1906, 1906, 1908, 1908, 1908, + 1909, 1909, 1909, 1914, 1914, 1914, 1916, 1916, 1916, 1919, + 1919, 1919, 1921, 1921, 1921, 1923, 1923, 1923, 1924, 1924, + 1924, 1936, 1936, 1936, 1916, 3233, 3227, 1919, 1887, 1921, + + 1933, 1933, 1933, 1923, 1933, 1924, 1502, 1933, 1500, 1936, + 1937, 1937, 1937, 1942, 1942, 1942, 1943, 1943, 1943, 1947, + 1947, 1947, 1951, 1951, 1951, 3239, 1916, 1937, 1948, 1948, + 1948, 3227, 1948, 1499, 3239, 1948, 1947, 1936, 3229, 3234, + 1951, 1952, 1952, 1952, 1923, 1953, 1953, 1953, 1954, 1954, + 1954, 3262, 1954, 3248, 3235, 1954, 3242, 3236, 1952, 1955, + 1955, 1955, 1953, 1956, 1956, 1956, 1957, 1957, 1957, 1958, + 1958, 1958, 3229, 1958, 3234, 1951, 1958, 1955, 1959, 1959, + 1959, 1956, 3248, 1957, 1962, 1962, 1962, 3240, 1962, 3235, + 3236, 1962, 3262, 1965, 1965, 1965, 1959, 1965, 3242, 3237, + + 1965, 1969, 1969, 1969, 1971, 1971, 1971, 3243, 1973, 1973, + 1973, 3249, 1955, 1975, 1975, 1975, 3264, 1975, 3244, 1969, + 1975, 1978, 1978, 1978, 3240, 1959, 1973, 1979, 1979, 1979, + 3241, 1979, 3237, 3246, 1979, 1983, 1983, 1983, 1978, 1983, + 3249, 1497, 1983, 1986, 1986, 1986, 1987, 1987, 1987, 3243, + 1987, 3264, 3247, 1987, 1988, 1988, 1988, 1992, 1992, 1992, + 1986, 1993, 1993, 1993, 3244, 1993, 1973, 3241, 1993, 1496, + 3246, 1988, 3250, 3245, 1992, 1994, 1994, 1994, 1995, 1995, + 1995, 3250, 1995, 1494, 1491, 1995, 1998, 1998, 1998, 3247, + 1999, 1999, 1999, 1994, 1999, 3252, 3271, 1999, 2000, 2000, + + 2000, 3251, 3281, 1998, 2001, 2001, 2001, 2002, 2002, 2002, + 3251, 2002, 3253, 3281, 2002, 2000, 2003, 2003, 2003, 3245, + 3254, 2001, 3255, 2005, 2005, 2005, 1994, 2005, 3271, 3252, + 2005, 2008, 2008, 2008, 2003, 2009, 2009, 2009, 1490, 2009, + 1489, 3256, 2009, 2011, 2011, 2011, 3253, 2011, 2008, 3256, + 2011, 2015, 2015, 2015, 2018, 2018, 2018, 2020, 2020, 2020, + 2021, 2021, 2021, 2023, 2023, 2023, 3254, 2003, 3255, 2015, + 3260, 3261, 2018, 3257, 2020, 2025, 2025, 2025, 2021, 2025, + 2023, 3257, 2025, 2029, 2029, 2029, 2032, 2032, 2032, 2034, + 2034, 2034, 2035, 2035, 2035, 3258, 2035, 1488, 3259, 2035, + + 1487, 2029, 3263, 1486, 2032, 1485, 2034, 3260, 3261, 2023, + 2036, 2036, 2036, 2037, 2037, 2037, 3274, 2037, 2018, 1483, + 2037, 2021, 2039, 2039, 2039, 3265, 3275, 2036, 2041, 2041, + 2041, 2042, 2042, 2042, 2043, 2043, 2043, 2044, 2044, 2044, + 2039, 2044, 3258, 3263, 2044, 3259, 2041, 3278, 3274, 2042, + 3279, 2043, 2045, 2045, 2045, 2046, 2046, 2046, 3275, 2046, + 3265, 3268, 2046, 2047, 2047, 2047, 2052, 2052, 2052, 2045, + 3266, 2054, 2054, 2054, 3272, 2054, 3277, 2041, 2054, 3278, + 3267, 2047, 3279, 3272, 2052, 2057, 2057, 2057, 2039, 2058, + 2058, 2058, 3269, 2059, 2059, 2059, 2042, 2059, 3268, 1482, + + 2059, 1481, 1480, 2057, 2062, 2062, 2062, 2058, 2068, 2068, + 2068, 2069, 2069, 2069, 3273, 2069, 3266, 1471, 2069, 2070, + 2070, 2070, 2062, 3273, 3277, 2068, 3267, 1456, 2047, 3269, + 1455, 2052, 2071, 2071, 2071, 1450, 2057, 2070, 2076, 2076, + 2076, 1449, 2058, 2077, 2077, 2077, 2078, 2078, 2078, 2080, + 2080, 2080, 2084, 2084, 2084, 2085, 2085, 2085, 2086, 2086, + 2086, 2087, 2087, 2087, 2089, 2089, 2089, 2090, 2090, 2090, + 2091, 2091, 2091, 2092, 2092, 2092, 2093, 2093, 2093, 2094, + 2094, 2094, 1448, 2070, 2096, 2096, 2096, 2099, 2099, 2099, + 1446, 2102, 2102, 2102, 2103, 2103, 2103, 1439, 2103, 1438, + + 1420, 2103, 2096, 1415, 1412, 2099, 1411, 2087, 2102, 2105, + 2105, 2105, 2106, 2106, 2106, 2107, 2107, 2107, 1408, 2107, + 1403, 1394, 2107, 2118, 2118, 2118, 1393, 2105, 1392, 2106, + 2119, 2119, 2119, 1388, 1383, 2096, 2120, 2120, 2120, 1379, + 2120, 2118, 1371, 2120, 2121, 2121, 2121, 2119, 2126, 2126, + 2126, 2127, 2127, 2127, 2128, 2128, 2128, 2129, 2129, 2129, + 1366, 2129, 1365, 1359, 2129, 2130, 2130, 2130, 2131, 2131, + 2131, 2128, 2118, 2132, 2132, 2132, 1358, 2132, 1357, 1356, + 2132, 1351, 1350, 2130, 1349, 2131, 2133, 2133, 2133, 1348, + 2133, 1335, 1334, 2133, 2136, 2136, 2136, 2127, 1333, 2137, + + 2137, 2137, 2139, 2139, 2139, 1332, 2139, 1331, 1330, 2139, + 1329, 1328, 2136, 2142, 2142, 2142, 2130, 2137, 2149, 2149, + 2149, 2151, 2151, 2151, 1327, 2151, 1317, 1316, 2151, 1315, + 1314, 2142, 1297, 2157, 2157, 2157, 2149, 2157, 1296, 1291, + 2157, 2160, 2160, 2160, 1290, 2136, 2161, 2161, 2161, 1285, + 2161, 1284, 1265, 2161, 1261, 2165, 2165, 2165, 2160, 2165, + 1255, 1251, 2165, 2168, 2168, 2168, 2142, 2169, 2169, 2169, + 1250, 2169, 1249, 2149, 2169, 2172, 2172, 2172, 2173, 2173, + 2173, 2168, 2173, 1248, 1247, 2173, 2174, 2174, 2174, 1246, + 2174, 1245, 2172, 2174, 2177, 2177, 2177, 2179, 2179, 2179, + + 1243, 2179, 1242, 1240, 2179, 2185, 2185, 2185, 2187, 2187, + 2187, 1239, 2177, 2188, 2188, 2188, 1238, 2188, 1233, 1225, + 2188, 1223, 1218, 2185, 1216, 2187, 1207, 2168, 2189, 2189, + 2189, 2191, 2191, 2191, 2192, 2192, 2192, 1202, 2192, 1191, + 1189, 2192, 1188, 2199, 2199, 2199, 2189, 1187, 2191, 2202, + 2202, 2202, 1186, 2202, 1184, 1183, 2202, 2209, 2209, 2209, + 2177, 2199, 2205, 2205, 2205, 1182, 2205, 1181, 1180, 2205, + 1179, 2211, 2211, 2211, 1177, 2209, 2212, 2212, 2212, 2213, + 2213, 2213, 1176, 2213, 1175, 1174, 2213, 1173, 2189, 2211, + 1172, 2216, 2216, 2216, 2212, 2216, 1171, 1169, 2216, 2219, + + 2219, 2219, 1168, 2220, 2220, 2220, 1167, 1166, 2209, 2221, + 2221, 2221, 2212, 2222, 2222, 2222, 1165, 2219, 1164, 2219, + 2220, 2223, 2223, 2223, 1163, 1157, 2221, 2224, 2224, 2224, + 2222, 2226, 2226, 2226, 2227, 2227, 2227, 2211, 2223, 2228, + 2228, 2228, 2231, 2231, 2231, 2224, 2232, 2232, 2232, 2226, + 2232, 1156, 2227, 2232, 2235, 2235, 2235, 2228, 1155, 1152, + 2221, 2236, 2236, 2236, 2237, 2237, 2237, 2238, 2238, 2238, + 1151, 1150, 2235, 2241, 2241, 2241, 1148, 2222, 1144, 1141, + 2223, 2242, 2242, 2242, 2244, 2244, 2244, 2245, 2245, 2245, + 1132, 2226, 2224, 2246, 2246, 2246, 2247, 2247, 2247, 2248, + + 2248, 2248, 2249, 2249, 2249, 2252, 2252, 2252, 2253, 2253, + 2253, 1131, 1128, 2235, 2254, 2254, 2254, 2255, 2255, 2255, + 2257, 2257, 2257, 2260, 2260, 2260, 2261, 2261, 2261, 1127, + 2261, 1126, 1125, 2261, 2264, 2264, 2264, 1124, 2257, 1110, + 2260, 2265, 2265, 2265, 1103, 2267, 2267, 2267, 1095, 2267, + 1094, 2264, 2267, 2280, 2280, 2280, 2281, 2281, 2281, 2265, + 2281, 2283, 2283, 2281, 2283, 2284, 2284, 2284, 2285, 2285, + 2285, 2280, 2283, 2289, 2289, 2289, 2291, 2291, 2291, 2283, + 2291, 1093, 1090, 2291, 2294, 2294, 2294, 2295, 2295, 2295, + 1087, 2295, 1084, 1079, 2295, 2298, 2298, 2298, 1076, 1075, + + 2264, 1071, 2294, 2299, 2299, 2299, 2307, 2307, 2307, 2308, + 2308, 2308, 1069, 2298, 2280, 2313, 2313, 2313, 1055, 2313, + 1054, 2299, 2313, 2316, 2316, 2316, 1053, 2308, 1052, 1051, + 2294, 2319, 2319, 2319, 2320, 2320, 2320, 1050, 2320, 1049, + 2316, 2320, 2323, 2323, 2323, 2328, 2328, 2328, 1048, 2319, + 2330, 2330, 2330, 1047, 2299, 2331, 2331, 2331, 1043, 2331, + 2323, 1039, 2331, 2328, 2334, 2334, 2334, 2330, 1032, 2308, + 2335, 2335, 2335, 2336, 2336, 2336, 1029, 2336, 1028, 1027, + 2336, 1024, 2334, 2339, 2339, 2339, 1023, 2335, 2340, 2340, + 2340, 2345, 2345, 2345, 2347, 2347, 2347, 2350, 2350, 2350, + + 2339, 2349, 2349, 2349, 1020, 2340, 1019, 1018, 2345, 2351, + 2351, 2351, 1015, 1014, 2350, 2334, 2335, 1011, 1006, 2349, + 1003, 2352, 2352, 2352, 2354, 2354, 2354, 2351, 2353, 2353, + 2353, 1000, 999, 2355, 2355, 2355, 996, 2355, 2339, 2352, + 2355, 2354, 2345, 2356, 2356, 2356, 2353, 995, 994, 2340, + 2357, 2357, 2357, 2358, 2358, 2358, 2359, 2359, 2359, 993, + 2356, 2360, 2360, 2360, 992, 2353, 990, 2357, 989, 2351, + 2358, 2361, 2361, 2361, 2359, 2362, 2362, 2362, 2364, 2364, + 2364, 988, 2352, 2367, 2367, 2367, 2369, 2369, 2369, 2361, + 2368, 2368, 2368, 2362, 987, 986, 2364, 2370, 2370, 2370, + + 985, 2357, 984, 983, 2358, 2373, 2373, 2373, 2368, 2374, + 2374, 2374, 2375, 2375, 2375, 2376, 2376, 2376, 2380, 2380, + 2380, 2383, 2383, 2383, 2384, 2384, 2384, 979, 2384, 974, + 973, 2384, 2396, 2396, 2396, 972, 2380, 2361, 2383, 969, + 2364, 2407, 2407, 2407, 2410, 2410, 2410, 2412, 2412, 2412, + 2396, 2413, 2413, 2413, 2415, 2415, 2415, 2422, 2422, 2422, + 2423, 2423, 2423, 968, 967, 2412, 2424, 2424, 2424, 2413, + 965, 961, 2415, 957, 2422, 956, 2430, 2430, 2430, 2431, + 2431, 2431, 953, 2431, 2424, 950, 2431, 2433, 2433, 2433, + 949, 948, 2396, 2430, 2434, 2434, 2434, 2436, 2436, 2436, + + 2440, 2440, 2440, 947, 2433, 2442, 2442, 2442, 946, 2444, + 2444, 2444, 2434, 2412, 945, 2436, 944, 2440, 2445, 2445, + 2445, 942, 2442, 2424, 2443, 2443, 2443, 2444, 2443, 941, + 940, 2443, 2446, 2446, 2446, 2445, 2446, 939, 938, 2446, + 2447, 2447, 2447, 2448, 2448, 2448, 2449, 2449, 2449, 2454, + 2454, 2454, 2456, 2456, 2456, 937, 936, 2447, 935, 934, + 2448, 933, 932, 2449, 931, 930, 2454, 2458, 2458, 2458, + 2460, 2460, 2460, 2461, 2461, 2461, 929, 2461, 928, 927, + 2461, 2462, 2462, 2462, 926, 2458, 925, 2460, 2463, 2463, + 2463, 924, 2447, 2464, 2464, 2464, 2465, 2465, 2465, 2462, + + 2465, 2448, 923, 2465, 2449, 922, 2463, 2468, 2468, 2468, + 918, 2464, 2469, 2469, 2469, 917, 2469, 915, 914, 2469, + 2470, 2470, 2470, 913, 2468, 2471, 2471, 2471, 2472, 2472, + 2472, 2474, 2474, 2474, 2475, 2475, 2475, 2470, 2479, 2479, + 2479, 912, 2471, 2483, 2483, 2483, 2472, 2487, 2487, 2487, + 911, 907, 2475, 905, 904, 2463, 2479, 2464, 2488, 2488, + 2488, 903, 2488, 902, 2487, 2488, 2502, 2502, 2502, 2517, + 2517, 2517, 2519, 2519, 2519, 2520, 2520, 2520, 2523, 2523, + 2523, 2526, 2526, 2526, 2502, 2527, 2527, 2527, 898, 2527, + 2519, 894, 2527, 2520, 893, 2523, 890, 889, 2526, 2528, + + 2528, 2528, 2532, 2532, 2532, 2534, 2534, 2534, 888, 2534, + 887, 886, 2534, 2538, 2538, 2538, 885, 2528, 884, 2532, + 2539, 2539, 2539, 881, 2539, 880, 2502, 2539, 879, 878, + 2538, 2541, 2541, 2541, 2542, 2542, 2542, 2543, 2543, 2543, + 875, 2543, 874, 2519, 2543, 2544, 2544, 2544, 2541, 873, + 870, 2542, 2545, 2545, 2545, 868, 2545, 865, 864, 2545, + 863, 862, 2544, 2548, 2548, 2548, 2550, 2550, 2550, 861, + 2550, 858, 857, 2550, 2553, 2553, 2553, 2554, 2554, 2554, + 856, 2548, 2555, 2555, 2555, 2558, 2558, 2558, 2559, 2559, + 2559, 2553, 2559, 855, 2554, 2559, 2560, 2560, 2560, 2555, + + 854, 851, 2558, 2561, 2561, 2561, 850, 2562, 2562, 2562, + 849, 2562, 848, 2560, 2562, 2565, 2565, 2565, 846, 843, + 2561, 2567, 2567, 2567, 2568, 2568, 2568, 842, 2554, 2553, + 2572, 2572, 2572, 2565, 2569, 2569, 2569, 2555, 2569, 2567, + 840, 2569, 2568, 837, 2573, 2573, 2573, 2572, 2573, 835, + 832, 2573, 2574, 2574, 2574, 2575, 2575, 2575, 831, 2575, + 830, 829, 2575, 2576, 2576, 2576, 2582, 2582, 2582, 2574, + 827, 2586, 2586, 2586, 826, 2587, 2587, 2587, 825, 2587, + 822, 2576, 2587, 821, 820, 2568, 819, 2567, 2586, 2605, + 2605, 2605, 2619, 2619, 2619, 2621, 2621, 2621, 2622, 2622, + + 2622, 2623, 2623, 2623, 2624, 2624, 2624, 2605, 2624, 818, + 817, 2624, 812, 2621, 811, 2622, 810, 809, 2623, 2625, + 2625, 2625, 808, 2625, 807, 806, 2625, 2628, 2628, 2628, + 2632, 2632, 2632, 2633, 2633, 2633, 805, 2635, 2635, 2635, + 2605, 2676, 2676, 2676, 2622, 2628, 804, 2632, 803, 802, + 2633, 2634, 2634, 2634, 2635, 2634, 800, 2621, 2634, 2637, + 2637, 2637, 798, 2637, 797, 794, 2637, 2641, 2641, 2641, + 2642, 2642, 2642, 791, 2642, 788, 787, 2642, 2643, 2643, + 2643, 783, 2643, 782, 2641, 2643, 2646, 2646, 2646, 2647, + 2647, 2647, 781, 2647, 778, 775, 2647, 2648, 2648, 2648, + + 2649, 2649, 2649, 2646, 2650, 2650, 2650, 774, 2651, 2651, + 2651, 773, 2651, 770, 2648, 2651, 769, 2649, 2654, 2654, + 2654, 2650, 2655, 2655, 2655, 765, 2655, 764, 762, 2655, + 2656, 2656, 2656, 759, 758, 2654, 2657, 2657, 2657, 757, + 2657, 755, 744, 2657, 2664, 2664, 2664, 2656, 2665, 2665, + 2665, 742, 739, 2650, 738, 2648, 2666, 2666, 2666, 737, + 2666, 735, 2664, 2666, 734, 733, 2665, 2669, 2669, 2669, + 729, 2669, 728, 727, 2669, 2674, 2674, 2674, 2677, 2677, + 2677, 2680, 2680, 2680, 726, 2680, 723, 722, 2680, 2691, + 2691, 2691, 2674, 2674, 721, 2664, 2700, 2700, 2700, 2714, + + 2714, 2714, 2715, 2715, 2715, 720, 2691, 2716, 2716, 2716, + 2717, 2717, 2717, 719, 2700, 2665, 2718, 2718, 2718, 718, + 2718, 717, 715, 2718, 712, 2716, 711, 2717, 2720, 2720, + 2720, 709, 2720, 707, 704, 2720, 2725, 2725, 2725, 2726, + 2726, 2726, 703, 2726, 697, 2700, 2726, 2727, 2727, 2727, + 695, 2727, 693, 2725, 2727, 2730, 2730, 2730, 2716, 2731, + 2731, 2731, 690, 2731, 689, 685, 2731, 2734, 2734, 2734, + 684, 2734, 2730, 683, 2734, 2737, 2737, 2737, 682, 2737, + 679, 678, 2737, 2740, 2740, 2740, 2741, 2741, 2741, 2742, + 2742, 2742, 677, 2742, 676, 673, 2742, 2743, 2743, 2743, + + 2740, 672, 671, 2741, 2744, 2744, 2744, 670, 2744, 669, + 663, 2744, 662, 660, 2743, 2747, 2747, 2747, 654, 2747, + 653, 649, 2747, 2756, 2756, 2756, 2757, 2757, 2757, 2763, + 2763, 2763, 642, 638, 2740, 2764, 2764, 2764, 2765, 2765, + 2765, 2756, 2765, 632, 2757, 2765, 2763, 2763, 2766, 2766, + 2766, 628, 2764, 2764, 620, 619, 2765, 2767, 2767, 2767, + 2768, 2768, 2768, 2769, 2769, 2769, 618, 617, 2743, 2778, + 2778, 2778, 2779, 2779, 2779, 616, 2779, 612, 605, 2779, + 2788, 2788, 2788, 2801, 2801, 2801, 2778, 2802, 2802, 2802, + 604, 603, 2757, 2803, 2803, 2803, 599, 592, 2788, 2804, + + 2804, 2804, 591, 2804, 587, 581, 2804, 580, 2810, 2810, + 2810, 2803, 2810, 576, 568, 2810, 2813, 2813, 2813, 567, + 2813, 563, 554, 2813, 2816, 2816, 2816, 2818, 2818, 2818, + 2819, 2819, 2819, 550, 2819, 542, 541, 2819, 2822, 2822, + 2822, 2816, 540, 536, 2818, 530, 2788, 2837, 2837, 2837, + 2839, 2839, 2839, 529, 528, 2822, 2845, 2845, 2845, 2846, + 2846, 2846, 524, 2846, 518, 2837, 2846, 517, 2839, 2850, + 2850, 2850, 513, 2845, 2845, 507, 506, 2846, 2847, 2847, + 2847, 505, 2847, 504, 503, 2847, 2851, 2851, 2851, 2852, + 2852, 2852, 502, 2861, 2861, 2861, 2847, 2861, 501, 497, + + 2861, 2839, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, + 2848, 491, 490, 2848, 2870, 2870, 2870, 488, 2848, 2848, + 2848, 2848, 2848, 2879, 2879, 2879, 2880, 2880, 2880, 2885, + 2885, 2885, 2870, 2886, 2886, 2886, 487, 2886, 486, 482, + 2886, 2888, 2888, 2888, 2880, 471, 2885, 2848, 2848, 2849, + 2849, 2849, 2849, 2849, 2849, 2849, 2849, 2849, 2888, 470, + 2849, 2890, 2890, 2890, 468, 2849, 2849, 2849, 2849, 2849, + 2889, 2889, 2889, 464, 2889, 458, 457, 2889, 2890, 2891, + 2891, 2891, 456, 2891, 452, 446, 2891, 2904, 2904, 2904, + 2929, 2929, 2929, 442, 2849, 2849, 2910, 2910, 2910, 434, + + 2910, 433, 432, 2910, 431, 2904, 430, 426, 2929, 2962, + 2962, 2962, 420, 419, 2910, 2913, 2913, 2913, 2913, 2913, + 2913, 2913, 2913, 2913, 415, 409, 2913, 2962, 408, 404, + 397, 2913, 2913, 2913, 2913, 2913, 2940, 2940, 2940, 396, + 2940, 395, 391, 2940, 2944, 2944, 2944, 384, 2944, 383, + 382, 2944, 2947, 2947, 2947, 381, 2947, 377, 368, 2947, + 2913, 2913, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, + 2914, 362, 358, 2914, 2974, 2974, 2974, 357, 2914, 2914, + 2914, 2914, 2914, 2989, 2989, 2989, 2990, 2990, 2990, 2991, + 2991, 2991, 2974, 2974, 2996, 2996, 2996, 3007, 3007, 3007, + + 2989, 353, 347, 2990, 346, 345, 2991, 2914, 2914, 341, + 334, 2996, 3011, 3011, 3011, 3007, 3020, 3020, 3020, 3021, + 3021, 3021, 332, 3021, 331, 327, 3021, 3022, 3022, 3022, + 3011, 324, 322, 3020, 3023, 3023, 3023, 321, 3023, 320, + 316, 3023, 312, 309, 3022, 3024, 3024, 3024, 3025, 3025, + 3025, 305, 3025, 302, 301, 3025, 3032, 3032, 3032, 3042, + 3042, 3042, 3024, 3011, 3033, 3033, 3033, 293, 3033, 289, + 285, 3033, 284, 3032, 3050, 3050, 3050, 3042, 3050, 283, + 277, 3050, 3053, 3053, 3053, 276, 3053, 274, 271, 3053, + 3056, 3056, 3056, 259, 3056, 0, 3042, 3056, 3065, 3065, + + 3065, 0, 3065, 0, 0, 3065, 3172, 3172, 3172, 3181, + 3181, 3181, 0, 3181, 0, 0, 3181, 3282, 3282, 3282, + 3283, 3283, 3283, 0, 3172, 0, 0, 3181, 0, 0, + 0, 0, 0, 0, 0, 3282, 0, 0, 3283, 3286, + 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3287, 3287, + 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3288, 3288, 3288, + 3288, 3288, 3288, 3288, 3288, 3288, 3289, 3289, 3289, 3289, + 3289, 3289, 3289, 3289, 3289, 3290, 3290, 3290, 3290, 3290, + 3290, 3290, 3290, 3290, 3291, 3291, 3291, 3291, 3291, 3291, + 3291, 3291, 3291, 3292, 3292, 3292, 3292, 3292, 3292, 3292, + + 3292, 3292, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, + 3293, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, + 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3296, + 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3297, 3297, + 3297, 3297, 3297, 3297, 3297, 3297, 3297, 3298, 3298, 3298, + 3298, 3298, 3298, 3298, 3298, 3298, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3300, 3300, 3300, 3300, 3300, + 3300, 3300, 3300, 3300, 3301, 3301, 3301, 3301, 3301, 3301, + 3301, 3301, 3301, 3302, 3302, 3302, 3302, 3302, 3302, 3302, + 3302, 3302, 3303, 3303, 3303, 3303, 3303, 3303, 3303, 3303, + + 3303, 3304, 3304, 3304, 3304, 3304, 3304, 3304, 3304, 3304, + 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3306, + 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3308, 3308, 3308, + 3308, 3308, 3308, 3308, 3308, 3308, 3309, 3309, 3309, 3309, + 3309, 3309, 3309, 3309, 3309, 3310, 3310, 3310, 3310, 3310, + 3310, 3310, 3310, 3310, 3311, 3311, 3311, 3311, 3311, 3311, + 3311, 3311, 3311, 3312, 3312, 3312, 3312, 3312, 3312, 3312, + 3312, 3312, 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3313, + 3313, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + + 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3316, + 3316, 3316, 3316, 3316, 3316, 3316, 3316, 3316, 3317, 3317, + 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3318, 3318, 3318, + 3318, 3318, 3318, 3318, 3318, 3318, 3319, 3319, 3319, 3319, + 3319, 3319, 3319, 3319, 3319, 3320, 3320, 3320, 3320, 3320, + 3320, 3320, 3320, 3320, 3321, 3321, 3321, 3321, 3321, 3321, + 3321, 3321, 3321, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, + 3323, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324, + 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3326, + + 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3327, 3327, + 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3328, 3328, 3328, + 3328, 3328, 3328, 3328, 3328, 3328, 3329, 3329, 3329, 3329, + 3329, 3329, 3329, 3329, 3329, 3330, 3330, 3330, 3330, 3330, + 3330, 3330, 3330, 3330, 3331, 3331, 3331, 3331, 3331, 3331, + 3331, 3331, 3331, 3332, 3332, 3332, 3332, 3332, 3332, 3332, + 3332, 3332, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, + 3333, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, + 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3336, + 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3337, 3337, + + 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3338, 3338, 3338, + 3338, 3338, 3338, 3338, 3338, 3338, 3339, 3339, 3339, 3339, + 3339, 3339, 3339, 3339, 3339, 3340, 3340, 3340, 3340, 3340, + 3340, 3340, 3340, 3340, 3341, 3341, 3341, 3341, 3341, 3341, + 3341, 3341, 3341, 3342, 3342, 3342, 3342, 3342, 3342, 3342, + 3342, 3342, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, + 3343, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344, + 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3346, + 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3347, 3347, + 3347, 0, 0, 0, 3347, 3348, 3348, 3348, 0, 0, + + 0, 3348, 3349, 3349, 3349, 0, 0, 0, 3349, 3350, + 3350, 3350, 0, 0, 0, 3350, 3351, 3351, 3351, 0, + 0, 0, 3351, 3352, 3352, 3352, 0, 0, 0, 3352, + 3353, 3353, 3353, 0, 0, 0, 3353, 3354, 3354, 3354, + 0, 0, 0, 3354, 3355, 3355, 3355, 0, 0, 0, + 3355, 3356, 3356, 3356, 0, 0, 0, 3356, 3357, 3357, + 3357, 0, 0, 0, 3357, 3358, 3358, 3358, 0, 0, + 0, 3358, 3359, 3359, 3359, 0, 0, 0, 3359, 3360, + 3360, 3360, 0, 0, 0, 3360, 3361, 3361, 3361, 0, + 0, 0, 3361, 3362, 3362, 3362, 0, 0, 0, 3362, + + 3363, 3363, 3363, 0, 0, 0, 3363, 3364, 3364, 3364, + 0, 0, 0, 3364, 3365, 3365, 3365, 0, 0, 0, + 3365, 3366, 3366, 3366, 0, 0, 0, 3366, 3367, 3367, + 3367, 0, 0, 0, 3367, 3368, 3368, 3368, 0, 0, + 0, 3368, 3369, 3369, 3369, 0, 0, 0, 3369, 3370, + 3370, 3370, 0, 0, 0, 3370, 3371, 3371, 3371, 0, + 0, 0, 3371, 3372, 3372, 3372, 0, 0, 0, 3372, + 3373, 3373, 3373, 0, 0, 0, 3373, 3374, 3374, 3374, + 0, 0, 0, 3374, 3375, 3375, 3375, 3375, 3375, 3375, + 3375, 0, 3375, 3376, 3376, 3376, 0, 0, 0, 3376, + 3377, 0, 0, 0, 3377, 3378, 3378, 3378, 0, 0, - 0, 3378, 3379, 3379, 3379, 0, 0, 0, 3379, 3380, - 3380, 3380, 0, 0, 0, 3380, 3381, 3381, 3381, 0, - 0, 0, 3381, 3382, 3382, 3382, 0, 0, 0, 3382, - 3383, 3383, 3383, 0, 0, 0, 3383, 3384, 3384, 3384, - 0, 0, 0, 3384, 3385, 3385, 3385, 0, 0, 0, - - 3385, 3386, 3386, 3386, 0, 0, 0, 3386, 3387, 3387, - 3387, 0, 0, 0, 3387, 3388, 3388, 3388, 3388, 3388, - 3388, 3388, 0, 3388, 3389, 3389, 3389, 0, 0, 0, - 3389, 3390, 0, 0, 0, 3390, 3391, 3391, 3391, 0, - 0, 0, 3391, 3392, 0, 0, 0, 3392, 3393, 3393, - 3393, 0, 0, 0, 3393, 3394, 0, 0, 0, 3394, - 3395, 3395, 3395, 0, 0, 0, 3395, 3396, 0, 0, - 0, 3396, 3397, 3397, 3397, 0, 0, 0, 3397, 3398, - 0, 0, 0, 3398, 3399, 3399, 3399, 0, 0, 0, - 3399, 3400, 0, 0, 0, 3400, 3401, 3401, 3401, 0, - - 0, 0, 3401, 3402, 0, 0, 0, 3402, 3403, 3403, - 3403, 0, 0, 0, 3403, 3404, 0, 0, 0, 3404, - 3405, 3405, 3405, 0, 0, 0, 3405, 3406, 0, 0, - 0, 3406, 3407, 3407, 3407, 0, 0, 0, 3407, 3408, - 0, 0, 0, 3408, 3409, 3409, 3409, 0, 0, 0, - 3409, 3410, 0, 0, 0, 3410, 3411, 3411, 3411, 0, - 0, 0, 3411, 3412, 0, 0, 0, 3412, 3413, 3413, - 3413, 0, 0, 0, 3413, 3414, 0, 0, 0, 3414, - 3415, 3415, 3415, 0, 0, 0, 3415, 3416, 0, 0, - 0, 3416, 3417, 3417, 3417, 0, 0, 0, 3417, 3418, - - 0, 0, 0, 3418, 3419, 3419, 3419, 0, 0, 0, - 3419, 3420, 0, 0, 0, 3420, 3421, 3421, 3421, 0, - 0, 0, 3421, 3422, 0, 0, 0, 3422, 3423, 3423, - 3423, 0, 0, 0, 3423, 3424, 0, 0, 0, 3424, - 3425, 3425, 3425, 0, 0, 0, 3425, 3426, 0, 0, - 0, 3426, 3427, 3427, 3427, 0, 0, 0, 3427, 3428, - 0, 0, 0, 3428, 3429, 3429, 3429, 0, 0, 0, - 3429, 3430, 0, 0, 0, 3430, 3431, 3431, 3431, 0, - 0, 0, 3431, 3432, 0, 0, 0, 3432, 3433, 3433, - 3433, 0, 0, 0, 3433, 3434, 0, 0, 0, 3434, - - 3435, 3435, 3435, 0, 0, 0, 3435, 3436, 0, 0, - 0, 3436, 3437, 3437, 3437, 0, 0, 0, 3437, 3438, - 0, 0, 0, 3438, 3439, 3439, 3439, 0, 0, 0, - 3439, 3440, 0, 0, 0, 3440, 3441, 3441, 3441, 0, - 0, 0, 3441, 3442, 0, 0, 0, 3442, 3443, 3443, - 3443, 0, 0, 0, 3443, 3444, 0, 0, 0, 3444, - 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3446, - 0, 0, 0, 0, 3446, 3447, 3447, 3447, 0, 0, - 0, 3447, 3448, 3448, 3448, 3448, 0, 0, 3448, 3448, - 3449, 3449, 3449, 0, 0, 0, 3449, 3450, 3450, 3450, - - 3450, 0, 0, 3450, 3450, 3451, 3451, 3451, 0, 0, - 0, 3451, 3452, 3452, 3452, 3452, 0, 0, 3452, 3452, - 3453, 3453, 3453, 0, 0, 0, 3453, 3454, 3454, 3454, - 3454, 0, 0, 3454, 3454, 3455, 3455, 3455, 0, 0, - 0, 3455, 3456, 3456, 3456, 3456, 0, 0, 3456, 3456, - 3457, 3457, 3457, 0, 0, 0, 3457, 3458, 3458, 3458, - 3458, 0, 0, 3458, 3458, 3459, 3459, 3459, 0, 0, - 0, 3459, 3460, 3460, 3460, 3460, 0, 0, 3460, 3460, - 3461, 3461, 3461, 0, 0, 0, 3461, 3462, 3462, 3462, - 3462, 0, 0, 3462, 3462, 3463, 3463, 3463, 0, 0, - - 0, 3463, 3464, 3464, 3464, 3464, 0, 0, 3464, 3464, - 3465, 3465, 3465, 0, 0, 0, 3465, 3466, 3466, 3466, - 3466, 0, 0, 3466, 3466, 3467, 3467, 3467, 0, 0, - 0, 3467, 3468, 3468, 3468, 3468, 0, 0, 3468, 3468, - 3469, 3469, 3469, 0, 0, 0, 3469, 3470, 3470, 3470, - 3470, 0, 0, 3470, 3470, 3471, 3471, 3471, 0, 0, - 0, 3471, 3472, 3472, 3472, 3472, 0, 0, 3472, 3472, - 3473, 3473, 3473, 0, 0, 0, 3473, 3474, 3474, 3474, - 3474, 0, 0, 3474, 3474, 3475, 3475, 3475, 3475, 0, - 3475, 0, 3475, 3476, 3476, 3476, 3476, 0, 0, 3476, - - 3476, 3477, 3477, 3477, 0, 0, 0, 3477, 3478, 3478, - 3478, 3478, 0, 0, 3478, 3478, 3479, 3479, 3479, 0, - 0, 0, 3479, 3480, 3480, 3480, 3480, 0, 0, 3480, - 3480, 3481, 3481, 3481, 0, 0, 0, 3481, 3482, 3482, - 3482, 3482, 0, 0, 3482, 3482, 3483, 3483, 3483, 0, - 0, 0, 3483, 3484, 3484, 3484, 3484, 0, 0, 3484, - 3484, 3485, 3485, 3485, 3485, 0, 3485, 0, 3485, 3486, + 0, 3378, 3379, 0, 0, 0, 3379, 3380, 3380, 3380, + 0, 0, 0, 3380, 3381, 0, 0, 0, 3381, 3382, + 3382, 3382, 0, 0, 0, 3382, 3383, 0, 0, 0, + 3383, 3384, 3384, 3384, 0, 0, 0, 3384, 3385, 0, + 0, 0, 3385, 3386, 3386, 3386, 0, 0, 0, 3386, + 3387, 0, 0, 0, 3387, 3388, 3388, 3388, 0, 0, + 0, 3388, 3389, 0, 0, 0, 3389, 3390, 3390, 3390, + 0, 0, 0, 3390, 3391, 0, 0, 0, 3391, 3392, + 3392, 3392, 0, 0, 0, 3392, 3393, 0, 0, 0, + + 3393, 3394, 3394, 3394, 0, 0, 0, 3394, 3395, 0, + 0, 0, 3395, 3396, 3396, 3396, 0, 0, 0, 3396, + 3397, 0, 0, 0, 3397, 3398, 3398, 3398, 0, 0, + 0, 3398, 3399, 0, 0, 0, 3399, 3400, 3400, 3400, + 0, 0, 0, 3400, 3401, 0, 0, 0, 3401, 3402, + 3402, 3402, 0, 0, 0, 3402, 3403, 0, 0, 0, + 3403, 3404, 3404, 3404, 0, 0, 0, 3404, 3405, 0, + 0, 0, 3405, 3406, 3406, 3406, 0, 0, 0, 3406, + 3407, 0, 0, 0, 3407, 3408, 3408, 3408, 0, 0, + 0, 3408, 3409, 0, 0, 0, 3409, 3410, 3410, 3410, + + 0, 0, 0, 3410, 3411, 0, 0, 0, 3411, 3412, + 3412, 3412, 0, 0, 0, 3412, 3413, 0, 0, 0, + 3413, 3414, 3414, 3414, 0, 0, 0, 3414, 3415, 0, + 0, 0, 3415, 3416, 3416, 3416, 0, 0, 0, 3416, + 3417, 0, 0, 0, 3417, 3418, 3418, 3418, 0, 0, + 0, 3418, 3419, 0, 0, 0, 3419, 3420, 3420, 3420, + 0, 0, 0, 3420, 3421, 0, 0, 0, 3421, 3422, + 3422, 3422, 0, 0, 0, 3422, 3423, 0, 0, 0, + 3423, 3424, 3424, 3424, 0, 0, 0, 3424, 3425, 0, + 0, 0, 3425, 3426, 3426, 3426, 0, 0, 0, 3426, + + 3427, 0, 0, 0, 3427, 3428, 3428, 3428, 0, 0, + 0, 3428, 3429, 0, 0, 0, 3429, 3430, 3430, 3430, + 0, 0, 0, 3430, 3431, 0, 0, 0, 3431, 3432, + 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3433, 0, + 0, 0, 0, 3433, 3434, 3434, 3434, 0, 0, 0, + 3434, 3435, 3435, 3435, 3435, 0, 0, 3435, 3435, 3436, + 3436, 3436, 0, 0, 0, 3436, 3437, 3437, 3437, 3437, + 0, 0, 3437, 3437, 3438, 3438, 3438, 0, 0, 0, + 3438, 3439, 3439, 3439, 3439, 0, 0, 3439, 3439, 3440, + 3440, 3440, 0, 0, 0, 3440, 3441, 3441, 3441, 3441, + + 0, 0, 3441, 3441, 3442, 3442, 3442, 0, 0, 0, + 3442, 3443, 3443, 3443, 3443, 0, 0, 3443, 3443, 3444, + 3444, 3444, 0, 0, 0, 3444, 3445, 3445, 3445, 3445, + 0, 0, 3445, 3445, 3446, 3446, 3446, 0, 0, 0, + 3446, 3447, 3447, 3447, 3447, 0, 0, 3447, 3447, 3448, + 3448, 3448, 0, 0, 0, 3448, 3449, 3449, 3449, 3449, + 0, 0, 3449, 3449, 3450, 3450, 3450, 0, 0, 0, + 3450, 3451, 3451, 3451, 3451, 0, 0, 3451, 3451, 3452, + 3452, 3452, 0, 0, 0, 3452, 3453, 3453, 3453, 3453, + 0, 0, 3453, 3453, 3454, 3454, 3454, 0, 0, 0, + + 3454, 3455, 3455, 3455, 3455, 0, 0, 3455, 3455, 3456, + 3456, 3456, 0, 0, 0, 3456, 3457, 3457, 3457, 3457, + 0, 0, 3457, 3457, 3458, 3458, 3458, 0, 0, 0, + 3458, 3459, 3459, 3459, 3459, 0, 0, 3459, 3459, 3460, + 3460, 3460, 0, 0, 0, 3460, 3461, 3461, 3461, 3461, + 0, 0, 3461, 3461, 3462, 3462, 3462, 3462, 0, 3462, + 0, 3462, 3463, 3463, 3463, 3463, 0, 0, 3463, 3463, + 3464, 3464, 3464, 0, 0, 0, 3464, 3465, 3465, 3465, + 3465, 0, 0, 3465, 3465, 3466, 3466, 3466, 0, 0, + 0, 3466, 3467, 3467, 3467, 3467, 0, 0, 3467, 3467, + + 3468, 3468, 3468, 0, 0, 0, 3468, 3469, 3469, 3469, + 3469, 0, 0, 3469, 3469, 3470, 3470, 3470, 0, 0, + 0, 3470, 3471, 3471, 3471, 3471, 0, 0, 3471, 3471, + 3472, 3472, 3472, 3472, 0, 3472, 0, 3472, 3473, 3473, + 3473, 3473, 0, 0, 3473, 3473, 3474, 3474, 3474, 3474, + 0, 3474, 0, 3474, 3475, 3475, 3475, 3475, 0, 0, + 3475, 3475, 3476, 3476, 3476, 0, 0, 0, 3476, 3477, + 3477, 3477, 3477, 0, 0, 3477, 3477, 3478, 3478, 3478, + 3478, 0, 3478, 0, 3478, 3479, 3479, 3479, 3479, 0, + 0, 3479, 3479, 3480, 3480, 3480, 3480, 0, 3480, 0, + + 3480, 3481, 3481, 3481, 3481, 0, 0, 3481, 3481, 3482, + 3482, 3482, 0, 0, 0, 3482, 3483, 3483, 3483, 3483, + 0, 0, 3483, 3483, 3484, 3484, 3484, 0, 0, 0, + 3484, 3485, 3485, 3485, 3485, 0, 0, 3485, 3485, 3486, 3486, 3486, 3486, 0, 0, 3486, 3486, 3487, 3487, 3487, - 3487, 0, 3487, 0, 3487, 3488, 3488, 3488, 3488, 0, - 0, 3488, 3488, 3489, 3489, 3489, 0, 0, 0, 3489, - - 3490, 3490, 3490, 3490, 0, 0, 3490, 3490, 3491, 3491, - 3491, 3491, 0, 3491, 0, 3491, 3492, 3492, 3492, 3492, - 0, 0, 3492, 3492, 3493, 3493, 3493, 3493, 0, 3493, - 0, 3493, 3494, 3494, 3494, 3494, 0, 0, 3494, 3494, - 3495, 3495, 3495, 0, 0, 0, 3495, 3496, 3496, 3496, - 3496, 0, 0, 3496, 3496, 3497, 3497, 3497, 0, 0, - 0, 3497, 3498, 3498, 3498, 3498, 0, 0, 3498, 3498, - 3499, 3499, 3499, 3499, 0, 0, 3499, 3499, 3500, 3500, - 3500, 0, 0, 0, 3500, 3501, 3501, 3501, 3501, 0, - 0, 3501, 3501, 3502, 3502, 3502, 3502, 3502, 3502, 3502, - - 3502, 3502, 3503, 0, 3503, 0, 0, 3503, 3504, 3504, - 3504, 0, 0, 0, 3504, 3505, 3505, 3505, 3505, 0, - 0, 3505, 3505, 3506, 3506, 3506, 3506, 0, 3506, 0, - 3506, 3507, 3507, 3507, 3507, 0, 0, 3507, 3507, 3508, - 3508, 3508, 3508, 0, 3508, 0, 3508, 3509, 3509, 3509, - 3509, 0, 0, 3509, 3509, 3510, 3510, 3510, 0, 0, - 0, 3510, 3511, 3511, 3511, 3511, 0, 0, 3511, 3511, - 3512, 3512, 3512, 0, 0, 0, 3512, 3513, 3513, 3513, - 3513, 0, 0, 3513, 3513, 3514, 3514, 3514, 0, 0, - 0, 3514, 3515, 3515, 3515, 3515, 0, 0, 3515, 3515, - - 3516, 3516, 3516, 0, 0, 0, 3516, 3517, 3517, 3517, - 3517, 0, 0, 3517, 3517, 3518, 3518, 3518, 0, 0, - 0, 3518, 3519, 3519, 3519, 3519, 0, 0, 3519, 3519, - 3520, 3520, 3520, 3520, 0, 3520, 0, 3520, 3521, 3521, - 3521, 3521, 0, 0, 3521, 3521, 3522, 3522, 3522, 3522, - 0, 3522, 0, 3522, 3523, 3523, 3523, 3523, 0, 0, - 3523, 3523, 3524, 3524, 3524, 0, 0, 0, 3524, 3525, - 3525, 3525, 3525, 0, 0, 3525, 3525, 3526, 3526, 3526, - 3526, 0, 3526, 0, 3526, 3527, 3527, 3527, 3527, 0, - 0, 3527, 3527, 3528, 3528, 3528, 3528, 0, 3528, 0, - - 3528, 3529, 3529, 3529, 3529, 0, 0, 3529, 3529, 3530, - 3530, 3530, 0, 0, 0, 3530, 3531, 3531, 3531, 3531, - 0, 0, 3531, 3531, 3532, 3532, 3532, 0, 0, 0, - 3532, 3533, 3533, 3533, 3533, 0, 0, 3533, 3533, 3534, - 3534, 3534, 0, 0, 0, 3534, 3535, 3535, 3535, 3535, - 0, 0, 3535, 3535, 3536, 3536, 3536, 0, 0, 0, - 3536, 3537, 3537, 3537, 3537, 0, 0, 3537, 3537, 3538, - 3538, 3538, 0, 0, 0, 3538, 3539, 3539, 3539, 3539, - 0, 0, 3539, 3539, 3540, 3540, 3540, 0, 0, 0, - 3540, 3541, 3541, 3541, 3541, 0, 0, 3541, 3541, 3542, - - 3542, 3542, 0, 0, 0, 3542, 3543, 3543, 3543, 3543, - 0, 0, 3543, 3543, 3544, 3544, 3544, 0, 0, 0, - 3544, 3545, 3545, 3545, 3545, 0, 0, 3545, 3545, 3546, - 3546, 3546, 0, 0, 0, 3546, 3547, 3547, 3547, 3547, - 0, 0, 3547, 3547, 3548, 3548, 3548, 3548, 0, 0, - 3548, 3548, 3549, 3549, 3549, 0, 0, 0, 3549, 3550, - 3550, 3550, 3550, 0, 0, 3550, 3550, 3551, 3551, 3551, - 0, 0, 0, 3551, 3552, 3552, 3552, 3552, 0, 0, - 3552, 3552, 3553, 3553, 3553, 0, 0, 0, 3553, 3554, - 3554, 3554, 3554, 0, 0, 3554, 3554, 3555, 3555, 3555, - + 0, 0, 0, 3487, 3488, 3488, 3488, 3488, 0, 0, + 3488, 3488, 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3489, + 3489, 3490, 0, 3490, 0, 0, 3490, 3491, 3491, 3491, + 0, 0, 0, 3491, 3492, 3492, 3492, 3492, 0, 0, + 3492, 3492, 3493, 3493, 3493, 3493, 0, 3493, 0, 3493, + + 3494, 3494, 3494, 3494, 0, 0, 3494, 3494, 3495, 3495, + 3495, 3495, 0, 3495, 0, 3495, 3496, 3496, 3496, 3496, + 0, 0, 3496, 3496, 3497, 3497, 3497, 0, 0, 0, + 3497, 3498, 3498, 3498, 3498, 0, 0, 3498, 3498, 3499, + 3499, 3499, 0, 0, 0, 3499, 3500, 3500, 3500, 3500, + 0, 0, 3500, 3500, 3501, 3501, 3501, 0, 0, 0, + 3501, 3502, 3502, 3502, 3502, 0, 0, 3502, 3502, 3503, + 3503, 3503, 0, 0, 0, 3503, 3504, 3504, 3504, 3504, + 0, 0, 3504, 3504, 3505, 3505, 3505, 0, 0, 0, + 3505, 3506, 3506, 3506, 3506, 0, 0, 3506, 3506, 3507, + + 3507, 3507, 3507, 0, 3507, 0, 3507, 3508, 3508, 3508, + 3508, 0, 0, 3508, 3508, 3509, 3509, 3509, 3509, 0, + 3509, 0, 3509, 3510, 3510, 3510, 3510, 0, 0, 3510, + 3510, 3511, 3511, 3511, 0, 0, 0, 3511, 3512, 3512, + 3512, 3512, 0, 0, 3512, 3512, 3513, 3513, 3513, 3513, + 0, 3513, 0, 3513, 3514, 3514, 3514, 3514, 0, 0, + 3514, 3514, 3515, 3515, 3515, 3515, 0, 3515, 0, 3515, + 3516, 3516, 3516, 3516, 0, 0, 3516, 3516, 3517, 3517, + 3517, 0, 0, 0, 3517, 3518, 3518, 3518, 3518, 0, + 0, 3518, 3518, 3519, 3519, 3519, 0, 0, 0, 3519, + + 3520, 3520, 3520, 3520, 0, 0, 3520, 3520, 3521, 3521, + 3521, 0, 0, 0, 3521, 3522, 3522, 3522, 3522, 0, + 0, 3522, 3522, 3523, 3523, 3523, 0, 0, 0, 3523, + 3524, 3524, 3524, 3524, 0, 0, 3524, 3524, 3525, 3525, + 3525, 0, 0, 0, 3525, 3526, 3526, 3526, 3526, 0, + 0, 3526, 3526, 3527, 3527, 3527, 0, 0, 0, 3527, + 3528, 3528, 3528, 3528, 0, 0, 3528, 3528, 3529, 3529, + 3529, 0, 0, 0, 3529, 3530, 3530, 3530, 3530, 0, + 0, 3530, 3530, 3531, 3531, 3531, 0, 0, 0, 3531, + 3532, 3532, 3532, 3532, 0, 0, 3532, 3532, 3533, 3533, + + 3533, 0, 0, 0, 3533, 3534, 3534, 3534, 3534, 0, + 0, 3534, 3534, 3535, 3535, 3535, 3535, 0, 0, 3535, + 3535, 3536, 3536, 3536, 0, 0, 0, 3536, 3537, 3537, + 3537, 3537, 0, 0, 3537, 3537, 3538, 3538, 3538, 0, + 0, 0, 3538, 3539, 3539, 3539, 3539, 0, 0, 3539, + 3539, 3540, 3540, 3540, 0, 0, 0, 3540, 3541, 3541, + 3541, 3541, 0, 0, 3541, 3541, 3542, 3542, 3542, 3542, + 0, 0, 3542, 3542, 3543, 3543, 3543, 0, 0, 0, + 3543, 3544, 3544, 3544, 3544, 0, 0, 3544, 3544, 3545, + 3545, 3545, 3545, 3545, 3545, 3545, 3545, 3545, 3546, 3546, + + 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3547, 3547, 3547, + 0, 0, 0, 3547, 3548, 3548, 3548, 3548, 0, 0, + 3548, 3548, 3549, 3549, 3549, 3549, 0, 0, 3549, 3549, + 3550, 3550, 3550, 0, 0, 0, 3550, 3551, 3551, 3551, + 3551, 0, 0, 3551, 3551, 3552, 3552, 3552, 0, 0, + 0, 3552, 3553, 3553, 3553, 3553, 0, 0, 3553, 3553, + 3554, 3554, 3554, 0, 0, 0, 3554, 3555, 3555, 3555, 3555, 0, 0, 3555, 3555, 3556, 3556, 3556, 0, 0, - 0, 3556, 3557, 3557, 3557, 3557, 0, 0, 3557, 3557, - 3558, 3558, 3558, 3558, 3558, 3558, 3558, 3558, 3558, 3559, - 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3560, 3560, - 3560, 0, 0, 0, 3560, 3561, 3561, 3561, 3561, 0, - 0, 3561, 3561, 3562, 3562, 3562, 3562, 0, 0, 3562, - 3562, 3563, 3563, 3563, 0, 0, 0, 3563, 3564, 3564, - 3564, 3564, 0, 0, 3564, 3564, 3565, 3565, 3565, 0, - 0, 0, 3565, 3566, 3566, 3566, 3566, 0, 0, 3566, - 3566, 3567, 3567, 3567, 0, 0, 0, 3567, 3568, 3568, - - 3568, 3568, 0, 0, 3568, 3568, 3569, 3569, 3569, 0, - 0, 0, 3569, 3570, 3570, 3570, 0, 0, 0, 3570, - 3571, 3571, 3571, 3571, 0, 0, 3571, 3571, 3572, 3572, - 3572, 0, 0, 0, 3572, 3573, 3573, 3573, 3573, 0, - 0, 3573, 3573, 3574, 3574, 3574, 3574, 0, 0, 3574, - 3574, 3575, 3575, 3575, 0, 0, 0, 3575, 3576, 3576, - 3576, 3576, 0, 0, 3576, 3576, 3577, 3577, 3577, 0, - 0, 0, 3577, 3578, 3578, 3578, 3578, 0, 0, 3578, - 3578, 3579, 3579, 3579, 3579, 0, 0, 3579, 3579, 3580, - 3580, 3580, 3580, 0, 0, 3580, 3580, 3581, 3581, 3581, - - 0, 0, 0, 3581, 3582, 3582, 3582, 3582, 0, 0, - 3582, 3582, 3583, 3583, 3583, 3583, 0, 3583, 0, 3583, - 3584, 3584, 3584, 3584, 0, 0, 3584, 3584, 3585, 3585, - 3585, 0, 0, 0, 3585, 3586, 3586, 3586, 3586, 0, - 0, 3586, 3586, 3587, 3587, 3587, 0, 0, 0, 3587, - 3588, 3588, 3588, 3588, 0, 0, 3588, 3588, 3589, 3589, - 3589, 0, 0, 0, 3589, 3590, 3590, 3590, 3590, 0, - 0, 3590, 3590, 3591, 3591, 3591, 0, 0, 0, 3591, - 3592, 3592, 3592, 3592, 0, 0, 3592, 3592, 3593, 3593, - 3593, 0, 0, 0, 3593, 3594, 3594, 3594, 3594, 0, - - 0, 3594, 3594, 3595, 3595, 3595, 0, 0, 0, 3595, - 3596, 3596, 3596, 3596, 0, 0, 3596, 3596, 3597, 3597, - 3597, 0, 0, 0, 3597, 3598, 3598, 3598, 3598, 0, - 0, 3598, 3598, 3599, 3599, 3599, 3599, 0, 0, 3599, - 3599, 3600, 3600, 3600, 0, 0, 0, 3600, 3601, 3601, - 3601, 3601, 0, 0, 3601, 3601, 3602, 3602, 3602, 0, - 0, 0, 3602, 3603, 3603, 3603, 3603, 0, 0, 3603, - 3603, 3604, 3604, 3604, 3604, 0, 3604, 0, 3604, 3605, - 3605, 3605, 3605, 0, 0, 3605, 3605, 3606, 3606, 3606, - 3606, 0, 0, 3606, 3606, 3607, 3607, 3607, 3607, 0, - - 3607, 0, 3607, 3608, 3608, 3608, 3608, 0, 0, 3608, - 3608, 3609, 3609, 3609, 3609, 3609, 3609, 3609, 3609, 3609, - 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3611, - 3611, 3611, 0, 0, 0, 3611, 3612, 3612, 3612, 3612, - 0, 0, 3612, 3612, 3613, 3613, 3613, 3613, 0, 0, - 3613, 3613, 3614, 3614, 3614, 0, 0, 0, 3614, 3615, - 3615, 3615, 3615, 0, 0, 3615, 3615, 3616, 3616, 3616, - 0, 0, 0, 3616, 3617, 3617, 3617, 3617, 0, 0, - 3617, 3617, 3618, 3618, 3618, 0, 0, 0, 3618, 3619, - 3619, 3619, 3619, 0, 0, 3619, 3619, 3620, 3620, 3620, - - 0, 0, 0, 3620, 3621, 3621, 3621, 0, 0, 0, - 3621, 3622, 3622, 3622, 3622, 0, 0, 3622, 3622, 3623, - 3623, 3623, 0, 0, 0, 3623, 3624, 3624, 3624, 3624, - 0, 0, 3624, 3624, 3625, 3625, 3625, 3625, 0, 0, - 3625, 3625, 3626, 3626, 3626, 3626, 0, 3626, 0, 3626, - 3627, 3627, 3627, 3627, 0, 0, 3627, 3627, 3628, 3628, - 3628, 0, 0, 0, 3628, 3629, 3629, 3629, 3629, 0, - 0, 3629, 3629, 3630, 3630, 3630, 3630, 0, 0, 3630, - 3630, 3631, 3631, 3631, 0, 0, 0, 3631, 3632, 3632, - 3632, 3632, 0, 0, 3632, 3632, 3633, 3633, 3633, 3633, - - 0, 3633, 0, 3633, 3634, 3634, 3634, 3634, 0, 0, - 3634, 3634, 3635, 3635, 3635, 0, 0, 0, 3635, 3636, - 3636, 3636, 3636, 0, 0, 3636, 3636, 3637, 3637, 3637, - 0, 0, 0, 3637, 3638, 3638, 3638, 3638, 0, 0, - 3638, 3638, 3639, 3639, 3639, 0, 0, 0, 3639, 3640, - 3640, 3640, 3640, 0, 0, 3640, 3640, 3641, 3641, 3641, - 0, 0, 0, 3641, 3642, 3642, 3642, 3642, 0, 0, - 3642, 3642, 3643, 3643, 3643, 0, 0, 0, 3643, 3644, - 3644, 3644, 3644, 0, 0, 3644, 3644, 3645, 3645, 3645, - 3645, 0, 3645, 0, 3645, 3646, 3646, 3646, 3646, 0, - - 0, 3646, 3646, 3647, 3647, 3647, 0, 0, 0, 3647, - 3648, 3648, 3648, 3648, 0, 0, 3648, 3648, 3649, 3649, - 3649, 3649, 0, 0, 3649, 3649, 3650, 3650, 3650, 3650, - 0, 3650, 0, 3650, 3651, 3651, 3651, 3651, 0, 0, - 3651, 3651, 3652, 3652, 3652, 0, 0, 0, 3652, 3653, - 3653, 3653, 3653, 0, 0, 3653, 3653, 3654, 3654, 3654, - 3654, 0, 0, 3654, 3654, 3655, 3655, 3655, 3655, 0, - 0, 3655, 3655, 3656, 3656, 3656, 3656, 0, 0, 3656, - 3656, 3657, 3657, 3657, 3657, 3657, 3657, 3657, 3657, 3657, - 3658, 3658, 3658, 3658, 3658, 3658, 3658, 3658, 3658, 3659, - - 3659, 3659, 3659, 0, 3659, 0, 3659, 3660, 3660, 3660, - 3660, 0, 0, 3660, 3660, 3661, 3661, 3661, 3661, 0, - 0, 3661, 3661, 3662, 3662, 3662, 0, 0, 0, 3662, - 3663, 3663, 3663, 3663, 0, 0, 3663, 3663, 3664, 3664, - 3664, 0, 0, 0, 3664, 3665, 3665, 3665, 3665, 0, - 0, 3665, 3665, 3666, 3666, 3666, 3666, 0, 3666, 0, - 3666, 3667, 3667, 3667, 3667, 0, 0, 3667, 3667, 3668, - 3668, 3668, 3668, 0, 3668, 0, 3668, 3669, 3669, 3669, - 3669, 0, 3669, 0, 3669, 3670, 3670, 3670, 3670, 0, - 0, 3670, 3670, 3671, 3671, 3671, 3671, 0, 3671, 0, - - 3671, 3672, 3672, 3672, 3672, 0, 0, 3672, 3672, 3673, - 3673, 3673, 3673, 0, 0, 3673, 3673, 3674, 3674, 3674, - 3674, 0, 0, 3674, 3674, 3675, 3675, 3675, 0, 0, - 0, 3675, 3676, 3676, 3676, 3676, 0, 0, 3676, 3676, - 3677, 3677, 3677, 0, 0, 0, 3677, 3678, 3678, 3678, - 3678, 0, 0, 3678, 3678, 3679, 3679, 3679, 3679, 0, - 3679, 0, 3679, 3680, 3680, 3680, 3680, 0, 0, 3680, - 3680, 3681, 3681, 3681, 0, 0, 0, 3681, 3682, 3682, - 3682, 0, 0, 0, 3682, 3683, 3683, 3683, 3683, 0, - 0, 3683, 3683, 3684, 3684, 3684, 0, 0, 0, 3684, - - 3685, 3685, 3685, 3685, 0, 0, 3685, 3685, 3686, 3686, - 3686, 0, 0, 0, 3686, 3687, 3687, 3687, 0, 0, - 0, 3687, 3688, 3688, 3688, 3688, 0, 0, 3688, 3688, - 3689, 3689, 3689, 0, 0, 0, 3689, 3690, 3690, 3690, - 3690, 0, 0, 3690, 3690, 3691, 3691, 3691, 0, 0, - 0, 3691, 3692, 3692, 3692, 3692, 0, 0, 3692, 3692, - 3693, 3693, 3693, 3693, 0, 0, 3693, 3693, 3694, 3694, - 3694, 3694, 0, 0, 3694, 3694, 3695, 3695, 3695, 0, - 0, 0, 3695, 3696, 3696, 3696, 3696, 0, 0, 3696, - 3696, 3697, 3697, 3697, 3697, 0, 0, 3697, 3697, 3698, - - 3698, 3698, 3698, 0, 0, 3698, 3698, 3699, 3699, 3699, - 3699, 3699, 3699, 3699, 3699, 3699, 3700, 3700, 3700, 3700, - 3700, 3700, 3700, 3700, 3700, 3701, 3701, 3701, 3701, 0, - 0, 3701, 3701, 3702, 3702, 3702, 3702, 0, 0, 3702, - 3702, 3703, 3703, 3703, 0, 0, 0, 3703, 3704, 3704, - 3704, 0, 0, 0, 3704, 3705, 3705, 3705, 3705, 0, - 0, 3705, 3705, 3706, 3706, 3706, 3706, 0, 0, 3706, - 3706, 3707, 3707, 3707, 3707, 0, 0, 3707, 3707, 3708, - 3708, 3708, 3708, 0, 0, 3708, 3708, 3709, 3709, 3709, - 3709, 0, 0, 3709, 3709, 3710, 3710, 3710, 0, 0, - - 0, 3710, 3711, 3711, 3711, 3711, 0, 0, 3711, 3711, - 3712, 3712, 3712, 0, 0, 0, 3712, 3713, 3713, 3713, - 3713, 0, 0, 3713, 3713, 3714, 3714, 3714, 3714, 0, - 0, 3714, 3714, 3715, 3715, 3715, 0, 0, 0, 3715, - 3716, 3716, 3716, 0, 0, 0, 3716, 3717, 3717, 3717, - 3717, 0, 0, 3717, 3717, 3718, 3718, 3718, 0, 0, - 0, 3718, 3719, 3719, 3719, 3719, 0, 0, 3719, 3719, - 3720, 3720, 3720, 0, 0, 0, 3720, 3721, 3721, 3721, - 0, 0, 0, 3721, 3722, 3722, 3722, 0, 0, 0, - 3722, 3723, 3723, 3723, 3723, 0, 0, 3723, 3723, 3724, - - 3724, 3724, 0, 0, 0, 3724, 3725, 3725, 3725, 3725, - 0, 0, 3725, 3725, 3726, 3726, 3726, 3726, 0, 0, - 3726, 3726, 3727, 3727, 3727, 3727, 0, 0, 3727, 3727, - 3728, 3728, 3728, 3728, 0, 3728, 0, 3728, 3729, 3729, - 3729, 3729, 0, 0, 3729, 3729, 3730, 3730, 3730, 3730, - 0, 0, 3730, 3730, 3731, 3731, 3731, 3731, 0, 0, - 3731, 3731, 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732, - 3732, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, - 3734, 3734, 3734, 3734, 0, 0, 3734, 3734, 3735, 3735, - 3735, 3735, 0, 0, 3735, 3735, 3736, 3736, 3736, 0, - - 0, 0, 3736, 3737, 3737, 3737, 3737, 0, 3737, 0, - 3737, 3738, 3738, 3738, 3738, 0, 0, 3738, 3738, 3739, - 3739, 3739, 3739, 0, 0, 3739, 3739, 3740, 3740, 3740, - 3740, 0, 0, 3740, 3740, 3741, 3741, 3741, 3741, 0, - 0, 3741, 3741, 3742, 3742, 3742, 0, 0, 0, 3742, - 3743, 3743, 3743, 3743, 0, 0, 3743, 3743, 3744, 3744, - 3744, 0, 0, 0, 3744, 3745, 3745, 3745, 3745, 0, - 0, 3745, 3745, 3746, 3746, 3746, 3746, 0, 0, 3746, - 3746, 3747, 3747, 3747, 0, 0, 0, 3747, 3748, 3748, - 3748, 0, 0, 0, 3748, 3749, 3749, 3749, 3749, 0, - - 3749, 0, 3749, 3750, 3750, 3750, 3750, 0, 0, 3750, - 3750, 3751, 3751, 3751, 3751, 0, 3751, 0, 3751, 3752, - 3752, 3752, 0, 0, 0, 3752, 3753, 3753, 3753, 0, - 0, 0, 3753, 3754, 3754, 3754, 3754, 0, 0, 3754, - 3754, 3755, 3755, 3755, 3755, 0, 3755, 0, 3755, 3756, - 3756, 3756, 3756, 0, 0, 3756, 3756, 3757, 3757, 3757, - 3757, 0, 0, 3757, 3757, 3758, 3758, 3758, 3758, 0, - 0, 3758, 3758, 3759, 3759, 3759, 3759, 0, 3759, 0, - 3759, 3760, 3760, 3760, 3760, 0, 0, 3760, 3760, 3761, - 3761, 3761, 3761, 0, 0, 3761, 3761, 3762, 3762, 3762, - - 3762, 3762, 3762, 3762, 3762, 3762, 3763, 3763, 3763, 3763, - 3763, 3763, 3763, 3763, 3763, 3764, 3764, 3764, 3764, 0, - 0, 3764, 3764, 3765, 3765, 3765, 0, 0, 0, 3765, - 3766, 3766, 3766, 0, 0, 0, 3766, 3767, 3767, 3767, - 3767, 0, 0, 3767, 3767, 3768, 3768, 3768, 3768, 0, - 0, 3768, 3768, 3769, 3769, 3769, 3769, 0, 0, 3769, - 3769, 3770, 3770, 3770, 0, 0, 0, 3770, 3771, 3771, - 3771, 3771, 0, 0, 3771, 3771, 3772, 3772, 3772, 0, - 0, 0, 3772, 3773, 3773, 3773, 3773, 3773, 3773, 3773, - 3773, 3773, 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, - - 3774, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, - 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3777, - 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3778, 3778, - 3778, 3778, 3778, 3778, 3778, 3778, 3778, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - - 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, - 3298, 3298 + 0, 3556, 3557, 3557, 3557, 0, 0, 0, 3557, 3558, + 3558, 3558, 3558, 0, 0, 3558, 3558, 3559, 3559, 3559, + + 0, 0, 0, 3559, 3560, 3560, 3560, 3560, 0, 0, + 3560, 3560, 3561, 3561, 3561, 3561, 0, 0, 3561, 3561, + 3562, 3562, 3562, 0, 0, 0, 3562, 3563, 3563, 3563, + 3563, 0, 0, 3563, 3563, 3564, 3564, 3564, 0, 0, + 0, 3564, 3565, 3565, 3565, 3565, 0, 0, 3565, 3565, + 3566, 3566, 3566, 3566, 0, 0, 3566, 3566, 3567, 3567, + 3567, 3567, 0, 0, 3567, 3567, 3568, 3568, 3568, 0, + 0, 0, 3568, 3569, 3569, 3569, 3569, 0, 0, 3569, + 3569, 3570, 3570, 3570, 3570, 0, 3570, 0, 3570, 3571, + 3571, 3571, 3571, 0, 0, 3571, 3571, 3572, 3572, 3572, + + 0, 0, 0, 3572, 3573, 3573, 3573, 3573, 0, 0, + 3573, 3573, 3574, 3574, 3574, 0, 0, 0, 3574, 3575, + 3575, 3575, 3575, 0, 0, 3575, 3575, 3576, 3576, 3576, + 0, 0, 0, 3576, 3577, 3577, 3577, 3577, 0, 0, + 3577, 3577, 3578, 3578, 3578, 0, 0, 0, 3578, 3579, + 3579, 3579, 3579, 0, 0, 3579, 3579, 3580, 3580, 3580, + 0, 0, 0, 3580, 3581, 3581, 3581, 3581, 0, 0, + 3581, 3581, 3582, 3582, 3582, 0, 0, 0, 3582, 3583, + 3583, 3583, 3583, 0, 0, 3583, 3583, 3584, 3584, 3584, + 0, 0, 0, 3584, 3585, 3585, 3585, 3585, 0, 0, + + 3585, 3585, 3586, 3586, 3586, 3586, 0, 0, 3586, 3586, + 3587, 3587, 3587, 0, 0, 0, 3587, 3588, 3588, 3588, + 3588, 0, 0, 3588, 3588, 3589, 3589, 3589, 0, 0, + 0, 3589, 3590, 3590, 3590, 3590, 0, 0, 3590, 3590, + 3591, 3591, 3591, 3591, 0, 3591, 0, 3591, 3592, 3592, + 3592, 3592, 0, 0, 3592, 3592, 3593, 3593, 3593, 3593, + 0, 0, 3593, 3593, 3594, 3594, 3594, 3594, 0, 3594, + 0, 3594, 3595, 3595, 3595, 3595, 0, 0, 3595, 3595, + 3596, 3596, 3596, 3596, 3596, 3596, 3596, 3596, 3596, 3597, + 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3598, 3598, + + 3598, 0, 0, 0, 3598, 3599, 3599, 3599, 3599, 0, + 0, 3599, 3599, 3600, 3600, 3600, 3600, 0, 0, 3600, + 3600, 3601, 3601, 3601, 0, 0, 0, 3601, 3602, 3602, + 3602, 3602, 0, 0, 3602, 3602, 3603, 3603, 3603, 0, + 0, 0, 3603, 3604, 3604, 3604, 3604, 0, 0, 3604, + 3604, 3605, 3605, 3605, 0, 0, 0, 3605, 3606, 3606, + 3606, 3606, 0, 0, 3606, 3606, 3607, 3607, 3607, 0, + 0, 0, 3607, 3608, 3608, 3608, 0, 0, 0, 3608, + 3609, 3609, 3609, 3609, 0, 0, 3609, 3609, 3610, 3610, + 3610, 0, 0, 0, 3610, 3611, 3611, 3611, 3611, 0, + + 0, 3611, 3611, 3612, 3612, 3612, 3612, 0, 0, 3612, + 3612, 3613, 3613, 3613, 3613, 0, 3613, 0, 3613, 3614, + 3614, 3614, 3614, 0, 0, 3614, 3614, 3615, 3615, 3615, + 0, 0, 0, 3615, 3616, 3616, 3616, 3616, 0, 0, + 3616, 3616, 3617, 3617, 3617, 3617, 0, 0, 3617, 3617, + 3618, 3618, 3618, 0, 0, 0, 3618, 3619, 3619, 3619, + 3619, 0, 0, 3619, 3619, 3620, 3620, 3620, 3620, 0, + 3620, 0, 3620, 3621, 3621, 3621, 3621, 0, 0, 3621, + 3621, 3622, 3622, 3622, 0, 0, 0, 3622, 3623, 3623, + 3623, 3623, 0, 0, 3623, 3623, 3624, 3624, 3624, 0, + + 0, 0, 3624, 3625, 3625, 3625, 3625, 0, 0, 3625, + 3625, 3626, 3626, 3626, 0, 0, 0, 3626, 3627, 3627, + 3627, 3627, 0, 0, 3627, 3627, 3628, 3628, 3628, 0, + 0, 0, 3628, 3629, 3629, 3629, 3629, 0, 0, 3629, + 3629, 3630, 3630, 3630, 0, 0, 0, 3630, 3631, 3631, + 3631, 3631, 0, 0, 3631, 3631, 3632, 3632, 3632, 3632, + 0, 3632, 0, 3632, 3633, 3633, 3633, 3633, 0, 0, + 3633, 3633, 3634, 3634, 3634, 0, 0, 0, 3634, 3635, + 3635, 3635, 3635, 0, 0, 3635, 3635, 3636, 3636, 3636, + 3636, 0, 0, 3636, 3636, 3637, 3637, 3637, 3637, 0, + + 3637, 0, 3637, 3638, 3638, 3638, 3638, 0, 0, 3638, + 3638, 3639, 3639, 3639, 0, 0, 0, 3639, 3640, 3640, + 3640, 3640, 0, 0, 3640, 3640, 3641, 3641, 3641, 3641, + 0, 0, 3641, 3641, 3642, 3642, 3642, 3642, 0, 0, + 3642, 3642, 3643, 3643, 3643, 3643, 0, 0, 3643, 3643, + 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3645, + 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3646, 3646, + 3646, 3646, 0, 3646, 0, 3646, 3647, 3647, 3647, 3647, + 0, 0, 3647, 3647, 3648, 3648, 3648, 3648, 0, 0, + 3648, 3648, 3649, 3649, 3649, 0, 0, 0, 3649, 3650, + + 3650, 3650, 3650, 0, 0, 3650, 3650, 3651, 3651, 3651, + 0, 0, 0, 3651, 3652, 3652, 3652, 3652, 0, 0, + 3652, 3652, 3653, 3653, 3653, 3653, 0, 3653, 0, 3653, + 3654, 3654, 3654, 3654, 0, 0, 3654, 3654, 3655, 3655, + 3655, 3655, 0, 3655, 0, 3655, 3656, 3656, 3656, 3656, + 0, 3656, 0, 3656, 3657, 3657, 3657, 3657, 0, 0, + 3657, 3657, 3658, 3658, 3658, 3658, 0, 3658, 0, 3658, + 3659, 3659, 3659, 3659, 0, 0, 3659, 3659, 3660, 3660, + 3660, 3660, 0, 0, 3660, 3660, 3661, 3661, 3661, 3661, + 0, 0, 3661, 3661, 3662, 3662, 3662, 0, 0, 0, + + 3662, 3663, 3663, 3663, 3663, 0, 0, 3663, 3663, 3664, + 3664, 3664, 0, 0, 0, 3664, 3665, 3665, 3665, 3665, + 0, 0, 3665, 3665, 3666, 3666, 3666, 3666, 0, 3666, + 0, 3666, 3667, 3667, 3667, 3667, 0, 0, 3667, 3667, + 3668, 3668, 3668, 0, 0, 0, 3668, 3669, 3669, 3669, + 0, 0, 0, 3669, 3670, 3670, 3670, 3670, 0, 0, + 3670, 3670, 3671, 3671, 3671, 0, 0, 0, 3671, 3672, + 3672, 3672, 3672, 0, 0, 3672, 3672, 3673, 3673, 3673, + 0, 0, 0, 3673, 3674, 3674, 3674, 0, 0, 0, + 3674, 3675, 3675, 3675, 3675, 0, 0, 3675, 3675, 3676, + + 3676, 3676, 0, 0, 0, 3676, 3677, 3677, 3677, 3677, + 0, 0, 3677, 3677, 3678, 3678, 3678, 0, 0, 0, + 3678, 3679, 3679, 3679, 3679, 0, 0, 3679, 3679, 3680, + 3680, 3680, 3680, 0, 0, 3680, 3680, 3681, 3681, 3681, + 3681, 0, 0, 3681, 3681, 3682, 3682, 3682, 0, 0, + 0, 3682, 3683, 3683, 3683, 3683, 0, 0, 3683, 3683, + 3684, 3684, 3684, 3684, 0, 0, 3684, 3684, 3685, 3685, + 3685, 3685, 0, 0, 3685, 3685, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3687, 3687, 3687, 3687, 3687, + 3687, 3687, 3687, 3687, 3688, 3688, 3688, 3688, 0, 0, + + 3688, 3688, 3689, 3689, 3689, 3689, 0, 0, 3689, 3689, + 3690, 3690, 3690, 0, 0, 0, 3690, 3691, 3691, 3691, + 0, 0, 0, 3691, 3692, 3692, 3692, 3692, 0, 0, + 3692, 3692, 3693, 3693, 3693, 3693, 0, 0, 3693, 3693, + 3694, 3694, 3694, 3694, 0, 0, 3694, 3694, 3695, 3695, + 3695, 3695, 0, 0, 3695, 3695, 3696, 3696, 3696, 3696, + 0, 0, 3696, 3696, 3697, 3697, 3697, 0, 0, 0, + 3697, 3698, 3698, 3698, 3698, 0, 0, 3698, 3698, 3699, + 3699, 3699, 0, 0, 0, 3699, 3700, 3700, 3700, 3700, + 0, 0, 3700, 3700, 3701, 3701, 3701, 3701, 0, 0, + + 3701, 3701, 3702, 3702, 3702, 0, 0, 0, 3702, 3703, + 3703, 3703, 0, 0, 0, 3703, 3704, 3704, 3704, 3704, + 0, 0, 3704, 3704, 3705, 3705, 3705, 0, 0, 0, + 3705, 3706, 3706, 3706, 3706, 0, 0, 3706, 3706, 3707, + 3707, 3707, 0, 0, 0, 3707, 3708, 3708, 3708, 0, + 0, 0, 3708, 3709, 3709, 3709, 0, 0, 0, 3709, + 3710, 3710, 3710, 3710, 0, 0, 3710, 3710, 3711, 3711, + 3711, 0, 0, 0, 3711, 3712, 3712, 3712, 3712, 0, + 0, 3712, 3712, 3713, 3713, 3713, 3713, 0, 0, 3713, + 3713, 3714, 3714, 3714, 3714, 0, 0, 3714, 3714, 3715, + + 3715, 3715, 3715, 0, 3715, 0, 3715, 3716, 3716, 3716, + 3716, 0, 0, 3716, 3716, 3717, 3717, 3717, 3717, 0, + 0, 3717, 3717, 3718, 3718, 3718, 3718, 0, 0, 3718, + 3718, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719, + 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3721, + 3721, 3721, 3721, 0, 0, 3721, 3721, 3722, 3722, 3722, + 3722, 0, 0, 3722, 3722, 3723, 3723, 3723, 0, 0, + 0, 3723, 3724, 3724, 3724, 3724, 0, 3724, 0, 3724, + 3725, 3725, 3725, 3725, 0, 0, 3725, 3725, 3726, 3726, + 3726, 3726, 0, 0, 3726, 3726, 3727, 3727, 3727, 3727, + + 0, 0, 3727, 3727, 3728, 3728, 3728, 3728, 0, 0, + 3728, 3728, 3729, 3729, 3729, 0, 0, 0, 3729, 3730, + 3730, 3730, 3730, 0, 0, 3730, 3730, 3731, 3731, 3731, + 0, 0, 0, 3731, 3732, 3732, 3732, 3732, 0, 0, + 3732, 3732, 3733, 3733, 3733, 3733, 0, 0, 3733, 3733, + 3734, 3734, 3734, 0, 0, 0, 3734, 3735, 3735, 3735, + 0, 0, 0, 3735, 3736, 3736, 3736, 3736, 0, 3736, + 0, 3736, 3737, 3737, 3737, 3737, 0, 0, 3737, 3737, + 3738, 3738, 3738, 3738, 0, 3738, 0, 3738, 3739, 3739, + 3739, 0, 0, 0, 3739, 3740, 3740, 3740, 0, 0, + + 0, 3740, 3741, 3741, 3741, 3741, 0, 0, 3741, 3741, + 3742, 3742, 3742, 3742, 0, 3742, 0, 3742, 3743, 3743, + 3743, 3743, 0, 0, 3743, 3743, 3744, 3744, 3744, 3744, + 0, 0, 3744, 3744, 3745, 3745, 3745, 3745, 0, 0, + 3745, 3745, 3746, 3746, 3746, 3746, 0, 3746, 0, 3746, + 3747, 3747, 3747, 3747, 0, 0, 3747, 3747, 3748, 3748, + 3748, 3748, 0, 0, 3748, 3748, 3749, 3749, 3749, 3749, + 3749, 3749, 3749, 3749, 3749, 3750, 3750, 3750, 3750, 3750, + 3750, 3750, 3750, 3750, 3751, 3751, 3751, 3751, 0, 0, + 3751, 3751, 3752, 3752, 3752, 0, 0, 0, 3752, 3753, + + 3753, 3753, 0, 0, 0, 3753, 3754, 3754, 3754, 3754, + 0, 0, 3754, 3754, 3755, 3755, 3755, 3755, 0, 0, + 3755, 3755, 3756, 3756, 3756, 3756, 0, 0, 3756, 3756, + 3757, 3757, 3757, 0, 0, 0, 3757, 3758, 3758, 3758, + 3758, 0, 0, 3758, 3758, 3759, 3759, 3759, 0, 0, + 0, 3759, 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, + 3760, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, + 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3763, + 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3764, 3764, + 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3765, 3765, 3765, + + 3765, 3765, 3765, 3765, 3765, 3765, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, + 3285 } ; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[565] = +static yyconst flex_int32_t yy_rule_can_match_eol[563] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, @@ -4344,29 +4354,29 @@ static yyconst flex_int32_t yy_rule_can_match_eol[565] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, - 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, }; + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, }; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; @@ -5024,57 +5034,60 @@ const char* *surfxml_statenames=NULL; #define AL_surfxml_host___link 72 #define E_surfxml_host___link 73 #define AL_surfxml_cluster 74 -#define E_surfxml_cluster 75 -#define AL_surfxml_cabinet 76 -#define E_surfxml_cabinet 77 -#define AL_surfxml_peer 78 -#define E_surfxml_peer 79 -#define AL_surfxml_router 80 -#define E_surfxml_router 81 -#define AL_surfxml_backbone 82 -#define E_surfxml_backbone 83 -#define AL_surfxml_link 84 -#define S_surfxml_link 85 -#define S_surfxml_link_1 86 -#define S_surfxml_link_2 87 -#define E_surfxml_link 88 -#define AL_surfxml_route 89 -#define S_surfxml_route 90 -#define S_surfxml_route_1 91 -#define S_surfxml_route_2 92 -#define E_surfxml_route 93 -#define AL_surfxml_ASroute 94 -#define S_surfxml_ASroute 95 -#define S_surfxml_ASroute_1 96 -#define S_surfxml_ASroute_2 97 -#define E_surfxml_ASroute 98 -#define AL_surfxml_link___ctn 99 -#define E_surfxml_link___ctn 100 -#define AL_surfxml_bypassRoute 101 -#define S_surfxml_bypassRoute 102 -#define S_surfxml_bypassRoute_1 103 -#define S_surfxml_bypassRoute_2 104 -#define E_surfxml_bypassRoute 105 -#define AL_surfxml_bypassASroute 106 -#define S_surfxml_bypassASroute 107 -#define S_surfxml_bypassASroute_1 108 -#define S_surfxml_bypassASroute_2 109 -#define E_surfxml_bypassASroute 110 -#define AL_surfxml_process 111 -#define S_surfxml_process 112 -#define S_surfxml_process_1 113 -#define S_surfxml_process_2 114 -#define E_surfxml_process 115 -#define AL_surfxml_argument 116 -#define E_surfxml_argument 117 -#define AL_surfxml_config 118 -#define S_surfxml_config 119 -#define S_surfxml_config_1 120 -#define S_surfxml_config_2 121 -#define E_surfxml_config 122 -#define AL_surfxml_prop 123 -#define E_surfxml_prop 124 -#define IMPOSSIBLE 125 +#define S_surfxml_cluster 75 +#define S_surfxml_cluster_1 76 +#define S_surfxml_cluster_2 77 +#define E_surfxml_cluster 78 +#define AL_surfxml_cabinet 79 +#define E_surfxml_cabinet 80 +#define AL_surfxml_peer 81 +#define E_surfxml_peer 82 +#define AL_surfxml_router 83 +#define E_surfxml_router 84 +#define AL_surfxml_backbone 85 +#define E_surfxml_backbone 86 +#define AL_surfxml_link 87 +#define S_surfxml_link 88 +#define S_surfxml_link_1 89 +#define S_surfxml_link_2 90 +#define E_surfxml_link 91 +#define AL_surfxml_route 92 +#define S_surfxml_route 93 +#define S_surfxml_route_1 94 +#define S_surfxml_route_2 95 +#define E_surfxml_route 96 +#define AL_surfxml_ASroute 97 +#define S_surfxml_ASroute 98 +#define S_surfxml_ASroute_1 99 +#define S_surfxml_ASroute_2 100 +#define E_surfxml_ASroute 101 +#define AL_surfxml_link___ctn 102 +#define E_surfxml_link___ctn 103 +#define AL_surfxml_bypassRoute 104 +#define S_surfxml_bypassRoute 105 +#define S_surfxml_bypassRoute_1 106 +#define S_surfxml_bypassRoute_2 107 +#define E_surfxml_bypassRoute 108 +#define AL_surfxml_bypassASroute 109 +#define S_surfxml_bypassASroute 110 +#define S_surfxml_bypassASroute_1 111 +#define S_surfxml_bypassASroute_2 112 +#define E_surfxml_bypassASroute 113 +#define AL_surfxml_process 114 +#define S_surfxml_process 115 +#define S_surfxml_process_1 116 +#define S_surfxml_process_2 117 +#define E_surfxml_process 118 +#define AL_surfxml_argument 119 +#define E_surfxml_argument 120 +#define AL_surfxml_config 121 +#define S_surfxml_config 122 +#define S_surfxml_config_1 123 +#define S_surfxml_config_2 124 +#define E_surfxml_config 125 +#define AL_surfxml_prop 126 +#define E_surfxml_prop 127 +#define IMPOSSIBLE 128 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way @@ -5375,6 +5388,9 @@ YY_DECL surfxml_statenames[AL_surfxml_host___link] = NULL; surfxml_statenames[E_surfxml_host___link] = "host_link"; surfxml_statenames[AL_surfxml_cluster] = NULL; + surfxml_statenames[S_surfxml_cluster] = "cluster"; + surfxml_statenames[S_surfxml_cluster_1] = "cluster"; + surfxml_statenames[S_surfxml_cluster_2] = "cluster"; surfxml_statenames[E_surfxml_cluster] = "cluster"; surfxml_statenames[AL_surfxml_cabinet] = NULL; surfxml_statenames[E_surfxml_cabinet] = "cabinet"; @@ -5480,13 +5496,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3299 ) + if ( yy_current_state >= 3286 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 12038 ); + while ( yy_base[yy_current_state] != 12107 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -6281,30 +6297,23 @@ case 120: case 121: /* rule 121 can match eol */ YY_RULE_SETUP -A_surfxml_AS_routing = A_surfxml_AS_routing_RuleBased; +A_surfxml_AS_routing = A_surfxml_AS_routing_Vivaldi; YY_BREAK case 122: /* rule 122 can match eol */ case 123: /* rule 123 can match eol */ YY_RULE_SETUP -A_surfxml_AS_routing = A_surfxml_AS_routing_Vivaldi; - YY_BREAK -case 124: -/* rule 124 can match eol */ -case 125: -/* rule 125 can match eol */ -YY_RULE_SETUP A_surfxml_AS_routing = A_surfxml_AS_routing_Cluster; YY_BREAK -case 126: +case 124: YY_RULE_SETUP { if (!AX_surfxml_AS_id) FAIL("Required attribute `id' not set for `AS' element."); LEAVE; STag_surfxml_AS();surfxml_pcdata_ix = 0; ENTER(S_surfxml_AS); } YY_BREAK -case 127: +case 125: YY_RULE_SETUP { if (!AX_surfxml_AS_id) FAIL("Required attribute `id' not set for `AS' element."); @@ -6316,11 +6325,11 @@ YY_RULE_SETUP } } YY_BREAK -case 128: +case 126: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of AS element.", surf_parse_text[0]); YY_BREAK -case 129: +case 127: YY_RULE_SETUP FAIL("Bad attribute `%s' in `AS' element start tag.",surf_parse_text); YY_BREAK @@ -6328,8 +6337,8 @@ case YY_STATE_EOF(AL_surfxml_AS): FAIL("EOF in attribute list of `AS' element."); YY_BREAK -case 130: -/* rule 130 can match eol */ +case 128: +/* rule 128 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6342,12 +6351,12 @@ YY_RULE_SETUP } } YY_BREAK -case 131: -/* rule 131 can match eol */ +case 129: +/* rule 129 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 132: +case 130: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6366,13 +6375,13 @@ case YY_STATE_EOF(S_surfxml_AS_4): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 133: -/* rule 133 can match eol */ +case 131: +/* rule 131 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 134: -/* rule 134 can match eol */ +case 132: +/* rule 132 can match eol */ YY_RULE_SETUP { AX_surfxml_storage___type_id = 0; @@ -6387,47 +6396,47 @@ YY_RULE_SETUP } YY_BREAK +case 133: +/* rule 133 can match eol */ +YY_RULE_SETUP +if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id); + YY_BREAK +case 134: +/* rule 134 can match eol */ +YY_RULE_SETUP +if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id); + YY_BREAK case 135: /* rule 135 can match eol */ YY_RULE_SETUP -if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id); +if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in ");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model); YY_BREAK case 136: /* rule 136 can match eol */ YY_RULE_SETUP -if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id); +if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in ");} surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model); YY_BREAK case 137: /* rule 137 can match eol */ YY_RULE_SETUP -if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in ");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model); +if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size); YY_BREAK case 138: /* rule 138 can match eol */ YY_RULE_SETUP -if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in ");} surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model); +if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size); YY_BREAK case 139: /* rule 139 can match eol */ YY_RULE_SETUP -if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size); +if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content); YY_BREAK case 140: /* rule 140 can match eol */ YY_RULE_SETUP -if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size); - YY_BREAK -case 141: -/* rule 141 can match eol */ -YY_RULE_SETUP -if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content); - YY_BREAK -case 142: -/* rule 142 can match eol */ -YY_RULE_SETUP if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content); YY_BREAK -case 143: +case 141: YY_RULE_SETUP { if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element."); @@ -6436,7 +6445,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_storage___type();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage___type); } YY_BREAK -case 144: +case 142: YY_RULE_SETUP { if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element."); @@ -6449,11 +6458,11 @@ YY_RULE_SETUP } } YY_BREAK -case 145: +case 143: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of storage_type element.", surf_parse_text[0]); YY_BREAK -case 146: +case 144: YY_RULE_SETUP FAIL("Bad attribute `%s' in `storage_type' element start tag.",surf_parse_text); YY_BREAK @@ -6461,8 +6470,8 @@ case YY_STATE_EOF(AL_surfxml_storage___type): FAIL("EOF in attribute list of `storage_type' element."); YY_BREAK -case 147: -/* rule 147 can match eol */ +case 145: +/* rule 145 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6474,12 +6483,12 @@ YY_RULE_SETUP } } YY_BREAK -case 148: -/* rule 148 can match eol */ +case 146: +/* rule 146 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 149: +case 147: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6489,13 +6498,13 @@ case YY_STATE_EOF(S_surfxml_storage___type_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 150: -/* rule 150 can match eol */ +case 148: +/* rule 148 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 151: -/* rule 151 can match eol */ +case 149: +/* rule 149 can match eol */ YY_RULE_SETUP { AX_surfxml_storage_id = 0; @@ -6508,37 +6517,37 @@ YY_RULE_SETUP } YY_BREAK -case 152: -/* rule 152 can match eol */ +case 150: +/* rule 150 can match eol */ YY_RULE_SETUP if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id); YY_BREAK -case 153: -/* rule 153 can match eol */ +case 151: +/* rule 151 can match eol */ YY_RULE_SETUP if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id); YY_BREAK -case 154: -/* rule 154 can match eol */ +case 152: +/* rule 152 can match eol */ YY_RULE_SETUP if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId); YY_BREAK -case 155: -/* rule 155 can match eol */ +case 153: +/* rule 153 can match eol */ YY_RULE_SETUP if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId); YY_BREAK -case 156: -/* rule 156 can match eol */ +case 154: +/* rule 154 can match eol */ YY_RULE_SETUP if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content); YY_BREAK -case 157: -/* rule 157 can match eol */ +case 155: +/* rule 155 can match eol */ YY_RULE_SETUP if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content); YY_BREAK -case 158: +case 156: YY_RULE_SETUP { if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element."); @@ -6546,7 +6555,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage); } YY_BREAK -case 159: +case 157: YY_RULE_SETUP { if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element."); @@ -6558,11 +6567,11 @@ YY_RULE_SETUP } } YY_BREAK -case 160: +case 158: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]); YY_BREAK -case 161: +case 159: YY_RULE_SETUP FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text); YY_BREAK @@ -6570,8 +6579,8 @@ case YY_STATE_EOF(AL_surfxml_storage): FAIL("EOF in attribute list of `storage' element."); YY_BREAK -case 162: -/* rule 162 can match eol */ +case 160: +/* rule 160 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6583,12 +6592,12 @@ YY_RULE_SETUP } } YY_BREAK -case 163: -/* rule 163 can match eol */ +case 161: +/* rule 161 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 164: +case 162: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6598,13 +6607,13 @@ case YY_STATE_EOF(S_surfxml_storage_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 165: -/* rule 165 can match eol */ +case 163: +/* rule 163 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 166: -/* rule 166 can match eol */ +case 164: +/* rule 164 can match eol */ YY_RULE_SETUP { AX_surfxml_mount_id = 0; @@ -6615,27 +6624,27 @@ YY_RULE_SETUP } YY_BREAK -case 167: -/* rule 167 can match eol */ +case 165: +/* rule 165 can match eol */ YY_RULE_SETUP if (surfxml_mount_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_mount_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_id); YY_BREAK -case 168: -/* rule 168 can match eol */ +case 166: +/* rule 166 can match eol */ YY_RULE_SETUP if (surfxml_mount_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_mount_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_id); YY_BREAK -case 169: -/* rule 169 can match eol */ +case 167: +/* rule 167 can match eol */ YY_RULE_SETUP if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mount_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_name); YY_BREAK -case 170: -/* rule 170 can match eol */ +case 168: +/* rule 168 can match eol */ YY_RULE_SETUP if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mount_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_name); YY_BREAK -case 171: +case 169: YY_RULE_SETUP { if (!AX_surfxml_mount_id) FAIL("Required attribute `id' not set for `mount' element."); @@ -6643,7 +6652,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_mount();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mount); } YY_BREAK -case 172: +case 170: YY_RULE_SETUP { if (!AX_surfxml_mount_id) FAIL("Required attribute `id' not set for `mount' element."); @@ -6654,11 +6663,11 @@ YY_RULE_SETUP } } YY_BREAK -case 173: +case 171: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of mount element.", surf_parse_text[0]); YY_BREAK -case 174: +case 172: YY_RULE_SETUP FAIL("Bad attribute `%s' in `mount' element start tag.",surf_parse_text); YY_BREAK @@ -6666,8 +6675,8 @@ case YY_STATE_EOF(AL_surfxml_mount): FAIL("EOF in attribute list of `mount' element."); YY_BREAK -case 175: -/* rule 175 can match eol */ +case 173: +/* rule 173 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6678,12 +6687,12 @@ YY_RULE_SETUP } } YY_BREAK -case 176: -/* rule 176 can match eol */ +case 174: +/* rule 174 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 177: +case 175: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6691,13 +6700,13 @@ case YY_STATE_EOF(E_surfxml_mount): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 178: -/* rule 178 can match eol */ +case 176: +/* rule 176 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 179: -/* rule 179 can match eol */ +case 177: +/* rule 177 can match eol */ YY_RULE_SETUP { AX_surfxml_mstorage_typeId = 0; @@ -6708,27 +6717,27 @@ YY_RULE_SETUP } YY_BREAK -case 180: -/* rule 180 can match eol */ +case 178: +/* rule 178 can match eol */ YY_RULE_SETUP if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_mstorage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_typeId); YY_BREAK -case 181: -/* rule 181 can match eol */ +case 179: +/* rule 179 can match eol */ YY_RULE_SETUP if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_mstorage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_typeId); YY_BREAK -case 182: -/* rule 182 can match eol */ +case 180: +/* rule 180 can match eol */ YY_RULE_SETUP if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mstorage_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_name); YY_BREAK -case 183: -/* rule 183 can match eol */ +case 181: +/* rule 181 can match eol */ YY_RULE_SETUP if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mstorage_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_name); YY_BREAK -case 184: +case 182: YY_RULE_SETUP { if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element."); @@ -6736,7 +6745,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_mstorage();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mstorage); } YY_BREAK -case 185: +case 183: YY_RULE_SETUP { if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element."); @@ -6747,11 +6756,11 @@ YY_RULE_SETUP } } YY_BREAK -case 186: +case 184: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of mstorage element.", surf_parse_text[0]); YY_BREAK -case 187: +case 185: YY_RULE_SETUP FAIL("Bad attribute `%s' in `mstorage' element start tag.",surf_parse_text); YY_BREAK @@ -6759,8 +6768,8 @@ case YY_STATE_EOF(AL_surfxml_mstorage): FAIL("EOF in attribute list of `mstorage' element."); YY_BREAK -case 188: -/* rule 188 can match eol */ +case 186: +/* rule 186 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6771,12 +6780,12 @@ YY_RULE_SETUP } } YY_BREAK -case 189: -/* rule 189 can match eol */ +case 187: +/* rule 187 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 190: +case 188: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6784,13 +6793,13 @@ case YY_STATE_EOF(E_surfxml_mstorage): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 191: -/* rule 191 can match eol */ +case 189: +/* rule 189 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 192: -/* rule 192 can match eol */ +case 190: +/* rule 190 can match eol */ YY_RULE_SETUP { AX_surfxml_host_id = 0; @@ -6813,91 +6822,91 @@ YY_RULE_SETUP } YY_BREAK +case 191: +/* rule 191 can match eol */ +YY_RULE_SETUP +if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id); + YY_BREAK +case 192: +/* rule 192 can match eol */ +YY_RULE_SETUP +if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id); + YY_BREAK case 193: /* rule 193 can match eol */ YY_RULE_SETUP -if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id); +if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_host_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power); YY_BREAK case 194: /* rule 194 can match eol */ YY_RULE_SETUP -if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id); +if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_host_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power); YY_BREAK case 195: /* rule 195 can match eol */ YY_RULE_SETUP -if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_host_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power); +if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core); YY_BREAK case 196: /* rule 196 can match eol */ YY_RULE_SETUP -if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_host_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power); +if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core); YY_BREAK case 197: /* rule 197 can match eol */ YY_RULE_SETUP -if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core); +if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in ");} surfxml_host_availability_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability); YY_BREAK case 198: /* rule 198 can match eol */ YY_RULE_SETUP -if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core); +if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in ");} surfxml_host_availability_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability); YY_BREAK case 199: /* rule 199 can match eol */ YY_RULE_SETUP -if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in ");} surfxml_host_availability_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability); +if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file); YY_BREAK case 200: /* rule 200 can match eol */ YY_RULE_SETUP -if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in ");} surfxml_host_availability_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability); +if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file); YY_BREAK case 201: /* rule 201 can match eol */ -YY_RULE_SETUP -if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file); - YY_BREAK case 202: /* rule 202 can match eol */ YY_RULE_SETUP -if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file); +A_surfxml_host_state = A_surfxml_host_state_ON; YY_BREAK case 203: /* rule 203 can match eol */ case 204: /* rule 204 can match eol */ YY_RULE_SETUP -A_surfxml_host_state = A_surfxml_host_state_ON; +A_surfxml_host_state = A_surfxml_host_state_OFF; YY_BREAK case 205: /* rule 205 can match eol */ +YY_RULE_SETUP +if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file); + YY_BREAK case 206: /* rule 206 can match eol */ YY_RULE_SETUP -A_surfxml_host_state = A_surfxml_host_state_OFF; +if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file); YY_BREAK case 207: /* rule 207 can match eol */ YY_RULE_SETUP -if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file); +if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates); YY_BREAK case 208: /* rule 208 can match eol */ YY_RULE_SETUP -if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file); - YY_BREAK -case 209: -/* rule 209 can match eol */ -YY_RULE_SETUP -if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates); - YY_BREAK -case 210: -/* rule 210 can match eol */ -YY_RULE_SETUP if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates); YY_BREAK -case 211: +case 209: YY_RULE_SETUP { if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); @@ -6905,7 +6914,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host); } YY_BREAK -case 212: +case 210: YY_RULE_SETUP { if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); @@ -6916,11 +6925,11 @@ YY_RULE_SETUP } } YY_BREAK -case 213: +case 211: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]); YY_BREAK -case 214: +case 212: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text); YY_BREAK @@ -6928,8 +6937,8 @@ case YY_STATE_EOF(AL_surfxml_host): FAIL("EOF in attribute list of `host' element."); YY_BREAK -case 215: -/* rule 215 can match eol */ +case 213: +/* rule 213 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6940,12 +6949,12 @@ YY_RULE_SETUP } } YY_BREAK -case 216: -/* rule 216 can match eol */ +case 214: +/* rule 214 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 217: +case 215: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6955,13 +6964,13 @@ case YY_STATE_EOF(S_surfxml_host_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 218: -/* rule 218 can match eol */ +case 216: +/* rule 216 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 219: -/* rule 219 can match eol */ +case 217: +/* rule 217 can match eol */ YY_RULE_SETUP { AX_surfxml_gpu_name = 0; @@ -6970,24 +6979,24 @@ YY_RULE_SETUP } YY_BREAK -case 220: -/* rule 220 can match eol */ +case 218: +/* rule 218 can match eol */ YY_RULE_SETUP if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_gpu_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_gpu_name); YY_BREAK -case 221: -/* rule 221 can match eol */ +case 219: +/* rule 219 can match eol */ YY_RULE_SETUP if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_gpu_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_gpu_name); YY_BREAK -case 222: +case 220: YY_RULE_SETUP { if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element."); LEAVE; STag_surfxml_gpu();surfxml_pcdata_ix = 0; ENTER(E_surfxml_gpu); } YY_BREAK -case 223: +case 221: YY_RULE_SETUP { if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element."); @@ -6997,11 +7006,11 @@ YY_RULE_SETUP } } YY_BREAK -case 224: +case 222: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of gpu element.", surf_parse_text[0]); YY_BREAK -case 225: +case 223: YY_RULE_SETUP FAIL("Bad attribute `%s' in `gpu' element start tag.",surf_parse_text); YY_BREAK @@ -7009,8 +7018,8 @@ case YY_STATE_EOF(AL_surfxml_gpu): FAIL("EOF in attribute list of `gpu' element."); YY_BREAK -case 226: -/* rule 226 can match eol */ +case 224: +/* rule 224 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7021,12 +7030,12 @@ YY_RULE_SETUP } } YY_BREAK -case 227: -/* rule 227 can match eol */ +case 225: +/* rule 225 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 228: +case 226: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7034,13 +7043,13 @@ case YY_STATE_EOF(E_surfxml_gpu): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 229: -/* rule 229 can match eol */ +case 227: +/* rule 227 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 230: -/* rule 230 can match eol */ +case 228: +/* rule 228 can match eol */ YY_RULE_SETUP { AX_surfxml_host___link_id = 0; @@ -7053,37 +7062,37 @@ YY_RULE_SETUP } YY_BREAK -case 231: -/* rule 231 can match eol */ +case 229: +/* rule 229 can match eol */ YY_RULE_SETUP if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host___link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_id); YY_BREAK -case 232: -/* rule 232 can match eol */ +case 230: +/* rule 230 can match eol */ YY_RULE_SETUP if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host___link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_id); YY_BREAK -case 233: -/* rule 233 can match eol */ +case 231: +/* rule 231 can match eol */ YY_RULE_SETUP if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in ");} surfxml_host___link_up_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_up); YY_BREAK -case 234: -/* rule 234 can match eol */ +case 232: +/* rule 232 can match eol */ YY_RULE_SETUP if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in ");} surfxml_host___link_up_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_up); YY_BREAK -case 235: -/* rule 235 can match eol */ +case 233: +/* rule 233 can match eol */ YY_RULE_SETUP if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in ");} surfxml_host___link_down_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_down); YY_BREAK -case 236: -/* rule 236 can match eol */ +case 234: +/* rule 234 can match eol */ YY_RULE_SETUP if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in ");} surfxml_host___link_down_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_down); YY_BREAK -case 237: +case 235: YY_RULE_SETUP { if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element."); @@ -7092,7 +7101,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link); } YY_BREAK -case 238: +case 236: YY_RULE_SETUP { if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element."); @@ -7104,11 +7113,11 @@ YY_RULE_SETUP } } YY_BREAK -case 239: +case 237: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]); YY_BREAK -case 240: +case 238: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text); YY_BREAK @@ -7116,8 +7125,8 @@ case YY_STATE_EOF(AL_surfxml_host___link): FAIL("EOF in attribute list of `host_link' element."); YY_BREAK -case 241: -/* rule 241 can match eol */ +case 239: +/* rule 239 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7128,12 +7137,12 @@ YY_RULE_SETUP } } YY_BREAK -case 242: -/* rule 242 can match eol */ +case 240: +/* rule 240 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 243: +case 241: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7141,13 +7150,13 @@ case YY_STATE_EOF(E_surfxml_host___link): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 244: -/* rule 244 can match eol */ +case 242: +/* rule 242 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 245: -/* rule 245 can match eol */ +case 243: +/* rule 243 can match eol */ YY_RULE_SETUP { AX_surfxml_cluster_id = 0; @@ -7190,202 +7199,202 @@ YY_RULE_SETUP } YY_BREAK +case 244: +/* rule 244 can match eol */ +YY_RULE_SETUP +if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id); + YY_BREAK +case 245: +/* rule 245 can match eol */ +YY_RULE_SETUP +if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id); + YY_BREAK case 246: /* rule 246 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id); +if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix); YY_BREAK case 247: /* rule 247 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id); +if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix); YY_BREAK case 248: /* rule 248 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix); +if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix); YY_BREAK case 249: /* rule 249 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix); +if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix); YY_BREAK case 250: /* rule 250 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix); +if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical); YY_BREAK case 251: /* rule 251 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix); +if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical); YY_BREAK case 252: /* rule 252 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical); +if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power); YY_BREAK case 253: /* rule 253 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical); +if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power); YY_BREAK case 254: /* rule 254 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power); +if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core); YY_BREAK case 255: /* rule 255 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power); +if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core); YY_BREAK case 256: /* rule 256 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core); +if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw); YY_BREAK case 257: /* rule 257 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core); +if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw); YY_BREAK case 258: /* rule 258 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw); +if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat); YY_BREAK case 259: /* rule 259 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw); +if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat); YY_BREAK case 260: /* rule 260 can match eol */ -YY_RULE_SETUP -if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat); - YY_BREAK case 261: /* rule 261 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat); +A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED; YY_BREAK case 262: /* rule 262 can match eol */ case 263: /* rule 263 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED; +A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX; YY_BREAK case 264: /* rule 264 can match eol */ case 265: /* rule 265 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX; +A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE; YY_BREAK case 266: /* rule 266 can match eol */ +YY_RULE_SETUP +if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw); + YY_BREAK case 267: /* rule 267 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE; +if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw); YY_BREAK case 268: /* rule 268 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw); +if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat); YY_BREAK case 269: /* rule 269 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw); +if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat); YY_BREAK case 270: /* rule 270 can match eol */ -YY_RULE_SETUP -if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat); - YY_BREAK case 271: /* rule 271 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat); +A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED; YY_BREAK case 272: /* rule 272 can match eol */ case 273: /* rule 273 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED; +A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE; YY_BREAK case 274: /* rule 274 can match eol */ +YY_RULE_SETUP +if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file); + YY_BREAK case 275: /* rule 275 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE; +if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file); YY_BREAK case 276: /* rule 276 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file); +if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file); YY_BREAK case 277: /* rule 277 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file); +if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file); YY_BREAK case 278: /* rule 278 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file); +if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id); YY_BREAK case 279: /* rule 279 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file); +if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id); YY_BREAK case 280: /* rule 280 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id); +if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link); YY_BREAK case 281: /* rule 281 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id); +if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link); YY_BREAK case 282: /* rule 282 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link); +if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw); YY_BREAK case 283: /* rule 283 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link); +if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw); YY_BREAK case 284: /* rule 284 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw); +if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat); YY_BREAK case 285: /* rule 285 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw); - YY_BREAK -case 286: -/* rule 286 can match eol */ -YY_RULE_SETUP -if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat); - YY_BREAK -case 287: -/* rule 287 can match eol */ -YY_RULE_SETUP if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat); YY_BREAK -case 288: +case 286: YY_RULE_SETUP { if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element."); @@ -7395,10 +7404,10 @@ YY_RULE_SETUP if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element."); if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element."); if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element."); - LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cluster); + LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster); } YY_BREAK -case 289: +case 287: YY_RULE_SETUP { if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element."); @@ -7416,11 +7425,11 @@ YY_RULE_SETUP } } YY_BREAK -case 290: +case 288: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]); YY_BREAK -case 291: +case 289: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text); YY_BREAK @@ -7428,8 +7437,8 @@ case YY_STATE_EOF(AL_surfxml_cluster): FAIL("EOF in attribute list of `cluster' element."); YY_BREAK -case 292: -/* rule 292 can match eol */ +case 290: +/* rule 290 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7442,26 +7451,28 @@ YY_RULE_SETUP } } YY_BREAK -case 293: -/* rule 293 can match eol */ +case 291: +/* rule 291 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 294: +case 292: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK +case YY_STATE_EOF(S_surfxml_cluster_2): +case YY_STATE_EOF(S_surfxml_cluster): case YY_STATE_EOF(E_surfxml_cluster): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 295: -/* rule 295 can match eol */ +case 293: +/* rule 293 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 296: -/* rule 296 can match eol */ +case 294: +/* rule 294 can match eol */ YY_RULE_SETUP { AX_surfxml_cabinet_id = 0; @@ -7482,77 +7493,77 @@ YY_RULE_SETUP } YY_BREAK +case 295: +/* rule 295 can match eol */ +YY_RULE_SETUP +if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id); + YY_BREAK +case 296: +/* rule 296 can match eol */ +YY_RULE_SETUP +if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id); + YY_BREAK case 297: /* rule 297 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id); +if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix); YY_BREAK case 298: /* rule 298 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id); +if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix); YY_BREAK case 299: /* rule 299 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix); +if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix); YY_BREAK case 300: /* rule 300 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix); +if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix); YY_BREAK case 301: /* rule 301 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix); +if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical); YY_BREAK case 302: /* rule 302 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix); +if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical); YY_BREAK case 303: /* rule 303 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical); +if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power); YY_BREAK case 304: /* rule 304 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical); +if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power); YY_BREAK case 305: /* rule 305 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power); +if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw); YY_BREAK case 306: /* rule 306 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power); +if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw); YY_BREAK case 307: /* rule 307 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw); +if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat); YY_BREAK case 308: /* rule 308 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw); +if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat); YY_BREAK case 309: -/* rule 309 can match eol */ -YY_RULE_SETUP -if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat); - YY_BREAK -case 310: -/* rule 310 can match eol */ -YY_RULE_SETUP -if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat); - YY_BREAK -case 311: YY_RULE_SETUP { if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element."); @@ -7565,7 +7576,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet); } YY_BREAK -case 312: +case 310: YY_RULE_SETUP { if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element."); @@ -7584,11 +7595,11 @@ YY_RULE_SETUP } } YY_BREAK -case 313: +case 311: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]); YY_BREAK -case 314: +case 312: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text); YY_BREAK @@ -7596,8 +7607,8 @@ case YY_STATE_EOF(AL_surfxml_cabinet): FAIL("EOF in attribute list of `cabinet' element."); YY_BREAK -case 315: -/* rule 315 can match eol */ +case 313: +/* rule 313 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7611,12 +7622,12 @@ YY_RULE_SETUP } } YY_BREAK -case 316: -/* rule 316 can match eol */ +case 314: +/* rule 314 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 317: +case 315: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7624,13 +7635,13 @@ case YY_STATE_EOF(E_surfxml_cabinet): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 318: -/* rule 318 can match eol */ +case 316: +/* rule 316 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 319: -/* rule 319 can match eol */ +case 317: +/* rule 317 can match eol */ YY_RULE_SETUP { AX_surfxml_peer_id = 0; @@ -7653,87 +7664,87 @@ YY_RULE_SETUP } YY_BREAK +case 318: +/* rule 318 can match eol */ +YY_RULE_SETUP +if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id); + YY_BREAK +case 319: +/* rule 319 can match eol */ +YY_RULE_SETUP +if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id); + YY_BREAK case 320: /* rule 320 can match eol */ YY_RULE_SETUP -if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id); +if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power); YY_BREAK case 321: /* rule 321 can match eol */ YY_RULE_SETUP -if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id); +if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power); YY_BREAK case 322: /* rule 322 can match eol */ YY_RULE_SETUP -if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power); +if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in); YY_BREAK case 323: /* rule 323 can match eol */ YY_RULE_SETUP -if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power); +if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in); YY_BREAK case 324: /* rule 324 can match eol */ YY_RULE_SETUP -if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in); +if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out); YY_BREAK case 325: /* rule 325 can match eol */ YY_RULE_SETUP -if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in); +if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out); YY_BREAK case 326: /* rule 326 can match eol */ YY_RULE_SETUP -if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out); +if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat); YY_BREAK case 327: /* rule 327 can match eol */ YY_RULE_SETUP -if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out); +if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat); YY_BREAK case 328: /* rule 328 can match eol */ YY_RULE_SETUP -if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat); +if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates); YY_BREAK case 329: /* rule 329 can match eol */ YY_RULE_SETUP -if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat); +if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates); YY_BREAK case 330: /* rule 330 can match eol */ YY_RULE_SETUP -if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates); +if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file); YY_BREAK case 331: /* rule 331 can match eol */ YY_RULE_SETUP -if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates); +if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file); YY_BREAK case 332: /* rule 332 can match eol */ YY_RULE_SETUP -if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file); +if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file); YY_BREAK case 333: /* rule 333 can match eol */ YY_RULE_SETUP -if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file); - YY_BREAK -case 334: -/* rule 334 can match eol */ -YY_RULE_SETUP -if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file); - YY_BREAK -case 335: -/* rule 335 can match eol */ -YY_RULE_SETUP if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file); YY_BREAK -case 336: +case 334: YY_RULE_SETUP { if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element."); @@ -7744,7 +7755,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer); } YY_BREAK -case 337: +case 335: YY_RULE_SETUP { if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element."); @@ -7760,11 +7771,11 @@ YY_RULE_SETUP } } YY_BREAK -case 338: +case 336: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]); YY_BREAK -case 339: +case 337: YY_RULE_SETUP FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text); YY_BREAK @@ -7772,8 +7783,8 @@ case YY_STATE_EOF(AL_surfxml_peer): FAIL("EOF in attribute list of `peer' element."); YY_BREAK -case 340: -/* rule 340 can match eol */ +case 338: +/* rule 338 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7786,12 +7797,12 @@ YY_RULE_SETUP } } YY_BREAK -case 341: -/* rule 341 can match eol */ +case 339: +/* rule 339 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 342: +case 340: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7799,13 +7810,13 @@ case YY_STATE_EOF(E_surfxml_peer): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 343: -/* rule 343 can match eol */ +case 341: +/* rule 341 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 344: -/* rule 344 can match eol */ +case 342: +/* rule 342 can match eol */ YY_RULE_SETUP { AX_surfxml_router_id = 0; @@ -7816,34 +7827,34 @@ YY_RULE_SETUP } YY_BREAK -case 345: -/* rule 345 can match eol */ +case 343: +/* rule 343 can match eol */ YY_RULE_SETUP if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id); YY_BREAK -case 346: -/* rule 346 can match eol */ +case 344: +/* rule 344 can match eol */ YY_RULE_SETUP if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id); YY_BREAK -case 347: -/* rule 347 can match eol */ +case 345: +/* rule 345 can match eol */ YY_RULE_SETUP if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_router_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates); YY_BREAK -case 348: -/* rule 348 can match eol */ +case 346: +/* rule 346 can match eol */ YY_RULE_SETUP if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_router_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates); YY_BREAK -case 349: +case 347: YY_RULE_SETUP { if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element."); LEAVE; STag_surfxml_router();surfxml_pcdata_ix = 0; ENTER(E_surfxml_router); } YY_BREAK -case 350: +case 348: YY_RULE_SETUP { if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element."); @@ -7853,11 +7864,11 @@ YY_RULE_SETUP } } YY_BREAK -case 351: +case 349: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]); YY_BREAK -case 352: +case 350: YY_RULE_SETUP FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text); YY_BREAK @@ -7865,8 +7876,8 @@ case YY_STATE_EOF(AL_surfxml_router): FAIL("EOF in attribute list of `router' element."); YY_BREAK -case 353: -/* rule 353 can match eol */ +case 351: +/* rule 351 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7877,12 +7888,12 @@ YY_RULE_SETUP } } YY_BREAK -case 354: -/* rule 354 can match eol */ +case 352: +/* rule 352 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 355: +case 353: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7890,13 +7901,13 @@ case YY_STATE_EOF(E_surfxml_router): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 356: -/* rule 356 can match eol */ +case 354: +/* rule 354 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 357: -/* rule 357 can match eol */ +case 355: +/* rule 355 can match eol */ YY_RULE_SETUP { AX_surfxml_backbone_id = 0; @@ -7909,37 +7920,37 @@ YY_RULE_SETUP } YY_BREAK -case 358: -/* rule 358 can match eol */ +case 356: +/* rule 356 can match eol */ YY_RULE_SETUP if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_backbone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_id); YY_BREAK -case 359: -/* rule 359 can match eol */ +case 357: +/* rule 357 can match eol */ YY_RULE_SETUP if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_backbone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_id); YY_BREAK -case 360: -/* rule 360 can match eol */ +case 358: +/* rule 358 can match eol */ YY_RULE_SETUP if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_bandwidth); YY_BREAK -case 361: -/* rule 361 can match eol */ +case 359: +/* rule 359 can match eol */ YY_RULE_SETUP if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_bandwidth); YY_BREAK -case 362: -/* rule 362 can match eol */ +case 360: +/* rule 360 can match eol */ YY_RULE_SETUP if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_backbone_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_latency); YY_BREAK -case 363: -/* rule 363 can match eol */ +case 361: +/* rule 361 can match eol */ YY_RULE_SETUP if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_backbone_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_latency); YY_BREAK -case 364: +case 362: YY_RULE_SETUP { if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element."); @@ -7948,7 +7959,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone); } YY_BREAK -case 365: +case 363: YY_RULE_SETUP { if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element."); @@ -7961,11 +7972,11 @@ YY_RULE_SETUP } } YY_BREAK -case 366: +case 364: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]); YY_BREAK -case 367: +case 365: YY_RULE_SETUP FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text); YY_BREAK @@ -7973,8 +7984,8 @@ case YY_STATE_EOF(AL_surfxml_backbone): FAIL("EOF in attribute list of `backbone' element."); YY_BREAK -case 368: -/* rule 368 can match eol */ +case 366: +/* rule 366 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7986,12 +7997,12 @@ YY_RULE_SETUP } } YY_BREAK -case 369: -/* rule 369 can match eol */ +case 367: +/* rule 367 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 370: +case 368: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7999,13 +8010,13 @@ case YY_STATE_EOF(E_surfxml_backbone): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 371: -/* rule 371 can match eol */ +case 369: +/* rule 369 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 372: -/* rule 372 can match eol */ +case 370: +/* rule 370 can match eol */ YY_RULE_SETUP { AX_surfxml_link_id = 0; @@ -8028,102 +8039,102 @@ YY_RULE_SETUP } YY_BREAK +case 371: +/* rule 371 can match eol */ +YY_RULE_SETUP +if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id); + YY_BREAK +case 372: +/* rule 372 can match eol */ +YY_RULE_SETUP +if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id); + YY_BREAK case 373: /* rule 373 can match eol */ YY_RULE_SETUP -if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id); +if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth); YY_BREAK case 374: /* rule 374 can match eol */ YY_RULE_SETUP -if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id); +if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth); YY_BREAK case 375: /* rule 375 can match eol */ YY_RULE_SETUP -if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth); +if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file); YY_BREAK case 376: /* rule 376 can match eol */ YY_RULE_SETUP -if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth); +if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file); YY_BREAK case 377: /* rule 377 can match eol */ YY_RULE_SETUP -if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file); +if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency); YY_BREAK case 378: /* rule 378 can match eol */ YY_RULE_SETUP -if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file); +if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency); YY_BREAK case 379: /* rule 379 can match eol */ YY_RULE_SETUP -if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency); +if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file); YY_BREAK case 380: /* rule 380 can match eol */ YY_RULE_SETUP -if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency); +if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file); YY_BREAK case 381: /* rule 381 can match eol */ -YY_RULE_SETUP -if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file); - YY_BREAK case 382: /* rule 382 can match eol */ YY_RULE_SETUP -if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file); +A_surfxml_link_state = A_surfxml_link_state_ON; YY_BREAK case 383: /* rule 383 can match eol */ case 384: /* rule 384 can match eol */ YY_RULE_SETUP -A_surfxml_link_state = A_surfxml_link_state_ON; +A_surfxml_link_state = A_surfxml_link_state_OFF; YY_BREAK case 385: /* rule 385 can match eol */ +YY_RULE_SETUP +if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file); + YY_BREAK case 386: /* rule 386 can match eol */ YY_RULE_SETUP -A_surfxml_link_state = A_surfxml_link_state_OFF; +if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file); YY_BREAK case 387: /* rule 387 can match eol */ -YY_RULE_SETUP -if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file); - YY_BREAK case 388: /* rule 388 can match eol */ YY_RULE_SETUP -if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file); +A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED; YY_BREAK case 389: /* rule 389 can match eol */ case 390: /* rule 390 can match eol */ YY_RULE_SETUP -A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED; +A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE; YY_BREAK case 391: /* rule 391 can match eol */ case 392: /* rule 392 can match eol */ YY_RULE_SETUP -A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE; - YY_BREAK -case 393: -/* rule 393 can match eol */ -case 394: -/* rule 394 can match eol */ -YY_RULE_SETUP A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX; YY_BREAK -case 395: +case 393: YY_RULE_SETUP { if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); @@ -8131,7 +8142,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link); } YY_BREAK -case 396: +case 394: YY_RULE_SETUP { if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); @@ -8143,11 +8154,11 @@ YY_RULE_SETUP } } YY_BREAK -case 397: +case 395: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]); YY_BREAK -case 398: +case 396: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text); YY_BREAK @@ -8155,8 +8166,8 @@ case YY_STATE_EOF(AL_surfxml_link): FAIL("EOF in attribute list of `link' element."); YY_BREAK -case 399: -/* rule 399 can match eol */ +case 397: +/* rule 397 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8168,12 +8179,12 @@ YY_RULE_SETUP } } YY_BREAK -case 400: -/* rule 400 can match eol */ +case 398: +/* rule 398 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 401: +case 399: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8183,13 +8194,13 @@ case YY_STATE_EOF(S_surfxml_link): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 402: -/* rule 402 can match eol */ +case 400: +/* rule 400 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 403: -/* rule 403 can match eol */ +case 401: +/* rule 401 can match eol */ YY_RULE_SETUP { AX_surfxml_route_src = 0; @@ -8202,41 +8213,41 @@ YY_RULE_SETUP } YY_BREAK +case 402: +/* rule 402 can match eol */ +YY_RULE_SETUP +if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src); + YY_BREAK +case 403: +/* rule 403 can match eol */ +YY_RULE_SETUP +if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src); + YY_BREAK case 404: /* rule 404 can match eol */ YY_RULE_SETUP -if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src); +if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst); YY_BREAK case 405: /* rule 405 can match eol */ YY_RULE_SETUP -if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src); +if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst); YY_BREAK case 406: /* rule 406 can match eol */ -YY_RULE_SETUP -if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst); - YY_BREAK case 407: /* rule 407 can match eol */ YY_RULE_SETUP -if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst); +A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES; YY_BREAK case 408: /* rule 408 can match eol */ case 409: /* rule 409 can match eol */ YY_RULE_SETUP -A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES; - YY_BREAK -case 410: -/* rule 410 can match eol */ -case 411: -/* rule 411 can match eol */ -YY_RULE_SETUP A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; YY_BREAK -case 412: +case 410: YY_RULE_SETUP { if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); @@ -8244,7 +8255,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route); } YY_BREAK -case 413: +case 411: YY_RULE_SETUP { if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); @@ -8255,11 +8266,11 @@ YY_RULE_SETUP } } YY_BREAK -case 414: +case 412: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]); YY_BREAK -case 415: +case 413: YY_RULE_SETUP FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text); YY_BREAK @@ -8267,8 +8278,8 @@ case YY_STATE_EOF(AL_surfxml_route): FAIL("EOF in attribute list of `route' element."); YY_BREAK -case 416: -/* rule 416 can match eol */ +case 414: +/* rule 414 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8279,12 +8290,12 @@ YY_RULE_SETUP } } YY_BREAK -case 417: -/* rule 417 can match eol */ +case 415: +/* rule 415 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 418: +case 416: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8294,13 +8305,13 @@ case YY_STATE_EOF(E_surfxml_route): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 419: -/* rule 419 can match eol */ +case 417: +/* rule 417 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 420: -/* rule 420 can match eol */ +case 418: +/* rule 418 can match eol */ YY_RULE_SETUP { AX_surfxml_ASroute_src = 0; @@ -8317,61 +8328,61 @@ YY_RULE_SETUP } YY_BREAK +case 419: +/* rule 419 can match eol */ +YY_RULE_SETUP +if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src); + YY_BREAK +case 420: +/* rule 420 can match eol */ +YY_RULE_SETUP +if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src); + YY_BREAK case 421: /* rule 421 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src); +if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst); YY_BREAK case 422: /* rule 422 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src); +if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst); YY_BREAK case 423: /* rule 423 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst); +if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src); YY_BREAK case 424: /* rule 424 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst); +if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src); YY_BREAK case 425: /* rule 425 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src); +if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst); YY_BREAK case 426: /* rule 426 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src); +if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst); YY_BREAK case 427: /* rule 427 can match eol */ -YY_RULE_SETUP -if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst); - YY_BREAK case 428: /* rule 428 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst); +A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES; YY_BREAK case 429: /* rule 429 can match eol */ case 430: /* rule 430 can match eol */ YY_RULE_SETUP -A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES; - YY_BREAK -case 431: -/* rule 431 can match eol */ -case 432: -/* rule 432 can match eol */ -YY_RULE_SETUP A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO; YY_BREAK -case 433: +case 431: YY_RULE_SETUP { if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); @@ -8381,7 +8392,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute); } YY_BREAK -case 434: +case 432: YY_RULE_SETUP { if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); @@ -8394,11 +8405,11 @@ YY_RULE_SETUP } } YY_BREAK -case 435: +case 433: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of ASroute element.", surf_parse_text[0]); YY_BREAK -case 436: +case 434: YY_RULE_SETUP FAIL("Bad attribute `%s' in `ASroute' element start tag.",surf_parse_text); YY_BREAK @@ -8406,8 +8417,8 @@ case YY_STATE_EOF(AL_surfxml_ASroute): FAIL("EOF in attribute list of `ASroute' element."); YY_BREAK -case 437: -/* rule 437 can match eol */ +case 435: +/* rule 435 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8418,12 +8429,12 @@ YY_RULE_SETUP } } YY_BREAK -case 438: -/* rule 438 can match eol */ +case 436: +/* rule 436 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 439: +case 437: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8433,13 +8444,13 @@ case YY_STATE_EOF(S_surfxml_ASroute_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 440: -/* rule 440 can match eol */ +case 438: +/* rule 438 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 441: -/* rule 441 can match eol */ +case 439: +/* rule 439 can match eol */ YY_RULE_SETUP { AX_surfxml_link___ctn_id = 0; @@ -8450,45 +8461,45 @@ YY_RULE_SETUP } YY_BREAK -case 442: -/* rule 442 can match eol */ +case 440: +/* rule 440 can match eol */ YY_RULE_SETUP if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link___ctn_id); YY_BREAK +case 441: +/* rule 441 can match eol */ +YY_RULE_SETUP +if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id); + YY_BREAK +case 442: +/* rule 442 can match eol */ case 443: /* rule 443 can match eol */ YY_RULE_SETUP -if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id); +A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP; YY_BREAK case 444: /* rule 444 can match eol */ case 445: /* rule 445 can match eol */ YY_RULE_SETUP -A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP; +A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN; YY_BREAK case 446: /* rule 446 can match eol */ case 447: /* rule 447 can match eol */ YY_RULE_SETUP -A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN; - YY_BREAK -case 448: -/* rule 448 can match eol */ -case 449: -/* rule 449 can match eol */ -YY_RULE_SETUP A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE; YY_BREAK -case 450: +case 448: YY_RULE_SETUP { if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element."); LEAVE; STag_surfxml_link___ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link___ctn); } YY_BREAK -case 451: +case 449: YY_RULE_SETUP { if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element."); @@ -8501,11 +8512,11 @@ YY_RULE_SETUP } } YY_BREAK -case 452: +case 450: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]); YY_BREAK -case 453: +case 451: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text); YY_BREAK @@ -8513,8 +8524,8 @@ case YY_STATE_EOF(AL_surfxml_link___ctn): FAIL("EOF in attribute list of `link_ctn' element."); YY_BREAK -case 454: -/* rule 454 can match eol */ +case 452: +/* rule 452 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8528,12 +8539,12 @@ YY_RULE_SETUP } } YY_BREAK -case 455: -/* rule 455 can match eol */ +case 453: +/* rule 453 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 456: +case 454: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8541,13 +8552,13 @@ case YY_STATE_EOF(E_surfxml_link___ctn): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 457: -/* rule 457 can match eol */ +case 455: +/* rule 455 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 458: -/* rule 458 can match eol */ +case 456: +/* rule 456 can match eol */ YY_RULE_SETUP { AX_surfxml_bypassRoute_src = 0; @@ -8558,27 +8569,27 @@ YY_RULE_SETUP } YY_BREAK -case 459: -/* rule 459 can match eol */ +case 457: +/* rule 457 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src); YY_BREAK -case 460: -/* rule 460 can match eol */ +case 458: +/* rule 458 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src); YY_BREAK -case 461: -/* rule 461 can match eol */ +case 459: +/* rule 459 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst); YY_BREAK -case 462: -/* rule 462 can match eol */ +case 460: +/* rule 460 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst); YY_BREAK -case 463: +case 461: YY_RULE_SETUP { if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); @@ -8586,7 +8597,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute); } YY_BREAK -case 464: +case 462: YY_RULE_SETUP { if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); @@ -8597,11 +8608,11 @@ YY_RULE_SETUP } } YY_BREAK -case 465: +case 463: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]); YY_BREAK -case 466: +case 464: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text); YY_BREAK @@ -8609,8 +8620,8 @@ case YY_STATE_EOF(AL_surfxml_bypassRoute): FAIL("EOF in attribute list of `bypassRoute' element."); YY_BREAK -case 467: -/* rule 467 can match eol */ +case 465: +/* rule 465 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8621,12 +8632,12 @@ YY_RULE_SETUP } } YY_BREAK -case 468: -/* rule 468 can match eol */ +case 466: +/* rule 466 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 469: +case 467: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8636,13 +8647,13 @@ case YY_STATE_EOF(E_surfxml_bypassRoute): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 470: -/* rule 470 can match eol */ +case 468: +/* rule 468 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 471: -/* rule 471 can match eol */ +case 469: +/* rule 469 can match eol */ YY_RULE_SETUP { AX_surfxml_bypassASroute_src = 0; @@ -8657,47 +8668,47 @@ YY_RULE_SETUP } YY_BREAK +case 470: +/* rule 470 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src); + YY_BREAK +case 471: +/* rule 471 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src); + YY_BREAK case 472: /* rule 472 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src); +if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst); YY_BREAK case 473: /* rule 473 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src); +if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst); YY_BREAK case 474: /* rule 474 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst); +if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src); YY_BREAK case 475: /* rule 475 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst); +if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src); YY_BREAK case 476: /* rule 476 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src); +if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); YY_BREAK case 477: /* rule 477 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src); - YY_BREAK -case 478: -/* rule 478 can match eol */ -YY_RULE_SETUP -if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); - YY_BREAK -case 479: -/* rule 479 can match eol */ -YY_RULE_SETUP if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); YY_BREAK -case 480: +case 478: YY_RULE_SETUP { if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element."); @@ -8707,7 +8718,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute); } YY_BREAK -case 481: +case 479: YY_RULE_SETUP { if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element."); @@ -8720,11 +8731,11 @@ YY_RULE_SETUP } } YY_BREAK -case 482: +case 480: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]); YY_BREAK -case 483: +case 481: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text); YY_BREAK @@ -8732,8 +8743,8 @@ case YY_STATE_EOF(AL_surfxml_bypassASroute): FAIL("EOF in attribute list of `bypassASroute' element."); YY_BREAK -case 484: -/* rule 484 can match eol */ +case 482: +/* rule 482 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8744,12 +8755,12 @@ YY_RULE_SETUP } } YY_BREAK -case 485: -/* rule 485 can match eol */ +case 483: +/* rule 483 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 486: +case 484: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8759,13 +8770,13 @@ case YY_STATE_EOF(S_surfxml_bypassASroute): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 487: -/* rule 487 can match eol */ +case 485: +/* rule 485 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 488: -/* rule 488 can match eol */ +case 486: +/* rule 486 can match eol */ YY_RULE_SETUP { AX_surfxml_process_host = 0; @@ -8782,61 +8793,61 @@ YY_RULE_SETUP } YY_BREAK +case 487: +/* rule 487 can match eol */ +YY_RULE_SETUP +if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host); + YY_BREAK +case 488: +/* rule 488 can match eol */ +YY_RULE_SETUP +if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host); + YY_BREAK case 489: /* rule 489 can match eol */ YY_RULE_SETUP -if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host); +if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function); YY_BREAK case 490: /* rule 490 can match eol */ YY_RULE_SETUP -if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host); +if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function); YY_BREAK case 491: /* rule 491 can match eol */ YY_RULE_SETUP -if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function); +if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time); YY_BREAK case 492: /* rule 492 can match eol */ YY_RULE_SETUP -if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function); +if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time); YY_BREAK case 493: /* rule 493 can match eol */ YY_RULE_SETUP -if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time); +if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time); YY_BREAK case 494: /* rule 494 can match eol */ YY_RULE_SETUP -if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time); +if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time); YY_BREAK case 495: /* rule 495 can match eol */ -YY_RULE_SETUP -if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time); - YY_BREAK case 496: /* rule 496 can match eol */ YY_RULE_SETUP -if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time); +A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE; YY_BREAK case 497: /* rule 497 can match eol */ case 498: /* rule 498 can match eol */ YY_RULE_SETUP -A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE; - YY_BREAK -case 499: -/* rule 499 can match eol */ -case 500: -/* rule 500 can match eol */ -YY_RULE_SETUP A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART; YY_BREAK -case 501: +case 499: YY_RULE_SETUP { if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); @@ -8844,7 +8855,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process); } YY_BREAK -case 502: +case 500: YY_RULE_SETUP { if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); @@ -8855,11 +8866,11 @@ YY_RULE_SETUP } } YY_BREAK -case 503: +case 501: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]); YY_BREAK -case 504: +case 502: YY_RULE_SETUP FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text); YY_BREAK @@ -8867,8 +8878,8 @@ case YY_STATE_EOF(AL_surfxml_process): FAIL("EOF in attribute list of `process' element."); YY_BREAK -case 505: -/* rule 505 can match eol */ +case 503: +/* rule 503 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8879,12 +8890,12 @@ YY_RULE_SETUP } } YY_BREAK -case 506: -/* rule 506 can match eol */ +case 504: +/* rule 504 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 507: +case 505: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8894,13 +8905,13 @@ case YY_STATE_EOF(S_surfxml_process_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 508: -/* rule 508 can match eol */ +case 506: +/* rule 506 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 509: -/* rule 509 can match eol */ +case 507: +/* rule 507 can match eol */ YY_RULE_SETUP { AX_surfxml_argument_value = 0; @@ -8909,24 +8920,24 @@ YY_RULE_SETUP } YY_BREAK -case 510: -/* rule 510 can match eol */ +case 508: +/* rule 508 can match eol */ YY_RULE_SETUP if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value); YY_BREAK -case 511: -/* rule 511 can match eol */ +case 509: +/* rule 509 can match eol */ YY_RULE_SETUP if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value); YY_BREAK -case 512: +case 510: YY_RULE_SETUP { if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element."); LEAVE; STag_surfxml_argument();surfxml_pcdata_ix = 0; ENTER(E_surfxml_argument); } YY_BREAK -case 513: +case 511: YY_RULE_SETUP { if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element."); @@ -8936,11 +8947,11 @@ YY_RULE_SETUP } } YY_BREAK -case 514: +case 512: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]); YY_BREAK -case 515: +case 513: YY_RULE_SETUP FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text); YY_BREAK @@ -8948,8 +8959,8 @@ case YY_STATE_EOF(AL_surfxml_argument): FAIL("EOF in attribute list of `argument' element."); YY_BREAK -case 516: -/* rule 516 can match eol */ +case 514: +/* rule 514 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8960,12 +8971,12 @@ YY_RULE_SETUP } } YY_BREAK -case 517: -/* rule 517 can match eol */ +case 515: +/* rule 515 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 518: +case 516: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8973,13 +8984,13 @@ case YY_STATE_EOF(E_surfxml_argument): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 519: -/* rule 519 can match eol */ +case 517: +/* rule 517 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 520: -/* rule 520 can match eol */ +case 518: +/* rule 518 can match eol */ YY_RULE_SETUP { AX_surfxml_config_id = 0; @@ -8988,23 +8999,23 @@ YY_RULE_SETUP } YY_BREAK -case 521: -/* rule 521 can match eol */ +case 519: +/* rule 519 can match eol */ YY_RULE_SETUP if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_config_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id); YY_BREAK -case 522: -/* rule 522 can match eol */ +case 520: +/* rule 520 can match eol */ YY_RULE_SETUP if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_config_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id); YY_BREAK -case 523: +case 521: YY_RULE_SETUP { LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config); } YY_BREAK -case 524: +case 522: YY_RULE_SETUP { LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */ @@ -9013,11 +9024,11 @@ YY_RULE_SETUP } } YY_BREAK -case 525: +case 523: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]); YY_BREAK -case 526: +case 524: YY_RULE_SETUP FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text); YY_BREAK @@ -9025,8 +9036,8 @@ case YY_STATE_EOF(AL_surfxml_config): FAIL("EOF in attribute list of `config' element."); YY_BREAK -case 527: -/* rule 527 can match eol */ +case 525: +/* rule 525 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9037,12 +9048,12 @@ YY_RULE_SETUP } } YY_BREAK -case 528: -/* rule 528 can match eol */ +case 526: +/* rule 526 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 529: +case 527: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9054,13 +9065,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); /* * */ -case 530: -/* rule 530 can match eol */ +case 528: +/* rule 528 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 531: -/* rule 531 can match eol */ +case 529: +/* rule 529 can match eol */ YY_RULE_SETUP { AX_surfxml_prop_id = 0; @@ -9071,27 +9082,27 @@ YY_RULE_SETUP } YY_BREAK -case 532: -/* rule 532 can match eol */ +case 530: +/* rule 530 can match eol */ YY_RULE_SETUP if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id); YY_BREAK -case 533: -/* rule 533 can match eol */ +case 531: +/* rule 531 can match eol */ YY_RULE_SETUP if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id); YY_BREAK -case 534: -/* rule 534 can match eol */ +case 532: +/* rule 532 can match eol */ YY_RULE_SETUP if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value); YY_BREAK -case 535: -/* rule 535 can match eol */ +case 533: +/* rule 533 can match eol */ YY_RULE_SETUP if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value); YY_BREAK -case 536: +case 534: YY_RULE_SETUP { if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); @@ -9099,7 +9110,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop); } YY_BREAK -case 537: +case 535: YY_RULE_SETUP { if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); @@ -9108,19 +9119,20 @@ YY_RULE_SETUP switch (YY_START) { case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; case S_surfxml_storage_1: case S_surfxml_storage_2: case S_surfxml_storage: SET(S_surfxml_storage_2); break; - case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break; - case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break; + case S_surfxml_cluster_2: case S_surfxml_cluster: case S_surfxml_cluster_1: SET(S_surfxml_cluster_2); break; case S_surfxml_host_1: case S_surfxml_host_2: case S_surfxml_host: SET(S_surfxml_host_2); break; case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break; + case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break; + case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break; case S_surfxml_storage___type_1: case S_surfxml_storage___type: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break; } } YY_BREAK -case 538: +case 536: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]); YY_BREAK -case 539: +case 537: YY_RULE_SETUP FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text); YY_BREAK @@ -9128,8 +9140,8 @@ case YY_STATE_EOF(AL_surfxml_prop): FAIL("EOF in attribute list of `prop' element."); YY_BREAK -case 540: -/* rule 540 can match eol */ +case 538: +/* rule 538 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9138,20 +9150,21 @@ YY_RULE_SETUP switch (YY_START) { case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; case S_surfxml_storage_1: case S_surfxml_storage_2: case S_surfxml_storage: SET(S_surfxml_storage_2); break; - case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break; - case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break; + case S_surfxml_cluster_2: case S_surfxml_cluster: case S_surfxml_cluster_1: SET(S_surfxml_cluster_2); break; case S_surfxml_host_1: case S_surfxml_host_2: case S_surfxml_host: SET(S_surfxml_host_2); break; case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break; + case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break; + case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break; case S_surfxml_storage___type_1: case S_surfxml_storage___type: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break; } } YY_BREAK -case 541: -/* rule 541 can match eol */ +case 539: +/* rule 539 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 542: +case 540: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9161,7 +9174,7 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); /* EPILOG: after the root element. */ -case 543: +case 541: YY_RULE_SETUP {SET(PROLOG); yyless(0); CLEANUP; return -1;} YY_BREAK @@ -9172,58 +9185,58 @@ SUCCEED; /* CHARACTER DATA. */ /* Non-defined standard entities... */ -case 544: +case 542: YY_RULE_SETUP BUFFERPUTC('&'); YY_BREAK -case 545: +case 543: YY_RULE_SETUP BUFFERPUTC('<'); YY_BREAK -case 546: +case 544: YY_RULE_SETUP BUFFERPUTC('>'); YY_BREAK -case 547: +case 545: YY_RULE_SETUP BUFFERPUTC('\''); YY_BREAK -case 548: +case 546: YY_RULE_SETUP BUFFERPUTC('"'); YY_BREAK /* Character entities. */ -case 549: +case 547: YY_RULE_SETUP BUFFERPUTC((unsigned char)atoi(surf_parse_text+2)); YY_BREAK -case 550: +case 548: YY_RULE_SETUP BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16)); YY_BREAK +case 549: +/* rule 549 can match eol */ +case 550: +/* rule 550 can match eol */ case 551: /* rule 551 can match eol */ case 552: /* rule 552 can match eol */ -case 553: -/* rule 553 can match eol */ -case 554: -/* rule 554 can match eol */ YY_RULE_SETUP BUFFERPUTC('\n'); YY_BREAK -case 555: +case 553: YY_RULE_SETUP ENTER(CDATA); YY_BREAK -case 556: +case 554: YY_RULE_SETUP FAIL("Unexpected `]""]>' in character data."); YY_BREAK -case 557: +case 555: YY_RULE_SETUP BUFFERDONE; LEAVE; YY_BREAK @@ -9231,7 +9244,7 @@ case YY_STATE_EOF(VALUE1): FAIL("EOF in literal (\"'\" expected)."); YY_BREAK -case 558: +case 556: YY_RULE_SETUP BUFFERDONE; LEAVE; YY_BREAK @@ -9239,22 +9252,22 @@ case YY_STATE_EOF(VALUE2): FAIL("EOF in literal (`\"' expected)."); YY_BREAK -case 559: -/* rule 559 can match eol */ +case 557: +/* rule 557 can match eol */ YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); YY_BREAK -case 560: +case 558: YY_RULE_SETUP FAIL("Spurious `%c' in character data.",surf_parse_text[0]); YY_BREAK -case 561: +case 559: YY_RULE_SETUP LEAVE; YY_BREAK /* "]""]" BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */ -case 562: +case 560: YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); YY_BREAK @@ -9266,13 +9279,13 @@ FAIL("EOF in CDATA section."); /* Ideally, this should be replaced by code in flexml.pl that generates just the states not covered by other rules. */ -case 563: -/* rule 563 can match eol */ +case 561: +/* rule 561 can match eol */ YY_RULE_SETUP FAIL("Syntax error on character `%c'.", surf_parse_text[0]); YY_BREAK -case 564: +case 562: YY_RULE_SETUP ECHO; YY_BREAK @@ -9291,6 +9304,7 @@ case YY_STATE_EOF(S_surfxml_AS_15): case YY_STATE_EOF(S_surfxml_storage___type_1): case YY_STATE_EOF(S_surfxml_storage_1): case YY_STATE_EOF(S_surfxml_host_1): +case YY_STATE_EOF(S_surfxml_cluster_1): case YY_STATE_EOF(S_surfxml_link_1): case YY_STATE_EOF(S_surfxml_route_1): case YY_STATE_EOF(S_surfxml_ASroute_1): @@ -9589,7 +9603,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3299 ) + if ( yy_current_state >= 3286 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -9617,11 +9631,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3299 ) + if ( yy_current_state >= 3286 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 3298); + yy_is_jam = (yy_current_state == 3285); return yy_is_jam ? 0 : yy_current_state; } diff --git a/src/surf/storage.c b/src/surf/storage.c index 2e35c4548e..9db9c852e1 100644 --- a/src/surf/storage.c +++ b/src/surf/storage.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. The SimGrid Team. +/* Copyright (c) 2004 - 2013. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -6,7 +6,6 @@ #include "xbt/ex.h" #include "xbt/dict.h" -#include "xbt/file_stat.h" #include "portable.h" #include "surf_private.h" #include "storage_private.h" @@ -35,19 +34,10 @@ static xbt_dynar_t storage_list; #define GENERIC_LMM_ACTION(action) action->generic_lmm_action #define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action -static xbt_dict_t parse_storage_content(char *filename, unsigned long *used_size); +static xbt_dict_t parse_storage_content(char *filename, size_t *used_size); static int storage_action_unref(surf_action_t action); static void storage_action_state_set(surf_action_t action, e_surf_action_state_t state); -static surf_action_t storage_action_execute (void *storage, double size, e_surf_action_storage_type_t type); -static void free_storage_content(void *p); - -static surf_action_t storage_action_stat(void *storage, surf_file_t stream) -{ - surf_action_t action = storage_action_execute(storage,0, STAT); - action->file = stream; - action->stat = stream->content->stat; - return action; -} +static surf_action_t storage_action_execute (void *storage, size_t size, e_surf_action_storage_type_t type); static surf_action_t storage_action_ls(void *storage, const char* path) { @@ -56,14 +46,14 @@ static surf_action_t storage_action_ls(void *storage, const char* path) xbt_dict_t ls_dict = xbt_dict_new(); char* key; - surf_stat_t data = NULL; + size_t size = 0; xbt_dict_cursor_t cursor = NULL; xbt_dynar_t dyn = NULL; char* file = NULL; - // foreach file int the storage - xbt_dict_foreach(((storage_t)storage)->content,cursor,key,data){ + // for each file in the storage content + xbt_dict_foreach(((storage_t)storage)->content,cursor,key,size){ // Search if file start with the prefix 'path' if(xbt_str_start_with(key,path)){ file = &key[strlen(path)]; @@ -74,12 +64,12 @@ static surf_action_t storage_action_ls(void *storage, const char* path) // file if(xbt_dynar_length(dyn) == 1){ - xbt_dict_set(ls_dict,file,&(data->stat),NULL); + xbt_dict_set(ls_dict,file,&size,NULL); } // Directory else { - // if directory does not exist yet in dict + // if directory does not exist yet in the dictionary if(!xbt_dict_get_or_null(ls_dict,file)) xbt_dict_set(ls_dict,file,NULL,NULL); } @@ -91,88 +81,65 @@ static surf_action_t storage_action_ls(void *storage, const char* path) return action; } -static surf_action_t storage_action_unlink(void *storage, surf_file_t stream) -{ - surf_action_t action = storage_action_execute(storage,0, UNLINK); - - // Add memory to storage - ((storage_t)storage)->used_size -= stream->content->stat.size; - - // Remove the file from storage - xbt_dict_t content_dict = ((storage_t)storage)->content; - xbt_dict_remove(content_dict,stream->name); - - free(stream->name); - xbt_free(stream); - - return action; -} - -static surf_action_t storage_action_open(void *storage, const char* mount, const char* path, const char* mode) +static surf_action_t storage_action_open(void *storage, const char* mount, + const char* path) { XBT_DEBUG("\tOpen file '%s'",path); xbt_dict_t content_dict = ((storage_t)storage)->content; - surf_stat_t content = xbt_dict_get_or_null(content_dict,path); - + size_t size = (size_t) xbt_dict_get_or_null(content_dict,path); // if file does not exist create an empty file - if(!content){ - content = xbt_new0(s_surf_stat_t,1); - content->stat.date = xbt_strdup(""); - content->stat.group = xbt_strdup(""); - content->stat.size = 0; - content->stat.time = xbt_strdup(""); - content->stat.user = xbt_strdup(""); - content->stat.user_rights = xbt_strdup(""); - xbt_dict_set(content_dict,path,content,NULL); + if(!size){ + xbt_dict_set(content_dict,path,&size,NULL); XBT_DEBUG("File '%s' was not found, file created.",path); } surf_file_t file = xbt_new0(s_surf_file_t,1); file->name = xbt_strdup(path); - file->content = content; - file->storage = mount; + file->size = size; + file->storage = xbt_strdup(mount); surf_action_t action = storage_action_execute(storage,0, OPEN); action->file = (void *)file; return action; } -static surf_action_t storage_action_close(void *storage, surf_file_t fp) +static surf_action_t storage_action_close(void *storage, surf_file_t fd) { - char *filename = fp->name; - XBT_DEBUG("\tClose file '%s' size '%f'",filename,fp->content->stat.size); + char *filename = fd->name; + XBT_DEBUG("\tClose file '%s' size '%zu'",filename,fd->size); // unref write actions from storage surf_action_storage_t write_action; unsigned int i; xbt_dynar_foreach(((storage_t)storage)->write_actions,i,write_action) { - if ((write_action->generic_lmm_action.generic_action.file) == fp) { + if ((write_action->generic_lmm_action.generic_action.file) == fd) { xbt_dynar_cursor_rm(((storage_t)storage)->write_actions, &i); storage_action_unref((surf_action_t) write_action); } } - free(fp->name); - xbt_free(fp); + free(fd->name); + free(fd->storage); + xbt_free(fd); surf_action_t action = storage_action_execute(storage,0, CLOSE); return action; } -static surf_action_t storage_action_read(void *storage, void* ptr, double size, size_t nmemb, surf_file_t stream) +static surf_action_t storage_action_read(void *storage, void* ptr, + size_t size, surf_file_t fd) { - surf_stat_t content = stream->content; - if(size > content->stat.size) - size = content->stat.size; + if(size > fd->size) + size = fd->size; surf_action_t action = storage_action_execute(storage,size,READ); return action; } -static surf_action_t storage_action_write(void *storage, const void* ptr, size_t size, size_t nmemb, surf_file_t stream) +static surf_action_t storage_action_write(void *storage, const void* ptr, + size_t size, surf_file_t fd) { - char *filename = stream->name; - surf_stat_t content = stream->content; - XBT_DEBUG("\tWrite file '%s' size '%zu/%f'",filename,size,content->stat.size); + char *filename = fd->name; + XBT_DEBUG("\tWrite file '%s' size '%zu/%zu'",filename,size,fd->size); surf_action_t action = storage_action_execute(storage,size,WRITE); - action->file = stream; + action->file = fd; // If the storage is full if(((storage_t)storage)->used_size==((storage_t)storage)->size) { @@ -181,12 +148,12 @@ static surf_action_t storage_action_write(void *storage, const void* ptr, size_t return action; } -static surf_action_t storage_action_execute (void *storage, double size, e_surf_action_storage_type_t type) +static surf_action_t storage_action_execute (void *storage, size_t size, e_surf_action_storage_type_t type) { surf_action_storage_t action = NULL; storage_t STORAGE = storage; - XBT_IN("(%s,%f)", surf_resource_name(STORAGE), size); + XBT_IN("(%s,%zu", surf_resource_name(STORAGE), size); action = surf_action_new(sizeof(s_surf_action_storage_t), size, surf_storage_model, STORAGE->state_current != SURF_RESOURCE_ON); @@ -207,7 +174,6 @@ static surf_action_t storage_action_execute (void *storage, double size, e_surf_ case OPEN: case CLOSE: case STAT: - case UNLINK: case LS: break; case READ: @@ -245,7 +211,7 @@ static void* storage_create_resource(const char* id, const char* model,const cha double Bread = atof(xbt_dict_get(storage_type->properties,"Bread")); double Bwrite = atof(xbt_dict_get(storage_type->properties,"Bwrite")); double Bconnection = atof(xbt_dict_get(storage_type->properties,"Bconnection")); - XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%ld'",Bconnection,Bread,Bwrite,storage_type->size); + XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%lu'",Bconnection,Bread,Bwrite,(unsigned long)storage_type->size); storage->constraint = lmm_constraint_new(storage_maxmin_system, storage, Bconnection); storage->constraint_read = lmm_constraint_new(storage_maxmin_system, storage, Bread); storage->constraint_write = lmm_constraint_new(storage_maxmin_system, storage, Bwrite); @@ -290,13 +256,16 @@ static void storage_update_actions_state(surf_model_t storage_model, double now, // Update the disk usage // Update the file size - // Foreach action of type write + // For each action of type write xbt_swag_foreach_safe(action, next_action, running_actions) { if(action->type == WRITE) { double rate = lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable); - ((storage_t)(action->storage))->used_size += delta * rate; // disk usage - ((surf_action_t)action)->file->content->stat.size += delta * rate; // file size + /* Hack to avoid rounding differences between x86 and x86_64 + * (note that the next sizes are of type size_t). */ + long incr = delta * rate + MAXMIN_PRECISION; + ((storage_t)(action->storage))->used_size += incr; // disk usage + ((surf_action_t)action)->file->size += incr; // file size } } @@ -513,8 +482,6 @@ static void surf_storage_model_init_internal(void) surf_storage_model->extension.storage.close = storage_action_close; surf_storage_model->extension.storage.read = storage_action_read; surf_storage_model->extension.storage.write = storage_action_write; - surf_storage_model->extension.storage.stat = storage_action_stat; - surf_storage_model->extension.storage.unlink = storage_action_unlink; surf_storage_model->extension.storage.ls = storage_action_ls; if (!storage_maxmin_system) { @@ -553,24 +520,13 @@ static void storage_parse_storage(sg_platf_storage_cbarg_t storage) (void *) xbt_strdup(storage->type_id)); } -static void free_storage_content(void *p) -{ - surf_stat_t content = p; - free(content->stat.date); - free(content->stat.group); - free(content->stat.time); - free(content->stat.user); - free(content->stat.user_rights); - free(content); -} - -static xbt_dict_t parse_storage_content(char *filename, unsigned long *used_size) +static xbt_dict_t parse_storage_content(char *filename, size_t *used_size) { *used_size = 0; if ((!filename) || (strcmp(filename, "") == 0)) return NULL; - xbt_dict_t parse_content = xbt_dict_new_homogeneous(free_storage_content); + xbt_dict_t parse_content = xbt_dict_new_homogeneous(NULL); FILE *file = NULL; file = surf_fopen(filename, "r"); @@ -580,33 +536,17 @@ static xbt_dict_t parse_storage_content(char *filename, unsigned long *used_size char *line = NULL; size_t len = 0; ssize_t read; - char user_rights[12]; - char user[100]; - char group[100]; - char date[12]; - char time[12]; char path[1024]; - int nb; - unsigned long size; + size_t size; - surf_stat_t content; while ((read = xbt_getline(&line, &len, file)) != -1) { if (read){ - content = xbt_new0(s_surf_stat_t,1); - if(sscanf(line,"%s %d %s %s %ld %s %s %s",user_rights,&nb,user,group,&size,date,time,path)==8) { - content->stat.date = xbt_strdup(date); - content->stat.group = xbt_strdup(group); - content->stat.size = size; - content->stat.time = xbt_strdup(time); - content->stat.user = xbt_strdup(user); - content->stat.user_rights = xbt_strdup(user_rights); - *used_size += content->stat.size; - xbt_dict_set(parse_content,path,content,NULL); + if(sscanf(line,"%s %zu",path, &size)==2) { + *used_size += size; + xbt_dict_set(parse_content,path,(void*) size,NULL); } else { xbt_die("Be sure of passing a good format for content file.\n"); - // You can generate this kind of file with command line: - // find /path/you/want -type f -exec ls -l {} \; 2>/dev/null > ./content.txt } } } diff --git a/src/surf/storage_private.h b/src/surf/storage_private.h index 30792454a0..1d896f5bac 100644 --- a/src/surf/storage_private.h +++ b/src/surf/storage_private.h @@ -12,7 +12,7 @@ typedef struct s_storage_type { char *content; char *type_id; xbt_dict_t properties; - unsigned long size; + size_t size; } s_storage_type_t, *storage_type_t; typedef struct s_mount { @@ -20,31 +20,26 @@ typedef struct s_mount { char *name; } s_mount_t, *mount_t; -typedef struct surf_stat { /* file status structure */ - s_file_stat_t stat; - /* possible additionnal fields (e.g., popularity, last access time to know whether the file is in cache, ...) */ -} s_surf_stat_t; - typedef struct surf_file { char *name; - surf_stat_t content; - const char* storage; + char *storage; + size_t size; } s_surf_file_t; typedef struct storage { - s_surf_resource_t generic_resource; /*< Structure with generic data. Needed at begin to interate with SURF */ + s_surf_resource_t generic_resource; /*< Structure with generic data. Needed at begin to interact with SURF */ e_surf_resource_state_t state_current; /*< STORAGE current state (ON or OFF) */ - lmm_constraint_t constraint; /* Constraint for maximum bandwidth from connexion */ + lmm_constraint_t constraint; /* Constraint for maximum bandwidth from connection */ lmm_constraint_t constraint_write; /* Constraint for maximum write bandwidth*/ lmm_constraint_t constraint_read; /* Constraint for maximum write bandwidth*/ - xbt_dict_t content; /* char * -> s_surf_stat_t */ - unsigned long size; - unsigned long used_size; + xbt_dict_t content; /* char * -> s_surf_file_t */ + size_t size; + size_t used_size; xbt_dynar_t write_actions; } s_storage_t, *storage_t; typedef enum { - READ=0, WRITE, STAT, OPEN, CLOSE, UNLINK, LS + READ=0, WRITE, STAT, OPEN, CLOSE, LS } e_surf_action_storage_type_t; typedef struct surf_action_storage { diff --git a/src/surf/surf.c b/src/surf/surf.c index d2ded06483..2cc050d9e8 100644 --- a/src/surf/surf.c +++ b/src/surf/surf.c @@ -208,7 +208,6 @@ s_surf_model_description_t surf_new_model_description[] = { static xbt_parmap_t surf_parmap = NULL; /* parallel map on models */ #endif -static int surf_nthreads = 1; /* number of threads of the parmap (1 means no parallelism) */ static double *surf_mins = NULL; /* return value of share_resources for each model */ static int surf_min_index; /* current index in surf_mins */ static double min; /* duration determined by surf_solve */ @@ -567,20 +566,9 @@ double surf_solve(double max_date) } surf_min_index = 0; - - if (surf_get_nthreads() > 1) { - /* parallel version */ -#ifdef CONTEXT_THREADS - xbt_parmap_apply(surf_parmap, (void_f_pvoid_t) surf_share_resources, model_list_invoke); -#else - xbt_die("Asked to run in parallel, but no thread at hand..."); -#endif - } - else { - /* sequential version */ - xbt_dynar_foreach(model_list_invoke, iter, model) { - surf_share_resources(model); - } + /* sequential version */ + xbt_dynar_foreach(model_list_invoke, iter, model) { + surf_share_resources(model); } unsigned i; @@ -655,19 +643,10 @@ double surf_solve(double max_date) XBT_DEBUG("Duration set to %f", min); NOW = NOW + min; - - if (surf_get_nthreads() > 1) { - /* parallel version */ -#ifdef CONTEXT_THREADS - xbt_parmap_apply(surf_parmap, (void_f_pvoid_t) surf_update_actions_state, model_list); -#endif - } - else { - /* FIXME: model_list or model_list_invoke? revisit here later */ - /* sequential version */ - xbt_dynar_foreach(model_list, iter, model) { - surf_update_actions_state(model); - } + /* FIXME: model_list or model_list_invoke? revisit here later */ + /* sequential version */ + xbt_dynar_foreach(model_list, iter, model) { + surf_update_actions_state(model); } #ifdef HAVE_TRACING @@ -700,44 +679,6 @@ static void surf_update_actions_state(surf_model_t model) model->model_private->update_actions_state(model, NOW, min); } -/** - * \brief Returns the number of parallel threads used to update the models. - * \return the number of threads (1 means no parallelism) - */ -int surf_get_nthreads(void) { - return surf_nthreads; -} - -/** - * \brief Sets the number of parallel threads used to update the models. - * - * A value of 1 means no parallelism. - * - * \param nb_threads the number of threads to use - */ -void surf_set_nthreads(int nthreads) { - - if (nthreads<=0) { - nthreads = xbt_os_get_numcores(); - XBT_INFO("Auto-setting surf/nthreads to %d",nthreads); - } - -#ifdef CONTEXT_THREADS - xbt_parmap_destroy(surf_parmap); - surf_parmap = NULL; -#endif - - if (nthreads > 1) { -#ifdef CONTEXT_THREADS - surf_parmap = xbt_parmap_new(nthreads, XBT_PARMAP_DEFAULT); -#else - THROWF(arg_error, 0, "Cannot activate parallel threads in Surf: your architecture does not support threads"); -#endif - } - - surf_nthreads = nthreads; -} - /* This function is a pimple that we ought to fix. But it won't be easy. * * The surf_solve() function does properly return the set of actions that changed. diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index 076a05c426..2fb09bf4cd 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -104,7 +104,6 @@ int net_get_link_latency_limited(surf_action_t action); */ int __surf_is_absolute_file_path(const char *file_path); -typedef struct s_as *AS_t; typedef struct s_routing_edge { AS_t rc_component; e_surf_network_element_type_t rc_type; diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 5901fbd2ff..1efbed43fe 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -75,7 +75,6 @@ typedef enum { SURF_MODEL_DIJKSTRA, SURF_MODEL_DIJKSTRACACHE, SURF_MODEL_NONE, - SURF_MODEL_RULEBASED, SURF_MODEL_VIVALDI, SURF_MODEL_CLUSTER } e_routing_types; @@ -95,8 +94,6 @@ struct s_model_type routing_models[] = { model_dijkstracache_create, model_dijkstra_both_end}, {"none", "No routing (Unless you know what you are doing, avoid using this mode in combination with a non Constant network model).", model_none_create, NULL}, - {"RuleBased", "Rule-Based routing data (...)", - model_rulebased_create, NULL}, {"Vivaldi", "Vivaldi routing", model_vivaldi_create, NULL}, {"Cluster", "Cluster routing", @@ -119,6 +116,8 @@ static void parse_S_host_link(sg_platf_host_link_cbarg_t host) s_surf_parsing_link_up_down_t link_up_down; link_up_down.link_up = xbt_lib_get_or_null(link_lib, host->link_up, SURF_LINK_LEVEL); link_up_down.link_down = xbt_lib_get_or_null(link_lib, host->link_down, SURF_LINK_LEVEL); + link_up_down.limiter_link = NULL; + link_up_down.loopback_link = NULL; xbt_assert(link_up_down.link_up, "Link '%s' not found!",host->link_up); xbt_assert(link_up_down.link_down, "Link '%s' not found!",host->link_down); @@ -354,7 +353,6 @@ void routing_AS_begin(sg_platf_AS_cbarg_t AS) case A_surfxml_AS_routing_Floyd: model = &routing_models[SURF_MODEL_FLOYD];break; case A_surfxml_AS_routing_Full: model = &routing_models[SURF_MODEL_FULL];break; case A_surfxml_AS_routing_None: model = &routing_models[SURF_MODEL_NONE];break; - case A_surfxml_AS_routing_RuleBased: model = &routing_models[SURF_MODEL_RULEBASED];break; case A_surfxml_AS_routing_Vivaldi: model = &routing_models[SURF_MODEL_VIVALDI];break; default: xbt_die("Not a valid model!!!"); break; @@ -1229,3 +1227,36 @@ void routing_exit(void) { finalize_rec(routing_platf->root); xbt_free(routing_platf); } + +AS_t surf_AS_get_routing_root() { + return routing_platf->root; +} + +const char *surf_AS_get_name(AS_t as) { + return as->name; +} + +xbt_dict_t surf_AS_get_routing_sons(AS_t as) { + return as->routing_sons; +} + +const char *surf_AS_get_model(AS_t as) { + return as->model_desc->name; +} + +xbt_dynar_t surf_AS_get_hosts(AS_t as) { + xbt_dynar_t elms = as->index_network_elm; + sg_routing_edge_t relm; + xbt_dictelm_t delm; + int index; + int count = xbt_dynar_length(elms); + xbt_dynar_t res = xbt_dynar_new(sizeof(xbt_dictelm_t), NULL); + for (index = 0; index < count; index++) { + relm = xbt_dynar_get_as(elms, index, sg_routing_edge_t); + delm = xbt_lib_get_elm_or_null(host_lib, relm->name); + if (delm!=NULL) { + xbt_dynar_push(res, &delm); + } + } + return res; +} diff --git a/src/surf/surf_routing_dijkstra.c b/src/surf/surf_routing_dijkstra.c index 4b0d4c96b1..d225cd4621 100644 --- a/src/surf/surf_routing_dijkstra.c +++ b/src/surf/surf_routing_dijkstra.c @@ -51,7 +51,7 @@ static void graph_node_map_elem_free(void *e) xbt_free(elm); } -static void graph_edge_data_free(void *e) // FIXME: useless code dupplication +static void graph_edge_data_free(void *e) // FIXME: useless code duplication { sg_platf_route_cbarg_t e_route = (sg_platf_route_cbarg_t) e; if (e_route) { diff --git a/src/surf/surf_routing_private.h b/src/surf/surf_routing_private.h index b63fb23a9c..99f54ddfc8 100644 --- a/src/surf/surf_routing_private.h +++ b/src/surf/surf_routing_private.h @@ -63,10 +63,6 @@ AS_t model_floyd_create(void); /* create structures for floyd routing model */ void model_floyd_end(AS_t as); /* finalize the creation of floyd routing model */ void model_floyd_parse_route(AS_t rc, sg_platf_route_cbarg_t route); -/* ************************************************** */ -/* ************** RULE-BASED ROUTING **************** */ -AS_t model_rulebased_create(void); /* create structures for rulebased routing model */ - /* ************************************************** */ /* ************** Cluster ROUTING **************** */ typedef struct { diff --git a/src/surf/surf_routing_rulebased.c b/src/surf/surf_routing_rulebased.c deleted file mode 100644 index 2c69fc9d81..0000000000 --- a/src/surf/surf_routing_rulebased.c +++ /dev/null @@ -1,406 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011. The SimGrid Team. - * All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "surf_routing_private.h" -#include /* regular expression library */ - -/* Global vars */ -extern routing_platf_t routing_platf; - -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_rulebased, surf, "Routing part of surf"); - -/* Routing model structure */ - -typedef struct { - s_as_t generic_routing; - xbt_dynar_t list_route; - xbt_dynar_t list_ASroute; -} s_AS_rulebased_t, *AS_rulebased_t; - -typedef struct s_rule_route s_rule_route_t, *rule_route_t; -typedef struct s_rule_route_extended s_rule_route_extended_t, *rule_route_extended_t; - -struct s_rule_route { - xbt_dynar_t re_str_link; // dynar of char* - pcre *re_src; - pcre *re_dst; -}; - -struct s_rule_route_extended { - s_rule_route_t generic_rule_route; - char *re_src_gateway; - char *re_dst_gateway; -}; - -static void rule_route_free(void *e) -{ - rule_route_t *elem = (rule_route_t *) (e); - if (*elem) { - xbt_dynar_free(&(*elem)->re_str_link); - pcre_free((*elem)->re_src); - pcre_free((*elem)->re_dst); - xbt_free(*elem); - } - *elem = NULL; -} - -static void rule_route_extended_free(void *e) -{ - rule_route_extended_t *elem = (rule_route_extended_t *) e; - if (*elem) { - xbt_dynar_free(&(*elem)->generic_rule_route.re_str_link); - pcre_free((*elem)->generic_rule_route.re_src); - pcre_free((*elem)->generic_rule_route.re_dst); - xbt_free((*elem)->re_src_gateway); - xbt_free((*elem)->re_dst_gateway); - xbt_free(*elem); - } -} - -/* Parse routing model functions */ - -static int model_rulebased_parse_PU(AS_t rc, sg_routing_edge_t elm) -{ - AS_rulebased_t routing = (AS_rulebased_t) rc; - xbt_dynar_push(routing->generic_routing.index_network_elm,&elm); - return -1; -} - -static int model_rulebased_parse_AS(AS_t rc, sg_routing_edge_t elm) -{ - AS_rulebased_t routing = (AS_rulebased_t) rc; - xbt_dynar_push(routing->generic_routing.index_network_elm,&elm); - return -1; -} - -static void model_rulebased_parse_route(AS_t rc, sg_platf_route_cbarg_t route) -{ - char *src = (char*)(route->src); - char *dst = (char*)(route->dst); - - AS_rulebased_t routing = (AS_rulebased_t) rc; - rule_route_t ruleroute = xbt_new0(s_rule_route_t, 1); - const char *error; - int erroffset; - - if(!strcmp(rc->model_desc->name,"Vivaldi")){ - if(!xbt_dynar_is_empty(route->link_list)) - xbt_die("You can't have link_ctn with Model Vivaldi."); - } - - ruleroute->re_src = pcre_compile(src, 0, &error, &erroffset, NULL); - xbt_assert(ruleroute->re_src, - "PCRE compilation failed at offset %d (\"%s\"): %s\n", - erroffset, src, error); - ruleroute->re_dst = pcre_compile(dst, 0, &error, &erroffset, NULL); - xbt_assert(ruleroute->re_src, - "PCRE compilation failed at offset %d (\"%s\"): %s\n", - erroffset, dst, error); - - ruleroute->re_str_link = route->link_list; - route->link_list = NULL; // Don't free it twice in each container - - xbt_dynar_push(routing->list_route, &ruleroute); -} - -static void model_rulebased_parse_ASroute(AS_t rc, sg_platf_route_cbarg_t route) -{ - char *src = (char*)(route->src); - char *dst = (char*)(route->dst); - - AS_rulebased_t routing = (AS_rulebased_t) rc; - rule_route_extended_t ruleroute_e = xbt_new0(s_rule_route_extended_t, 1); - const char *error; - int erroffset; - - if(!strcmp(rc->model_desc->name,"Vivaldi")){ - if(!xbt_dynar_is_empty(route->link_list)) - xbt_die("You can't have link_ctn with Model Vivaldi."); - } - - ruleroute_e->generic_rule_route.re_src = - pcre_compile(src, 0, &error, &erroffset, NULL); - xbt_assert(ruleroute_e->generic_rule_route.re_src, - "PCRE compilation failed at offset %d (\"%s\"): %s\n", - erroffset, src, error); - ruleroute_e->generic_rule_route.re_dst = - pcre_compile(dst, 0, &error, &erroffset, NULL); - xbt_assert(ruleroute_e->generic_rule_route.re_dst, - "PCRE compilation failed at offset %d (\"%s\"): %s\n", - erroffset, dst, error); - - ruleroute_e->generic_rule_route.re_str_link = route->link_list; - - // DIRTY PERL HACK AHEAD: with the rulebased routing, the {src,dst}_gateway fields - // store the provided name instead of the entity directly (routing_parse_E_ASroute knows) - // - // This is because the user will provide something like "^AS_(.*)$" instead of the proper name of a given entity - ruleroute_e->re_src_gateway = xbt_strdup((char *)route->gw_src); - ruleroute_e->re_dst_gateway = xbt_strdup((char *)route->gw_dst); - xbt_dynar_push(routing->list_ASroute, &ruleroute_e); - - /* make sure that they don't get freed */ - route->link_list = NULL; - route->gw_src = route->gw_dst = NULL; -} - -static void model_rulebased_parse_bypassroute(AS_t rc, sg_platf_route_cbarg_t e_route) -{ - xbt_die("bypass routing not supported for Route-Based model"); -} - -#define BUFFER_SIZE 4096 /* result buffer size */ -#define OVECCOUNT 30 /* should be a multiple of 3 */ - -static char *remplace(char *value, const char **src_list, int src_size, - const char **dst_list, int dst_size) -{ - char result[BUFFER_SIZE]; - int i_res = 0; - int i = 0; - - while (value[i]) { - if (value[i] == '$') { - i++; /* skip the '$' */ - if (value[i] < '0' || value[i] > '9') - xbt_die("bad string parameter, no number indication, at offset: " - "%d (\"%s\")", i, value); - - /* solve the number */ - int number = value[i++] - '0'; - while (value[i] >= '0' && value[i] <= '9') - number = 10 * number + (value[i++] - '0'); - - /* solve the indication */ - const char **param_list; - _XBT_GNUC_UNUSED int param_size; - if (value[i] == 's' && value[i + 1] == 'r' && value[i + 2] == 'c') { - param_list = src_list; - param_size = src_size; - } else if (value[i] == 'd' && value[i + 1] == 's' - && value[i + 2] == 't') { - param_list = dst_list; - param_size = dst_size; - } else { - xbt_die("bad string parameter, support only \"src\" and \"dst\", " - "at offset: %d (\"%s\")", i, value); - } - i += 3; - - xbt_assert(number < param_size, - "bad string parameter, not enough length param_size, " - "at offset: %d (\"%s\") %d %d", i, value, param_size, number); - - const char *param = param_list[number]; - int j = 0; - while (param[j] && i_res < BUFFER_SIZE) - result[i_res++] = param[j++]; - } else { - result[i_res++] = value[i++]; /* next char */ - } - if (i_res >= BUFFER_SIZE) - xbt_die("solving string \"%s\", small buffer size (%d)", - value, BUFFER_SIZE); - } - result[i_res++] = '\0'; - char *res = xbt_malloc(i_res); - return memcpy(res, result, i_res); -} - -static void rulebased_get_route_and_latency(AS_t rc, - sg_routing_edge_t src, sg_routing_edge_t dst, - sg_platf_route_cbarg_t res,double*lat); -static xbt_dynar_t rulebased_get_onelink_routes(AS_t rc) -{ - xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); - //We have already bypass cluster routes with network NS3 - if(!strcmp(surf_network_model->name,"network NS3")) - return ret; - - char *k1; - - //find router - sg_routing_edge_t router = NULL; - xbt_lib_cursor_t cursor; - xbt_lib_foreach(as_router_lib, cursor, k1, router) - { - if (router->rc_type == SURF_NETWORK_ELEMENT_ROUTER) - break; - } - - if (!router) - xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); - - sg_routing_edge_t host = NULL; - xbt_lib_foreach(as_router_lib, cursor, k1, host){ - void *link_ptr; - sg_platf_route_cbarg_t route = xbt_new0(s_sg_platf_route_cbarg_t,1); - route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t),NULL); - rulebased_get_route_and_latency (rc, router, host, route,NULL); - - switch (xbt_dynar_length(route->link_list)) { - case 1: - //loopback - break; - case 2: - xbt_dynar_get_cpy (route->link_list, 1, &link_ptr); - onelink_t onelink = xbt_new0 (s_onelink_t, 1); - onelink->src = host; - onelink->dst = router; - onelink->link_ptr = link_ptr; - xbt_dynar_push (ret, &onelink); - break; - default: - xbt_die("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); - break; - } - } - return ret; -} - -/* Business methods */ -static void rulebased_get_route_and_latency(AS_t rc, - sg_routing_edge_t src, sg_routing_edge_t dst, - sg_platf_route_cbarg_t route, double *lat) -{ - XBT_DEBUG("rulebased_get_route_and_latency from '%s' to '%s'",src->name,dst->name); - xbt_assert(rc && src - && dst, - "Invalid params for \"get_route\" function at AS \"%s\"", - rc->name); - - /* set utils vars */ - AS_rulebased_t routing = (AS_rulebased_t) rc; - - char* src_name = src->name; - char* dst_name = dst->name; - - int are_processing_units=0; - xbt_dynar_t rule_list; - if ((src->rc_type == SURF_NETWORK_ELEMENT_HOST || src->rc_type == SURF_NETWORK_ELEMENT_ROUTER)&& - (dst->rc_type == SURF_NETWORK_ELEMENT_HOST || dst->rc_type == SURF_NETWORK_ELEMENT_ROUTER)){ - are_processing_units = 1; - rule_list = routing->list_route; - } else if (src->rc_type == SURF_NETWORK_ELEMENT_AS && dst->rc_type == SURF_NETWORK_ELEMENT_AS) { - are_processing_units = 0; - rule_list = routing->list_ASroute; - } else - THROWF(arg_error,0,"No route from '%s' to '%s'",src_name,dst_name); - - int rc_src = -1; - int rc_dst = -1; - int src_length = (int) strlen(src_name); - int dst_length = (int) strlen(dst_name); - - rule_route_t ruleroute; - unsigned int cpt; - int ovector_src[OVECCOUNT]; - int ovector_dst[OVECCOUNT]; - const char **list_src = NULL; - const char **list_dst = NULL; - _XBT_GNUC_UNUSED int res; - xbt_dynar_foreach(rule_list, cpt, ruleroute) { - rc_src = - pcre_exec(ruleroute->re_src, NULL, src_name, src_length, 0, 0, - ovector_src, OVECCOUNT); - if (rc_src >= 0) { - rc_dst = - pcre_exec(ruleroute->re_dst, NULL, dst_name, dst_length, 0, 0, - ovector_dst, OVECCOUNT); - if (rc_dst >= 0) { - res = pcre_get_substring_list(src_name, ovector_src, rc_src, &list_src); - xbt_assert(!res, "error solving substring list for src \"%s\"", src_name); - res = pcre_get_substring_list(dst_name, ovector_dst, rc_dst, &list_dst); - xbt_assert(!res, "error solving substring list for dst \"%s\"", dst_name); - char *link_name; - xbt_dynar_foreach(ruleroute->re_str_link, cpt, link_name) { - char *new_link_name = - remplace(link_name, list_src, rc_src, list_dst, rc_dst); - void *link = - xbt_lib_get_or_null(link_lib, new_link_name, SURF_LINK_LEVEL); - if (link) { - xbt_dynar_push(route->link_list, &link); - if (lat) - *lat += surf_network_model->extension.network.get_link_latency(link); - } else - THROWF(mismatch_error, 0, "Link %s not found", new_link_name); - xbt_free(new_link_name); - } - } - } - if (rc_src >= 0 && rc_dst >= 0) - break; - } - - if (rc_src >= 0 && rc_dst >= 0) { - /* matched src and dest, nothing more to do (?) */ - } else if (!strcmp(src_name, dst_name) && are_processing_units) { - xbt_dynar_push(route->link_list, &(routing_platf->loopback)); - if (lat) - *lat += surf_network_model->extension.network.get_link_latency(routing_platf->loopback); - } else { - THROWF(arg_error,0,"No route from '%s' to '%s'??",src_name,dst_name); - //xbt_dynar_reset(route->link_list); - } - - if (!are_processing_units && !xbt_dynar_is_empty(route->link_list)) { - rule_route_extended_t ruleroute_extended = - (rule_route_extended_t) ruleroute; - char *gw_src_name = remplace(ruleroute_extended->re_src_gateway, list_src, rc_src, - list_dst, rc_dst); - route->gw_src = sg_routing_edge_by_name_or_null(gw_src_name); - xbt_free(gw_src_name); - - char *gw_dst_name = remplace(ruleroute_extended->re_dst_gateway, list_src, rc_src, - list_dst, rc_dst); - route->gw_dst = sg_routing_edge_by_name_or_null(gw_dst_name); - xbt_free(gw_dst_name); - } - - if (list_src) - pcre_free_substring_list(list_src); - if (list_dst) - pcre_free_substring_list(list_dst); -} - -static sg_platf_route_cbarg_t rulebased_get_bypass_route(AS_t rc, sg_routing_edge_t src, sg_routing_edge_t dst, double *lat) { - return NULL; -} - -static void rulebased_finalize(AS_t rc) -{ - AS_rulebased_t routing = - (AS_rulebased_t) rc; - if (routing) { - xbt_dynar_free(&routing->list_route); - xbt_dynar_free(&routing->list_ASroute); - model_generic_finalize(rc); - } -} - -/* Creation routing model functions */ -AS_t model_rulebased_create(void) { - - AS_rulebased_t new_component = (AS_rulebased_t) - model_generic_create_sized(sizeof(s_AS_rulebased_t)); - - new_component->generic_routing.parse_PU = model_rulebased_parse_PU; - new_component->generic_routing.parse_AS = model_rulebased_parse_AS; - new_component->generic_routing.parse_route = model_rulebased_parse_route; - new_component->generic_routing.parse_ASroute = model_rulebased_parse_ASroute; - new_component->generic_routing.parse_bypassroute = model_rulebased_parse_bypassroute; - new_component->generic_routing.get_onelink_routes = rulebased_get_onelink_routes; - new_component->generic_routing.get_route_and_latency = rulebased_get_route_and_latency; - new_component->generic_routing.get_bypass_route = rulebased_get_bypass_route; - new_component->generic_routing.get_graph = generic_get_graph; - new_component->generic_routing.finalize = rulebased_finalize; - /* initialization of internal structures */ - new_component->list_route = xbt_dynar_new(sizeof(rule_route_t), &rule_route_free); - new_component->list_ASroute = - xbt_dynar_new(sizeof(rule_route_extended_t), - &rule_route_extended_free); - - return (AS_t) new_component; -} diff --git a/src/surf/surf_routing_vivaldi.c b/src/surf/surf_routing_vivaldi.c index ed8a80cc3c..a7e0cce3e4 100644 --- a/src/surf/surf_routing_vivaldi.c +++ b/src/surf/surf_routing_vivaldi.c @@ -102,7 +102,8 @@ static int vivaldi_parse_PU(AS_t rc, sg_routing_edge_t elm) { /* Creation routing model functions */ AS_t model_vivaldi_create(void) { - AS_t new_component = model_rulebased_create(); + AS_t new_component = model_generic_create_sized(sizeof *new_component); + new_component->get_route_and_latency = vivaldi_get_route_and_latency; new_component->parse_PU = vivaldi_parse_PU; new_component->get_graph = generic_get_graph; diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index fb6e217633..a8016911e4 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -4,6 +4,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include +#include #include /* va_arg */ #include "xbt/misc.h" @@ -49,6 +51,7 @@ double surf_parse_get_double(const char *string) { int ret = sscanf(string, "%lg", &res); if (ret != 1) surf_parse_error("%s is not a double", string); + //printf("Parsed double [%lg] %s\n", res, string); return res; } @@ -60,6 +63,105 @@ int surf_parse_get_int(const char *string) { return res; } +struct unit_scale { + const char *unit; + double scale; +}; + +/* Note: field `unit' for the last element of parametre `units' should be + * NULL. */ +static double surf_parse_get_value_with_unit(const char *string, + const struct unit_scale *units) +{ + char* ptr; + double res; + int i; + errno = 0; + res = strtod(string, &ptr); + if (errno == ERANGE) + surf_parse_error("value out of range: %s", string); + if (ptr == string) + surf_parse_error("cannot parse number: %s", string); + for (i = 0; units[i].unit != NULL && strcmp(ptr, units[i].unit) != 0; i++) { + } + if (units[i].unit != NULL) + res *= units[i].scale; + else + surf_parse_error("unknown unit: %s", ptr); + return res; +} + +double surf_parse_get_time(const char *string) +{ + const struct unit_scale units[] = { + { "w", 7 * 24 * 60 * 60 }, + { "d", 24 * 60 * 60 }, + { "h", 60 * 60 }, + { "m", 60 }, + { "s", 1.0 }, + { "", 1.0 }, /* default unit is seconds */ + { "ms", 1e-3 }, + { "us", 1e-6 }, + { "ns", 1e-9 }, + { "ps", 1e-12 }, + { NULL, 0 } + }; + return surf_parse_get_value_with_unit(string, units); +} + +double surf_parse_get_bandwidth(const char *string) +{ + const struct unit_scale units[] = { + { "TiBps", pow(1024, 4) }, + { "GiBps", pow(1024, 3) }, + { "MiBps", pow(1024, 2) }, + { "KiBps", 1024 }, + { "TBps", 1e12 }, + { "GBps", 1e9 }, + { "MBps", 1e6 }, + { "kBps", 1e3 }, + { "Bps", 1.0 }, + { "", 1.0 }, /* default unit is bytes per second */ + { "Tibps", 0.125 * pow(1024, 4) }, + { "Gibps", 0.125 * pow(1024, 3) }, + { "Mibps", 0.125 * pow(1024, 2) }, + { "Kibps", 0.125 * 1024 }, + { "Tbps", 0.125 * 1e12 }, + { "Gbps", 0.125 * 1e9 }, + { "Mbps", 0.125 * 1e6 }, + { "kbps", 0.125 * 1e3 }, + { "bps", 0.125 }, + { NULL, 0 } + }; + return surf_parse_get_value_with_unit(string, units); +} + +double surf_parse_get_power(const char *string) +{ + const struct unit_scale units[] = { + { "yottaflops", 1e24 }, + { "Yf", 1e24 }, + { "zettaflops", 1e21 }, + { "Zf", 1e21 }, + { "exaflops", 1e18 }, + { "Ef", 1e18 }, + { "petaflops", 1e15 }, + { "Pf", 1e15 }, + { "teraflops", 1e12 }, + { "Tf", 1e12 }, + { "gigaflops", 1e9 }, + { "Gf", 1e9 }, + { "megaflops", 1e6 }, + { "Mf", 1e6 }, + { "kiloflops", 1e3 }, + { "kf", 1e3 }, + { "flops", 1.0 }, + { "f", 1.0 }, + { "", 1.0 }, /* default unit is flops */ + { NULL, 0 } + }; + return surf_parse_get_value_with_unit(string, units); +} /* * All the callback lists that can be overridden anywhere. @@ -333,27 +435,29 @@ void STag_surfxml_router(void){ sg_platf_new_router(&router); } -void STag_surfxml_cluster(void){ +void ETag_surfxml_cluster(void){ s_sg_platf_cluster_cbarg_t cluster; memset(&cluster,0,sizeof(cluster)); + cluster.properties = current_property_set; + cluster.id = A_surfxml_cluster_id; cluster.prefix = A_surfxml_cluster_prefix; cluster.suffix = A_surfxml_cluster_suffix; cluster.radical = A_surfxml_cluster_radical; - cluster.power= surf_parse_get_double(A_surfxml_cluster_power); + cluster.power = surf_parse_get_power(A_surfxml_cluster_power); cluster.core_amount = surf_parse_get_int(A_surfxml_cluster_core); - cluster.bw = surf_parse_get_double(A_surfxml_cluster_bw); - cluster.lat = surf_parse_get_double(A_surfxml_cluster_lat); + cluster.bw = surf_parse_get_bandwidth(A_surfxml_cluster_bw); + cluster.lat = surf_parse_get_time(A_surfxml_cluster_lat); if(strcmp(A_surfxml_cluster_bb___bw,"")) - cluster.bb_bw = surf_parse_get_double(A_surfxml_cluster_bb___bw); + cluster.bb_bw = surf_parse_get_bandwidth(A_surfxml_cluster_bb___bw); if(strcmp(A_surfxml_cluster_bb___lat,"")) - cluster.bb_lat = surf_parse_get_double(A_surfxml_cluster_bb___lat); + cluster.bb_lat = surf_parse_get_time(A_surfxml_cluster_bb___lat); if(strcmp(A_surfxml_cluster_limiter___link,"")) cluster.limiter_link = surf_parse_get_double(A_surfxml_cluster_limiter___link); if(strcmp(A_surfxml_cluster_loopback___bw,"")) - cluster.loopback_bw = surf_parse_get_double(A_surfxml_cluster_loopback___bw); + cluster.loopback_bw = surf_parse_get_bandwidth(A_surfxml_cluster_loopback___bw); if(strcmp(A_surfxml_cluster_loopback___lat,"")) - cluster.loopback_lat = surf_parse_get_double(A_surfxml_cluster_loopback___lat); + cluster.loopback_lat = surf_parse_get_time(A_surfxml_cluster_loopback___lat); cluster.router_id = A_surfxml_cluster_router___id; switch (AX_surfxml_cluster_sharing___policy) { @@ -387,6 +491,12 @@ void STag_surfxml_cluster(void){ cluster.availability_trace = A_surfxml_cluster_availability___file; cluster.state_trace = A_surfxml_cluster_state___file; sg_platf_new_cluster(&cluster); + + current_property_set = NULL; +} + +void STag_surfxml_cluster(void){ + xbt_assert(current_property_set == NULL, "Someone forgot to reset the property set to NULL in its closing tag (or XML malformed)"); } void STag_surfxml_cabinet(void){ @@ -395,9 +505,9 @@ void STag_surfxml_cabinet(void){ cabinet.id = A_surfxml_cabinet_id; cabinet.prefix = A_surfxml_cabinet_prefix; cabinet.suffix = A_surfxml_cabinet_suffix; - cabinet.power = surf_parse_get_double(A_surfxml_cabinet_power); - cabinet.bw = surf_parse_get_double(A_surfxml_cabinet_bw); - cabinet.lat = surf_parse_get_double(A_surfxml_cabinet_lat); + cabinet.power = surf_parse_get_power(A_surfxml_cabinet_power); + cabinet.bw = surf_parse_get_bandwidth(A_surfxml_cabinet_bw); + cabinet.lat = surf_parse_get_time(A_surfxml_cabinet_lat); cabinet.radical = A_surfxml_cabinet_radical; sg_platf_new_cabinet(&cabinet); @@ -407,10 +517,10 @@ void STag_surfxml_peer(void){ s_sg_platf_peer_cbarg_t peer; memset(&peer,0,sizeof(peer)); peer.id = A_surfxml_peer_id; - peer.power = surf_parse_get_double(A_surfxml_peer_power); - peer.bw_in = surf_parse_get_double(A_surfxml_peer_bw___in); - peer.bw_out = surf_parse_get_double(A_surfxml_peer_bw___out); - peer.lat = surf_parse_get_double(A_surfxml_peer_lat); + peer.power = surf_parse_get_power(A_surfxml_peer_power); + peer.bw_in = surf_parse_get_bandwidth(A_surfxml_peer_bw___in); + peer.bw_out = surf_parse_get_bandwidth(A_surfxml_peer_bw___out); + peer.lat = surf_parse_get_time(A_surfxml_peer_lat); peer.coord = A_surfxml_peer_coordinates; peer.availability_trace = tmgr_trace_new_from_file(A_surfxml_peer_availability___file); peer.state_trace = tmgr_trace_new_from_file(A_surfxml_peer_state___file); @@ -430,9 +540,11 @@ void ETag_surfxml_link(void){ link.properties = current_property_set; link.id = A_surfxml_link_id; - link.bandwidth = surf_parse_get_double(A_surfxml_link_bandwidth); + link.bandwidth = surf_parse_get_bandwidth(A_surfxml_link_bandwidth); + //printf("Link bandwidth [%lg]\n", link.bandwidth); link.bandwidth_trace = tmgr_trace_new_from_file(A_surfxml_link_bandwidth___file); - link.latency = surf_parse_get_double(A_surfxml_link_latency); + link.latency = surf_parse_get_time(A_surfxml_link_latency); + //printf("Link latency [%lg]\n", link.latency); link.latency_trace = tmgr_trace_new_from_file(A_surfxml_link_latency___file); switch (A_surfxml_link_state) { @@ -496,8 +608,8 @@ void ETag_surfxml_backbone(void){ link.properties = NULL; link.id = A_surfxml_backbone_id; - link.bandwidth = surf_parse_get_double(A_surfxml_backbone_bandwidth); - link.latency = surf_parse_get_double(A_surfxml_backbone_latency); + link.bandwidth = surf_parse_get_bandwidth(A_surfxml_backbone_bandwidth); + link.latency = surf_parse_get_time(A_surfxml_backbone_latency); link.state = SURF_RESOURCE_ON; link.policy = SURF_LINK_SHARED; @@ -573,17 +685,8 @@ void ETag_surfxml_ASroute(void){ ASroute.src = A_surfxml_ASroute_src; ASroute.dst = A_surfxml_ASroute_dst; - if (!strcmp(current_routing->model_desc->name,"RuleBased")) { - // DIRTY PERL HACK AHEAD: with the rulebased routing, the {src,dst}_gateway fields - // store the provided name instead of the entity directly (model_rulebased_parse_ASroute knows) - // - // This is because the user will provide something like "^AS_(.*)$" instead of the proper name of a given entity - ASroute.gw_src = (sg_routing_edge_t) A_surfxml_ASroute_gw___src; - ASroute.gw_dst = (sg_routing_edge_t) A_surfxml_ASroute_gw___dst; - } else { - ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___src); - ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___dst); - } + ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___src); + ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___dst); ASroute.link_list = parsed_link_list; @@ -625,17 +728,8 @@ void ETag_surfxml_bypassASroute(void){ ASroute.link_list = parsed_link_list; ASroute.symmetrical = FALSE; - if (!strcmp(current_routing->model_desc->name,"RuleBased")) { - // DIRTY PERL HACK AHEAD: with the rulebased routing, the {src,dst}_gateway fields - // store the provided name instead of the entity directly (model_rulebased_parse_ASroute knows) - // - // This is because the user will provide something like "^AS_(.*)$" instead of the proper name of a given entity - ASroute.gw_src = (sg_routing_edge_t) A_surfxml_bypassASroute_gw___src; - ASroute.gw_dst = (sg_routing_edge_t) A_surfxml_bypassASroute_gw___dst; - } else { - ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_bypassASroute_gw___src); - ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_bypassASroute_gw___dst); - } + ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_bypassASroute_gw___src); + ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_bypassASroute_gw___dst); sg_platf_new_bypassASroute(&ASroute); parsed_link_list = NULL; @@ -802,7 +896,6 @@ void ETag_surfxml_trace___connect(void){} void STag_surfxml_trace(void){} void ETag_surfxml_router(void){} void ETag_surfxml_host___link(void){} -void ETag_surfxml_cluster(void){} void ETag_surfxml_cabinet(void){} void ETag_surfxml_peer(void){} void STag_surfxml_backbone(void){} @@ -890,7 +983,7 @@ double get_cpu_power(const char *power) power_scale = random_generate(random); } } else { - power_scale = surf_parse_get_double(power); + power_scale = surf_parse_get_power(power); } return power_scale; } diff --git a/src/surf/workstation.c b/src/surf/workstation.c index 1748f2b42f..dbaf9ae184 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -37,7 +37,6 @@ static void workstation_new(sg_platf_host_cbarg_t host) xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, ws); } - static void ws_parallel_action_cancel(surf_action_t action) { THROW_UNIMPLEMENTED; /* This model does not implement parallel tasks */ @@ -332,12 +331,23 @@ e_surf_resource_state_t ws_get_state(void *workstation) return cpu->model->extension.cpu.get_state(workstation); } +static void ws_set_state(void *workstation, e_surf_resource_state_t state) +{ + surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation)); + cpu->model->extension.cpu.set_state(workstation, state); +} + double ws_get_speed(void *workstation, double load) { surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation)); return cpu->model->extension.cpu.get_speed(workstation, load); } +static int ws_get_core(void *workstation) +{ + surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation)); + return cpu->model->extension.cpu.get_core(workstation); +} static double ws_get_available_speed(void *workstation) { surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation)); @@ -431,55 +441,72 @@ static storage_t find_storage_on_mount_list(void *workstation,const char* storag return st; } -static surf_action_t ws_action_open(void *workstation, const char* mount, const char* path, const char* mode) +static surf_action_t ws_action_open(void *workstation, const char* mount, + const char* path) { storage_t st = find_storage_on_mount_list(workstation, mount); XBT_DEBUG("OPEN on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; - return model->extension.storage.open(st, mount, path, mode); + return model->extension.storage.open(st, mount, path); } -static surf_action_t ws_action_close(void *workstation, surf_file_t fp) +static surf_action_t ws_action_close(void *workstation, surf_file_t fd) { - storage_t st = find_storage_on_mount_list(workstation, fp->storage); + storage_t st = find_storage_on_mount_list(workstation, fd->storage); XBT_DEBUG("CLOSE on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; - return model->extension.storage.close(st, fp); + return model->extension.storage.close(st, fd); } -static surf_action_t ws_action_read(void *workstation, void* ptr, size_t size, size_t nmemb, surf_file_t stream) +static surf_action_t ws_action_read(void *workstation, void* ptr, size_t size, + surf_file_t fd) { - storage_t st = find_storage_on_mount_list(workstation, stream->storage); + storage_t st = find_storage_on_mount_list(workstation, fd->storage); XBT_DEBUG("READ on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; - return model->extension.storage.read(st, ptr, (double)size, nmemb, stream); + return model->extension.storage.read(st, ptr, size, fd); } -static surf_action_t ws_action_write(void *workstation, const void* ptr, size_t size, size_t nmemb, surf_file_t stream) +static surf_action_t ws_action_write(void *workstation, const void* ptr, + size_t size, surf_file_t fd) { - storage_t st = find_storage_on_mount_list(workstation, stream->storage); + storage_t st = find_storage_on_mount_list(workstation, fd->storage); XBT_DEBUG("WRITE on disk '%s'",st->generic_resource.name); surf_model_t model = st->generic_resource.model; - return model->extension.storage.write(st, ptr, size, nmemb, stream); + return model->extension.storage.write(st, ptr, size, fd); } -static surf_action_t ws_action_stat(void *workstation, surf_file_t stream) +static int ws_file_unlink(void *workstation, surf_file_t fd) { - storage_t st = find_storage_on_mount_list(workstation, stream->storage); - XBT_DEBUG("STAT on disk '%s'",st->generic_resource.name); - surf_model_t model = st->generic_resource.model; - return model->extension.storage.stat(st, stream); -} + if (!fd){ + XBT_WARN("No such file descriptor. Impossible to unlink"); + return 0; + } else { +// XBT_INFO("%s %zu", fd->storage, fd->size); + storage_t st = find_storage_on_mount_list(workstation, fd->storage); + xbt_dict_t content_dict = (st)->content; + /* Check if the file is on this storage */ + if (!xbt_dict_get_or_null(content_dict, fd->name)){ + XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name, + st->generic_resource.name); + return 0; + } else { + XBT_DEBUG("UNLINK on disk '%s'",st->generic_resource.name); + st->used_size -= fd->size; -static surf_action_t ws_action_unlink(void *workstation, surf_file_t stream) -{ - storage_t st = find_storage_on_mount_list(workstation, stream->storage); - XBT_DEBUG("UNLINK on disk '%s'",st->generic_resource.name); - surf_model_t model = st->generic_resource.model; - return model->extension.storage.unlink(st, stream); + // Remove the file from storage + xbt_dict_remove(content_dict,fd->name); + + free(fd->name); + free(fd->storage); + xbt_free(fd); + return 1; + } + } } -static surf_action_t ws_action_ls(void *workstation, const char* mount, const char *path) +static surf_action_t ws_action_ls(void *workstation, const char* mount, + const char *path) { XBT_DEBUG("LS on mount '%s' and file '%s'",mount, path); storage_t st = find_storage_on_mount_list(workstation, mount); @@ -487,6 +514,11 @@ static surf_action_t ws_action_ls(void *workstation, const char* mount, const ch return model->extension.storage.ls(st, path); } +static size_t ws_file_get_size(void *workstation, surf_file_t fd) +{ + return fd->size; +} + void ws_get_params(void *ws, ws_params_t params) { workstation_CLM03_t ws_clm03 = surf_workstation_resource_priv(ws); @@ -565,8 +597,11 @@ static void surf_workstation_model_init_internal(void) model->extension.workstation.execute = ws_execute; model->extension.workstation.sleep = ws_action_sleep; model->extension.workstation.get_state = ws_get_state; + model->extension.workstation.set_state = ws_set_state; + model->extension.workstation.get_core = ws_get_core; model->extension.workstation.get_speed = ws_get_speed; - model->extension.workstation.get_available_speed = ws_get_available_speed; + model->extension.workstation.get_available_speed = + ws_get_available_speed; model->extension.workstation.communicate = ws_communicate; model->extension.workstation.get_route = ws_get_route; @@ -580,8 +615,7 @@ static void surf_workstation_model_init_internal(void) model->extension.workstation.close = ws_action_close; model->extension.workstation.read = ws_action_read; model->extension.workstation.write = ws_action_write; - model->extension.workstation.stat = ws_action_stat; - model->extension.workstation.unlink = ws_action_unlink; + model->extension.workstation.unlink = ws_file_unlink; model->extension.workstation.ls = ws_action_ls; model->extension.workstation.get_params = ws_get_params; @@ -593,7 +627,7 @@ static void surf_workstation_model_init_internal(void) void surf_workstation_model_init_current_default(void) { - xbt_cfg_setdefault_int(_sg_cfg_set, "network/crosstraffic", 1); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/crosstraffic", xbt_strdup("yes")); surf_cpu_model_init_Cas01(); surf_network_model_init_LegrandVelho(); diff --git a/src/xbt/automaton/parserPromela.tab.cacc b/src/xbt/automaton/parserPromela.tab.cacc index 0a13e384cc..56cc4b6895 100644 --- a/src/xbt/automaton/parserPromela.tab.cacc +++ b/src/xbt/automaton/parserPromela.tab.cacc @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 2.5. */ +/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.5" +#define YYBISON_VERSION "2.7.12-4996" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -58,8 +58,6 @@ /* Pull parsers. */ #define YYPULL 1 -/* Using locations. */ -#define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse xbt_automaton_parser_parse @@ -70,10 +68,8 @@ #define yydebug xbt_automaton_parser_debug #define yynerrs xbt_automaton_parser_nerrs - /* Copy the first part of user declarations. */ - -/* Line 268 of yacc.c */ +/* Line 371 of yacc.c */ #line 1 "parserPromela.yacc" @@ -83,14 +79,16 @@ void yyerror(const char *s); +/* Line 371 of yacc.c */ +#line 84 "parserPromela.tab.cacc" -/* Line 268 of yacc.c */ -#line 89 "parserPromela.tab.cacc" - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif +# ifndef YY_NULL +# if defined __cplusplus && 201103L <= __cplusplus +# define YY_NULL nullptr +# else +# define YY_NULL 0 +# endif +# endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE @@ -100,11 +98,17 @@ void yyerror(const char *s); # define YYERROR_VERBOSE 0 #endif -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 +/* In a future release of Bison, this section will be replaced + by #include "parserPromela.tab.hacc". */ +#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED +# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int xbt_automaton_parser_debug; #endif - /* Tokens. */ #ifndef YYTOKENTYPE @@ -136,12 +140,10 @@ void yyerror(const char *s); #endif - #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { - -/* Line 293 of yacc.c */ +/* Line 387 of yacc.c */ #line 10 "parserPromela.yacc" double real; @@ -150,21 +152,36 @@ typedef union YYSTYPE xbt_automaton_exp_label_t label; - -/* Line 293 of yacc.c */ -#line 156 "parserPromela.tab.cacc" +/* Line 387 of yacc.c */ +#line 157 "parserPromela.tab.cacc" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif +extern YYSTYPE xbt_automaton_parser_lval; -/* Copy the second part of user declarations. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int xbt_automaton_parser_parse (void *YYPARSE_PARAM); +#else +int xbt_automaton_parser_parse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int xbt_automaton_parser_parse (void); +#else +int xbt_automaton_parser_parse (); +#endif +#endif /* ! YYPARSE_PARAM */ +#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED */ -/* Line 343 of yacc.c */ -#line 168 "parserPromela.tab.cacc" +/* Copy the second part of user declarations. */ + +/* Line 390 of yacc.c */ +#line 185 "parserPromela.tab.cacc" #ifdef short # undef short @@ -217,24 +234,33 @@ typedef short int yytype_int16; # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ -# define YY_(msgid) msgid +# define YY_(Msgid) Msgid +# endif +#endif + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if (! defined __GNUC__ || __GNUC__ < 2 \ + || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) +# define __attribute__(Spec) /* empty */ # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) +# define YYUSE(E) ((void) (E)) #else -# define YYUSE(e) /* empty */ +# define YYUSE(E) /* empty */ #endif + /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint -# define YYID(n) (n) +# define YYID(N) (N) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) @@ -270,6 +296,7 @@ YYID (yyi) # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif @@ -361,20 +388,20 @@ union yyalloc #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from FROM to TO. The source and destination do +/* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) # else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ while (YYID (0)) # endif # endif @@ -461,7 +488,7 @@ static const yytype_uint8 yyrline[] = }; #endif -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +#if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = @@ -470,7 +497,7 @@ static const char *const yytname[] = "AND", "OR", "NOT", "LEFT_PAR", "RIGHT_PAR", "CASE", "COLON", "SEMI_COLON", "CASE_TRUE", "LEFT_BRACE", "RIGHT_BRACE", "LITT_ENT", "LITT_CHAINE", "LITT_REEL", "ID", "$accept", "automaton", "stateseq", - "$@1", "option", "exp", 0 + "$@1", "option", "exp", YY_NULL }; #endif @@ -544,10 +571,10 @@ static const yytype_uint8 yytable[] = 10, 11, 18, 31, 0, 26, 24, 30, 29 }; -#define yypact_value_is_default(yystate) \ - ((yystate) == (-16)) +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-16))) -#define yytable_value_is_error(yytable_value) \ +#define yytable_value_is_error(Yytable_value) \ YYID (0) static const yytype_int8 yycheck[] = @@ -594,62 +621,35 @@ static const yytype_uint8 yystos[] = #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) - +/* Error token number */ #define YYTERROR 1 #define YYERRCODE 256 -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - /* This macro is provided for backward compatibility. */ - #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif /* YYLEX -- calling `yylex' with the right arguments. */ - #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else @@ -699,6 +699,8 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep) YYSTYPE const * const yyvaluep; #endif { + FILE *yyo = yyoutput; + YYUSE (yyo); if (!yyvaluep) return; # ifdef YYPRINT @@ -707,11 +709,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep) # else YYUSE (yyoutput); # endif - switch (yytype) - { - default: - break; - } + YYUSE (yytype); } @@ -950,12 +948,11 @@ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); + YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ - const char *yyformat = 0; + const char *yyformat = YY_NULL; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per @@ -1015,11 +1012,13 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, break; } yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } } } } @@ -1039,10 +1038,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, # undef YYCASE_ } - yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } if (*yymsg_alloc < yysize) { @@ -1098,36 +1099,26 @@ yydestruct (yymsg, yytype, yyvaluep) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - switch (yytype) - { - - default: - break; - } + YYUSE (yytype); } -/* Prevent warnings from -Wmissing-prototypes. */ -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ /* The lookahead symbol. */ int yychar; + +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + /* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; +YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); /* Number of syntax errors so far. */ int yynerrs; @@ -1167,7 +1158,7 @@ yyparse () `yyss': related to states. `yyvs': related to semantic values. - Refer to the stacks thru separate pointers, to allow yyoverflow + Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ @@ -1185,7 +1176,7 @@ yyparse () int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ - int yytoken; + int yytoken = 0; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; @@ -1203,9 +1194,8 @@ yyparse () Keep to zero when no symbol should be popped. */ int yylen = 0; - yytoken = 0; - yyss = yyssa; - yyvs = yyvsa; + yyssp = yyss = yyssa; + yyvsp = yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); @@ -1214,14 +1204,6 @@ yyparse () yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - yyssp = yyss; - yyvsp = yyvs; - goto yysetstate; /*------------------------------------------------------------. @@ -1362,7 +1344,9 @@ yybackup: yychar = YYEMPTY; yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END goto yynewstate; @@ -1399,65 +1383,56 @@ yyreduce: switch (yyn) { case 4: - -/* Line 1806 of yacc.c */ +/* Line 1787 of yacc.c */ #line 51 "parserPromela.yacc" { new_state((yyvsp[(1) - (2)].string), 1);} break; case 7: - -/* Line 1806 of yacc.c */ +/* Line 1787 of yacc.c */ #line 55 "parserPromela.yacc" { new_transition((yyvsp[(5) - (6)].string), (yyvsp[(2) - (6)].label));} break; case 8: - -/* Line 1806 of yacc.c */ +/* Line 1787 of yacc.c */ #line 58 "parserPromela.yacc" { (yyval.label) = (yyvsp[(2) - (3)].label); } break; case 9: - -/* Line 1806 of yacc.c */ +/* Line 1787 of yacc.c */ #line 59 "parserPromela.yacc" { (yyval.label) = new_label(0, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); } break; case 10: - -/* Line 1806 of yacc.c */ +/* Line 1787 of yacc.c */ #line 60 "parserPromela.yacc" { (yyval.label) = new_label(1, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); } break; case 11: - -/* Line 1806 of yacc.c */ +/* Line 1787 of yacc.c */ #line 61 "parserPromela.yacc" { (yyval.label) = new_label(2, (yyvsp[(2) - (2)].label)); } break; case 12: - -/* Line 1806 of yacc.c */ +/* Line 1787 of yacc.c */ #line 62 "parserPromela.yacc" { (yyval.label) = new_label(4); } break; case 13: - -/* Line 1806 of yacc.c */ +/* Line 1787 of yacc.c */ #line 63 "parserPromela.yacc" { (yyval.label) = new_label(3, (yyvsp[(1) - (1)].string)); } break; - -/* Line 1806 of yacc.c */ -#line 1461 "parserPromela.tab.cacc" +/* Line 1787 of yacc.c */ +#line 1436 "parserPromela.tab.cacc" default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -1620,7 +1595,9 @@ yyerrlab1: YY_STACK_PRINT (yyss, yyssp); } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ @@ -1644,7 +1621,7 @@ yyabortlab: yyresult = 1; goto yyreturn; -#if !defined(yyoverflow) || YYERROR_VERBOSE +#if !defined yyoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ @@ -1686,8 +1663,7 @@ yyreturn: } - -/* Line 2067 of yacc.c */ +/* Line 2050 of yacc.c */ #line 66 "parserPromela.yacc" @@ -1699,4 +1675,3 @@ void yyerror(const char *s){ - diff --git a/src/xbt/automaton/parserPromela.tab.hacc b/src/xbt/automaton/parserPromela.tab.hacc index 676dd599a4..483349a029 100644 --- a/src/xbt/automaton/parserPromela.tab.hacc +++ b/src/xbt/automaton/parserPromela.tab.hacc @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 2.5. */ +/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,15 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ +#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED +# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int xbt_automaton_parser_debug; +#endif /* Tokens. */ #ifndef YYTOKENTYPE @@ -61,12 +70,10 @@ #endif - #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { - -/* Line 2068 of yacc.c */ +/* Line 2053 of yacc.c */ #line 10 "parserPromela.yacc" double real; @@ -75,9 +82,8 @@ typedef union YYSTYPE xbt_automaton_exp_label_t label; - -/* Line 2068 of yacc.c */ -#line 81 "parserPromela.tab.hacc" +/* Line 2053 of yacc.c */ +#line 87 "parserPromela.tab.hacc" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -86,4 +92,18 @@ typedef union YYSTYPE extern YYSTYPE xbt_automaton_parser_lval; +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int xbt_automaton_parser_parse (void *YYPARSE_PARAM); +#else +int xbt_automaton_parser_parse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int xbt_automaton_parser_parse (void); +#else +int xbt_automaton_parser_parse (); +#endif +#endif /* ! YYPARSE_PARAM */ +#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED */ diff --git a/src/xbt/config.c b/src/xbt/config.c index 41abae5762..2eee32a906 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -45,7 +45,15 @@ typedef struct { } s_xbt_cfgelm_t, *xbt_cfgelm_t; static const char *xbt_cfgelm_type_name[xbt_cfgelm_type_count] = - { "int", "double", "string", "peer", "any" }; + { "int", "double", "string", "boolean", "peer", "any" }; + +const struct xbt_boolean_couple xbt_cfgelm_boolean_values[] = { + { "yes", "no"}, + { "on", "off"}, + {"true", "false"}, + { "1", "0"}, + { NULL, NULL} +}; /* Internal stuff used in cache to free a variable */ static void xbt_cfgelm_free(void *data); @@ -154,6 +162,13 @@ void xbt_cfg_dump(const char *name, const char *indent, xbt_cfg_t cfg) } break; + case xbt_cfgelm_boolean: + for (i = 0; i < size; i++) { + ival = xbt_dynar_get_as(variable->content, i, int); + printf("%s %d\n", indent, ival); + } + break; + case xbt_cfgelm_peer: for (i = 0; i < size; i++) { hval = xbt_dynar_get_as(variable->content, i, xbt_peer_t); @@ -253,6 +268,12 @@ xbt_cfg_register(xbt_cfg_t * cfg, xbt_dynar_push(res->content, default_value); break; + case xbt_cfgelm_boolean: + res->content = xbt_dynar_new(sizeof(int), NULL); + if (default_value) + xbt_dynar_push(res->content, default_value); + break; + case xbt_cfgelm_peer: res->content = xbt_dynar_new(sizeof(xbt_peer_t), xbt_peer_free_voidp); if (default_value) @@ -391,6 +412,10 @@ void xbt_cfg_help(xbt_cfg_t cfg) printf("'%s'%s", xbt_dynar_get_as(variable->content, i, char *), sep); break; + case xbt_cfgelm_boolean: + printf("'%d'%s", xbt_dynar_get_as(variable->content, i, int), sep); + break; + case xbt_cfgelm_peer: { xbt_peer_t hval = xbt_dynar_get_as(variable->content, i, xbt_peer_t); printf("%s:%d%s", hval->name, hval->port, sep); @@ -537,6 +562,11 @@ void xbt_cfg_set_vargs(xbt_cfg_t cfg, const char *name, va_list pa) xbt_cfg_set_double(cfg, name, d); break; + case xbt_cfgelm_boolean: + str = va_arg(pa, char *); + xbt_cfg_set_boolean(cfg, name, str); + break; + default: xbt_die("Config element variable %s not valid (type=%d)", name, (int)type); } @@ -684,7 +714,7 @@ void *xbt_cfg_set_as_string(xbt_cfg_t cfg, const char *key, const char *value) { case xbt_cfgelm_int: i = strtol(value, &ret, 0); - if (value == NULL) { + if (ret == value) { xbt_die("Value of option %s not valid. Should be an integer", key); } @@ -693,13 +723,17 @@ void *xbt_cfg_set_as_string(xbt_cfg_t cfg, const char *key, const char *value) { case xbt_cfgelm_double: d = strtod(value, &ret); - if (value == NULL) { + if (ret == value) { xbt_die("Value of option %s not valid. Should be a double", key); } xbt_cfg_set_double(cfg, key, d); /* throws */ break; + case xbt_cfgelm_boolean: + xbt_cfg_set_boolean(cfg, key, value); /* throws */ + break; + case xbt_cfgelm_peer: val = xbt_strdup(value); str = val; @@ -710,7 +744,7 @@ void *xbt_cfg_set_as_string(xbt_cfg_t cfg, const char *key, const char *value) { *(val++) = '\0'; i = strtol(val, &ret, 0); - if (val == NULL) { + if (ret == val) { xbt_die("Value of option %s not valid. Should be an peer (machine:port)", key); } @@ -784,6 +818,26 @@ void xbt_cfg_setdefault_string(xbt_cfg_t cfg, const char *name, name, val); } + +/** @brief Set an boolean value to \a name within \a cfg if it wasn't changed yet + * + * This is useful to change the default value of a variable while allowing + * users to override it with command line arguments + */ +void xbt_cfg_setdefault_boolean(xbt_cfg_t cfg, const char *name, const char *val) +{ + xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_boolean); + + if (variable->isdefault){ + xbt_cfg_set_boolean(cfg, name, val); + variable->isdefault = 1; + } + else + XBT_DEBUG + ("Do not override configuration variable '%s' with value '%s' because it was already set.", + name, val); +} + /** @brief Set a peer value to \a name within \a cfg if it wasn't changed yet * * This is useful to change the default value of a variable while allowing @@ -917,6 +971,55 @@ void xbt_cfg_set_string(xbt_cfg_t cfg, const char *name, const char *val) variable->isdefault = 0; } +/** @brief Set or add a boolean value to \a name within \a cfg + * + * \arg cfg the config set + * \arg name the name of the variable + * \arg val the value of the variable + */ +void xbt_cfg_set_boolean(xbt_cfg_t cfg, const char *name, const char *val) +{ + xbt_cfgelm_t variable; + int i, bval; + + XBT_VERB("Configuration setting: %s=%s", name, val); + variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_boolean); + + for (i = 0; xbt_cfgelm_boolean_values[i].true_val != NULL; i++) { + if (strcmp(val, xbt_cfgelm_boolean_values[i].true_val) == 0){ + bval = 1; + break; + } + if (strcmp(val, xbt_cfgelm_boolean_values[i].false_val) == 0){ + bval = 0; + break; + } + } + if (xbt_cfgelm_boolean_values[i].true_val == NULL) { + xbt_die("Value of option '%s' not valid. Should be a boolean (yes,no,on,off,true,false,0,1)", val); + } + + if (variable->max == 1) { + if (variable->cb_rm && !xbt_dynar_is_empty(variable->content)) + variable->cb_rm(name, 0); + + xbt_dynar_set(variable->content, 0, &bval); + } else { + if (variable->max + && xbt_dynar_length(variable->content) == + (unsigned long) variable->max) + THROWF(mismatch_error, 0, + "Cannot add value %s to the config element %s since it's already full (size=%d)", + val, name, variable->max); + + xbt_dynar_push(variable->content, &bval); + } + + if (variable->cb_set) + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); + variable->isdefault = 0; +} + /** @brief Set or add an peer value to \a name within \a cfg * * \arg cfg the config set @@ -1061,6 +1164,40 @@ void xbt_cfg_rm_string(xbt_cfg_t cfg, const char *name, const char *val) val, name); } +/** @brief Remove the provided \e val boolean value from a variable + * + * \arg cfg the config set + * \arg name the name of the variable + * \arg val the value to be removed + */ +void xbt_cfg_rm_boolean(xbt_cfg_t cfg, const char *name, int val) +{ + + xbt_cfgelm_t variable; + unsigned int cpt; + int seen; + + variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_boolean); + + if (xbt_dynar_length(variable->content) == variable->min) + THROWF(mismatch_error, 0, + "Cannot remove value %d from the config element %s since it's already at its minimal size (=%d)", + val, name, variable->min); + + xbt_dynar_foreach(variable->content, cpt, seen) { + if (seen == val) { + if (variable->cb_rm) + variable->cb_rm(name, cpt); + xbt_dynar_cursor_rm(variable->content, &cpt); + return; + } + } + + THROWF(not_found_error, 0, + "Can't remove the value %d of config element %s: value not found.", + val, name); +} + /** @brief Remove the provided \e val peer value from a variable * * \arg cfg the config set @@ -1242,6 +1379,31 @@ char *xbt_cfg_get_string(xbt_cfg_t cfg, const char *name) return xbt_dynar_get_as(variable->content, 0, char *); } +/** @brief Retrieve a boolean value of a variable (get a warning if not uniq) + * + * \arg cfg the config set + * \arg name the name of the variable + * \arg val the wanted value + * + * Returns the first value from the config set under the given name. + * If there is more than one value, it will issue a warning. Consider using + * xbt_cfg_get_dynar() instead. + * + * \warning the returned value is the actual content of the config set + */ +int xbt_cfg_get_boolean(xbt_cfg_t cfg, const char *name) +{ + xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_boolean); + + if (xbt_dynar_length(variable->content) > 1) { + XBT_WARN + ("You asked for the first value of the config element '%s', but there is %lu values", + name, xbt_dynar_length(variable->content)); + } + + return xbt_dynar_get_as(variable->content, 0, int); +} + /** @brief Retrieve an peer value of a variable (get a warning if not uniq) * * \arg cfg the config set @@ -1331,6 +1493,14 @@ char *xbt_cfg_get_string_at(xbt_cfg_t cfg, const char *name, int pos) return xbt_dynar_get_as(variable->content, pos, char *); } +/** @brief Retrieve one of the boolean value of a variable */ +int xbt_cfg_get_boolean_at(xbt_cfg_t cfg, const char *name, int pos) +{ + + xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_boolean); + return xbt_dynar_get_as(variable->content, pos, int); +} + /** @brief Retrieve one of the peer value of a variable */ void xbt_cfg_get_peer_at(xbt_cfg_t cfg, const char *name, int pos, diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index 6924f0bd89..b29a851b9b 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -34,16 +34,6 @@ static XBT_INLINE void _check_inbound_idx(xbt_dynar_t dynar, int idx) } } -static XBT_INLINE void _check_sloppy_inbound_idx(xbt_dynar_t dynar, - int idx) -{ - if (idx > dynar->used) { - THROWF(bound_error, idx, - "dynar is not that long. You asked %d, but it's only %lu long (could have been equal to it)", - (int) (idx), (unsigned long) dynar->used); - } -} - static XBT_INLINE void _check_populated_dynar(xbt_dynar_t dynar) { if (dynar->used == 0) { diff --git a/src/xbt/graph.c b/src/xbt/graph.c index 2c6603b621..05e32c271d 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -724,7 +724,7 @@ void xbt_graph_export_graphxml(xbt_graph_t g, const char *filename, fprintf(file, "label=\"%s\" ", name); if ((node_data_print) && ((name = node_data_print(node->data)))) fprintf(file, "data=\"%s\" ", name); - fprintf(file, ">\n"); + fprintf(file, "/>\n"); } xbt_dynar_foreach(g->edges, cursor, edge) { fprintf(file, " length); if ((edge_data_print) && ((name = edge_data_print(edge->data)))) fprintf(file, "data=\"%s\" ", name); - fprintf(file, ">\n"); + fprintf(file, "/>\n"); } fprintf(file, "\n"); fclose(file); diff --git a/src/xbt/log.c b/src/xbt/log.c index a0897143ee..c560de6d9f 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -24,7 +24,6 @@ #include "xbt/dynar.h" #include "xbt/xbt_os_thread.h" -XBT_PUBLIC_DATA(int) (*xbt_pid) (); int xbt_log_no_loc = 0; /* if set to true (with --log=no_loc), file localization will be omitted (for tesh tests) */ static xbt_os_rmutex_t log_cat_init_mutex = NULL; @@ -256,7 +255,7 @@ XBT_LOG_NEW_CATEGORY(VSS); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(SA, VSS); int main() { - / * Now set the parent's priority. (the string would typcially be a runtime option) * / + / * Now set the parent's priority. (the string would typically be a runtime option) * / xbt_log_control_set("SA.thresh:3"); / * This request is enabled, because WARNING >= INFO. * / @@ -288,12 +287,29 @@ checks and deals properly with such arguments. The most common setting is to control which logging event will get displayed by setting a threshold to each category through the -thres keyword. +threshold keyword. -For example, \verbatim --log=root.thres:debug\endverbatim will make +For example, \verbatim --log=root.threshold:debug\endverbatim will make SimGrid extremely verbose while \verbatim --log=root.thres:critical\endverbatim should shut it almost -completely off. The full list of recognized thresholds is the following: +completely off. + +Note that the threshold keyword can be abbreviated here. For example, +all the following notations have the same result. +\verbatim +--log=root.threshold:debug +--log=root.threshol:debug +--log=root.thresho:debug +--log=root.thresh:debug +--log=root.thres:debug +--log=root.thre:debug +--log=root.thr:debug +--log=root.th:debug +--log=root.t:debug +--log=root.:debug <--- That's obviously really ugly, but it actually works. +\endverbatim + +The full list of recognized thresholds is the following: - trace: enter and return of some functions - debug: crufty output @@ -553,7 +569,6 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(xbt_mallocator); XBT_LOG_CONNECT(xbt_matrix); XBT_LOG_CONNECT(xbt_parmap); - XBT_LOG_CONNECT(xbt_parmap_unit); XBT_LOG_CONNECT(xbt_queue); XBT_LOG_CONNECT(xbt_set); XBT_LOG_CONNECT(xbt_sync); @@ -582,6 +597,7 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(instr_config); XBT_LOG_CONNECT(instr_msg); XBT_LOG_CONNECT(instr_msg_process); + XBT_LOG_CONNECT(instr_msg_vm); XBT_LOG_CONNECT(instr_paje_containers); XBT_LOG_CONNECT(instr_paje_header); XBT_LOG_CONNECT(instr_paje_trace); @@ -589,6 +605,7 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(instr_paje_values); XBT_LOG_CONNECT(instr_resource); XBT_LOG_CONNECT(instr_routing); + XBT_LOG_CONNECT(instr_sd); XBT_LOG_CONNECT(instr_surf); #endif @@ -621,6 +638,7 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(msg_mailbox); XBT_LOG_CONNECT(msg_new_API); XBT_LOG_CONNECT(msg_process); + XBT_LOG_CONNECT(msg_synchro); XBT_LOG_CONNECT(msg_task); XBT_LOG_CONNECT(msg_vm); @@ -683,7 +701,6 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(surf_route_floyd); XBT_LOG_CONNECT(surf_route_full); XBT_LOG_CONNECT(surf_route_none); - XBT_LOG_CONNECT(surf_route_rulebased); XBT_LOG_CONNECT(surf_route_vivaldi); XBT_LOG_CONNECT(surf_storage); XBT_LOG_CONNECT(surf_trace); @@ -1065,7 +1082,7 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string) xbt_assert(*dot == '.' && (*eq == '=' || *eq == ':'), "Invalid control string '%s'", control_string); - if (!strncmp(dot + 1, "thresh", (size_t) (eq - dot - 1))) { + if (!strncmp(dot + 1, "threshold", (size_t) (eq - dot - 1))) { int i; char *neweq = xbt_strdup(eq + 1); char *p = neweq - 1; diff --git a/src/xbt/mmalloc/mm_diff.c b/src/xbt/mmalloc/mm_diff.c index b80543e668..adf6b2e780 100644 --- a/src/xbt/mmalloc/mm_diff.c +++ b/src/xbt/mmalloc/mm_diff.c @@ -269,9 +269,10 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){ } if(!equal){ - XBT_DEBUG("Block %zu not found (size_used = %zu, addr = %p)", i1, heapinfo1[i1].busy_block.busy_size, addr_block1); + /*XBT_DEBUG("Block %zu not found (size_used = %zu, addr = %p)", i1, heapinfo1[i1].busy_block.busy_size, addr_block1); i1 = heaplimit + 1; - nb_diff1++; + nb_diff1++;*/ + i1++; } }else{ /* Fragmented block */ @@ -345,13 +346,13 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){ } - if(heapinfo1[i1].busy_frag.equal_to[j1] == NULL){ - XBT_DEBUG("Block %zu, fragment %zu not found (size_used = %zd, address = %p, ignore %d)", i1, j1, heapinfo1[i1].busy_frag.frag_size[j1], addr_frag1, heapinfo1[i1].busy_frag.ignore[j1]); + /*if(heapinfo1[i1].busy_frag.equal_to[j1] == NULL){ + fprintf(stderr,"Block %zu, fragment %zu not found (size_used = %zd, address = %p, ignore %d)\n", i1, j1, heapinfo1[i1].busy_frag.frag_size[j1], addr_frag1, heapinfo1[i1].busy_frag.ignore[j1]); i2 = heaplimit + 1; i1 = heaplimit + 1; nb_diff1++; break; - } + }*/ } diff --git a/src/xbt/parmap.c b/src/xbt/parmap.c index 6e0a7286ac..c7592a044a 100644 --- a/src/xbt/parmap.c +++ b/src/xbt/parmap.c @@ -21,9 +21,9 @@ #include "xbt/dynar.h" #include "xbt/xbt_os_thread.h" #include "xbt/sysdep.h" +#include "simix/smx_private.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_parmap, xbt, "parmap: parallel map"); -XBT_LOG_NEW_SUBCATEGORY(xbt_parmap_unit, xbt_parmap, "parmap unit testing"); typedef enum { XBT_PARMAP_WORK, @@ -53,6 +53,7 @@ static void xbt_parmap_busy_worker_signal(xbt_parmap_t parmap); static void xbt_parmap_busy_master_signal(xbt_parmap_t parmap); static void xbt_parmap_busy_worker_wait(xbt_parmap_t parmap, unsigned round); + /** * \brief Parallel map structure */ @@ -80,6 +81,16 @@ typedef struct s_xbt_parmap { void (*worker_wait_f)(xbt_parmap_t, unsigned); /**< waits for more work */ } s_xbt_parmap_t; +/** + * \brief Thread data transmission structure + */ +typedef struct s_xbt_parmap_thread_data{ + xbt_parmap_t parmap; + int worker_id; +} s_xbt_parmap_thread_data_t; + +typedef s_xbt_parmap_thread_data_t *xbt_parmap_thread_data_t; + /** * \brief Creates a parallel map object * \param num_workers number of worker threads to create @@ -101,8 +112,12 @@ xbt_parmap_t xbt_parmap_new(unsigned int num_workers, e_xbt_parmap_mode_t mode) xbt_parmap_set_mode(parmap, mode); /* Create the pool of worker threads */ + xbt_parmap_thread_data_t data; for (i = 1; i < num_workers; i++) { - worker = xbt_os_thread_create(NULL, xbt_parmap_worker_main, parmap, NULL); + data = xbt_new0(s_xbt_parmap_thread_data_t, 1); + data->parmap = parmap; + data->worker_id = i; + worker = xbt_os_thread_create(NULL, xbt_parmap_worker_main, data, NULL); xbt_os_thread_detach(worker); } return parmap; @@ -243,8 +258,11 @@ static void xbt_parmap_work(xbt_parmap_t parmap) */ static void *xbt_parmap_worker_main(void *arg) { - xbt_parmap_t parmap = (xbt_parmap_t) arg; + xbt_parmap_thread_data_t data = (xbt_parmap_thread_data_t) arg; + xbt_parmap_t parmap = data->parmap; unsigned round = 0; + smx_context_t context = SIMIX_context_new(NULL, 0, NULL, NULL, NULL); + SIMIX_context_set_current(context); XBT_DEBUG("New worker thread created"); @@ -253,15 +271,16 @@ static void *xbt_parmap_worker_main(void *arg) parmap->worker_wait_f(parmap, ++round); if (parmap->status == XBT_PARMAP_WORK) { - XBT_DEBUG("Worker got a job"); + XBT_DEBUG("Worker %d got a job", data->worker_id); xbt_parmap_work(parmap); parmap->worker_signal_f(parmap); - XBT_DEBUG("Worker has finished"); + XBT_DEBUG("Worker %d has finished", data->worker_id); /* We are destroying the parmap */ } else { + xbt_free(data); parmap->worker_signal_f(parmap); return NULL; } @@ -478,152 +497,3 @@ static void xbt_parmap_busy_worker_wait(xbt_parmap_t parmap, unsigned round) xbt_os_thread_yield(); } } - -#ifdef SIMGRID_TEST -#include "xbt.h" -#include "xbt/ex.h" -#include "xbt/xbt_os_thread.h" -#include "xbt/xbt_os_time.h" -#include "internal_config.h" /* HAVE_FUTEX_H */ - -XBT_TEST_SUITE("parmap", "Parallel Map"); -XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_parmap_unit); - -#ifdef HAVE_FUTEX_H -#define TEST_PARMAP_SKIP_TEST(mode) 0 -#else -#define TEST_PARMAP_SKIP_TEST(mode) ((mode) == XBT_PARMAP_FUTEX) -#endif - -#define TEST_PARMAP_VALIDATE_MODE(mode) \ - if (TEST_PARMAP_SKIP_TEST(mode)) { xbt_test_skip(); return; } else ((void)0) - -static void fun_double(void *arg) -{ - unsigned *u = arg; - *u = 2 * *u + 1; -} - -/* Check that the computations are correctly done. */ -static void test_parmap_basic(e_xbt_parmap_mode_t mode) -{ - unsigned num_workers; - - for (num_workers = 1 ; num_workers <= 16 ; num_workers *= 2) { - const unsigned len = 1033; - const unsigned num = 5; - unsigned *a; - xbt_dynar_t data; - xbt_parmap_t parmap; - unsigned i; - - xbt_test_add("Basic parmap usage (%u workers)", num_workers); - - TEST_PARMAP_VALIDATE_MODE(mode); - parmap = xbt_parmap_new(num_workers, mode); - - a = xbt_malloc(len * sizeof *a); - data = xbt_dynar_new(sizeof a, NULL); - for (i = 0; i < len; i++) { - a[i] = i; - xbt_dynar_push_as(data, void *, &a[i]); - } - - for (i = 0; i < num; i++) - xbt_parmap_apply(parmap, fun_double, data); - - for (i = 0; i < len; i++) { - unsigned expected = (1U << num) * (i + 1) - 1; - xbt_test_assert(a[i] == expected, - "a[%u]: expected %u, got %u", i, expected, a[i]); - } - - xbt_dynar_free(&data); - xbt_free(a); - xbt_parmap_destroy(parmap); - } -} - -XBT_TEST_UNIT("basic_posix", test_parmap_basic_posix, "Basic usage: posix") -{ - test_parmap_basic(XBT_PARMAP_POSIX); -} - -XBT_TEST_UNIT("basic_futex", test_parmap_basic_futex, "Basic usage: futex") -{ - test_parmap_basic(XBT_PARMAP_FUTEX); -} - -XBT_TEST_UNIT("basic_busy_wait", test_parmap_basic_busy_wait, "Basic usage: busy_wait") -{ - test_parmap_basic(XBT_PARMAP_BUSY_WAIT); -} - -static void fun_get_id(void *arg) -{ - *(uintptr_t *)arg = (uintptr_t)xbt_os_thread_self(); - xbt_os_sleep(0.5); -} - -static int fun_compare(const void *pa, const void *pb) -{ - uintptr_t a = *(uintptr_t *)pa; - uintptr_t b = *(uintptr_t *)pb; - return a < b ? -1 : a > b ? 1 : 0; -} - -/* Check that all threads are working. */ -static void test_parmap_extended(e_xbt_parmap_mode_t mode) -{ - unsigned num_workers; - - for (num_workers = 1 ; num_workers <= 16 ; num_workers *= 2) { - const unsigned len = 2 * num_workers; - uintptr_t *a; - xbt_parmap_t parmap; - xbt_dynar_t data; - unsigned i; - unsigned count; - - xbt_test_add("Extended parmap usage (%u workers)", num_workers); - - TEST_PARMAP_VALIDATE_MODE(mode); - parmap = xbt_parmap_new(num_workers, mode); - - a = xbt_malloc(len * sizeof *a); - data = xbt_dynar_new(sizeof a, NULL); - for (i = 0; i < len; i++) - xbt_dynar_push_as(data, void *, &a[i]); - - xbt_parmap_apply(parmap, fun_get_id, data); - - qsort(a, len, sizeof a[0], fun_compare); - count = 1; - for (i = 1; i < len; i++) - if (a[i] != a[i - 1]) - count++; - xbt_test_assert(count == num_workers, - "only %u/%u threads did some work", count, num_workers); - - xbt_dynar_free(&data); - xbt_free(a); - xbt_parmap_destroy(parmap); - } -} - -XBT_TEST_UNIT("extended_posix", test_parmap_extended_posix, "Extended usage: posix") -{ - test_parmap_extended(XBT_PARMAP_POSIX); -} - -XBT_TEST_UNIT("extended_futex", test_parmap_extended_futex, "Extended usage: futex") -{ - test_parmap_extended(XBT_PARMAP_FUTEX); -} - -XBT_TEST_UNIT("extended_busy_wait", test_parmap_extended_busy_wait, "Extended usage: busy_wait") -{ - test_parmap_extended(XBT_PARMAP_BUSY_WAIT); -} - -#endif /* SIMGRID_TEST */ diff --git a/src/xbt/xbt_os_time.c b/src/xbt/xbt_os_time.c index 9788f9f343..4e0f331857 100644 --- a/src/xbt/xbt_os_time.c +++ b/src/xbt/xbt_os_time.c @@ -109,65 +109,294 @@ void xbt_os_timer_free(xbt_os_timer_t timer) free(timer); } -void xbt_os_timer_resume(xbt_os_timer_t timer) +double xbt_os_timer_elapsed(xbt_os_timer_t timer) { #ifdef HAVE_POSIX_GETTIME - timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; - - timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec; - clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->start)); -#elif defined(HAVE_GETTIMEOFDAY) - timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; - - timer->elapse.tv_usec += timer->stop.tv_usec - timer->start.tv_usec; - gettimeofday(&(timer->start), NULL); + return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec) + + ((double) timer->elapse.tv_sec ) + + ((((double) timer->stop.tv_nsec) - + ((double) timer->start.tv_nsec) + ((double) timer->elapse.tv_nsec )) / 1e9); +#elif defined(HAVE_GETTIMEOFDAY) || defined(_XBT_WIN32) + return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec) + + ((double) timer->elapse.tv_sec ) + + ((((double) timer->stop.tv_usec) - + ((double) timer->start.tv_usec) + ((double) timer->elapse.tv_usec )) / 1000000.0); #else - timer->elapse = timer->stop - timer->start; - timer->start = (unsigned long int) (time(NULL)); + return (double) timer->stop - (double) timer->start + (double) + timer->elapse; #endif } -void xbt_os_timer_start(xbt_os_timer_t timer) +void xbt_os_walltimer_start(xbt_os_timer_t timer) { #ifdef HAVE_POSIX_GETTIME timer->elapse.tv_sec = 0; timer->elapse.tv_nsec = 0; - clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->start)); + clock_gettime(CLOCK_REALTIME, &(timer->start)); #elif defined(HAVE_GETTIMEOFDAY) timer->elapse.tv_sec = 0; timer->elapse.tv_usec = 0; gettimeofday(&(timer->start), NULL); +#elif defined(_XBT_WIN32) + timer->elapse.tv_sec = 0; + timer->elapse.tv_usec = 0; +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + struct _timeb tm; + + _ftime(&tm); + + timer->start.tv_sec = tm.time; + timer->start.tv_usec = tm.millitm * 1000; + +# else + FILETIME ft; + unsigned __int64 tm; + + GetSystemTimeAsFileTime(&ft); + tm = (unsigned __int64) ft.dwHighDateTime << 32; + tm |= ft.dwLowDateTime; + tm /= 10; + tm -= 11644473600000000ULL; + + timer->start.tv_sec = (long) (tm / 1000000L); + timer->start.tv_usec = (long) (tm % 1000000L); +# endif /* windows version checker */ #else timer->elapse = 0; timer->start = (unsigned long int) (time(NULL)); #endif } -void xbt_os_timer_stop(xbt_os_timer_t timer) +void xbt_os_walltimer_resume(xbt_os_timer_t timer) { #ifdef HAVE_POSIX_GETTIME - clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->stop)); + timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; + + timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec; + clock_gettime(CLOCK_REALTIME, &(timer->start)); #elif defined(HAVE_GETTIMEOFDAY) - gettimeofday(&(timer->stop), NULL); + timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; + timer->elapse.tv_usec += timer->stop.tv_usec - timer->start.tv_usec; + gettimeofday(&(timer->start), NULL); +#elif defined(_XBT_WIN32) + timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; + timer->elapse.tv_usec += timer->stop.tv_usec - timer->start.tv_usec; +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + struct _timeb tm; + + _ftime(&tm); + + timer->start.tv_sec = tm.time; + timer->start.tv_usec = tm.millitm * 1000; + +# else + FILETIME ft; + unsigned __int64 tm; + + GetSystemTimeAsFileTime(&ft); + tm = (unsigned __int64) ft.dwHighDateTime << 32; + tm |= ft.dwLowDateTime; + tm /= 10; + tm -= 11644473600000000ULL; + + timer->start.tv_sec = (long) (tm / 1000000L); + timer->start.tv_usec = (long) (tm % 1000000L); +# endif #else - timer->stop = (unsigned long int) (time(NULL)); + timer->elapse = timer->stop - timer->start; + timer->start = (unsigned long int) (time(NULL)); #endif } -double xbt_os_timer_elapsed(xbt_os_timer_t timer) +void xbt_os_walltimer_stop(xbt_os_timer_t timer) { #ifdef HAVE_POSIX_GETTIME - return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec) + - ((double) timer->elapse.tv_sec ) + - ((((double) timer->stop.tv_nsec) - - ((double) timer->start.tv_nsec) + ((double) timer->elapse.tv_nsec )) / 1e9); + clock_gettime(CLOCK_REALTIME, &(timer->stop)); #elif defined(HAVE_GETTIMEOFDAY) - return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec) - + ((double) timer->elapse.tv_sec ) + - ((((double) timer->stop.tv_usec) - - ((double) timer->start.tv_usec) + ((double) timer->elapse.tv_usec )) / 1000000.0); + gettimeofday(&(timer->stop), NULL); +#elif defined(_XBT_WIN32) +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + struct _timeb tm; + + _ftime(&tm); + + timer->stop.tv_sec = tm.time; + timer->stop.tv_usec = tm.millitm * 1000; + +# else + FILETIME ft; + unsigned __int64 tm; + + GetSystemTimeAsFileTime(&ft); + tm = (unsigned __int64) ft.dwHighDateTime << 32; + tm |= ft.dwLowDateTime; + tm /= 10; + tm -= 11644473600000000ULL; + + timer->stop.tv_sec = (long) (tm / 1000000L); + timer->stop.tv_usec = (long) (tm % 1000000L); +# endif #else - return (double) timer->stop - (double) timer->start + (double) - timer->elapse; + timer->stop = (unsigned long int) (time(NULL)); +#endif +} + +void xbt_os_cputimer_start(xbt_os_timer_t timer) +{ +#ifdef HAVE_POSIX_GETTIME + timer->elapse.tv_sec = 0; + timer->elapse.tv_nsec = 0; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->start)); +#elif defined(_XBT_WIN32) + timer->elapse.tv_sec = 0; + timer->elapse.tv_nsec = 0; +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + THROW_UNIMPLEMENTED; +# else + HANDLE h = GetCurrentProcess(); + FILETIME creationTime, exitTime, kernelTime, userTime; + GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); + unsigned __int64 ktm, utm; + ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; + ktm |= kernelTime.dwLowDateTime; + ktm /= 10; + utm = (unsigned __int64) userTime.dwHighDateTime << 32; + utm |= userTime.dwLowDateTime; + utm /= 10; + timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); + timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); +# endif /* windows version checker */ +#endif +} + +void xbt_os_cputimer_resume(xbt_os_timer_t timer) +{ +#ifdef HAVE_POSIX_GETTIME + timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; + timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->start)); +#elif defined(_XBT_WIN32) + timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; + timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec; +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + THROW_UNIMPLEMENTED; +# else + HANDLE h = GetCurrentProcess(); + FILETIME creationTime, exitTime, kernelTime, userTime; + GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); + unsigned __int64 ktm, utm; + ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; + ktm |= kernelTime.dwLowDateTime; + ktm /= 10; + utm = (unsigned __int64) userTime.dwHighDateTime << 32; + utm |= userTime.dwLowDateTime; + utm /= 10; + timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); + timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); +# endif /* windows version checker */ + +#endif +} + +void xbt_os_cputimer_stop(xbt_os_timer_t timer) +{ +#ifdef HAVE_POSIX_GETTIME + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->stop)); +#elif defined(_XBT_WIN32) +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + THROW_UNIMPLEMENTED; +# else + HANDLE h = GetCurrentProcess(); + FILETIME creationTime, exitTime, kernelTime, userTime; + GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); + unsigned __int64 ktm, utm; + ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; + ktm |= kernelTime.dwLowDateTime; + ktm /= 10; + utm = (unsigned __int64) userTime.dwHighDateTime << 32; + utm |= userTime.dwLowDateTime; + utm /= 10; + timer->stop.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); + timer->stop.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); +# endif /* windows version checker */ +#endif +} + +void xbt_os_threadtimer_start(xbt_os_timer_t timer) +{ +#ifdef HAVE_POSIX_GETTIME + timer->elapse.tv_sec = 0; + timer->elapse.tv_nsec = 0; + clock_gettime(CLOCK_THREAD_CPUTIME_ID, &(timer->start)); +#elif defined(_XBT_WIN32) + struct timeval tv; +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + THROW_UNIMPLEMENTED; +# else + HANDLE h = GetCurrentThread(); + FILETIME creationTime, exitTime, kernelTime, userTime; + GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); + unsigned __int64 ktm, utm; + ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; + ktm |= kernelTime.dwLowDateTime; + ktm /= 10; + utm = (unsigned __int64) userTime.dwHighDateTime << 32; + utm |= userTime.dwLowDateTime; + utm /= 10; + timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); + timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); +# endif /* windows version checker */ +#endif +} + +void xbt_os_threadtimer_resume(xbt_os_timer_t timer) +{ +#ifdef HAVE_POSIX_GETTIME + timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; + timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec; + clock_gettime(CLOCK_THREAD_CPUTIME_ID, &(timer->start)); +#elif defined(_XBT_WIN32) + timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec; + timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec; +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + THROW_UNIMPLEMENTED; +# else + HANDLE h = GetCurrentThread(); + FILETIME creationTime, exitTime, kernelTime, userTime; + GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); + unsigned __int64 ktm, utm; + ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; + ktm |= kernelTime.dwLowDateTime; + ktm /= 10; + utm = (unsigned __int64) userTime.dwHighDateTime << 32; + utm |= userTime.dwLowDateTime; + utm /= 10; + timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); + timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); +# endif /* windows version checker */ +#endif +} + +void xbt_os_threadtimer_stop(xbt_os_timer_t timer) +{ +#ifdef HAVE_POSIX_GETTIME + clock_gettime(CLOCK_THREAD_CPUTIME_ID, &(timer->stop)); +#elif defined(_XBT_WIN32) +# if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400) + THROW_UNIMPLEMENTED; +# else + HANDLE h = GetCurrentThread(); + FILETIME creationTime, exitTime, kernelTime, userTime; + GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime); + unsigned __int64 ktm, utm; + ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32; + ktm |= kernelTime.dwLowDateTime; + ktm /= 10; + utm = (unsigned __int64) userTime.dwHighDateTime << 32; + utm |= userTime.dwLowDateTime; + utm /= 10; + timer->stop.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L); + timer->stop.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L); +# endif /* windows version checker */ #endif } diff --git a/teshsuite/msg/get_sender_p.xml b/teshsuite/msg/get_sender_p.xml index 90ab287708..05064f07c2 100644 --- a/teshsuite/msg/get_sender_p.xml +++ b/teshsuite/msg/get_sender_p.xml @@ -3,8 +3,8 @@ - - + + diff --git a/teshsuite/msg/pid_p.xml b/teshsuite/msg/pid_p.xml index f1d4756827..50cf472681 100644 --- a/teshsuite/msg/pid_p.xml +++ b/teshsuite/msg/pid_p.xml @@ -3,8 +3,8 @@ - - + + diff --git a/teshsuite/msg/trace/platform.xml b/teshsuite/msg/trace/platform.xml index 66961d0895..5e8b1d586a 100644 --- a/teshsuite/msg/trace/platform.xml +++ b/teshsuite/msg/trace/platform.xml @@ -2,6 +2,6 @@ - + diff --git a/teshsuite/msg/trace/platform_trace.xml b/teshsuite/msg/trace/platform_trace.xml index f5b61e12d8..5913d93eb7 100644 --- a/teshsuite/msg/trace/platform_trace.xml +++ b/teshsuite/msg/trace/platform_trace.xml @@ -13,7 +13,7 @@ 60 0.5 - + diff --git a/teshsuite/simdag/availability/simulacrum_7_hosts.xml b/teshsuite/simdag/availability/simulacrum_7_hosts.xml index 835e3127e8..2e664a5419 100644 --- a/teshsuite/simdag/availability/simulacrum_7_hosts.xml +++ b/teshsuite/simdag/availability/simulacrum_7_hosts.xml @@ -2,35 +2,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/teshsuite/simdag/basic_platform.xml b/teshsuite/simdag/basic_platform.xml index e43a89e198..b1aeab65a0 100644 --- a/teshsuite/simdag/basic_platform.xml +++ b/teshsuite/simdag/basic_platform.xml @@ -4,9 +4,9 @@ - - - + + + diff --git a/teshsuite/simdag/network/mxn/platform_4p_1switch.xml b/teshsuite/simdag/network/mxn/platform_4p_1switch.xml index c4f0d55704..d879f07ae8 100644 --- a/teshsuite/simdag/network/mxn/platform_4p_1switch.xml +++ b/teshsuite/simdag/network/mxn/platform_4p_1switch.xml @@ -4,16 +4,16 @@ - - - - + + + + - - - - - + + + + + diff --git a/teshsuite/simdag/network/p2p/platform_2p_1bb.xml b/teshsuite/simdag/network/p2p/platform_2p_1bb.xml index 6470a9d51a..c886e9654c 100644 --- a/teshsuite/simdag/network/p2p/platform_2p_1bb.xml +++ b/teshsuite/simdag/network/p2p/platform_2p_1bb.xml @@ -2,8 +2,8 @@ - - + + - + diff --git a/teshsuite/simdag/network/p2p/platform_2p_1fl.xml b/teshsuite/simdag/network/p2p/platform_2p_1fl.xml index 6599c719fe..acd0ebbc31 100644 --- a/teshsuite/simdag/network/p2p/platform_2p_1fl.xml +++ b/teshsuite/simdag/network/p2p/platform_2p_1fl.xml @@ -2,9 +2,9 @@ - - - + + + diff --git a/teshsuite/simdag/network/p2p/platform_2p_1sl.xml b/teshsuite/simdag/network/p2p/platform_2p_1sl.xml index 20f99a9cc0..90e6a84916 100644 --- a/teshsuite/simdag/network/p2p/platform_2p_1sl.xml +++ b/teshsuite/simdag/network/p2p/platform_2p_1sl.xml @@ -2,9 +2,9 @@ - - - + + + diff --git a/teshsuite/simdag/network/p2p/platform_2p_1switch.xml b/teshsuite/simdag/network/p2p/platform_2p_1switch.xml index b499f5caf8..4e1dccde4c 100644 --- a/teshsuite/simdag/network/p2p/platform_2p_1switch.xml +++ b/teshsuite/simdag/network/p2p/platform_2p_1switch.xml @@ -2,12 +2,12 @@ - - + + - - - + + + diff --git a/teshsuite/simdag/network/platform_2p_1sl.xml b/teshsuite/simdag/network/platform_2p_1sl.xml index e91239b54f..92cdc2edda 100644 --- a/teshsuite/simdag/network/platform_2p_1sl.xml +++ b/teshsuite/simdag/network/platform_2p_1sl.xml @@ -4,12 +4,12 @@ - - + + - + diff --git a/teshsuite/simdag/partask/platform_2p_1sl.xml b/teshsuite/simdag/partask/platform_2p_1sl.xml index fc0bde9228..e6d67a4190 100644 --- a/teshsuite/simdag/partask/platform_2p_1sl.xml +++ b/teshsuite/simdag/partask/platform_2p_1sl.xml @@ -4,9 +4,9 @@ - - - + + + diff --git a/teshsuite/simdag/partask/platform_2p_1sl_hetero.xml b/teshsuite/simdag/partask/platform_2p_1sl_hetero.xml index 185871ac02..5deb9ad909 100644 --- a/teshsuite/simdag/partask/platform_2p_1sl_hetero.xml +++ b/teshsuite/simdag/partask/platform_2p_1sl_hetero.xml @@ -3,10 +3,10 @@ - - + + - diff --git a/teshsuite/simdag/platforms/CMakeLists.txt b/teshsuite/simdag/platforms/CMakeLists.txt index 5c34236310..2db733ee87 100644 --- a/teshsuite/simdag/platforms/CMakeLists.txt +++ b/teshsuite/simdag/platforms/CMakeLists.txt @@ -75,7 +75,6 @@ set(xml_files ${CMAKE_CURRENT_SOURCE_DIR}/three_hosts_non_symmetric_route.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters_one_name.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters_router_id.xml - ${CMAKE_CURRENT_SOURCE_DIR}/Two_clusters_rulebased.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters_symmetric.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_asymetric_BOGUS2.xml diff --git a/teshsuite/simdag/platforms/Dijkstra.xml b/teshsuite/simdag/platforms/Dijkstra.xml index f66ad8baa5..4df752ef18 100644 --- a/teshsuite/simdag/platforms/Dijkstra.xml +++ b/teshsuite/simdag/platforms/Dijkstra.xml @@ -4,17 +4,17 @@ - - + + - - + + - - - + + + diff --git a/teshsuite/simdag/platforms/Evaluate_get_route_time.c b/teshsuite/simdag/platforms/Evaluate_get_route_time.c index 7fa2e1cd09..db7782c7f2 100644 --- a/teshsuite/simdag/platforms/Evaluate_get_route_time.c +++ b/teshsuite/simdag/platforms/Evaluate_get_route_time.c @@ -45,9 +45,9 @@ int main(int argc, char **argv) w2 = workstations[j]; printf("%d\tand\t%d\t\t",i,j); - xbt_os_timer_start(timer); + xbt_os_cputimer_start(timer); SD_route_get_list(w1, w2); - xbt_os_timer_stop(timer); + xbt_os_cputimer_stop(timer); printf("%lf\n", xbt_os_timer_elapsed(timer) ); diff --git a/teshsuite/simdag/platforms/Evaluate_parse_time.c b/teshsuite/simdag/platforms/Evaluate_parse_time.c index a710788aa3..09726fb6e7 100644 --- a/teshsuite/simdag/platforms/Evaluate_parse_time.c +++ b/teshsuite/simdag/platforms/Evaluate_parse_time.c @@ -22,9 +22,9 @@ int main(int argc, char **argv) SD_init(&argc, argv); /* creation of the environment, timed */ - xbt_os_timer_start(timer); + xbt_os_cputimer_start(timer); SD_create_environment(argv[1]); - xbt_os_timer_stop(timer); + xbt_os_cputimer_stop(timer); /* Display the result and exit after cleanup */ printf( "%lf\n", xbt_os_timer_elapsed(timer) ); diff --git a/teshsuite/simdag/platforms/Two_clusters_rulebased.xml b/teshsuite/simdag/platforms/Two_clusters_rulebased.xml deleted file mode 100644 index 7096f7592c..0000000000 --- a/teshsuite/simdag/platforms/Two_clusters_rulebased.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/teshsuite/simdag/platforms/basic_parsing_test.tesh b/teshsuite/simdag/platforms/basic_parsing_test.tesh index 32ab0211db..2d7dbcfa33 100644 --- a/teshsuite/simdag/platforms/basic_parsing_test.tesh +++ b/teshsuite/simdag/platforms/basic_parsing_test.tesh @@ -118,14 +118,3 @@ $ ${bindir:=.}/is_router_test ./test_of_is_router.xml > - Seen: "AS4" is type : 3 > - Seen: "AS" is type : 3 -$ ${bindir:=.}/basic_parsing_test ./Two_clusters_rulebased.xml ONE_LINK -> [0.000000] [surf_workstation/INFO] surf_workstation_model_init_ptask_L07 -> Workstation number: 4, link number: 12 -> Route between c-0.me and c-3.me -> Route size 5 -> Link my_cluster_1_link_0_UP: latency = 0.000050, bandwidth = 125000000.000000 -> Link my_cluster_1_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link my_cluster_2_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link my_cluster_2_link_3_DOWN: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001600, route bandwidth = 125000000.000000 diff --git a/teshsuite/simdag/platforms/clusterA.xml b/teshsuite/simdag/platforms/clusterA.xml index ea8f73f42c..ab96c62046 100644 --- a/teshsuite/simdag/platforms/clusterA.xml +++ b/teshsuite/simdag/platforms/clusterA.xml @@ -1,5 +1,5 @@ + radical="0,2-4,6" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> diff --git a/teshsuite/simdag/platforms/clusterB.xml b/teshsuite/simdag/platforms/clusterB.xml index 5dcc474f13..a1f69b330e 100644 --- a/teshsuite/simdag/platforms/clusterB.xml +++ b/teshsuite/simdag/platforms/clusterB.xml @@ -1,5 +1,5 @@ + radical="0,2-4,6" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> diff --git a/teshsuite/simdag/platforms/flatifier.c b/teshsuite/simdag/platforms/flatifier.c index 5f5d48d4eb..0fcec51730 100644 --- a/teshsuite/simdag/platforms/flatifier.c +++ b/teshsuite/simdag/platforms/flatifier.c @@ -74,9 +74,9 @@ static void create_environment(xbt_os_timer_t parse_time, const char *platformFi { xbt_ex_t e; TRY { - xbt_os_timer_start(parse_time); + xbt_os_cputimer_start(parse_time); SD_create_environment(platformFile); - xbt_os_timer_stop(parse_time); + xbt_os_cputimer_stop(parse_time); } CATCH(e) { xbt_die("Error while loading %s: %s", platformFile, e.msg); diff --git a/teshsuite/simdag/platforms/four_hosts_Dijkstra_ns3.xml b/teshsuite/simdag/platforms/four_hosts_Dijkstra_ns3.xml index a700f8217f..1650a420b2 100644 --- a/teshsuite/simdag/platforms/four_hosts_Dijkstra_ns3.xml +++ b/teshsuite/simdag/platforms/four_hosts_Dijkstra_ns3.xml @@ -2,15 +2,15 @@ - - - - + + + + - - - - + + + + diff --git a/teshsuite/simdag/platforms/four_hosts_floyd.xml b/teshsuite/simdag/platforms/four_hosts_floyd.xml index ec233d86db..e92b08750c 100644 --- a/teshsuite/simdag/platforms/four_hosts_floyd.xml +++ b/teshsuite/simdag/platforms/four_hosts_floyd.xml @@ -2,15 +2,15 @@ - - - - + + + + - - - - + + + + diff --git a/teshsuite/simdag/platforms/four_hosts_floyd_bis.xml b/teshsuite/simdag/platforms/four_hosts_floyd_bis.xml index d93a91cf9e..b5d3a22622 100644 --- a/teshsuite/simdag/platforms/four_hosts_floyd_bis.xml +++ b/teshsuite/simdag/platforms/four_hosts_floyd_bis.xml @@ -2,18 +2,18 @@ - - - - - + + + + + - - - - - - + + + + + + diff --git a/teshsuite/simdag/platforms/four_hosts_floyd_ns3.xml b/teshsuite/simdag/platforms/four_hosts_floyd_ns3.xml index 381e5e4972..1c0709c3fc 100644 --- a/teshsuite/simdag/platforms/four_hosts_floyd_ns3.xml +++ b/teshsuite/simdag/platforms/four_hosts_floyd_ns3.xml @@ -2,15 +2,15 @@ - - - - + + + + - - - - + + + + diff --git a/teshsuite/simdag/platforms/one_cluster.xml b/teshsuite/simdag/platforms/one_cluster.xml index e2c1eed1f2..4476c9f31a 100644 --- a/teshsuite/simdag/platforms/one_cluster.xml +++ b/teshsuite/simdag/platforms/one_cluster.xml @@ -3,7 +3,7 @@ + radical="0,2-4,6" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> diff --git a/teshsuite/simdag/platforms/one_cluster_file.xml b/teshsuite/simdag/platforms/one_cluster_file.xml index e53be106de..5e061e85d4 100644 --- a/teshsuite/simdag/platforms/one_cluster_file.xml +++ b/teshsuite/simdag/platforms/one_cluster_file.xml @@ -3,8 +3,8 @@ diff --git a/teshsuite/simdag/platforms/one_cluster_foreach.xml b/teshsuite/simdag/platforms/one_cluster_foreach.xml index df1694223d..5303166c91 100644 --- a/teshsuite/simdag/platforms/one_cluster_foreach.xml +++ b/teshsuite/simdag/platforms/one_cluster_foreach.xml @@ -6,11 +6,11 @@ radical="0,2-4,6"/> - - + + - diff --git a/teshsuite/simdag/platforms/one_cluster_fullduplex.xml b/teshsuite/simdag/platforms/one_cluster_fullduplex.xml index 0462399a5c..13d314c204 100644 --- a/teshsuite/simdag/platforms/one_cluster_fullduplex.xml +++ b/teshsuite/simdag/platforms/one_cluster_fullduplex.xml @@ -3,8 +3,8 @@ diff --git a/teshsuite/simdag/platforms/one_cluster_one_host.xml b/teshsuite/simdag/platforms/one_cluster_one_host.xml index 0998eca053..82f5660b30 100644 --- a/teshsuite/simdag/platforms/one_cluster_one_host.xml +++ b/teshsuite/simdag/platforms/one_cluster_one_host.xml @@ -3,12 +3,12 @@ + radical="0-4" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> - + - + diff --git a/teshsuite/simdag/platforms/one_cluster_one_host_random.xml b/teshsuite/simdag/platforms/one_cluster_one_host_random.xml index 7b9cd4e077..2983e2325f 100644 --- a/teshsuite/simdag/platforms/one_cluster_one_host_random.xml +++ b/teshsuite/simdag/platforms/one_cluster_one_host_random.xml @@ -13,7 +13,7 @@ - + diff --git a/teshsuite/simdag/platforms/one_cluster_properties_foreach.xml b/teshsuite/simdag/platforms/one_cluster_properties_foreach.xml index 8b52f2cc28..84f603af4e 100644 --- a/teshsuite/simdag/platforms/one_cluster_properties_foreach.xml +++ b/teshsuite/simdag/platforms/one_cluster_properties_foreach.xml @@ -5,10 +5,10 @@ radical="0,2-4,6"/> - + - + diff --git a/teshsuite/simdag/platforms/one_cluster_properties_override.xml b/teshsuite/simdag/platforms/one_cluster_properties_override.xml index 8a4f75c633..b53681b50f 100644 --- a/teshsuite/simdag/platforms/one_cluster_properties_override.xml +++ b/teshsuite/simdag/platforms/one_cluster_properties_override.xml @@ -5,14 +5,14 @@ radical="0,2-4,6"/> - + - + - + diff --git a/teshsuite/simdag/platforms/one_cluster_router_id.xml b/teshsuite/simdag/platforms/one_cluster_router_id.xml index 269186ba59..afa5b4fc87 100644 --- a/teshsuite/simdag/platforms/one_cluster_router_id.xml +++ b/teshsuite/simdag/platforms/one_cluster_router_id.xml @@ -3,7 +3,7 @@ + radical="0,2-4,6" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us" router_id="bob_cluster_router"/> diff --git a/teshsuite/simdag/platforms/one_host.xml b/teshsuite/simdag/platforms/one_host.xml index 147feb292d..700b0466db 100644 --- a/teshsuite/simdag/platforms/one_host.xml +++ b/teshsuite/simdag/platforms/one_host.xml @@ -2,6 +2,6 @@ - + diff --git a/teshsuite/simdag/platforms/one_host_availability.xml b/teshsuite/simdag/platforms/one_host_availability.xml index e88b01c022..f00a4e7b3d 100644 --- a/teshsuite/simdag/platforms/one_host_availability.xml +++ b/teshsuite/simdag/platforms/one_host_availability.xml @@ -2,7 +2,7 @@ - diff --git a/teshsuite/simdag/platforms/one_host_properties.xml b/teshsuite/simdag/platforms/one_host_properties.xml index b04b6e97cb..e2063d8637 100644 --- a/teshsuite/simdag/platforms/one_host_properties.xml +++ b/teshsuite/simdag/platforms/one_host_properties.xml @@ -2,7 +2,7 @@ - + diff --git a/teshsuite/simdag/platforms/one_host_state_file.xml b/teshsuite/simdag/platforms/one_host_state_file.xml index e24559794e..684f8a12b2 100644 --- a/teshsuite/simdag/platforms/one_host_state_file.xml +++ b/teshsuite/simdag/platforms/one_host_state_file.xml @@ -2,7 +2,7 @@ - diff --git a/teshsuite/simdag/platforms/one_host_state_off.xml b/teshsuite/simdag/platforms/one_host_state_off.xml index e777671f0c..810b6398db 100644 --- a/teshsuite/simdag/platforms/one_host_state_off.xml +++ b/teshsuite/simdag/platforms/one_host_state_off.xml @@ -2,7 +2,7 @@ - diff --git a/teshsuite/simdag/platforms/one_host_state_on.xml b/teshsuite/simdag/platforms/one_host_state_on.xml index d21d0658d6..0fdfcc468c 100644 --- a/teshsuite/simdag/platforms/one_host_state_on.xml +++ b/teshsuite/simdag/platforms/one_host_state_on.xml @@ -2,7 +2,7 @@ - diff --git a/teshsuite/simdag/platforms/one_host_trace_file.xml b/teshsuite/simdag/platforms/one_host_trace_file.xml index 65fcacc987..5f5d4ad95d 100644 --- a/teshsuite/simdag/platforms/one_host_trace_file.xml +++ b/teshsuite/simdag/platforms/one_host_trace_file.xml @@ -2,7 +2,7 @@ - + diff --git a/teshsuite/simdag/platforms/one_host_trace_inside.xml b/teshsuite/simdag/platforms/one_host_trace_inside.xml index f3f26adf2b..8f7730bbb1 100644 --- a/teshsuite/simdag/platforms/one_host_trace_inside.xml +++ b/teshsuite/simdag/platforms/one_host_trace_inside.xml @@ -2,7 +2,7 @@ - + 0.0 1.0 diff --git a/teshsuite/simdag/platforms/one_link_availability.xml b/teshsuite/simdag/platforms/one_link_availability.xml index 742ec3d959..76c95f01e1 100644 --- a/teshsuite/simdag/platforms/one_link_availability.xml +++ b/teshsuite/simdag/platforms/one_link_availability.xml @@ -2,8 +2,8 @@ - - + diff --git a/teshsuite/simdag/platforms/one_link_fatpipe.xml b/teshsuite/simdag/platforms/one_link_fatpipe.xml index 50b007187f..7a3bd79cd8 100644 --- a/teshsuite/simdag/platforms/one_link_fatpipe.xml +++ b/teshsuite/simdag/platforms/one_link_fatpipe.xml @@ -2,8 +2,8 @@ - - + diff --git a/teshsuite/simdag/platforms/one_link_shared.xml b/teshsuite/simdag/platforms/one_link_shared.xml index c9c5ccdb86..6bcccb363d 100644 --- a/teshsuite/simdag/platforms/one_link_shared.xml +++ b/teshsuite/simdag/platforms/one_link_shared.xml @@ -2,7 +2,7 @@ - - + + diff --git a/teshsuite/simdag/platforms/one_link_state_file.xml b/teshsuite/simdag/platforms/one_link_state_file.xml index 4d3cb6951d..6c6e35dcd2 100644 --- a/teshsuite/simdag/platforms/one_link_state_file.xml +++ b/teshsuite/simdag/platforms/one_link_state_file.xml @@ -2,8 +2,8 @@ - - + diff --git a/teshsuite/simdag/platforms/properties.xml b/teshsuite/simdag/platforms/properties.xml index d2ba4b3cc1..504c75471c 100644 --- a/teshsuite/simdag/platforms/properties.xml +++ b/teshsuite/simdag/platforms/properties.xml @@ -11,6 +11,6 @@ - + diff --git a/teshsuite/simdag/platforms/random.xml b/teshsuite/simdag/platforms/random.xml index eb4bc877e5..eee7263d92 100644 --- a/teshsuite/simdag/platforms/random.xml +++ b/teshsuite/simdag/platforms/random.xml @@ -33,17 +33,17 @@ mode="linear" base="NBcore" linear_a="0.5" linear_b="1000" noise="white"/> - + power="CustomPower" bw_in_trace="mybw" bw_out="CustomBWval" - lat="5e-5" + lat="50us" /> diff --git a/teshsuite/simdag/platforms/route_override.xml b/teshsuite/simdag/platforms/route_override.xml index 268ae91aa5..9ea9e36d75 100644 --- a/teshsuite/simdag/platforms/route_override.xml +++ b/teshsuite/simdag/platforms/route_override.xml @@ -3,14 +3,14 @@ + radical="0-4" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> + radical="0-4" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> - + diff --git a/teshsuite/simdag/platforms/test_of_is_router.xml b/teshsuite/simdag/platforms/test_of_is_router.xml index 3a797e952c..a0ee484be8 100644 --- a/teshsuite/simdag/platforms/test_of_is_router.xml +++ b/teshsuite/simdag/platforms/test_of_is_router.xml @@ -4,28 +4,28 @@ - - + + - - + + - - + + - - + + - - + + diff --git a/teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml b/teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml index f72e32a727..a1aa7e74a7 100644 --- a/teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml +++ b/teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml @@ -2,13 +2,13 @@ - - - + + + - - - + + + diff --git a/teshsuite/simdag/platforms/two_clusters.xml b/teshsuite/simdag/platforms/two_clusters.xml index 026061166a..e4f3a8a08d 100644 --- a/teshsuite/simdag/platforms/two_clusters.xml +++ b/teshsuite/simdag/platforms/two_clusters.xml @@ -5,14 +5,14 @@ + radical="0-4" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> + radical="0-4" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> - + + radical="0-1" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> + radical="2-3" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> - + + radical="0-4" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us" router_id="bob_cluster_router"/> + radical="0-4" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us" router_id="alice_cluster_router"/> - + + radical="0-1" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> + radical="0-1" power="1Gf" bw="125MBps" lat="50us" + bb_bw="2.25GBps" bb_lat="500us"/> - + - - + + - - + + diff --git a/teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS2.xml b/teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS2.xml index e76533449a..7577cda354 100644 --- a/teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS2.xml +++ b/teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS2.xml @@ -9,13 +9,13 @@ two_hosts_asymetric.tesh) --> - - + + - - - - + + + + diff --git a/teshsuite/simdag/platforms/two_hosts_multi_hop.xml b/teshsuite/simdag/platforms/two_hosts_multi_hop.xml index c92e9baf1d..6c4aba0e91 100644 --- a/teshsuite/simdag/platforms/two_hosts_multi_hop.xml +++ b/teshsuite/simdag/platforms/two_hosts_multi_hop.xml @@ -2,12 +2,12 @@ - - + + - - - + + diff --git a/teshsuite/simdag/platforms/two_hosts_one_link.xml b/teshsuite/simdag/platforms/two_hosts_one_link.xml index fd22b5f143..c1845c5a6c 100644 --- a/teshsuite/simdag/platforms/two_hosts_one_link.xml +++ b/teshsuite/simdag/platforms/two_hosts_one_link.xml @@ -2,10 +2,10 @@ - - + + - + diff --git a/teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml b/teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml index a75ffe755d..127f3104c5 100644 --- a/teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml +++ b/teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml @@ -2,10 +2,10 @@ - - + + - diff --git a/teshsuite/simdag/platforms/two_hosts_one_link_symmetrical.xml b/teshsuite/simdag/platforms/two_hosts_one_link_symmetrical.xml index 91ee52211c..a8b46d44e9 100644 --- a/teshsuite/simdag/platforms/two_hosts_one_link_symmetrical.xml +++ b/teshsuite/simdag/platforms/two_hosts_one_link_symmetrical.xml @@ -2,12 +2,12 @@ - - + + - - - + + + diff --git a/teshsuite/smpi/CMakeLists.txt b/teshsuite/smpi/CMakeLists.txt index 857c23b317..34f483c1f9 100644 --- a/teshsuite/smpi/CMakeLists.txt +++ b/teshsuite/smpi/CMakeLists.txt @@ -10,18 +10,26 @@ if(enable_smpi) set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") - - add_executable(alltoall2 alltoall2.c ) + add_executable(gather_coll gather_coll.c) + add_executable(allgather_coll allgather_coll.c) + add_executable(allgatherv_coll allgatherv_coll.c) + add_executable(alltoall2 alltoall2.c) add_executable(alltoall_basic alltoall_basic.c) - add_executable(alltoallv alltoallv.c) + add_executable(alltoall_coll alltoall_coll.c) + add_executable(alltoallv_coll alltoallv_coll.c) add_executable(allreduce allreduce.c) + add_executable(allreduce_coll allreduce_coll.c) add_executable(bcast bcast.c) + add_executable(bcast_coll bcast_coll.c) + add_executable(barrier_coll barrier.c ) add_executable(compute compute.c) add_executable(compute2 compute2.c) add_executable(compute3 compute3.c) add_executable(pingpong pingpong.c) add_executable(scatter scatter.c) add_executable(reduce reduce.c) + add_executable(reduce_coll reduce_coll.c) + add_executable(reduce_scatter_coll reduce_scatter_coll.c) add_executable(split split.c) add_executable(smpi_sendrecv sendrecv.c) add_executable(ttest01 ttest01.c) @@ -30,17 +38,26 @@ if(enable_smpi) add_executable(indexed_test indexed_test.c) add_executable(struct_test struct_test.c) + target_link_libraries(gather_coll simgrid) + target_link_libraries(allgather_coll simgrid) + target_link_libraries(allgatherv_coll simgrid) target_link_libraries(alltoall2 simgrid) target_link_libraries(alltoall_basic simgrid) - target_link_libraries(alltoallv simgrid) + target_link_libraries(alltoall_coll simgrid) + target_link_libraries(alltoallv_coll simgrid) target_link_libraries(allreduce simgrid) + target_link_libraries(allreduce_coll simgrid) target_link_libraries(bcast simgrid) + target_link_libraries(bcast_coll simgrid) + target_link_libraries(barrier_coll simgrid) target_link_libraries(compute simgrid) target_link_libraries(compute2 simgrid) target_link_libraries(compute3 simgrid) target_link_libraries(pingpong simgrid) target_link_libraries(scatter simgrid) target_link_libraries(reduce simgrid) + target_link_libraries(reduce_coll simgrid) + target_link_libraries(reduce_scatter_coll simgrid) target_link_libraries(split simgrid) target_link_libraries(smpi_sendrecv simgrid) target_link_libraries(ttest01 simgrid) @@ -61,12 +78,23 @@ endif() set(tesh_files ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/gather_coll.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/allgather_coll.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/allgatherv_coll.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/allreduce_coll.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/alltoall_coll.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv_coll.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/scatter_coll.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/barrier_coll.tesh ${CMAKE_CURRENT_SOURCE_DIR}/bcast.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/bcast_coll.tesh ${CMAKE_CURRENT_SOURCE_DIR}/compute.tesh ${CMAKE_CURRENT_SOURCE_DIR}/hvector.tesh ${CMAKE_CURRENT_SOURCE_DIR}/indexed.tesh ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt.tesh ${CMAKE_CURRENT_SOURCE_DIR}/reduce.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/reduce_coll.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/reduce_scatter_coll.tesh ${CMAKE_CURRENT_SOURCE_DIR}/struct.tesh ${CMAKE_CURRENT_SOURCE_DIR}/vector.tesh PARENT_SCOPE @@ -77,7 +105,16 @@ set(xml_files ) set(examples_src ${examples_src} - ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv.c + ${CMAKE_CURRENT_SOURCE_DIR}/gather_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/allgather_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/allgatherv_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/allreduce_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/alltoall_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/bcast_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/reduce_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/reduce_scatter_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv_coll.c ${CMAKE_CURRENT_SOURCE_DIR}/get_processor_name.c ${CMAKE_CURRENT_SOURCE_DIR}/pingpong.c ${CMAKE_CURRENT_SOURCE_DIR}/bcast.c diff --git a/teshsuite/smpi/allgather_coll.c b/teshsuite/smpi/allgather_coll.c new file mode 100644 index 0000000000..dfc776933c --- /dev/null +++ b/teshsuite/smpi/allgather_coll.c @@ -0,0 +1,62 @@ +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include +#include +#include "mpi.h" + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#endif + +int main(int argc, char *argv[]) +{ + int rank, size; + int i; + int *sb; + int *rb; + int status; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int count = 2; + sb = (int *) xbt_malloc(count * sizeof(int)); + rb = (int *) xbt_malloc(count * size * sizeof(int)); + + for (i = 0; i < count; ++i) + sb[i] = rank * count + i; + for (i = 0; i < count * size; ++i) + rb[i] = 0; + + printf("[%d] sndbuf=[", rank); + for (i = 0; i < count; i++) + printf("%d ", sb[i]); + printf("]\n"); + + status = MPI_Allgather(sb, count, MPI_INT, rb, count, MPI_INT, MPI_COMM_WORLD); + + printf("[%d] rcvbuf=[", rank); + for (i = 0; i < count * size; i++) + printf("%d ", rb[i]); + printf("]\n"); + + + if (rank == 0) { + if (status != MPI_SUCCESS) { + printf("allgather returned %d\n", status); + fflush(stdout); + } + } + free(sb); + free(rb); + MPI_Finalize(); + return (EXIT_SUCCESS); +} diff --git a/teshsuite/smpi/allgather_coll.tesh b/teshsuite/smpi/allgather_coll.tesh new file mode 100644 index 0000000000..2ff7d587d7 --- /dev/null +++ b/teshsuite/smpi/allgather_coll.tesh @@ -0,0 +1,57 @@ +# Smpi Alltoall collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test all to all +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allgather_coll +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0] rcvbuf=[0 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 ] +> [1] rcvbuf=[0 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 ] +> [2] rcvbuf=[0 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 ] +> [3] rcvbuf=[0 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 ] +> [4] rcvbuf=[0 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 ] +> [5] rcvbuf=[0 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 ] +> [6] rcvbuf=[0 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 ] +> [7] rcvbuf=[0 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 ] +> [8] rcvbuf=[0 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 ] +> [9] rcvbuf=[0 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 ] +> [10] rcvbuf=[0 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 ] +> [11] rcvbuf=[0 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 ] +> [12] rcvbuf=[0 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 ] +> [13] rcvbuf=[0 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 ] +> [14] rcvbuf=[0 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 ] +> [15] rcvbuf=[0 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 ] +> [0] sndbuf=[0 1 ] +> [1] sndbuf=[2 3 ] +> [2] sndbuf=[4 5 ] +> [3] sndbuf=[6 7 ] +> [4] sndbuf=[8 9 ] +> [5] sndbuf=[10 11 ] +> [6] sndbuf=[12 13 ] +> [7] sndbuf=[14 15 ] +> [8] sndbuf=[16 17 ] +> [9] sndbuf=[18 19 ] +> [10] sndbuf=[20 21 ] +> [11] sndbuf=[22 23 ] +> [12] sndbuf=[24 25 ] +> [13] sndbuf=[26 27 ] +> [14] sndbuf=[28 29 ] +> [15] sndbuf=[30 31 ] + diff --git a/teshsuite/smpi/allgatherv_coll.c b/teshsuite/smpi/allgatherv_coll.c new file mode 100644 index 0000000000..2d8c87fb5b --- /dev/null +++ b/teshsuite/smpi/allgatherv_coll.c @@ -0,0 +1,74 @@ +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include +#include +#include "mpi.h" + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#endif + +int main(int argc, char *argv[]) +{ + int rank, size; + int i; + int *sb; + int *rb; + int *recv_counts; + int *recv_disps; + int recv_sb_size; + int status; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + recv_counts = (int *) xbt_malloc(size * sizeof(int)); + recv_disps = (int *) xbt_malloc(size * sizeof(int)); + + recv_sb_size = 0; + for (i = 0; i < size; i++) { + recv_counts[i] = i + 1; + recv_disps[i] = recv_sb_size; + recv_sb_size += i + 1; + } + + sb = (int *) xbt_malloc(recv_counts[rank] * sizeof(int)); + rb = (int *) xbt_malloc(recv_sb_size * sizeof(int)); + + for (i = 0; i < recv_counts[rank]; ++i) + sb[i] = recv_disps[rank] + i; + for (i = 0; i < recv_sb_size; ++i) + rb[i] = -1; + + printf("[%d] sndbuf=[", rank); + for (i = 0; i < recv_counts[rank]; i++) + printf("%d ", sb[i]); + printf("]\n"); + + status = MPI_Allgatherv(sb, recv_counts[rank], MPI_INT, rb, recv_counts, recv_disps, MPI_INT, MPI_COMM_WORLD); + + printf("[%d] rcvbuf=[", rank); + for (i = 0; i < recv_sb_size; i++) + printf("%d ", rb[i]); + printf("]\n"); + + + if (rank == 0) { + if (status != MPI_SUCCESS) { + printf("allgatherv returned %d\n", status); + fflush(stdout); + } + } + free(sb); + free(rb); + MPI_Finalize(); + return (EXIT_SUCCESS); +} diff --git a/teshsuite/smpi/allgatherv_coll.tesh b/teshsuite/smpi/allgatherv_coll.tesh new file mode 100644 index 0000000000..520004adcb --- /dev/null +++ b/teshsuite/smpi/allgatherv_coll.tesh @@ -0,0 +1,56 @@ +# Smpi Allgatherv collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test allgatherv +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allgatherv_coll +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0] sndbuf=[0 ] +> [1] sndbuf=[1 2 ] +> [2] sndbuf=[3 4 5 ] +> [3] sndbuf=[6 7 8 9 ] +> [4] sndbuf=[10 11 12 13 14 ] +> [5] sndbuf=[15 16 17 18 19 20 ] +> [6] sndbuf=[21 22 23 24 25 26 27 ] +> [7] sndbuf=[28 29 30 31 32 33 34 35 ] +> [8] sndbuf=[36 37 38 39 40 41 42 43 44 ] +> [9] sndbuf=[45 46 47 48 49 50 51 52 53 54 ] +> [10] sndbuf=[55 56 57 58 59 60 61 62 63 64 65 ] +> [11] sndbuf=[66 67 68 69 70 71 72 73 74 75 76 77 ] +> [12] sndbuf=[78 79 80 81 82 83 84 85 86 87 88 89 90 ] +> [13] sndbuf=[91 92 93 94 95 96 97 98 99 100 101 102 103 104 ] +> [14] sndbuf=[105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 ] +> [15] sndbuf=[120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 ] +> [0] rcvbuf=[0 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 ] +> [1] rcvbuf=[0 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 ] +> [2] rcvbuf=[0 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 ] +> [3] rcvbuf=[0 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 ] +> [4] rcvbuf=[0 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 ] +> [5] rcvbuf=[0 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 ] +> [6] rcvbuf=[0 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 ] +> [7] rcvbuf=[0 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 ] +> [8] rcvbuf=[0 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 ] +> [9] rcvbuf=[0 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 ] +> [10] rcvbuf=[0 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 ] +> [11] rcvbuf=[0 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 ] +> [12] rcvbuf=[0 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 ] +> [13] rcvbuf=[0 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 ] +> [14] rcvbuf=[0 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 ] +> [15] rcvbuf=[0 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 ] diff --git a/teshsuite/smpi/allreduce_coll.c b/teshsuite/smpi/allreduce_coll.c new file mode 100644 index 0000000000..a2c992195e --- /dev/null +++ b/teshsuite/smpi/allreduce_coll.c @@ -0,0 +1,61 @@ +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include +#include +#include "mpi.h" + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#endif + +int main(int argc, char *argv[]) +{ + int rank, size; + int i; + int *sb; + int *rb; + int status; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + sb = (int *) xbt_malloc(size * sizeof(int)); + rb = (int *) xbt_malloc(size * sizeof(int)); + + for (i = 0; i < size; ++i) { + sb[i] = rank*size + i; + rb[i] = 0; + } + + printf("[%d] sndbuf=[", rank); + for (i = 0; i < size; i++) + printf("%d ", sb[i]); + printf("]\n"); + + status = MPI_Allreduce(sb, rb, size, MPI_INT, MPI_SUM, MPI_COMM_WORLD); + + printf("[%d] rcvbuf=[", rank); + for (i = 0; i < size; i++) + printf("%d ", rb[i]); + printf("]\n"); + + + if (rank == 0) { + if (status != MPI_SUCCESS) { + printf("all_to_all returned %d\n", status); + fflush(stdout); + } + } + free(sb); + free(rb); + MPI_Finalize(); + return (EXIT_SUCCESS); +} diff --git a/teshsuite/smpi/allreduce_coll.tesh b/teshsuite/smpi/allreduce_coll.tesh new file mode 100644 index 0000000000..8cde55d5b4 --- /dev/null +++ b/teshsuite/smpi/allreduce_coll.tesh @@ -0,0 +1,57 @@ +# Smpi Allreduce collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test allreduce +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] +> [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ] +> [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ] +> [3] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ] +> [4] sndbuf=[64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] +> [5] sndbuf=[80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ] +> [6] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ] +> [7] sndbuf=[112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 ] +> [8] sndbuf=[128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 ] +> [9] sndbuf=[144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 ] +> [10] sndbuf=[160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 ] +> [11] sndbuf=[176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 ] +> [12] sndbuf=[192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 ] +> [13] sndbuf=[208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 ] +> [14] sndbuf=[224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 ] +> [15] sndbuf=[240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 ] +> [0] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [1] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [2] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [3] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [4] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [5] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [6] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [7] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [8] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [9] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [10] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [11] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [12] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [13] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [14] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] +> [15] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] + diff --git a/teshsuite/smpi/alltoall_basic.c b/teshsuite/smpi/alltoall_basic.c index ad25e7a24c..869dd7c05a 100644 --- a/teshsuite/smpi/alltoall_basic.c +++ b/teshsuite/smpi/alltoall_basic.c @@ -44,6 +44,7 @@ int main(int argc, char *argv[]) sb[i] = rank + 1; rb[i] = 0; } + status = MPI_Alltoall(sb, 1, MPI_INT, rb, 1, MPI_INT, MPI_COMM_WORLD); printf("[%d] rcvbuf=[", rank); @@ -53,7 +54,7 @@ int main(int argc, char *argv[]) if (rank == 0) { - if (status != 0) { + if (status != MPI_SUCCESS) { printf("all_to_all returned %d\n", status); fflush(stdout); } diff --git a/teshsuite/smpi/alltoall_coll.c b/teshsuite/smpi/alltoall_coll.c new file mode 100644 index 0000000000..4c95ba3a08 --- /dev/null +++ b/teshsuite/smpi/alltoall_coll.c @@ -0,0 +1,61 @@ +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include +#include +#include "mpi.h" + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#endif + +int main(int argc, char *argv[]) +{ + int rank, size; + int i; + int *sb; + int *rb; + int status; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + sb = (int *) xbt_malloc(size * sizeof(int) * 2); + rb = (int *) xbt_malloc(size * sizeof(int) * 2); + + for (i = 0; i < size; ++i) { + sb[i] = rank*size + i; + rb[i] = 0; + } + + printf("[%d] sndbuf=[", rank); + for (i = 0; i < size; i++) + printf("%d ", sb[i]); + printf("]\n"); + + status = MPI_Alltoall(sb, 1, MPI_INT, rb, 1, MPI_INT, MPI_COMM_WORLD); + + printf("[%d] rcvbuf=[", rank); + for (i = 0; i < size; i++) + printf("%d ", rb[i]); + printf("]\n"); + + + if (rank == 0) { + if (status != MPI_SUCCESS) { + printf("all_to_all returned %d\n", status); + fflush(stdout); + } + } + free(sb); + free(rb); + MPI_Finalize(); + return (EXIT_SUCCESS); +} diff --git a/teshsuite/smpi/alltoall_coll.tesh b/teshsuite/smpi/alltoall_coll.tesh new file mode 100644 index 0000000000..0cab7eade2 --- /dev/null +++ b/teshsuite/smpi/alltoall_coll.tesh @@ -0,0 +1,57 @@ +# Smpi Alltoall collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test all to all +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./alltoall_coll -q +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] +> [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ] +> [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ] +> [3] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ] +> [4] sndbuf=[64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] +> [5] sndbuf=[80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ] +> [6] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ] +> [7] sndbuf=[112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 ] +> [8] sndbuf=[128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 ] +> [9] sndbuf=[144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 ] +> [10] sndbuf=[160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 ] +> [11] sndbuf=[176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 ] +> [12] sndbuf=[192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 ] +> [13] sndbuf=[208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 ] +> [14] sndbuf=[224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 ] +> [15] sndbuf=[240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 ] +> [0] rcvbuf=[0 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240 ] +> [1] rcvbuf=[1 17 33 49 65 81 97 113 129 145 161 177 193 209 225 241 ] +> [2] rcvbuf=[2 18 34 50 66 82 98 114 130 146 162 178 194 210 226 242 ] +> [3] rcvbuf=[3 19 35 51 67 83 99 115 131 147 163 179 195 211 227 243 ] +> [4] rcvbuf=[4 20 36 52 68 84 100 116 132 148 164 180 196 212 228 244 ] +> [5] rcvbuf=[5 21 37 53 69 85 101 117 133 149 165 181 197 213 229 245 ] +> [6] rcvbuf=[6 22 38 54 70 86 102 118 134 150 166 182 198 214 230 246 ] +> [7] rcvbuf=[7 23 39 55 71 87 103 119 135 151 167 183 199 215 231 247 ] +> [8] rcvbuf=[8 24 40 56 72 88 104 120 136 152 168 184 200 216 232 248 ] +> [9] rcvbuf=[9 25 41 57 73 89 105 121 137 153 169 185 201 217 233 249 ] +> [10] rcvbuf=[10 26 42 58 74 90 106 122 138 154 170 186 202 218 234 250 ] +> [11] rcvbuf=[11 27 43 59 75 91 107 123 139 155 171 187 203 219 235 251 ] +> [12] rcvbuf=[12 28 44 60 76 92 108 124 140 156 172 188 204 220 236 252 ] +> [13] rcvbuf=[13 29 45 61 77 93 109 125 141 157 173 189 205 221 237 253 ] +> [14] rcvbuf=[14 30 46 62 78 94 110 126 142 158 174 190 206 222 238 254 ] +> [15] rcvbuf=[15 31 47 63 79 95 111 127 143 159 175 191 207 223 239 255 ] + diff --git a/teshsuite/smpi/alltoallv.c b/teshsuite/smpi/alltoallv_coll.c similarity index 52% rename from teshsuite/smpi/alltoallv.c rename to teshsuite/smpi/alltoallv_coll.c index f2717b9c56..0b4c71b1f0 100644 --- a/teshsuite/smpi/alltoallv.c +++ b/teshsuite/smpi/alltoallv_coll.c @@ -44,16 +44,16 @@ <2> rdisp: (#3): [0][2][4] after MPI_Alltoallv : - <0> rbuf: (#9): [0][-1][-2][-3][-4][-5][-6][-7][-8] - <1> rbuf: (#9): [1][101][201][-3][-4][-5][-6][-7][-8] - <2> rbuf: (#9): [3][4][103][104][203][204][-6][-7][-8] + <0> rbuf: (#9): [-1][-1][-1][-1][-1][-1][-1][-1][-1] + <1> rbuf: (#9): [1][101][201][-1][-1][-1][-1][-1][-1] + <2> rbuf: (#9): [3][4][103][104][203][204][-1][-1][-1] */ static void print_buffer_int(void *buf, int len, char *msg, int rank) { int tmp, *v; - printf("**<%d> %s (#%d): ", rank, msg, len); + printf("[%d] %s (#%d): ", rank, msg, len); for (tmp = 0; tmp < len; tmp++) { v = buf; printf("[%d]", v[tmp]); @@ -67,96 +67,53 @@ int main(int argc, char **argv) { MPI_Comm comm; - int *sbuf, *rbuf, *erbuf; + int *sbuf, *rbuf; int rank, size; int *sendcounts, *recvcounts, *rdispls, *sdispls; - int i, j, *p, err; + int i; MPI_Init(&argc, &argv); - err = 0; comm = MPI_COMM_WORLD; /* Create the buffer */ MPI_Comm_size(comm, &size); MPI_Comm_rank(comm, &rank); - sbuf = (int *) malloc(size * size * sizeof(int)); - rbuf = (int *) malloc(size * size * sizeof(int)); - erbuf = (int *) malloc(size * size * sizeof(int)); // expected - if (!sbuf || !rbuf) { - fprintf(stderr, "Could not allocated buffers!\n"); - MPI_Abort(comm, 1); - } + sbuf = (int *) xbt_malloc(size * size * sizeof(int)); + rbuf = (int *) xbt_malloc(size * size * sizeof(int)); /* Load up the buffers */ for (i = 0; i < size * size; i++) { sbuf[i] = i + 100 * rank; - rbuf[i] = -i; - erbuf[i] = -i; + rbuf[i] = -1; } /* Create and load the arguments to alltoallv */ - sendcounts = (int *) malloc(size * sizeof(int)); - recvcounts = (int *) malloc(size * sizeof(int)); - rdispls = (int *) malloc(size * sizeof(int)); - sdispls = (int *) malloc(size * sizeof(int)); - if (!sendcounts || !recvcounts || !rdispls || !sdispls) { - fprintf(stderr, "Could not allocate arg items!\n"); - MPI_Abort(comm, 1); - } + sendcounts = (int *) xbt_malloc(size * sizeof(int)); + recvcounts = (int *) xbt_malloc(size * sizeof(int)); + rdispls = (int *) xbt_malloc(size * sizeof(int)); + sdispls = (int *) xbt_malloc(size * sizeof(int)); for (i = 0; i < size; i++) { sendcounts[i] = i; recvcounts[i] = rank; rdispls[i] = i * rank; sdispls[i] = (i * (i + 1)) / 2; } - - /* debug */ - /* - print_buffer_int( sbuf, size*size, strdup("sbuf:"),rank); - print_buffer_int( sendcounts, size, strdup("scount:"),rank); - print_buffer_int( recvcounts, size, strdup("rcount:"),rank); - print_buffer_int( sdispls, size, strdup("sdisp:"),rank); - print_buffer_int( rdispls, size, strdup("rdisp:"),rank); - */ - - - /* debug : erbuf */ - /* debug - for (i=0; i got %d expected %d for %dth\n", - rank, p[j], (i * (i + 1)) / 2 + j, j); - err++; - } - } - } + print_buffer_int( rbuf, size*size, strdup("rbuf:"),rank); - /* Summary */ - if (err > 0) { - printf("<%d> Alltoallv test: failure (%d errors).\n", rank, err); - } + MPI_Barrier(MPI_COMM_WORLD); if (0 == rank) { - printf("* Alltoallv TEST COMPLETE.\n"); + printf("Alltoallv TEST COMPLETE.\n"); } free(sdispls); free(rdispls); @@ -165,7 +122,6 @@ int main(int argc, char **argv) free(rbuf); free(sbuf); - MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); return 0; } diff --git a/teshsuite/smpi/alltoallv_coll.tesh b/teshsuite/smpi/alltoallv_coll.tesh new file mode 100644 index 0000000000..9b432f1d91 --- /dev/null +++ b/teshsuite/smpi/alltoallv_coll.tesh @@ -0,0 +1,123 @@ +# Smpi Alltoall collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test all to all +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./alltoallv_coll +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0] rbuf: (#256): [-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [0] rcount: (#16): [0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] +> [0] rdisp: (#16): [0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] +> [0] sbuf: (#256): [0][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] +> [0] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [0] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [1] rbuf: (#256): [1][101][201][301][401][501][601][701][801][901][1001][1101][1201][1301][1401][1501][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [1] rcount: (#16): [1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1] +> [1] rdisp: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [1] sbuf: (#256): [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] +> [1] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [1] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [2] rbuf: (#256): [3][4][103][104][203][204][303][304][403][404][503][504][603][604][703][704][803][804][903][904][1003][1004][1103][1104][1203][1204][1303][1304][1403][1404][1503][1504][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [2] rcount: (#16): [2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2] +> [2] rdisp: (#16): [0][2][4][6][8][10][12][14][16][18][20][22][24][26][28][30] +> [2] sbuf: (#256): [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] +> [2] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [2] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [3] rbuf: (#256): [6][7][8][106][107][108][206][207][208][306][307][308][406][407][408][506][507][508][606][607][608][706][707][708][806][807][808][906][907][908][1006][1007][1008][1106][1107][1108][1206][1207][1208][1306][1307][1308][1406][1407][1408][1506][1507][1508][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [3] rcount: (#16): [3][3][3][3][3][3][3][3][3][3][3][3][3][3][3][3] +> [3] rdisp: (#16): [0][3][6][9][12][15][18][21][24][27][30][33][36][39][42][45] +> [3] sbuf: (#256): [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] +> [3] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [3] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [4] rbuf: (#256): [10][11][12][13][110][111][112][113][210][211][212][213][310][311][312][313][410][411][412][413][510][511][512][513][610][611][612][613][710][711][712][713][810][811][812][813][910][911][912][913][1010][1011][1012][1013][1110][1111][1112][1113][1210][1211][1212][1213][1310][1311][1312][1313][1410][1411][1412][1413][1510][1511][1512][1513][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [4] rcount: (#16): [4][4][4][4][4][4][4][4][4][4][4][4][4][4][4][4] +> [4] rdisp: (#16): [0][4][8][12][16][20][24][28][32][36][40][44][48][52][56][60] +> [4] sbuf: (#256): [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] +> [4] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [4] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [5] rbuf: (#256): [15][16][17][18][19][115][116][117][118][119][215][216][217][218][219][315][316][317][318][319][415][416][417][418][419][515][516][517][518][519][615][616][617][618][619][715][716][717][718][719][815][816][817][818][819][915][916][917][918][919][1015][1016][1017][1018][1019][1115][1116][1117][1118][1119][1215][1216][1217][1218][1219][1315][1316][1317][1318][1319][1415][1416][1417][1418][1419][1515][1516][1517][1518][1519][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [5] rcount: (#16): [5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5] +> [5] rdisp: (#16): [0][5][10][15][20][25][30][35][40][45][50][55][60][65][70][75] +> [5] sbuf: (#256): [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] +> [5] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [5] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [6] rbuf: (#256): [21][22][23][24][25][26][121][122][123][124][125][126][221][222][223][224][225][226][321][322][323][324][325][326][421][422][423][424][425][426][521][522][523][524][525][526][621][622][623][624][625][626][721][722][723][724][725][726][821][822][823][824][825][826][921][922][923][924][925][926][1021][1022][1023][1024][1025][1026][1121][1122][1123][1124][1125][1126][1221][1222][1223][1224][1225][1226][1321][1322][1323][1324][1325][1326][1421][1422][1423][1424][1425][1426][1521][1522][1523][1524][1525][1526][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [6] rcount: (#16): [6][6][6][6][6][6][6][6][6][6][6][6][6][6][6][6] +> [6] rdisp: (#16): [0][6][12][18][24][30][36][42][48][54][60][66][72][78][84][90] +> [6] sbuf: (#256): [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][815][816][817][818][819][820][821][822][823][824][825][826][827][828][829][830][831][832][833][834][835][836][837][838][839][840][841][842][843][844][845][846][847][848][849][850][851][852][853][854][855] +> [6] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [6] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [7] rbuf: (#256): [28][29][30][31][32][33][34][128][129][130][131][132][133][134][228][229][230][231][232][233][234][328][329][330][331][332][333][334][428][429][430][431][432][433][434][528][529][530][531][532][533][534][628][629][630][631][632][633][634][728][729][730][731][732][733][734][828][829][830][831][832][833][834][928][929][930][931][932][933][934][1028][1029][1030][1031][1032][1033][1034][1128][1129][1130][1131][1132][1133][1134][1228][1229][1230][1231][1232][1233][1234][1328][1329][1330][1331][1332][1333][1334][1428][1429][1430][1431][1432][1433][1434][1528][1529][1530][1531][1532][1533][1534][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [7] rcount: (#16): [7][7][7][7][7][7][7][7][7][7][7][7][7][7][7][7] +> [7] rdisp: (#16): [0][7][14][21][28][35][42][49][56][63][70][77][84][91][98][105] +> [7] sbuf: (#256): [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][815][816][817][818][819][820][821][822][823][824][825][826][827][828][829][830][831][832][833][834][835][836][837][838][839][840][841][842][843][844][845][846][847][848][849][850][851][852][853][854][855][856][857][858][859][860][861][862][863][864][865][866][867][868][869][870][871][872][873][874][875][876][877][878][879][880][881][882][883][884][885][886][887][888][889][890][891][892][893][894][895][896][897][898][899][900][901][902][903][904][905][906][907][908][909][910][911][912][913][914][915][916][917][918][919][920][921][922][923][924][925][926][927][928][929][930][931][932][933][934][935][936][937][938][939][940][941][942][943][944][945][946][947][948][949][950][951][952][953][954][955] +> [7] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [7] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [8] rbuf: (#256): [36][37][38][39][40][41][42][43][136][137][138][139][140][141][142][143][236][237][238][239][240][241][242][243][336][337][338][339][340][341][342][343][436][437][438][439][440][441][442][443][536][537][538][539][540][541][542][543][636][637][638][639][640][641][642][643][736][737][738][739][740][741][742][743][836][837][838][839][840][841][842][843][936][937][938][939][940][941][942][943][1036][1037][1038][1039][1040][1041][1042][1043][1136][1137][1138][1139][1140][1141][1142][1143][1236][1237][1238][1239][1240][1241][1242][1243][1336][1337][1338][1339][1340][1341][1342][1343][1436][1437][1438][1439][1440][1441][1442][1443][1536][1537][1538][1539][1540][1541][1542][1543][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [8] rcount: (#16): [8][8][8][8][8][8][8][8][8][8][8][8][8][8][8][8] +> [8] rdisp: (#16): [0][8][16][24][32][40][48][56][64][72][80][88][96][104][112][120] +> [8] sbuf: (#256): [800][801][802][803][804][805][806][807][808][809][810][811][812][813][814][815][816][817][818][819][820][821][822][823][824][825][826][827][828][829][830][831][832][833][834][835][836][837][838][839][840][841][842][843][844][845][846][847][848][849][850][851][852][853][854][855][856][857][858][859][860][861][862][863][864][865][866][867][868][869][870][871][872][873][874][875][876][877][878][879][880][881][882][883][884][885][886][887][888][889][890][891][892][893][894][895][896][897][898][899][900][901][902][903][904][905][906][907][908][909][910][911][912][913][914][915][916][917][918][919][920][921][922][923][924][925][926][927][928][929][930][931][932][933][934][935][936][937][938][939][940][941][942][943][944][945][946][947][948][949][950][951][952][953][954][955][956][957][958][959][960][961][962][963][964][965][966][967][968][969][970][971][972][973][974][975][976][977][978][979][980][981][982][983][984][985][986][987][988][989][990][991][992][993][994][995][996][997][998][999][1000][1001][1002][1003][1004][1005][1006][1007][1008][1009][1010][1011][1012][1013][1014][1015][1016][1017][1018][1019][1020][1021][1022][1023][1024][1025][1026][1027][1028][1029][1030][1031][1032][1033][1034][1035][1036][1037][1038][1039][1040][1041][1042][1043][1044][1045][1046][1047][1048][1049][1050][1051][1052][1053][1054][1055] +> [8] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [8] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [9] rbuf: (#256): [45][46][47][48][49][50][51][52][53][145][146][147][148][149][150][151][152][153][245][246][247][248][249][250][251][252][253][345][346][347][348][349][350][351][352][353][445][446][447][448][449][450][451][452][453][545][546][547][548][549][550][551][552][553][645][646][647][648][649][650][651][652][653][745][746][747][748][749][750][751][752][753][845][846][847][848][849][850][851][852][853][945][946][947][948][949][950][951][952][953][1045][1046][1047][1048][1049][1050][1051][1052][1053][1145][1146][1147][1148][1149][1150][1151][1152][1153][1245][1246][1247][1248][1249][1250][1251][1252][1253][1345][1346][1347][1348][1349][1350][1351][1352][1353][1445][1446][1447][1448][1449][1450][1451][1452][1453][1545][1546][1547][1548][1549][1550][1551][1552][1553][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [9] rcount: (#16): [9][9][9][9][9][9][9][9][9][9][9][9][9][9][9][9] +> [9] rdisp: (#16): [0][9][18][27][36][45][54][63][72][81][90][99][108][117][126][135] +> [9] sbuf: (#256): [900][901][902][903][904][905][906][907][908][909][910][911][912][913][914][915][916][917][918][919][920][921][922][923][924][925][926][927][928][929][930][931][932][933][934][935][936][937][938][939][940][941][942][943][944][945][946][947][948][949][950][951][952][953][954][955][956][957][958][959][960][961][962][963][964][965][966][967][968][969][970][971][972][973][974][975][976][977][978][979][980][981][982][983][984][985][986][987][988][989][990][991][992][993][994][995][996][997][998][999][1000][1001][1002][1003][1004][1005][1006][1007][1008][1009][1010][1011][1012][1013][1014][1015][1016][1017][1018][1019][1020][1021][1022][1023][1024][1025][1026][1027][1028][1029][1030][1031][1032][1033][1034][1035][1036][1037][1038][1039][1040][1041][1042][1043][1044][1045][1046][1047][1048][1049][1050][1051][1052][1053][1054][1055][1056][1057][1058][1059][1060][1061][1062][1063][1064][1065][1066][1067][1068][1069][1070][1071][1072][1073][1074][1075][1076][1077][1078][1079][1080][1081][1082][1083][1084][1085][1086][1087][1088][1089][1090][1091][1092][1093][1094][1095][1096][1097][1098][1099][1100][1101][1102][1103][1104][1105][1106][1107][1108][1109][1110][1111][1112][1113][1114][1115][1116][1117][1118][1119][1120][1121][1122][1123][1124][1125][1126][1127][1128][1129][1130][1131][1132][1133][1134][1135][1136][1137][1138][1139][1140][1141][1142][1143][1144][1145][1146][1147][1148][1149][1150][1151][1152][1153][1154][1155] +> [9] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [9] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [10] rbuf: (#256): [55][56][57][58][59][60][61][62][63][64][155][156][157][158][159][160][161][162][163][164][255][256][257][258][259][260][261][262][263][264][355][356][357][358][359][360][361][362][363][364][455][456][457][458][459][460][461][462][463][464][555][556][557][558][559][560][561][562][563][564][655][656][657][658][659][660][661][662][663][664][755][756][757][758][759][760][761][762][763][764][855][856][857][858][859][860][861][862][863][864][955][956][957][958][959][960][961][962][963][964][1055][1056][1057][1058][1059][1060][1061][1062][1063][1064][1155][1156][1157][1158][1159][1160][1161][1162][1163][1164][1255][1256][1257][1258][1259][1260][1261][1262][1263][1264][1355][1356][1357][1358][1359][1360][1361][1362][1363][1364][1455][1456][1457][1458][1459][1460][1461][1462][1463][1464][1555][1556][1557][1558][1559][1560][1561][1562][1563][1564][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [10] rcount: (#16): [10][10][10][10][10][10][10][10][10][10][10][10][10][10][10][10] +> [10] rdisp: (#16): [0][10][20][30][40][50][60][70][80][90][100][110][120][130][140][150] +> [10] sbuf: (#256): [1000][1001][1002][1003][1004][1005][1006][1007][1008][1009][1010][1011][1012][1013][1014][1015][1016][1017][1018][1019][1020][1021][1022][1023][1024][1025][1026][1027][1028][1029][1030][1031][1032][1033][1034][1035][1036][1037][1038][1039][1040][1041][1042][1043][1044][1045][1046][1047][1048][1049][1050][1051][1052][1053][1054][1055][1056][1057][1058][1059][1060][1061][1062][1063][1064][1065][1066][1067][1068][1069][1070][1071][1072][1073][1074][1075][1076][1077][1078][1079][1080][1081][1082][1083][1084][1085][1086][1087][1088][1089][1090][1091][1092][1093][1094][1095][1096][1097][1098][1099][1100][1101][1102][1103][1104][1105][1106][1107][1108][1109][1110][1111][1112][1113][1114][1115][1116][1117][1118][1119][1120][1121][1122][1123][1124][1125][1126][1127][1128][1129][1130][1131][1132][1133][1134][1135][1136][1137][1138][1139][1140][1141][1142][1143][1144][1145][1146][1147][1148][1149][1150][1151][1152][1153][1154][1155][1156][1157][1158][1159][1160][1161][1162][1163][1164][1165][1166][1167][1168][1169][1170][1171][1172][1173][1174][1175][1176][1177][1178][1179][1180][1181][1182][1183][1184][1185][1186][1187][1188][1189][1190][1191][1192][1193][1194][1195][1196][1197][1198][1199][1200][1201][1202][1203][1204][1205][1206][1207][1208][1209][1210][1211][1212][1213][1214][1215][1216][1217][1218][1219][1220][1221][1222][1223][1224][1225][1226][1227][1228][1229][1230][1231][1232][1233][1234][1235][1236][1237][1238][1239][1240][1241][1242][1243][1244][1245][1246][1247][1248][1249][1250][1251][1252][1253][1254][1255] +> [10] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [10] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [11] rbuf: (#256): [66][67][68][69][70][71][72][73][74][75][76][166][167][168][169][170][171][172][173][174][175][176][266][267][268][269][270][271][272][273][274][275][276][366][367][368][369][370][371][372][373][374][375][376][466][467][468][469][470][471][472][473][474][475][476][566][567][568][569][570][571][572][573][574][575][576][666][667][668][669][670][671][672][673][674][675][676][766][767][768][769][770][771][772][773][774][775][776][866][867][868][869][870][871][872][873][874][875][876][966][967][968][969][970][971][972][973][974][975][976][1066][1067][1068][1069][1070][1071][1072][1073][1074][1075][1076][1166][1167][1168][1169][1170][1171][1172][1173][1174][1175][1176][1266][1267][1268][1269][1270][1271][1272][1273][1274][1275][1276][1366][1367][1368][1369][1370][1371][1372][1373][1374][1375][1376][1466][1467][1468][1469][1470][1471][1472][1473][1474][1475][1476][1566][1567][1568][1569][1570][1571][1572][1573][1574][1575][1576][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [11] rcount: (#16): [11][11][11][11][11][11][11][11][11][11][11][11][11][11][11][11] +> [11] rdisp: (#16): [0][11][22][33][44][55][66][77][88][99][110][121][132][143][154][165] +> [11] sbuf: (#256): [1100][1101][1102][1103][1104][1105][1106][1107][1108][1109][1110][1111][1112][1113][1114][1115][1116][1117][1118][1119][1120][1121][1122][1123][1124][1125][1126][1127][1128][1129][1130][1131][1132][1133][1134][1135][1136][1137][1138][1139][1140][1141][1142][1143][1144][1145][1146][1147][1148][1149][1150][1151][1152][1153][1154][1155][1156][1157][1158][1159][1160][1161][1162][1163][1164][1165][1166][1167][1168][1169][1170][1171][1172][1173][1174][1175][1176][1177][1178][1179][1180][1181][1182][1183][1184][1185][1186][1187][1188][1189][1190][1191][1192][1193][1194][1195][1196][1197][1198][1199][1200][1201][1202][1203][1204][1205][1206][1207][1208][1209][1210][1211][1212][1213][1214][1215][1216][1217][1218][1219][1220][1221][1222][1223][1224][1225][1226][1227][1228][1229][1230][1231][1232][1233][1234][1235][1236][1237][1238][1239][1240][1241][1242][1243][1244][1245][1246][1247][1248][1249][1250][1251][1252][1253][1254][1255][1256][1257][1258][1259][1260][1261][1262][1263][1264][1265][1266][1267][1268][1269][1270][1271][1272][1273][1274][1275][1276][1277][1278][1279][1280][1281][1282][1283][1284][1285][1286][1287][1288][1289][1290][1291][1292][1293][1294][1295][1296][1297][1298][1299][1300][1301][1302][1303][1304][1305][1306][1307][1308][1309][1310][1311][1312][1313][1314][1315][1316][1317][1318][1319][1320][1321][1322][1323][1324][1325][1326][1327][1328][1329][1330][1331][1332][1333][1334][1335][1336][1337][1338][1339][1340][1341][1342][1343][1344][1345][1346][1347][1348][1349][1350][1351][1352][1353][1354][1355] +> [11] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [11] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [12] rbuf: (#256): [78][79][80][81][82][83][84][85][86][87][88][89][178][179][180][181][182][183][184][185][186][187][188][189][278][279][280][281][282][283][284][285][286][287][288][289][378][379][380][381][382][383][384][385][386][387][388][389][478][479][480][481][482][483][484][485][486][487][488][489][578][579][580][581][582][583][584][585][586][587][588][589][678][679][680][681][682][683][684][685][686][687][688][689][778][779][780][781][782][783][784][785][786][787][788][789][878][879][880][881][882][883][884][885][886][887][888][889][978][979][980][981][982][983][984][985][986][987][988][989][1078][1079][1080][1081][1082][1083][1084][1085][1086][1087][1088][1089][1178][1179][1180][1181][1182][1183][1184][1185][1186][1187][1188][1189][1278][1279][1280][1281][1282][1283][1284][1285][1286][1287][1288][1289][1378][1379][1380][1381][1382][1383][1384][1385][1386][1387][1388][1389][1478][1479][1480][1481][1482][1483][1484][1485][1486][1487][1488][1489][1578][1579][1580][1581][1582][1583][1584][1585][1586][1587][1588][1589][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [12] rcount: (#16): [12][12][12][12][12][12][12][12][12][12][12][12][12][12][12][12] +> [12] rdisp: (#16): [0][12][24][36][48][60][72][84][96][108][120][132][144][156][168][180] +> [12] sbuf: (#256): [1200][1201][1202][1203][1204][1205][1206][1207][1208][1209][1210][1211][1212][1213][1214][1215][1216][1217][1218][1219][1220][1221][1222][1223][1224][1225][1226][1227][1228][1229][1230][1231][1232][1233][1234][1235][1236][1237][1238][1239][1240][1241][1242][1243][1244][1245][1246][1247][1248][1249][1250][1251][1252][1253][1254][1255][1256][1257][1258][1259][1260][1261][1262][1263][1264][1265][1266][1267][1268][1269][1270][1271][1272][1273][1274][1275][1276][1277][1278][1279][1280][1281][1282][1283][1284][1285][1286][1287][1288][1289][1290][1291][1292][1293][1294][1295][1296][1297][1298][1299][1300][1301][1302][1303][1304][1305][1306][1307][1308][1309][1310][1311][1312][1313][1314][1315][1316][1317][1318][1319][1320][1321][1322][1323][1324][1325][1326][1327][1328][1329][1330][1331][1332][1333][1334][1335][1336][1337][1338][1339][1340][1341][1342][1343][1344][1345][1346][1347][1348][1349][1350][1351][1352][1353][1354][1355][1356][1357][1358][1359][1360][1361][1362][1363][1364][1365][1366][1367][1368][1369][1370][1371][1372][1373][1374][1375][1376][1377][1378][1379][1380][1381][1382][1383][1384][1385][1386][1387][1388][1389][1390][1391][1392][1393][1394][1395][1396][1397][1398][1399][1400][1401][1402][1403][1404][1405][1406][1407][1408][1409][1410][1411][1412][1413][1414][1415][1416][1417][1418][1419][1420][1421][1422][1423][1424][1425][1426][1427][1428][1429][1430][1431][1432][1433][1434][1435][1436][1437][1438][1439][1440][1441][1442][1443][1444][1445][1446][1447][1448][1449][1450][1451][1452][1453][1454][1455] +> [12] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [12] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [13] rbuf: (#256): [91][92][93][94][95][96][97][98][99][100][101][102][103][191][192][193][194][195][196][197][198][199][200][201][202][203][291][292][293][294][295][296][297][298][299][300][301][302][303][391][392][393][394][395][396][397][398][399][400][401][402][403][491][492][493][494][495][496][497][498][499][500][501][502][503][591][592][593][594][595][596][597][598][599][600][601][602][603][691][692][693][694][695][696][697][698][699][700][701][702][703][791][792][793][794][795][796][797][798][799][800][801][802][803][891][892][893][894][895][896][897][898][899][900][901][902][903][991][992][993][994][995][996][997][998][999][1000][1001][1002][1003][1091][1092][1093][1094][1095][1096][1097][1098][1099][1100][1101][1102][1103][1191][1192][1193][1194][1195][1196][1197][1198][1199][1200][1201][1202][1203][1291][1292][1293][1294][1295][1296][1297][1298][1299][1300][1301][1302][1303][1391][1392][1393][1394][1395][1396][1397][1398][1399][1400][1401][1402][1403][1491][1492][1493][1494][1495][1496][1497][1498][1499][1500][1501][1502][1503][1591][1592][1593][1594][1595][1596][1597][1598][1599][1600][1601][1602][1603][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [13] rcount: (#16): [13][13][13][13][13][13][13][13][13][13][13][13][13][13][13][13] +> [13] rdisp: (#16): [0][13][26][39][52][65][78][91][104][117][130][143][156][169][182][195] +> [13] sbuf: (#256): [1300][1301][1302][1303][1304][1305][1306][1307][1308][1309][1310][1311][1312][1313][1314][1315][1316][1317][1318][1319][1320][1321][1322][1323][1324][1325][1326][1327][1328][1329][1330][1331][1332][1333][1334][1335][1336][1337][1338][1339][1340][1341][1342][1343][1344][1345][1346][1347][1348][1349][1350][1351][1352][1353][1354][1355][1356][1357][1358][1359][1360][1361][1362][1363][1364][1365][1366][1367][1368][1369][1370][1371][1372][1373][1374][1375][1376][1377][1378][1379][1380][1381][1382][1383][1384][1385][1386][1387][1388][1389][1390][1391][1392][1393][1394][1395][1396][1397][1398][1399][1400][1401][1402][1403][1404][1405][1406][1407][1408][1409][1410][1411][1412][1413][1414][1415][1416][1417][1418][1419][1420][1421][1422][1423][1424][1425][1426][1427][1428][1429][1430][1431][1432][1433][1434][1435][1436][1437][1438][1439][1440][1441][1442][1443][1444][1445][1446][1447][1448][1449][1450][1451][1452][1453][1454][1455][1456][1457][1458][1459][1460][1461][1462][1463][1464][1465][1466][1467][1468][1469][1470][1471][1472][1473][1474][1475][1476][1477][1478][1479][1480][1481][1482][1483][1484][1485][1486][1487][1488][1489][1490][1491][1492][1493][1494][1495][1496][1497][1498][1499][1500][1501][1502][1503][1504][1505][1506][1507][1508][1509][1510][1511][1512][1513][1514][1515][1516][1517][1518][1519][1520][1521][1522][1523][1524][1525][1526][1527][1528][1529][1530][1531][1532][1533][1534][1535][1536][1537][1538][1539][1540][1541][1542][1543][1544][1545][1546][1547][1548][1549][1550][1551][1552][1553][1554][1555] +> [13] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [13] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [14] rbuf: (#256): [105][106][107][108][109][110][111][112][113][114][115][116][117][118][205][206][207][208][209][210][211][212][213][214][215][216][217][218][305][306][307][308][309][310][311][312][313][314][315][316][317][318][405][406][407][408][409][410][411][412][413][414][415][416][417][418][505][506][507][508][509][510][511][512][513][514][515][516][517][518][605][606][607][608][609][610][611][612][613][614][615][616][617][618][705][706][707][708][709][710][711][712][713][714][715][716][717][718][805][806][807][808][809][810][811][812][813][814][815][816][817][818][905][906][907][908][909][910][911][912][913][914][915][916][917][918][1005][1006][1007][1008][1009][1010][1011][1012][1013][1014][1015][1016][1017][1018][1105][1106][1107][1108][1109][1110][1111][1112][1113][1114][1115][1116][1117][1118][1205][1206][1207][1208][1209][1210][1211][1212][1213][1214][1215][1216][1217][1218][1305][1306][1307][1308][1309][1310][1311][1312][1313][1314][1315][1316][1317][1318][1405][1406][1407][1408][1409][1410][1411][1412][1413][1414][1415][1416][1417][1418][1505][1506][1507][1508][1509][1510][1511][1512][1513][1514][1515][1516][1517][1518][1605][1606][1607][1608][1609][1610][1611][1612][1613][1614][1615][1616][1617][1618][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [14] rcount: (#16): [14][14][14][14][14][14][14][14][14][14][14][14][14][14][14][14] +> [14] rdisp: (#16): [0][14][28][42][56][70][84][98][112][126][140][154][168][182][196][210] +> [14] sbuf: (#256): [1400][1401][1402][1403][1404][1405][1406][1407][1408][1409][1410][1411][1412][1413][1414][1415][1416][1417][1418][1419][1420][1421][1422][1423][1424][1425][1426][1427][1428][1429][1430][1431][1432][1433][1434][1435][1436][1437][1438][1439][1440][1441][1442][1443][1444][1445][1446][1447][1448][1449][1450][1451][1452][1453][1454][1455][1456][1457][1458][1459][1460][1461][1462][1463][1464][1465][1466][1467][1468][1469][1470][1471][1472][1473][1474][1475][1476][1477][1478][1479][1480][1481][1482][1483][1484][1485][1486][1487][1488][1489][1490][1491][1492][1493][1494][1495][1496][1497][1498][1499][1500][1501][1502][1503][1504][1505][1506][1507][1508][1509][1510][1511][1512][1513][1514][1515][1516][1517][1518][1519][1520][1521][1522][1523][1524][1525][1526][1527][1528][1529][1530][1531][1532][1533][1534][1535][1536][1537][1538][1539][1540][1541][1542][1543][1544][1545][1546][1547][1548][1549][1550][1551][1552][1553][1554][1555][1556][1557][1558][1559][1560][1561][1562][1563][1564][1565][1566][1567][1568][1569][1570][1571][1572][1573][1574][1575][1576][1577][1578][1579][1580][1581][1582][1583][1584][1585][1586][1587][1588][1589][1590][1591][1592][1593][1594][1595][1596][1597][1598][1599][1600][1601][1602][1603][1604][1605][1606][1607][1608][1609][1610][1611][1612][1613][1614][1615][1616][1617][1618][1619][1620][1621][1622][1623][1624][1625][1626][1627][1628][1629][1630][1631][1632][1633][1634][1635][1636][1637][1638][1639][1640][1641][1642][1643][1644][1645][1646][1647][1648][1649][1650][1651][1652][1653][1654][1655] +> [14] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [14] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> [15] rbuf: (#256): [120][121][122][123][124][125][126][127][128][129][130][131][132][133][134][220][221][222][223][224][225][226][227][228][229][230][231][232][233][234][320][321][322][323][324][325][326][327][328][329][330][331][332][333][334][420][421][422][423][424][425][426][427][428][429][430][431][432][433][434][520][521][522][523][524][525][526][527][528][529][530][531][532][533][534][620][621][622][623][624][625][626][627][628][629][630][631][632][633][634][720][721][722][723][724][725][726][727][728][729][730][731][732][733][734][820][821][822][823][824][825][826][827][828][829][830][831][832][833][834][920][921][922][923][924][925][926][927][928][929][930][931][932][933][934][1020][1021][1022][1023][1024][1025][1026][1027][1028][1029][1030][1031][1032][1033][1034][1120][1121][1122][1123][1124][1125][1126][1127][1128][1129][1130][1131][1132][1133][1134][1220][1221][1222][1223][1224][1225][1226][1227][1228][1229][1230][1231][1232][1233][1234][1320][1321][1322][1323][1324][1325][1326][1327][1328][1329][1330][1331][1332][1333][1334][1420][1421][1422][1423][1424][1425][1426][1427][1428][1429][1430][1431][1432][1433][1434][1520][1521][1522][1523][1524][1525][1526][1527][1528][1529][1530][1531][1532][1533][1534][1620][1621][1622][1623][1624][1625][1626][1627][1628][1629][1630][1631][1632][1633][1634][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1] +> [15] rcount: (#16): [15][15][15][15][15][15][15][15][15][15][15][15][15][15][15][15] +> [15] rdisp: (#16): [0][15][30][45][60][75][90][105][120][135][150][165][180][195][210][225] +> [15] sbuf: (#256): [1500][1501][1502][1503][1504][1505][1506][1507][1508][1509][1510][1511][1512][1513][1514][1515][1516][1517][1518][1519][1520][1521][1522][1523][1524][1525][1526][1527][1528][1529][1530][1531][1532][1533][1534][1535][1536][1537][1538][1539][1540][1541][1542][1543][1544][1545][1546][1547][1548][1549][1550][1551][1552][1553][1554][1555][1556][1557][1558][1559][1560][1561][1562][1563][1564][1565][1566][1567][1568][1569][1570][1571][1572][1573][1574][1575][1576][1577][1578][1579][1580][1581][1582][1583][1584][1585][1586][1587][1588][1589][1590][1591][1592][1593][1594][1595][1596][1597][1598][1599][1600][1601][1602][1603][1604][1605][1606][1607][1608][1609][1610][1611][1612][1613][1614][1615][1616][1617][1618][1619][1620][1621][1622][1623][1624][1625][1626][1627][1628][1629][1630][1631][1632][1633][1634][1635][1636][1637][1638][1639][1640][1641][1642][1643][1644][1645][1646][1647][1648][1649][1650][1651][1652][1653][1654][1655][1656][1657][1658][1659][1660][1661][1662][1663][1664][1665][1666][1667][1668][1669][1670][1671][1672][1673][1674][1675][1676][1677][1678][1679][1680][1681][1682][1683][1684][1685][1686][1687][1688][1689][1690][1691][1692][1693][1694][1695][1696][1697][1698][1699][1700][1701][1702][1703][1704][1705][1706][1707][1708][1709][1710][1711][1712][1713][1714][1715][1716][1717][1718][1719][1720][1721][1722][1723][1724][1725][1726][1727][1728][1729][1730][1731][1732][1733][1734][1735][1736][1737][1738][1739][1740][1741][1742][1743][1744][1745][1746][1747][1748][1749][1750][1751][1752][1753][1754][1755] +> [15] scount: (#16): [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15] +> [15] sdisp: (#16): [0][1][3][6][10][15][21][28][36][45][55][66][78][91][105][120] +> +> Alltoallv TEST COMPLETE. + diff --git a/teshsuite/smpi/barrier.c b/teshsuite/smpi/barrier.c index 568015ec72..7fb9a0c917 100644 --- a/teshsuite/smpi/barrier.c +++ b/teshsuite/smpi/barrier.c @@ -11,22 +11,20 @@ int main(int argc, char **argv) { int size, rank; - int root = 0; - int value; - double start_timer; + //double start_timer; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); - start_timer = MPI_Wtime(); + //start_timer = MPI_Wtime(); MPI_Barrier(MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if (0 == rank) { printf("... Barrier ....\n"); - printf("Elapsed=%lf s\n", MPI_Wtime() - start_timer); + //printf("Elapsed=%lf s\n", MPI_Wtime() - start_timer); } MPI_Finalize(); diff --git a/teshsuite/smpi/barrier_coll.tesh b/teshsuite/smpi/barrier_coll.tesh new file mode 100644 index 0000000000..f5d2c79901 --- /dev/null +++ b/teshsuite/smpi/barrier_coll.tesh @@ -0,0 +1,58 @@ +# Smpi scatter collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test scatter +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./scatter +> [0] ok. +> [0] ok. +> [10] ok. +> [10] ok. +> [11] ok. +> [11] ok. +> [12] ok. +> [12] ok. +> [13] ok. +> [13] ok. +> [14] ok. +> [14] ok. +> [15] ok. +> [15] ok. +> [1] ok. +> [1] ok. +> [2] ok. +> [2] ok. +> [3] ok. +> [3] ok. +> [4] ok. +> [4] ok. +> [5] ok. +> [5] ok. +> [6] ok. +> [6] ok. +> [7] ok. +> [7] ok. +> [8] ok. +> [8] ok. +> [9] ok. +> [9] ok. +> ** IBM Test Result: ... +> ** Small Test Result: ... +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [rank 0] -> Tremblay +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa diff --git a/teshsuite/smpi/bcast_coll.c b/teshsuite/smpi/bcast_coll.c new file mode 100644 index 0000000000..9bb6a04fe6 --- /dev/null +++ b/teshsuite/smpi/bcast_coll.c @@ -0,0 +1,44 @@ +/* Copyright (c) 2009. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include + +int main(int argc, char **argv) +{ + int i, size, rank; + int count = 2048; + int *values; + int status; + + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + values = (int *) xbt_malloc(count * sizeof(int)); + + for (i = 0; i < count; i++) + values[i] = (0 == rank) ? 17 : 3; + + status = MPI_Bcast(values, count, MPI_INT, 0, MPI_COMM_WORLD); + + int good = 0; + for (i = 0; i < count; i++) + if (values[i]==17) good++; + printf("[%d] number of values equals to 17: %d\n", rank, good); + + MPI_Barrier(MPI_COMM_WORLD); + + if (rank == 0) { + if (status != MPI_SUCCESS) { + printf("bcast returned %d\n", status); + fflush(stdout); + } + } + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/bcast_coll.tesh b/teshsuite/smpi/bcast_coll.tesh new file mode 100644 index 0000000000..7dc08a5df0 --- /dev/null +++ b/teshsuite/smpi/bcast_coll.tesh @@ -0,0 +1,39 @@ +p Test Broadcast with more processes than hosts +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./bcast_coll +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0] number of values equals to 17: 2048 +> [1] number of values equals to 17: 2048 +> [2] number of values equals to 17: 2048 +> [3] number of values equals to 17: 2048 +> [4] number of values equals to 17: 2048 +> [5] number of values equals to 17: 2048 +> [6] number of values equals to 17: 2048 +> [7] number of values equals to 17: 2048 +> [8] number of values equals to 17: 2048 +> [9] number of values equals to 17: 2048 +> [10] number of values equals to 17: 2048 +> [11] number of values equals to 17: 2048 +> [12] number of values equals to 17: 2048 +> [13] number of values equals to 17: 2048 +> [14] number of values equals to 17: 2048 +> [15] number of values equals to 17: 2048 diff --git a/teshsuite/smpi/gather_coll.c b/teshsuite/smpi/gather_coll.c new file mode 100644 index 0000000000..a6111b46de --- /dev/null +++ b/teshsuite/smpi/gather_coll.c @@ -0,0 +1,65 @@ +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include +#include +#include "mpi.h" + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#endif + +int main(int argc, char *argv[]) +{ + int rank, size; + int i; + int *sb; + int *rb; + int status; + + int root = 0; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int count = 2; + sb = (int *) xbt_malloc(count * sizeof(int)); + rb = (int *) xbt_malloc(count * size * sizeof(int)); + + for (i = 0; i < count; ++i) + sb[i] = rank * count + i; + for (i = 0; i < count * size; ++i) + rb[i] = 0; + + printf("[%d] sndbuf=[", rank); + for (i = 0; i < count; i++) + printf("%d ", sb[i]); + printf("]\n"); + + status = MPI_Gather(sb, count, MPI_INT, rb, count, MPI_INT, root, MPI_COMM_WORLD); + + if (rank == root) { + printf("[%d] rcvbuf=[", rank); + for (i = 0; i < count * size; i++) + printf("%d ", rb[i]); + printf("]\n"); + + + if (status != MPI_SUCCESS) { + printf("allgather returned %d\n", status); + fflush(stdout); + } + } + free(sb); + free(rb); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Finalize(); + return (EXIT_SUCCESS); +} diff --git a/teshsuite/smpi/gather_coll.tesh b/teshsuite/smpi/gather_coll.tesh new file mode 100644 index 0000000000..c4b40fe684 --- /dev/null +++ b/teshsuite/smpi/gather_coll.tesh @@ -0,0 +1,42 @@ +# Smpi Alltoall collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test all to all +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./gather_coll +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0] rcvbuf=[0 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 ] +> [0] sndbuf=[0 1 ] +> [1] sndbuf=[2 3 ] +> [2] sndbuf=[4 5 ] +> [3] sndbuf=[6 7 ] +> [4] sndbuf=[8 9 ] +> [5] sndbuf=[10 11 ] +> [6] sndbuf=[12 13 ] +> [7] sndbuf=[14 15 ] +> [8] sndbuf=[16 17 ] +> [9] sndbuf=[18 19 ] +> [10] sndbuf=[20 21 ] +> [11] sndbuf=[22 23 ] +> [12] sndbuf=[24 25 ] +> [13] sndbuf=[26 27 ] +> [14] sndbuf=[28 29 ] +> [15] sndbuf=[30 31 ] + diff --git a/teshsuite/smpi/mpich-test/coll/redscat.c b/teshsuite/smpi/mpich-test/coll/redscat.c index 3cb057da76..9cb824ae30 100644 --- a/teshsuite/smpi/mpich-test/coll/redscat.c +++ b/teshsuite/smpi/mpich-test/coll/redscat.c @@ -31,10 +31,8 @@ int main( int argc, char **argv ) recvcounts = (int *)malloc( size * sizeof(int) ); recvbuf = (int *)malloc( size * sizeof(int) ); for (i=0; i 0 */ - if (j < bufferlen) { - if (valerr[0]) fprintf( stderr, "Different value[%d] = %s\n", - j, valerr ); - else + } + /* Return +1 so an error in the first location is > 0 */ + if (j < bufferlen) { + if (valerr[0]) fprintf( stderr, "Different value[%d] = %s\n", + j, valerr ); + else fprintf( stderr, "Different value[%d]\n", j ); - return j+1; + return j+1; } - return 0; + return 0; } void SetupBasicTypes() { - BasicTypes[0] = MPI_CHAR; BasicNames[0] = (char*)"MPI_CHAR" ; - BasicTypes[1] = MPI_SHORT; BasicNames[1] = (char*)"MPI_SHORT"; - BasicTypes[2] = MPI_INT; BasicNames[2] = (char*)"MPI_INT" ; - BasicTypes[3] = MPI_LONG; BasicNames[3] = (char*)"MPI_LONG" ; - BasicTypes[4] = MPI_UNSIGNED_CHAR; BasicNames[4] = (char*)"MPI_UNSIGNED_CHAR"; - BasicTypes[5] = MPI_UNSIGNED_SHORT; BasicNames[5] = (char*)"MPI_UNSIGNED_SHORT"; - BasicTypes[6] = MPI_UNSIGNED; BasicNames[6] = (char*)"MPI_UNSIGNED"; - BasicTypes[7] = MPI_UNSIGNED_LONG; BasicNames[7] = (char*)"MPI_UNSIGNED_LONG"; - BasicTypes[8] = MPI_FLOAT; BasicNames[8] = (char*)"MPI_FLOAT"; - BasicTypes[9] = MPI_DOUBLE; BasicNames[9] = (char*)"MPI_DOUBLE"; - BasicTypes[10] = MPI_BYTE; BasicNames[10] = (char*)"MPI_BYTE"; - /* By making the BYTE type LAST, we make it easier to handle heterogeneous - systems that may not support all of the types */ - ntypes = 11; + BasicTypes[0] = MPI_CHAR; BasicNames[0] = (char*)"MPI_CHAR" ; + BasicTypes[1] = MPI_SHORT; BasicNames[1] = (char*)"MPI_SHORT"; + BasicTypes[2] = MPI_INT; BasicNames[2] = (char*)"MPI_INT" ; + BasicTypes[3] = MPI_LONG; BasicNames[3] = (char*)"MPI_LONG" ; + BasicTypes[4] = MPI_UNSIGNED_CHAR; BasicNames[4] = (char*)"MPI_UNSIGNED_CHAR"; + BasicTypes[5] = MPI_UNSIGNED_SHORT; BasicNames[5] = (char*)"MPI_UNSIGNED_SHORT"; + BasicTypes[6] = MPI_UNSIGNED; BasicNames[6] = (char*)"MPI_UNSIGNED"; + BasicTypes[7] = MPI_UNSIGNED_LONG; BasicNames[7] = (char*)"MPI_UNSIGNED_LONG"; + BasicTypes[8] = MPI_FLOAT; BasicNames[8] = (char*)"MPI_FLOAT"; + BasicTypes[9] = MPI_DOUBLE; BasicNames[9] = (char*)"MPI_DOUBLE"; + BasicTypes[10] = MPI_BYTE; BasicNames[10] = (char*)"MPI_BYTE"; + /* By making the BYTE type LAST, we make it easier to handle heterogeneous + systems that may not support all of the types */ + ntypes = 11; #if defined (HAVE_LONG_DOUBLE) && !defined(HAS_XDR) - /* This test allows us to use MPI_LONG_DOUBLE, but rely on size > 0 - for "actually implemented" */ - if (!nolongdouble) { - int l; - MPI_Type_size( MPI_LONG_DOUBLE, &l ); - if (l > 0) { + /* This test allows us to use MPI_LONG_DOUBLE, but rely on size > 0 + for "actually implemented" */ + if (!nolongdouble) { + int l; + MPI_Type_size( MPI_LONG_DOUBLE, &l ); + if (l > 0) { BasicTypes[ntypes] = MPI_LONG_DOUBLE; BasicNames[ntypes] = (char*)"MPI_LONG_DOUBLE"; ntypes++; - } } + } #endif #if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) - BasicTypes[ntypes] = MPI_LONG_LONG_INT; - BasicNames[ntypes] = (char*)"MPI_LONG_LONG_INT"; - ntypes++; + BasicTypes[ntypes] = MPI_LONG_LONG_INT; + BasicNames[ntypes] = (char*)"MPI_LONG_LONG_INT"; + ntypes++; #endif } void SenderTest1() { - void *bufferspace[MAX_TYPES]; - int i, j; - - AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); - FillBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); - for (i = 0; i < ntypes; i++) { - MPI_Send( (void *)0, 0, BasicTypes[i], dest, 2000, MPI_COMM_WORLD ); - for (j = 0; j < maxbufferlen; j += 500) + void *bufferspace[MAX_TYPES]; + int i, j; + + AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + FillBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + for (i = 0; i < ntypes; i++) { + MPI_Send( (void *)0, 0, BasicTypes[i], dest, 2000, MPI_COMM_WORLD ); + for (j = 0; j < maxbufferlen; j += 500) MPI_Send(bufferspace[i], j, BasicTypes[i], dest, - 2000, MPI_COMM_WORLD); - } - FreeBuffers(bufferspace, ntypes); + 2000, MPI_COMM_WORLD); + } + FreeBuffers(bufferspace, ntypes); } void ReceiverTest1() { - void *bufferspace[MAX_TYPES]; - int i, j; - char message[81]; - MPI_Status Stat; - int dummy, passed; - - AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); - for (i = 0; i < ntypes; i++) { - passed = 1; - MPI_Recv( (void *)0, 0, BasicTypes[i], src, - 2000, MPI_COMM_WORLD, &Stat); - if (Stat.MPI_SOURCE != src) { + void *bufferspace[MAX_TYPES]; + int i, j; + char message[81]; + MPI_Status Stat; + int dummy, passed; + + AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + for (i = 0; i < ntypes; i++) { + passed = 1; + MPI_Recv( (void *)0, 0, BasicTypes[i], src, + 2000, MPI_COMM_WORLD, &Stat); + if (Stat.MPI_SOURCE != src) { fprintf(stderr, "*** Incorrect Source returned. ***\n"); Test_Failed(message); passed = 0; - } else if (Stat.MPI_TAG != 2000) { + } else if (Stat.MPI_TAG != 2000) { fprintf(stderr, "*** Incorrect Tag returned. ***\n"); Test_Failed(message); passed = 0; - } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) || - dummy != 0) { + } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) || + dummy != 0) { fprintf(stderr, - "*** Incorrect Count returned, Count = %d. ***\n", - dummy); + "*** Incorrect Count returned, Count = %d. ***\n", + dummy); Test_Failed(message); passed = 0; - } - /* Try different sized messages */ - for (j = 0; j < maxbufferlen; j += 500) { + } + /* Try different sized messages */ + for (j = 0; j < maxbufferlen; j += 500) { MPI_Recv(bufferspace[i], j, BasicTypes[i], src, - 2000, MPI_COMM_WORLD, &Stat); + 2000, MPI_COMM_WORLD, &Stat); sprintf(message, "Send-Receive Test, Type %d, Count %d", - i, j); + i, j); if (Stat.MPI_SOURCE != src) { - fprintf(stderr, "*** Incorrect Source returned. ***\n"); - Test_Failed(message); - passed = 0; + fprintf(stderr, "*** Incorrect Source returned. ***\n"); + Test_Failed(message); + passed = 0; } else if (Stat.MPI_TAG != 2000) { - fprintf(stderr, "*** Incorrect Tag returned. ***\n"); - Test_Failed(message); - passed = 0; + fprintf(stderr, "*** Incorrect Tag returned. ***\n"); + Test_Failed(message); + passed = 0; } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) || - dummy != j) { - fprintf(stderr, - "*** Incorrect Count returned, Count = %d (should be %d). ***\n", - dummy, j); - Test_Failed(message); - passed = 0; + dummy != j) { + fprintf(stderr, + "*** Incorrect Count returned, Count = %d (should be %d). ***\n", + dummy, j); + Test_Failed(message); + passed = 0; } else if(CheckBuffer(bufferspace[i], BasicTypes[i], j)) { - fprintf(stderr, - "*** Incorrect Message received (type = %d (%s), count = %d). ***\n", - i, BasicNames[i], j ); - Test_Failed(message); - passed = 0; + fprintf(stderr, + "*** Incorrect Message received (type = %d (%s), count = %d). ***\n", + i, BasicNames[i], j ); + Test_Failed(message); + passed = 0; } #ifdef VERBOSE else { - fprintf(stderr, - "Message of count %d, type %d received correctly.\n", - j, i ); + fprintf(stderr, + "Message of count %d, type %d received correctly.\n", + j, i ); } #endif - } - sprintf(message, "Send-Receive Test, Type %d (%s)", - i, BasicNames[i] ); - if (passed) + } + sprintf(message, "Send-Receive Test, Type %d (%s)", + i, BasicNames[i] ); + if (passed) Test_Passed(message); - else + else Test_Failed(message); - } - FreeBuffers(bufferspace, ntypes); + } + FreeBuffers(bufferspace, ntypes); } #define MAX_ORDER_TAG 2010 @@ -373,262 +373,263 @@ ReceiverTest1() void SenderTest2() { - int *buffer; - int i; - MPI_Request r[10]; - MPI_Status s[10]; - - buffer = (int *)malloc(maxbufferlen * sizeof(int)); - for (i = 0; i < maxbufferlen; i++) - buffer[i] = i; + int *buffer; + int i; + MPI_Request r[10]; + MPI_Status s[10]; + + buffer = (int *)malloc(maxbufferlen * sizeof(int)); + for (i = 0; i < maxbufferlen; i++) + buffer[i] = i; - for (i = 2001; i <= MAX_ORDER_TAG; i++) - MPI_Isend(buffer, maxbufferlen, MPI_INT, dest, - i, MPI_COMM_WORLD, &r[i-2001] ); + for (i = 2001; i <= MAX_ORDER_TAG; i++) + MPI_Isend(buffer, maxbufferlen, MPI_INT, dest, + i, MPI_COMM_WORLD, &r[i-2001] ); - MPI_Waitall( MAX_ORDER_TAG-2001+1, r, s ); - free(buffer); + MPI_Waitall( MAX_ORDER_TAG-2001+1, r, s ); + free(buffer); - return; + return; } void ReceiverTest2() { - int *buffer; - int i, j; - char message[81]; - MPI_Status Stat; - int dummy, passed; - int errloc; - - buffer = (int *)calloc(maxbufferlen,sizeof(int)); - passed = 1; - - for (i = MAX_ORDER_TAG; i >= 2001; i--) { - MPI_Recv(buffer, maxbufferlen, MPI_INT, src, - i, MPI_COMM_WORLD, &Stat); - sprintf(message, "Tag Selectivity Test, Tag %d", - i); - if (Stat.MPI_SOURCE != src) { + int *buffer; + int i, j; + char message[81]; + MPI_Status Stat; + int dummy, passed; + int errloc; + + buffer = (int *)calloc(maxbufferlen,sizeof(int)); + passed = 1; + + for (i = MAX_ORDER_TAG; i >= 2001; i--) { + MPI_Recv(buffer, maxbufferlen, MPI_INT, src, + i, MPI_COMM_WORLD, &Stat); + sprintf(message, "Tag Selectivity Test, Tag %d", + i); + if (Stat.MPI_SOURCE != src) { fprintf(stderr, "*** Incorrect Source returned. ***\n"); Test_Failed(message); - } else if (Stat.MPI_TAG != i) { + } else if (Stat.MPI_TAG != i) { fprintf(stderr, "*** Incorrect Tag returned. ***\n"); Test_Failed(message); - } else if (MPI_Get_count(&Stat, MPI_INT, &dummy) || - dummy != maxbufferlen) { + } else if (MPI_Get_count(&Stat, MPI_INT, &dummy) || + dummy != maxbufferlen) { fprintf(stderr, - "*** Incorrect Count returned, Count = %d. ***\n", - dummy); + "*** Incorrect Count returned, Count = %d. ***\n", + dummy); Test_Failed(message); - } else if((errloc = - CheckBuffer((void*)buffer, MPI_INT, maxbufferlen))) { + } else if((errloc = + CheckBuffer((void*)buffer, MPI_INT, maxbufferlen))) { fprintf(stderr, - "*** Incorrect Message received at %d (tag=%d). ***\n", - errloc-1, i); + "*** Incorrect Message received at %d (tag=%d). ***\n", + errloc-1, i); Test_Failed(message); passed = 0; - } - /* Clear out the buffer */ - for (j = 0; j < maxbufferlen; j++) - buffer[j] = -1; } - strncpy(message, "Tag Selectivity Test", 81); - if (passed) - Test_Passed(message); - else - Test_Failed(message); - free(buffer); - return; + /* Clear out the buffer */ + for (j = 0; j < maxbufferlen; j++) + buffer[j] = -1; + } + strncpy(message, "Tag Selectivity Test", 81); + if (passed) + Test_Passed(message); + else + Test_Failed(message); + free(buffer); + return; } void SenderTest3() { - int ibuf[10]; + int ibuf[10]; - /* A receive test might not fail until it is triggered... */ - MPI_Send( ibuf, 10, MPI_INT, dest, 15, MPI_COMM_WORLD); + /* A receive test might not fail until it is triggered... */ + MPI_Send( ibuf, 10, MPI_INT, dest, 15, MPI_COMM_WORLD); - return; + return; } void ReceiverTest3( void ) { - int buffer[20]; - MPI_Datatype bogus_type = MPI_DATATYPE_NULL; - MPI_Status status; - int myrank; - int small_tag; -/* + int buffer[20]; + MPI_Datatype bogus_type = MPI_DATATYPE_NULL; + MPI_Status status; + int myrank; + int small_tag; + /* if (verbose) - MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN); + MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN); else - MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN ); -*/ - MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); + MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN ); + */ + MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); - if (myrank == 0 && verbose) { - fprintf( stderr, -"There should be eight error messages about invalid communicator\n\ + if (myrank == 0 && verbose) { + fprintf( stderr, + "There should be eight error messages about invalid communicator\n\ count argument, datatype argument, tag, rank, buffer send and buffer recv\n" ); } - if (MPI_Send(buffer, 20, MPI_INT, dest, - 1, MPI_COMM_NULL) == MPI_SUCCESS){ - Test_Failed("NULL Communicator Test"); - } - else - Test_Passed("NULL Communicator Test"); - - if (MPI_Send(buffer, -1, MPI_INT, dest, - 1, MPI_COMM_WORLD) == MPI_SUCCESS){ - Test_Failed("Invalid Count Test"); - } - else - Test_Passed("Invalid Count Test"); - - if (MPI_Send(buffer, 20, bogus_type, dest, - 1, MPI_COMM_WORLD) == MPI_SUCCESS){ - Test_Failed("Invalid Type Test"); - } - else - Test_Passed("Invalid Type Test"); - - small_tag = -1; - if (small_tag == MPI_ANY_TAG) small_tag = -2; - if (MPI_Send(buffer, 20, MPI_INT, dest, - small_tag, MPI_COMM_WORLD) == MPI_SUCCESS) { - Test_Failed("Invalid Tag Test"); - } - else - Test_Passed("Invalid Tag Test"); - - /* Form a tag that is too large */ - /*MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, (void **)&tag_ubp, &flag ); + if (MPI_Send(buffer, 20, MPI_INT, dest, + 1, MPI_COMM_NULL) == MPI_SUCCESS){ + Test_Failed("NULL Communicator Test"); + } + else + Test_Passed("NULL Communicator Test"); + + if (MPI_Send(buffer, -1, MPI_INT, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Count Test"); + } + else + Test_Passed("Invalid Count Test"); + + if (MPI_Send(buffer, 20, bogus_type, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Type Test"); + } + else + Test_Passed("Invalid Type Test"); + + small_tag = -1; + if (small_tag == MPI_ANY_TAG) small_tag = -2; + if (MPI_Send(buffer, 20, MPI_INT, dest, + small_tag, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Tag Test"); + } + else + Test_Passed("Invalid Tag Test"); + + /* Form a tag that is too large */ + /*MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, (void **)&tag_ubp, &flag ); if (!flag) Test_Failed("Could not get tag ub!" ); large_tag = *tag_ubp + 1; if (large_tag > *tag_ubp) { - if (MPI_Send(buffer, 20, MPI_INT, dest, - large_tag, MPI_COMM_WORLD) == MPI_SUCCESS) { - Test_Failed("Invalid Tag Test"); - } - else - Test_Passed("Invalid Tag Test"); - } -*/ - if (MPI_Send(buffer, 20, MPI_INT, 300, - 1, MPI_COMM_WORLD) == MPI_SUCCESS) { - Test_Failed("Invalid Destination Test"); - } - else - Test_Passed("Invalid Destination Test"); - - if (MPI_Send((void *)0, 10, MPI_INT, dest, - 1, MPI_COMM_WORLD) == MPI_SUCCESS){ - Test_Failed("Invalid Buffer Test (send)"); + if (MPI_Send(buffer, 20, MPI_INT, dest, + large_tag, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Tag Test"); } else - Test_Passed("Invalid Buffer Test (send)"); - - /* A receive test might not fail until it is triggered... */ - if (MPI_Recv((void *)0, 10, MPI_INT, src, - 15, MPI_COMM_WORLD, &status) == MPI_SUCCESS){ - Test_Failed("Invalid Buffer Test (recv)"); + Test_Passed("Invalid Tag Test"); } - else - Test_Passed("Invalid Buffer Test (recv)"); - - /* Just to keep things happy, see if there is a message to receive */ - { int flag, ibuf[10]; + */ + if (MPI_Send(buffer, 20, MPI_INT, 300, + 1, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Destination Test"); + } + else + Test_Passed("Invalid Destination Test"); + + if (MPI_Send((void *)0, 10, MPI_INT, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Buffer Test (send)"); + } + else + Test_Passed("Invalid Buffer Test (send)"); + + /* A receive test might not fail until it is triggered... */ + if (MPI_Recv((void *)0, 10, MPI_INT, src, + 15, MPI_COMM_WORLD, &status) == MPI_SUCCESS){ + Test_Failed("Invalid Buffer Test (recv)"); + } + else + Test_Passed("Invalid Buffer Test (recv)"); + + /* Just to keep things happy, see if there is a message to receive */ + { //int flag, + int ibuf[10]; - MPI_Iprobe( src, 15, MPI_COMM_WORLD, &flag, &status ); - if (flag) - MPI_Recv( ibuf, 10, MPI_INT, src, 15, MPI_COMM_WORLD, &status ); - } - MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL ); - return; + //MPI_Iprobe( src, 15, MPI_COMM_WORLD, &flag, &status ); + //if (flag) + MPI_Recv( ibuf, 10, MPI_INT, src, 15, MPI_COMM_WORLD, &status ); + } + MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL ); + return; } /* Allow -nolongdouble to suppress long double testing */ int main( int argc, char **argv ) { - int myrank, mysize; - int rc, itemp, i; - - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &myrank); - MPI_Comm_size(MPI_COMM_WORLD, &mysize); - Test_Init("sendrecv", myrank); - SetupBasicTypes(); - - if (mysize != 2) { - fprintf(stderr, - "*** This test program requires exactly 2 processes.\n"); - MPI_Abort( MPI_COMM_WORLD, 1 ); - } - - /* Get the min of the basic types */ - itemp = ntypes; - MPI_Allreduce( &itemp, &ntypes, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD ); - - /* dest writes out the received stats; for the output to be - consistant (with the final check), it should be procees 0 */ - for (i=1; i +#include +#include +#include +#include "mpi.h" + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#endif + +int main(int argc, char *argv[]) +{ + int rank, size; + int i; + int *sb; + int *rb; + int status; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + sb = (int *) xbt_malloc(size * sizeof(int)); + rb = (int *) xbt_malloc(size * sizeof(int)); + + for (i = 0; i < size; ++i) { + sb[i] = rank*size + i; + rb[i] = 0; + } + + printf("[%d] sndbuf=[", rank); + for (i = 0; i < size; i++) + printf("%d ", sb[i]); + printf("]\n"); + + status = MPI_Reduce(sb, rb, size, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); + MPI_Barrier(MPI_COMM_WORLD); + + if (rank == 0) { + printf("[%d] rcvbuf=[", rank); + for (i = 0; i < size; i++) + printf("%d ", rb[i]); + printf("]\n"); + if (status != MPI_SUCCESS) { + printf("all_to_all returned %d\n", status); + fflush(stdout); + } + } + free(sb); + free(rb); + MPI_Finalize(); + return (EXIT_SUCCESS); +} diff --git a/teshsuite/smpi/reduce_coll.tesh b/teshsuite/smpi/reduce_coll.tesh new file mode 100644 index 0000000000..ae94a6c5b5 --- /dev/null +++ b/teshsuite/smpi/reduce_coll.tesh @@ -0,0 +1,41 @@ +# Smpi Allreduce collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test allreduce +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./reduce_coll +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] +> [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ] +> [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ] +> [3] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ] +> [4] sndbuf=[64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] +> [5] sndbuf=[80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ] +> [6] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ] +> [7] sndbuf=[112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 ] +> [8] sndbuf=[128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 ] +> [9] sndbuf=[144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 ] +> [10] sndbuf=[160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 ] +> [11] sndbuf=[176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 ] +> [12] sndbuf=[192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 ] +> [13] sndbuf=[208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 ] +> [14] sndbuf=[224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 ] +> [15] sndbuf=[240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 ] +> [0] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ] diff --git a/teshsuite/smpi/reduce_scatter_coll.c b/teshsuite/smpi/reduce_scatter_coll.c new file mode 100644 index 0000000000..cba19bc43f --- /dev/null +++ b/teshsuite/smpi/reduce_scatter_coll.c @@ -0,0 +1,50 @@ +/* + * Test of reduce scatter. + * + * Each processor contributes its rank + the index to the reduction, + * then receives the ith sum + * + * Can be called with any number of processors. + */ + +#include "mpi.h" +#include +#include + +int main( int argc, char **argv ) +{ + int err = 0, toterr; + int *sendbuf, *recvbuf, *recvcounts; + int size, rank, i, sumval; + MPI_Comm comm; + + + MPI_Init( &argc, &argv ); + comm = MPI_COMM_WORLD; + + MPI_Comm_size( comm, &size ); + MPI_Comm_rank( comm, &rank ); + sendbuf = (int *) malloc( size * sizeof(int) ); + for (i=0; i No Errors +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [rank 0] -> Tremblay +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa diff --git a/teshsuite/smpi/scatter_coll.tesh b/teshsuite/smpi/scatter_coll.tesh new file mode 100644 index 0000000000..f5d2c79901 --- /dev/null +++ b/teshsuite/smpi/scatter_coll.tesh @@ -0,0 +1,58 @@ +# Smpi scatter collectives tests +! setenv LD_LIBRARY_PATH=../../lib +! output sort + +p Test scatter +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./scatter +> [0] ok. +> [0] ok. +> [10] ok. +> [10] ok. +> [11] ok. +> [11] ok. +> [12] ok. +> [12] ok. +> [13] ok. +> [13] ok. +> [14] ok. +> [14] ok. +> [15] ok. +> [15] ok. +> [1] ok. +> [1] ok. +> [2] ok. +> [2] ok. +> [3] ok. +> [3] ok. +> [4] ok. +> [4] ok. +> [5] ok. +> [5] ok. +> [6] ok. +> [6] ok. +> [7] ok. +> [7] ok. +> [8] ok. +> [8] ok. +> [9] ok. +> [9] ok. +> ** IBM Test Result: ... +> ** Small Test Result: ... +> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [rank 0] -> Tremblay +> [rank 10] -> Tremblay +> [rank 11] -> Jupiter +> [rank 12] -> Fafard +> [rank 13] -> Ginette +> [rank 14] -> Bourassa +> [rank 15] -> Tremblay +> [rank 1] -> Jupiter +> [rank 2] -> Fafard +> [rank 3] -> Ginette +> [rank 4] -> Bourassa +> [rank 5] -> Tremblay +> [rank 6] -> Jupiter +> [rank 7] -> Fafard +> [rank 8] -> Ginette +> [rank 9] -> Bourassa diff --git a/teshsuite/xbt/CMakeLists.txt b/teshsuite/xbt/CMakeLists.txt index 8a8b7b78de..0a4b766365 100644 --- a/teshsuite/xbt/CMakeLists.txt +++ b/teshsuite/xbt/CMakeLists.txt @@ -7,6 +7,7 @@ if(NOT WIN32) if(HAVE_MMAP) add_executable(mmalloc_test mmalloc_test.c) endif() + add_executable(parmap_test parmap_test.c) endif() ### Add definitions for compile @@ -16,6 +17,7 @@ if(NOT WIN32) if(HAVE_MMAP) target_link_libraries(mmalloc_test simgrid m pthread ) endif() + target_link_libraries(parmap_test simgrid m pthread ) endif() set(tesh_files @@ -25,6 +27,7 @@ set(tesh_files ${CMAKE_CURRENT_SOURCE_DIR}/xbt.tesh ${CMAKE_CURRENT_SOURCE_DIR}/mmalloc_64.tesh ${CMAKE_CURRENT_SOURCE_DIR}/mmalloc_32.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/parmap_test.tesh PARENT_SCOPE ) set(xml_files @@ -36,6 +39,7 @@ set(teshsuite_src ${CMAKE_CURRENT_SOURCE_DIR}/log_large_test.c ${CMAKE_CURRENT_SOURCE_DIR}/parallel_log_crashtest.c ${CMAKE_CURRENT_SOURCE_DIR}/mmalloc_test.c + ${CMAKE_CURRENT_SOURCE_DIR}/parmap_test.c PARENT_SCOPE ) set(bin_files diff --git a/teshsuite/xbt/mmalloc_32.tesh b/teshsuite/xbt/mmalloc_32.tesh index b0161258f4..6da3d56fec 100644 --- a/teshsuite/xbt/mmalloc_32.tesh +++ b/teshsuite/xbt/mmalloc_32.tesh @@ -1,106 +1,106 @@ $ ./xbt/mmalloc_test --log=root.fmt:%m%n > Allocating a new heap > HeapA allocated -> 100 bytes allocated with offset 55000 -> 200 bytes allocated with offset 56000 -> 300 bytes allocated with offset 57000 -> 400 bytes allocated with offset 57200 -> 500 bytes allocated with offset 57400 -> 600 bytes allocated with offset 58000 -> 700 bytes allocated with offset 58400 -> 800 bytes allocated with offset 58800 -> 900 bytes allocated with offset 58c00 -> 1000 bytes allocated with offset 59000 -> 1100 bytes allocated with offset 5a000 -> 1200 bytes allocated with offset 5a800 -> 1300 bytes allocated with offset 5b000 -> 1400 bytes allocated with offset 5b800 -> 1500 bytes allocated with offset 5c000 -> 1600 bytes allocated with offset 5c800 -> 1700 bytes allocated with offset 5d000 -> 1800 bytes allocated with offset 5d800 -> 1900 bytes allocated with offset 5e000 -> 2000 bytes allocated with offset 5e800 -> 2100 bytes allocated with offset 5f000 -> 2200 bytes allocated with offset 60000 -> 2300 bytes allocated with offset 61000 -> 2400 bytes allocated with offset 62000 -> 2500 bytes allocated with offset 63000 -> 2600 bytes allocated with offset 64000 -> 2700 bytes allocated with offset 65000 -> 2800 bytes allocated with offset 66000 -> 2900 bytes allocated with offset 67000 -> 3000 bytes allocated with offset 68000 -> 3100 bytes allocated with offset 69000 -> 3200 bytes allocated with offset 6a000 -> 3300 bytes allocated with offset 6b000 -> 3400 bytes allocated with offset 6c000 -> 3500 bytes allocated with offset 6d000 -> 3600 bytes allocated with offset 6e000 -> 3700 bytes allocated with offset 6f000 -> 3800 bytes allocated with offset 70000 -> 3900 bytes allocated with offset 71000 -> 4000 bytes allocated with offset 72000 -> 4100 bytes allocated with offset 73000 -> 4200 bytes allocated with offset 75000 -> 4300 bytes allocated with offset 77000 -> 4400 bytes allocated with offset 79000 -> 4500 bytes allocated with offset 7b000 -> 4600 bytes allocated with offset 7d000 -> 4700 bytes allocated with offset 7f000 -> 4800 bytes allocated with offset 81000 -> 4900 bytes allocated with offset 83000 -> 5000 bytes allocated with offset 85000 -> 100 bytes allocated with offset 55080 -> 200 bytes allocated with offset 56100 -> 300 bytes allocated with offset 57600 -> 400 bytes allocated with offset 57800 -> 500 bytes allocated with offset 57a00 -> 600 bytes allocated with offset 59400 -> 700 bytes allocated with offset 59800 -> 800 bytes allocated with offset 59c00 -> 900 bytes allocated with offset 87000 -> 1000 bytes allocated with offset 87400 -> 1100 bytes allocated with offset 88000 -> 1200 bytes allocated with offset 88800 -> 1300 bytes allocated with offset 89000 -> 1400 bytes allocated with offset 89800 -> 1500 bytes allocated with offset 8a000 -> 1600 bytes allocated with offset 8a800 -> 1700 bytes allocated with offset 8b000 -> 1800 bytes allocated with offset 8b800 -> 1900 bytes allocated with offset 8c000 -> 2000 bytes allocated with offset 8c800 -> 2100 bytes allocated with offset 8d000 -> 2200 bytes allocated with offset 8e000 -> 2300 bytes allocated with offset 8f000 -> 2400 bytes allocated with offset 90000 -> 2500 bytes allocated with offset 91000 -> 2600 bytes allocated with offset 92000 -> 2700 bytes allocated with offset 93000 -> 2800 bytes allocated with offset 94000 -> 2900 bytes allocated with offset 95000 -> 3000 bytes allocated with offset 96000 -> 3100 bytes allocated with offset 97000 -> 3200 bytes allocated with offset 98000 -> 3300 bytes allocated with offset 99000 -> 3400 bytes allocated with offset 9a000 -> 3500 bytes allocated with offset 9b000 -> 3600 bytes allocated with offset 9c000 -> 3700 bytes allocated with offset 9d000 -> 3800 bytes allocated with offset 9e000 -> 3900 bytes allocated with offset 9f000 -> 4000 bytes allocated with offset a0000 -> 4100 bytes allocated with offset a1000 -> 4200 bytes allocated with offset a3000 -> 4300 bytes allocated with offset a5000 -> 4400 bytes allocated with offset a7000 -> 4500 bytes allocated with offset a9000 -> 4600 bytes allocated with offset ab000 -> 4700 bytes allocated with offset ad000 -> 4800 bytes allocated with offset af000 -> 4900 bytes allocated with offset b1000 -> 5000 bytes allocated with offset b3000 +> 100 bytes allocated with offset 65000 +> 200 bytes allocated with offset 66000 +> 300 bytes allocated with offset 67000 +> 400 bytes allocated with offset 67200 +> 500 bytes allocated with offset 67400 +> 600 bytes allocated with offset 68000 +> 700 bytes allocated with offset 68400 +> 800 bytes allocated with offset 68800 +> 900 bytes allocated with offset 68c00 +> 1000 bytes allocated with offset 69000 +> 1100 bytes allocated with offset 6a000 +> 1200 bytes allocated with offset 6a800 +> 1300 bytes allocated with offset 6b000 +> 1400 bytes allocated with offset 6b800 +> 1500 bytes allocated with offset 6c000 +> 1600 bytes allocated with offset 6c800 +> 1700 bytes allocated with offset 6d000 +> 1800 bytes allocated with offset 6d800 +> 1900 bytes allocated with offset 6e000 +> 2000 bytes allocated with offset 6e800 +> 2100 bytes allocated with offset 6f000 +> 2200 bytes allocated with offset 70000 +> 2300 bytes allocated with offset 71000 +> 2400 bytes allocated with offset 72000 +> 2500 bytes allocated with offset 73000 +> 2600 bytes allocated with offset 74000 +> 2700 bytes allocated with offset 75000 +> 2800 bytes allocated with offset 76000 +> 2900 bytes allocated with offset 77000 +> 3000 bytes allocated with offset 78000 +> 3100 bytes allocated with offset 79000 +> 3200 bytes allocated with offset 7a000 +> 3300 bytes allocated with offset 7b000 +> 3400 bytes allocated with offset 7c000 +> 3500 bytes allocated with offset 7d000 +> 3600 bytes allocated with offset 7e000 +> 3700 bytes allocated with offset 7f000 +> 3800 bytes allocated with offset 80000 +> 3900 bytes allocated with offset 81000 +> 4000 bytes allocated with offset 82000 +> 4100 bytes allocated with offset 83000 +> 4200 bytes allocated with offset 85000 +> 4300 bytes allocated with offset 87000 +> 4400 bytes allocated with offset 89000 +> 4500 bytes allocated with offset 8b000 +> 4600 bytes allocated with offset 8d000 +> 4700 bytes allocated with offset 8f000 +> 4800 bytes allocated with offset 91000 +> 4900 bytes allocated with offset 93000 +> 5000 bytes allocated with offset 95000 +> 100 bytes allocated with offset 65080 +> 200 bytes allocated with offset 66100 +> 300 bytes allocated with offset 67600 +> 400 bytes allocated with offset 67800 +> 500 bytes allocated with offset 67a00 +> 600 bytes allocated with offset 69400 +> 700 bytes allocated with offset 69800 +> 800 bytes allocated with offset 69c00 +> 900 bytes allocated with offset 97000 +> 1000 bytes allocated with offset 97400 +> 1100 bytes allocated with offset 98000 +> 1200 bytes allocated with offset 98800 +> 1300 bytes allocated with offset 99000 +> 1400 bytes allocated with offset 99800 +> 1500 bytes allocated with offset 9a000 +> 1600 bytes allocated with offset 9a800 +> 1700 bytes allocated with offset 9b000 +> 1800 bytes allocated with offset 9b800 +> 1900 bytes allocated with offset 9c000 +> 2000 bytes allocated with offset 9c800 +> 2100 bytes allocated with offset 9d000 +> 2200 bytes allocated with offset 9e000 +> 2300 bytes allocated with offset 9f000 +> 2400 bytes allocated with offset a0000 +> 2500 bytes allocated with offset a1000 +> 2600 bytes allocated with offset a2000 +> 2700 bytes allocated with offset a3000 +> 2800 bytes allocated with offset a4000 +> 2900 bytes allocated with offset a5000 +> 3000 bytes allocated with offset a6000 +> 3100 bytes allocated with offset a7000 +> 3200 bytes allocated with offset a8000 +> 3300 bytes allocated with offset a9000 +> 3400 bytes allocated with offset aa000 +> 3500 bytes allocated with offset ab000 +> 3600 bytes allocated with offset ac000 +> 3700 bytes allocated with offset ad000 +> 3800 bytes allocated with offset ae000 +> 3900 bytes allocated with offset af000 +> 4000 bytes allocated with offset b0000 +> 4100 bytes allocated with offset b1000 +> 4200 bytes allocated with offset b3000 +> 4300 bytes allocated with offset b5000 +> 4400 bytes allocated with offset b7000 +> 4500 bytes allocated with offset b9000 +> 4600 bytes allocated with offset bb000 +> 4700 bytes allocated with offset bd000 +> 4800 bytes allocated with offset bf000 +> 4900 bytes allocated with offset c1000 +> 5000 bytes allocated with offset c3000 > All blocks were correctly allocated. Free every second block > Memset every second block to zero (yeah, they are not currently allocated :) > Re-allocate every second block diff --git a/teshsuite/xbt/parmap_test.c b/teshsuite/xbt/parmap_test.c new file mode 100644 index 0000000000..06b41e1db0 --- /dev/null +++ b/teshsuite/xbt/parmap_test.c @@ -0,0 +1,140 @@ +/* parmap_test -- test parmap */ + +/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "simgrid/simix.h" +#include "xbt.h" +#include "xbt/ex.h" +#include "xbt/xbt_os_time.h" +#include "internal_config.h" + +XBT_LOG_NEW_DEFAULT_CATEGORY(parmap_test, "Test for parmap"); + +static void fun_double(void *arg) +{ + unsigned *u = arg; + *u = 2 * *u + 1; +} + +static int test_parmap_basic(e_xbt_parmap_mode_t mode) +{ + int ret = 0; + unsigned num_workers; + for (num_workers = 1 ; num_workers <= 16 ; num_workers *= 2) { + const unsigned len = 1033; + const unsigned num = 5; + unsigned *a; + xbt_dynar_t data; + xbt_parmap_t parmap; + unsigned i; + + parmap = xbt_parmap_new(num_workers, mode); + + a = xbt_malloc(len * sizeof *a); + data = xbt_dynar_new(sizeof a, NULL); + for (i = 0; i < len; i++) { + a[i] = i; + xbt_dynar_push_as(data, void *, &a[i]); + } + + for (i = 0; i < num; i++) + xbt_parmap_apply(parmap, fun_double, data); + + for (i = 0; i < len; i++) { + unsigned expected = (1U << num) * (i + 1) - 1; + if (a[i] != expected) { + XBT_CRITICAL("with %u threads, a[%u]: expected %u, got %u", + num_workers, i, expected, a[i]); + ret = 1; + break; + } + } + + xbt_dynar_free(&data); + xbt_free(a); + xbt_parmap_destroy(parmap); + } + return ret; +} + +static void fun_get_id(void *arg) +{ + *(uintptr_t *)arg = (uintptr_t)xbt_os_thread_self(); + xbt_os_sleep(0.05); +} + +static int fun_compare(const void *pa, const void *pb) +{ + uintptr_t a = *(uintptr_t *)pa; + uintptr_t b = *(uintptr_t *)pb; + return a < b ? -1 : a > b ? 1 : 0; +} + +static int test_parmap_extended(e_xbt_parmap_mode_t mode) +{ + int ret = 0; + unsigned num_workers; + + for (num_workers = 1 ; num_workers <= 16 ; num_workers *= 2) { + const unsigned len = 2 * num_workers; + uintptr_t *a; + xbt_parmap_t parmap; + xbt_dynar_t data; + unsigned i; + unsigned count; + + parmap = xbt_parmap_new(num_workers, mode); + + a = xbt_malloc(len * sizeof *a); + data = xbt_dynar_new(sizeof a, NULL); + for (i = 0; i < len; i++) + xbt_dynar_push_as(data, void *, &a[i]); + + xbt_parmap_apply(parmap, fun_get_id, data); + + qsort(a, len, sizeof a[0], fun_compare); + count = 1; + for (i = 1; i < len; i++) + if (a[i] != a[i - 1]) + count++; + if (count != num_workers) { + XBT_CRITICAL("only %u/%u threads did some work", count, num_workers); + ret = 1; + } + + xbt_dynar_free(&data); + xbt_free(a); + xbt_parmap_destroy(parmap); + } + return ret; +} + +int main(int argc, char** argv) +{ + int status = 0; + SIMIX_global_init(&argc, argv); + + XBT_INFO("Basic testing posix"); + status += test_parmap_basic(XBT_PARMAP_POSIX); + XBT_INFO("Basic testing futex"); +#ifdef HAVE_FUTEX_H + status += test_parmap_basic(XBT_PARMAP_FUTEX); +#endif + XBT_INFO("Basic testing busy wait"); + status += test_parmap_basic(XBT_PARMAP_BUSY_WAIT); + + XBT_INFO("Extended testing posix"); + status += test_parmap_extended(XBT_PARMAP_POSIX); + XBT_INFO("Extended testing futex"); +#ifdef HAVE_FUTEX_H + status += test_parmap_extended(XBT_PARMAP_FUTEX); +#endif + XBT_INFO("Extended testing busy wait"); + status += test_parmap_extended(XBT_PARMAP_BUSY_WAIT); + + return status == 0 ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/teshsuite/xbt/parmap_test.tesh b/teshsuite/xbt/parmap_test.tesh new file mode 100644 index 0000000000..2b85ff664a --- /dev/null +++ b/teshsuite/xbt/parmap_test.tesh @@ -0,0 +1,8 @@ +! timeout 120 +$ ./xbt/parmap_test --log=root.fmt:%m%n +> Basic testing posix +> Basic testing futex +> Basic testing busy wait +> Extended testing posix +> Extended testing futex +> Extended testing busy wait diff --git a/testsuite/surf/platform.xml b/testsuite/surf/platform.xml index 1fb76b0998..b6c18bb7af 100644 --- a/testsuite/surf/platform.xml +++ b/testsuite/surf/platform.xml @@ -2,9 +2,9 @@ - - - + + + diff --git a/testsuite/xbt/parmap_bench.c b/testsuite/xbt/parmap_bench.c index d63bfc3fe4..e95d77deae 100644 --- a/testsuite/xbt/parmap_bench.c +++ b/testsuite/xbt/parmap_bench.c @@ -4,6 +4,7 @@ #include #include #include /* HAVE_FUTEX_H */ +#include "simgrid/simix.h" #include "xbt/xbt_os_time.h" #define MODES_DEFAULT 0x7 @@ -166,6 +167,8 @@ int main(int argc, char *argv[]) int nthreads; unsigned modes = MODES_DEFAULT; + SIMIX_global_init(&argc, argv); + if (argc != 2 && argc != 3) { fprintf(stderr, "Usage: %s nthreads [modes]\n" diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index bcf8684780..147c734879 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -4,11 +4,13 @@ set(bin_files ${bin_files} ${CMAKE_CURRENT_SOURCE_DIR}/fix-paje-trace.sh ${CMAKE_CURRENT_SOURCE_DIR}/indent + ${CMAKE_CURRENT_SOURCE_DIR}/platf_route_rulebased2full.py ${CMAKE_CURRENT_SOURCE_DIR}/sg_unit_extractor.pl + ${CMAKE_CURRENT_SOURCE_DIR}/sg_xml_unit_converter.py ${CMAKE_CURRENT_SOURCE_DIR}/simgrid_update_xml.pl ${CMAKE_CURRENT_SOURCE_DIR}/xbt_exception_checker - ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/index_create.pl ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/fig2dev_postprocessor.pl + ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/index_create.pl ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/xbt_log_extract_hierarchy.pl ${CMAKE_CURRENT_SOURCE_DIR}/MSG_visualization/colorize.pl ${CMAKE_CURRENT_SOURCE_DIR}/MSG_visualization/trace2fig.pl diff --git a/tools/check_dist_archive b/tools/check_dist_archive index 7937222119..d2821499b8 100755 --- a/tools/check_dist_archive +++ b/tools/check_dist_archive @@ -13,7 +13,7 @@ fi if [ $# -lt 1 -o $# -gt 3 ]; then cat < $git_dir" -git archive --format=tar --prefix="b/" --remote="$giturl" "$gitbranch" \ +echo "Copying git repository: $giturl/$gitref -> $git_dir" +git archive --format=tar --prefix="b/" --remote="$giturl" "$gitref" \ | tar --directory "$tmpdir" --extract --file - fa=from_tgz @@ -86,7 +86,13 @@ diffcmd() { echo "The archive looks good." else status=1 - echo "Some files are missing and/or unexpected in the archive." + cat <= 1.0: + tmp = "%s%s"%(to_str(d), f) + break + res.append(tmp) + except: + print "Error with:", val + res.append(val) + m = re.search(r'%s="(.*?)"'%attrib, xml) + + res.append(xml) + return "".join(res) + +def formats(list): + return sorted(((Decimal(i), j) for i,j in list), key=lambda x: x[0], reverse=True) + +for root, dirnames, filenames in os.walk(sys.argv[1]): + for filename in fnmatch.filter(filenames, '*.xml'): + print root, dirnames, filename + path = os.path.join(root, filename) + xml = open(path).read() + + power_formats = formats([( "1E0", "f"), + ( "1E3", "kf"), + ( "1E6", "Mf"), + ( "1E9", "Gf"), + ("1E12", "Tf"), + ("1E15", "Pt"), + ("1E18", "Ef"), + ("1E21", "Zf")]) + xml = format(xml, power_formats, "power") + + bandwidth_formats = formats([( "1E0", "Bps"), + ( "1E3", "kBps"), + ( "1E6", "MBps"), + ( "1E9", "GBps"), + ("1E12", "TBps")]) + xml = format(xml, bandwidth_formats, "bandwidth") + xml = format(xml, bandwidth_formats, "bw") + xml = format(xml, bandwidth_formats, "bb_bw") + xml = format(xml, bandwidth_formats, "bw_in") + xml = format(xml, bandwidth_formats, "bw_out") + + time_formats = formats([( "1E-12", "ps"), + ( "1E-9" , "ns"), + ( "1E-6" , "us"), + ( "1E-3" , "ms"), + ( "1E0" , "s"), + ( "60E0" , "m"), + ( "3600E0" , "h"), + ( "86400E0" , "d"), + ("604800E0" , "w")]) + xml = format(xml, time_formats, "latency") + xml = format(xml, time_formats, "lat") + xml = format(xml, time_formats, "bb_lat") + + #print xml + file = open(path, "w") + file.write(xml) + file.close() diff --git a/tools/tesh/run_context.c b/tools/tesh/run_context.c index 747976806c..c6113367ad 100644 --- a/tools/tesh/run_context.c +++ b/tools/tesh/run_context.c @@ -777,38 +777,20 @@ void *rctx_wait(void *r) xbt_dynar_free(&a); } - { // Sorting output wanted + if (rctx->output_sort) { // Sorting output wanted + char *newbuf; xbt_dynar_t a = xbt_str_split(rctx->output_wanted->data, "\n"); - xbt_dynar_t b = xbt_dynar_new(sizeof(char *), NULL); - unsigned cpt; - char *str; - xbt_dynar_foreach(a, cpt, str) { - if (strncmp(str, "TESH_ERROR ", (sizeof "TESH_ERROR ") - 1) == 0) { - XBT_CRITICAL("%s", str); - errcode = 1; - } else if (coverage && - strncmp(str, "profiling:", (sizeof "profiling:") - 1) == 0) { - XBT_DEBUG("Remove line [%u]: '%s'", cpt, str); - } else { - xbt_dynar_push_as(b, char *, str); - } - } - if (rctx->output_sort) { - stable_sort(b); - /* If empty lines moved in first position, remove them */ - while (!xbt_dynar_is_empty(b) && *xbt_dynar_getfirst_as(b, char*) == '\0') - xbt_dynar_shift(b, NULL); - } + stable_sort(a); + /* If empty lines moved in first position, remove them */ + while (!xbt_dynar_is_empty(a) && *xbt_dynar_getfirst_as(a, char*) == '\0') + xbt_dynar_shift(a, NULL); - if (rctx->output_sort || xbt_dynar_length(b) != xbt_dynar_length(a)) { - char *newbuf = xbt_str_join(b, "\n"); - strcpy(rctx->output_wanted->data, newbuf); - rctx->output_wanted->used = strlen(newbuf); - xbt_free(newbuf); - } + newbuf = xbt_str_join(a, "\n"); + strcpy(rctx->output_wanted->data, newbuf); + rctx->output_wanted->used = strlen(newbuf); + xbt_free(newbuf); - xbt_dynar_free(&b); xbt_dynar_free(&a); } xbt_strbuff_chomp(rctx->output_got);