4
#include "UniformTaskCollSplitData.h"
18
using namespace tascel;
21
UniformTaskCollSplitData::UniformTaskCollSplitData(const TaskCollProps &props,
22
const std::vector<DataColl*>& _colls,
23
const std::vector<AccessMode>& _modes,
24
const std::vector<int>& _idxlens,
25
compute_index_t _ci_fn)
26
: UniformTaskCollectionSplit(props)
28
, colls(_colls.begin(), _colls.end())
29
, modes(_modes.begin(), _modes.end())
30
, idxlens(_idxlens.begin(), _idxlens.end())
32
assert(colls.size() == modes.size());
33
assert(colls.size() == idxlens.size());
37
UniformTaskCollSplitData::~UniformTaskCollSplitData() { }
40
UniformTaskCollSplitData::setupDataBufs(vector<void *> &data_bufs, vector<int> &data_lens, const vector<void *> &idxs) {
41
for(int i=0; i<idxlens.size(); i++) {
42
int sz = colls[i]->getSize(idxs[i],idxlens[i]);
43
char *dbuf = new char[sz];
44
data_bufs.push_back(dbuf);
45
data_lens.push_back(sz);
49
colls[i]->get(idxs[i], idxlens[i], dbuf, sz);
52
colls[i]->get(idxs[i], idxlens[i], dbuf, sz);
62
UniformTaskCollSplitData::cleanupDataBufs(vector<void *> &data_bufs,
63
vector<int> &data_lens,
64
const vector<void *> &idxs) {
65
for(int i=0; i<idxlens.size(); i++) {
66
int sz = data_lens[i];
67
char *dbuf = (char *)data_bufs[i];
73
colls[i]->put(idxs[i], idxlens[i], dbuf, sz);
76
colls[i]->add(idxs[i], idxlens[i], dbuf, sz);
86
UniformTaskCollSplitData::process() {
90
TslFunc_t fn = frt.get(tfn);
92
int tasksDone=0, stealAttempts=0, steals=0;
94
for(int i=0; i<idxlens.size(); i++) {
95
idxs.push_back(new char[idxlens[i]]);
98
while (!sq.hasTerminated()) {
99
while (sq.getTask(buf, tsk_size)) {
101
vector<int> data_lens;
102
vector<void *> data_bufs;
103
for(int i=0; i<idxlens.size(); i++) {
104
ci_fn(buf, tsk_size, pldata, pldata_len,
105
i, idxs[i], idxlens[i]);
107
setupDataBufs(data_bufs, data_lens, idxs);
108
fn(this, buf, tsk_size, pldata, pldata_len, data_bufs);
109
cleanupDataBufs(data_bufs, data_lens, idxs);
113
while(got_work == false && !sq.hasTerminated()) {
115
p = rand() % nproc();
118
got_work = sq.steal(p);
126
// printf("%d: processed %d tasks attempts=%d steals=%d\n", me(), tasksDone, stealAttempts, steals);