#include <vector>
#include <iostream>
#include <diy/mpi.hpp>
#include <diy/master.hpp>
#include <diy/assigner.hpp>
#include <diy/serialization.hpp>
#include <diy/io/block.hpp>
#include "../opts.h"
#include "block.h"
#define UNUSED(expr) do { (void)(expr); } while (0)
void local_sum(Block* b,
{
int total = 0;
for (unsigned i = 0; i < b->values.size(); ++i)
total += b->values[i];
std::cout <<
"Total (" << cp.
gid() <<
"): " << total << std::endl;
for (
int i = 0; i < l->
size(); ++i)
}
void average_neighbors(Block* b,
{
int all_total = cp.
get<
int>(); UNUSED(all_total);
int total = 0;
for (unsigned i = 0; i < in.size(); ++i)
{
int v;
total += v;
}
b->average = float(total) / in.size();
std::cout << "Average (" << cp.gid() << "): " << b->average << std::endl;
}
int main(int argc, char* argv[])
{
int nblocks = 128;
int threads = 4;
int in_memory = 8;
std::string prefix = "./DIY.XXXXXX";
using namespace opts;
Options ops(argc, argv);
ops
>> Option('b', "blocks", nblocks, "number of blocks")
>> Option('t', "thread", threads, "number of threads")
>> Option('m', "memory", in_memory, "maximum blocks to store in memory")
>> Option( "prefix", prefix, "prefix for external storage")
;
if (ops >> Present('h', "help", "show help"))
{
std::cout << ops;
return 1;
}
threads,
in_memory,
&create_block,
&destroy_block,
&storage,
&save_block,
&load_block);
std::vector<int> gids;
for (unsigned i = 0; i < gids.size(); ++i)
{
int gid = gids[i];
if (gid < nblocks - 1)
{
neighbor.
proc = assigner.rank(neighbor.gid);
link->
add_neighbor(neighbor);
}
if (gid > 0)
{
neighbor.gid = gid - 1;
neighbor.proc = assigner.rank(neighbor.gid);
link->add_neighbor(neighbor);
}
Block* b = new Block;
for (unsigned i = 0; i < 3; ++i)
b->values.push_back(gid * 3 + i);
master.add(gid, b, link);
}
master.foreach(&local_sum);
master.exchange();
master.foreach(&average_neighbors);
if (world.rank() == 0)
master.prof.output(std::cout);
}