Changeset 419:79940a8687ac

Show
Ignore:
Timestamp:
11/08/2012 12:26:37 AM (7 months ago)
Author:
Andreas Schaefer <gentryx@…>
Branch:
default
Message:

cleaned up Jacobi3D example, minor fixes

Location:
src
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • src/examples/jacobi3d/jacobi3d.cpp

    r410 r419  
    1 #include <emmintrin.h> 
     1#include <cmath> 
    22#include <mpi.h> 
    33 
     
    77#include <libgeodecomp/loadbalancer/tracingbalancer.h> 
    88#include <libgeodecomp/loadbalancer/noopbalancer.h> 
    9 #include <libgeodecomp/parallelization/stripingsimulator.h> 
     9#include <libgeodecomp/misc/cellapitraits.h> 
     10#include <libgeodecomp/parallelization/hiparsimulator.h> 
     11#include <libgeodecomp/parallelization/hiparsimulator/partitions/recursivebisectionpartition.h> 
    1012 
    1113using namespace LibGeoDecomp; 
     
    1618    typedef Stencils::VonNeumann<3, 1> Stencil; 
    1719    typedef Topologies::Cube<3>::Topology Topology; 
    18  
    19     class API : public CellAPITraits::Base 
     20    class API : public CellAPITraits::Fixed 
    2021    {}; 
    2122 
     
    3132    void update(const COORD_MAP& neighborhood, const unsigned& nanoStep) 
    3233    { 
    33         temp = (neighborhood[Coord<3>( 0,  0, -1)].temp +  
    34                 neighborhood[Coord<3>( 0, -1,  0)].temp +  
    35                 neighborhood[Coord<3>(-1,  0,  0)].temp +  
    36                 neighborhood[Coord<3>( 1,  0,  0)].temp +  
    37                 neighborhood[Coord<3>( 0,  1,  0)].temp +  
    38                 neighborhood[Coord<3>( 0,  0,  1)].temp) * (1.0 / 6.0); 
    39     } 
    40  
    41     static void update( 
    42         Cell *target, Cell* right, Cell *top,  
    43         Cell *center, Cell *bottom, Cell *left,  
    44         const int& length, const unsigned& nanoStep)  
    45     { 
    46         double factor = 1.0 / 6.0; 
    47         __m128d xFactor, cell1, cell2, cell3, cell4, tmp0, tmp1, tmp2, tmp3, tmp4; 
    48         xFactor = _mm_set_pd(factor, factor); 
    49  
    50         tmp0 = _mm_loadu_pd((double*) &center[-1]); 
    51  
    52         for (int start = 0; start < length - 7; start +=8) { 
    53             cell1 = _mm_load_pd((double*) &right[start] + 0); 
    54             cell2 = _mm_load_pd((double*) &right[start] + 2); 
    55             cell3 = _mm_load_pd((double*) &right[start] + 4); 
    56             cell4 = _mm_load_pd((double*) &right[start] + 6); 
    57  
    58             tmp1 = _mm_load_pd((double*) &top[start] + 0); 
    59             tmp2 = _mm_load_pd((double*) &top[start] + 2); 
    60             tmp3 = _mm_load_pd((double*) &top[start] + 4); 
    61             tmp4 = _mm_load_pd((double*) &top[start] + 6); 
    62  
    63             cell1 = _mm_add_pd(cell1, tmp1); 
    64             cell2 = _mm_add_pd(cell2, tmp2); 
    65             cell3 = _mm_add_pd(cell3, tmp3); 
    66             cell4 = _mm_add_pd(cell4, tmp4); 
    67  
    68             tmp1 = _mm_load_pd((double*) &center[start] + 0); 
    69             tmp2 = _mm_load_pd((double*) &center[start] + 2); 
    70             tmp3 = _mm_load_pd((double*) &center[start] + 4); 
    71             tmp4 = _mm_load_pd((double*) &center[start] + 6); 
    72  
    73             cell1 = _mm_add_pd(cell1, tmp1); 
    74             cell2 = _mm_add_pd(cell2, tmp2); 
    75             cell3 = _mm_add_pd(cell3, tmp3); 
    76             cell4 = _mm_add_pd(cell4, tmp4); 
    77  
    78             tmp1 = _mm_loadu_pd((double*) &bottom[start] + 1); 
    79             tmp2 = _mm_loadu_pd((double*) &bottom[start] + 3); 
    80             tmp3 = _mm_loadu_pd((double*) &bottom[start] + 5); 
    81             tmp4 = _mm_loadu_pd((double*) &bottom[start] + 7); 
    82  
    83             cell1 = _mm_add_pd(cell1, tmp0); 
    84             cell2 = _mm_add_pd(cell2, tmp1); 
    85             cell3 = _mm_add_pd(cell3, tmp2); 
    86             cell4 = _mm_add_pd(cell4, tmp3); 
    87  
    88             cell1 = _mm_add_pd(cell1, tmp1); 
    89             cell2 = _mm_add_pd(cell2, tmp2); 
    90             cell3 = _mm_add_pd(cell3, tmp3); 
    91             cell4 = _mm_add_pd(cell4, tmp4); 
    92  
    93             tmp0 = tmp4; 
    94  
    95             tmp1 = _mm_load_pd((double*) &center[start] + 0); 
    96             tmp2 = _mm_load_pd((double*) &center[start] + 2); 
    97             tmp3 = _mm_load_pd((double*) &center[start] + 4); 
    98             tmp4 = _mm_load_pd((double*) &center[start] + 6); 
    99  
    100             cell1 = _mm_add_pd(cell1, tmp1); 
    101             cell2 = _mm_add_pd(cell2, tmp2); 
    102             cell3 = _mm_add_pd(cell3, tmp3); 
    103             cell4 = _mm_add_pd(cell4, tmp4); 
    104  
    105             tmp1 = _mm_load_pd((double*) &left[start] + 0); 
    106             tmp2 = _mm_load_pd((double*) &left[start] + 2); 
    107             tmp3 = _mm_load_pd((double*) &left[start] + 4); 
    108             tmp4 = _mm_load_pd((double*) &left[start] + 6); 
    109  
    110             cell1 = _mm_add_pd(cell1, tmp1); 
    111             cell2 = _mm_add_pd(cell2, tmp2); 
    112             cell3 = _mm_add_pd(cell3, tmp3); 
    113             cell4 = _mm_add_pd(cell4, tmp4); 
    114  
    115             cell1 = _mm_mul_pd(cell1, xFactor); 
    116             cell2 = _mm_mul_pd(cell2, xFactor); 
    117             cell3 = _mm_mul_pd(cell3, xFactor); 
    118             cell4 = _mm_mul_pd(cell4, xFactor); 
    119  
    120             _mm_store_pd((double*) &target[start] + 0, cell1); 
    121             _mm_store_pd((double*) &target[start] + 2, cell2); 
    122             _mm_store_pd((double*) &target[start] + 4, cell3); 
    123             _mm_store_pd((double*) &target[start] + 6, cell4); 
    124         } 
     34        temp = (neighborhood[FixedCoord< 0,  0, -1>()].temp +  
     35                neighborhood[FixedCoord< 0, -1,  0>()].temp +  
     36                neighborhood[FixedCoord<-1,  0,  0>()].temp +  
     37                neighborhood[FixedCoord< 1,  0,  0>()].temp +  
     38                neighborhood[FixedCoord< 0,  1,  0>()].temp +  
     39                neighborhood[FixedCoord< 0,  0,  1>()].temp) * (1.0 / 6.0); 
    12540    } 
    12641 
     
    13348    using SimpleInitializer<Cell>::gridDimensions; 
    13449 
    135     CellInitializer(int num) : SimpleInitializer<Cell>(Coord<3>(64, 64, 64 * num), 100) 
     50    CellInitializer(int num) : SimpleInitializer<Cell>( 
     51        Coord<3>(128 * num,  
     52                 128 * num, 
     53                 128 * num), 1000) 
    13654    {} 
    13755 
     
    15876void runSimulation() 
    15977{ 
    160     int outputFrequency = 10; 
    161     StripingSimulator<Cell> sim( 
    162         new CellInitializer(MPILayer().size()), 
     78    int outputFrequency = 100; 
     79    int factor = pow(MPILayer().size(), 1.0 / 3.0); 
     80 
     81    HiParSimulator::HiParSimulator<Cell, HiParSimulator::RecursiveBisectionPartition<3> > sim( 
     82        new CellInitializer(factor), 
    16383        MPILayer().rank() ? 0 : new TracingBalancer(new NoOpBalancer()),  
    16484        1000, 
     85        1,  
    16586        MPI::DOUBLE); 
    166     if (MPILayer().rank() == 0) 
     87 
     88    if (MPILayer().rank() == 0) { 
    16789        new TracingWriter<Cell>(&sim, outputFrequency); 
     90    } 
    16891 
    16992    sim.run(); 
  • src/io/steerer.h

    r355 r419  
    1414    typedef GridBase<CELL_TYPE, Topology::DIMENSIONS> GridType; 
    1515 
    16     Steerer(const unsigned& _period) : 
     16    Steerer(const unsigned _period) : 
    1717        period(_period) 
    1818    {} 
  • src/parallelization/hiparsimulator/gridvecconv.h

    r342 r419  
    4545        const Region<GRID_TYPE::DIM>& region) 
    4646    { 
    47         if (vec.size() != region.size()) 
     47        if (vec.size() != region.size()) { 
    4848            throw std::logic_error("region doesn't match vector size"); 
     49        } 
    4950 
    5051        const typename GRID_TYPE::CellType *source = &vec[0];