int dmap_range(DMAP *dmap, double from, double to, u32_t *list) { int i = 0, ii = 0, k = 0, kk = 0, j = 0, x = 0, z = 0, ret = 0, n = 0; DMMKV *kvs = NULL; if(dmap && dmap->state) { if(from == to) return dmap_in(dmap, from, list); RWLOCK_RDLOCK(dmap->rwlock); k = dmap_find_slot(dmap, from); kk = dmap_find_slot2(dmap, to); i = dmap_find_kv(dmap, k, from); if(i == -1) { RWLOCK_UNLOCK(dmap->rwlock); return ret; } ii = dmap_find_kv2(dmap, kk, to); if(k == kk) { ret = ii + 1 - i; if(list) { kvs = dmap->map + dmap->slots[k].nodeid; for(x = i; x <= ii; x++) list[z++] = kvs[x].val; } } else { n = dmap->slots[k].count; ret = n - i; if(list) { kvs = dmap->map + dmap->slots[k].nodeid; for(x = i; x < n; x++) list[z++] = kvs[x].val; } for(j = k+1; j < kk; j++) { ret += dmap->slots[j].count; if(list) { kvs = dmap->map + dmap->slots[j].nodeid; for(x = 0; x < dmap->slots[j].count; x++) list[z++] = kvs[x].val; } } ret += ii + 1; if(list) { kvs = dmap->map + dmap->slots[kk].nodeid; for(x = 0; x <= ii; x++) list[z++] = kvs[x].val; } } RWLOCK_UNLOCK(dmap->rwlock); } return ret; }
int dmap_ins(DMAP *dmap, double *keys, int nkeys, u32_t *list) { int ret = 0, i = 0, n = 0; u32_t *plist = list; if(dmap && dmap->state && keys && nkeys > 0) { for(i = 0; i < nkeys; i++) { n = dmap_in(dmap, keys[i], plist); if(list) plist += n; ret += n; } } return ret; }
void ConnectAdapter::initMUSIC(int argc, char** argv) { MUSIC::Setup* setup = new MUSIC::Setup (argc, argv); setup->config("stoptime", &stoptime); setup->config("music_timestep", ×tep); setup->config("weights_filename", &weights_filename); port_in = setup->publishContInput("in"); port_out = setup->publishContOutput("out"); comm = setup->communicator (); int rank = comm.Get_rank (); int nProcesses = comm.Get_size (); if (nProcesses > 1) { std::cout << "ERROR: num processes (np) not equal 1" << std::endl; comm.Abort(1); } // get dimensions of data if (port_in->hasWidth() && port_out->hasWidth()) { size_data_in = port_in->width(); size_data_out = port_out->width(); } else { std::cout << "ERROR: Port-width not defined" << std::endl; comm.Abort(1); } data_in = new double[size_data_in]; for (int i = 0; i < size_data_in; ++i) { data_in[i] = 0.; } vec_data_in = gsl_vector_view_array(data_in, size_data_in); data_out = new double[size_data_out]; for (int i = 0; i < size_data_out; ++i) { data_out[i] = 0.; } vec_data_out = gsl_vector_view_array(data_out, size_data_out); weights = new double[size_data_out * size_data_in]; for (int i = 0; i < size_data_out * size_data_in; ++i) { weights[i] = 0.; } mat_weights = gsl_matrix_view_array(weights, size_data_out, size_data_in); // Declare where in memory to put command_data MUSIC::ArrayData dmap_in(data_in, MPI::DOUBLE, 0, size_data_in); port_in->map (&dmap_in, 0., 1, false); MUSIC::ArrayData dmap_out(data_out, MPI::DOUBLE, 0, size_data_out); port_out ->map (&dmap_out, 1); MPI::COMM_WORLD.Barrier(); runtime = new MUSIC::Runtime (setup, timestep); }
//gcc -o dmap dmap.c -DDMAP_TEST -DTEST_INS -DHAVE_PTHREAD -lpthread && ./dmap int main() { DMAP *dmap = NULL; int i = 0, j = 0, n = 0, total = 0, no = 0, stat[MASK], stat2[MASK]; double val = 0, from = 0, to = 0, *res = NULL; double inputs[256], nos[256], last[256]; double all = 0; time_t stime = 0, etime = 0; void *timer = NULL; if((dmap = dmap_init("/tmp/1.idx"))) { res = (double *)calloc(60000000, sizeof(double)); TIMER_INIT(timer); #ifdef TEST_INS //fprintf(stdout, "sizeof(stat):%d\n", sizeof(stat)); memset(stat, 0, sizeof(stat)); memset(stat2, 0, sizeof(stat2)); srand(time(NULL)); n = 256; for(i = 0; i < n; i++) { no = (rand()%MASK); nos[i] = no; if((i % 3) == 0) inputs[i] = no * -1; else inputs[i] = no; } TIMER_RESET(timer); for(i = 1; i < 20000000; i++) { j = (rand()%n); val = inputs[j]; no = nos[j]; stat[no]++; dmap_set(dmap, i, val); last[j] = i; } TIMER_SAMPLE(timer); fprintf(stdout, "set() 40000000 data, time used:%lld\n", PT_LU_USEC(timer)); TIMER_RESET(timer); for(i = 0; i < n; i++) { dmap_del(dmap, last[i]); } TIMER_SAMPLE(timer); fprintf(stdout, "del() time used:%lld\n", PT_LU_USEC(timer)); TIMER_RESET(timer); for(i = 0; i < n; i++) { val = inputs[i]; no = nos[i]; stat2[no] = dmap_in(dmap, val, res); } TIMER_SAMPLE(timer); fprintf(stdout, "in() time used:%lld\n", PT_LU_USEC(timer)); TIMER_RESET(timer); total = dmap_ins(dmap, inputs, n, NULL); TIMER_SAMPLE(timer); fprintf(stdout, "ins(keys, NULL) total:%d time used:%lld\n", total, PT_LU_USEC(timer)); TIMER_RESET(timer); total = dmap_ins(dmap, inputs, n, res); TIMER_SAMPLE(timer); fprintf(stdout, "ins(keys, res:%p) total:%d time used:%lld\n", res, total, PT_LU_USEC(timer)); for(i = 0; i < n; i++) { j = nos[i]; if(stat[j] != stat2[j]) fprintf(stdout, "%d:%d/%d::%d\n", j, stat[j], stat2[j], inputs[i]); } #ifdef OUT_ALL for(i = 0; i < total; i++) { fprintf(stdout, "%d:%d\n", i, res[i]); } #endif #endif /* for(i = 0; i < dmap->state->count; i++) { fprintf(stdout, "%d:{min:%d max:%d}(%d)\n", i, dmap->slots[i].min, dmap->slots[i].max, dmap->slots[i].count); } */ #ifdef TEST_RANGEFILTER dmap_set(dmap, 1, 1234567); dmap_set(dmap, 2, 1567890); fprintf(stdout, "rangefrom():%d\n", dmap_rangefrom(dmap, 1569000, NULL)); fprintf(stdout, "rangeto():%d\n", dmap_rangeto(dmap, 1111111, NULL)); fprintf(stdout, "range():%d\n", dmap_range(dmap, 1111111, 1600000, NULL)); #endif #ifdef TEST_RANGE srand(time(NULL)); TIMER_RESET(timer); for(i = 1; i < 40000000; i++) { val = 1356969600 + (rand()%31536000); dmap_set(dmap, i, val); } TIMER_SAMPLE(timer); fprintf(stdout, "set() 40000000 timestamps, time used:%lld\n", PT_LU_USEC(timer)); fflush(stdout); srand(time(NULL)); TIMER_RESET(timer); all = 0; for(i = 0; i < 1000; i++) { val = 1356969600 + (rand()%31536000); all += dmap_rangefrom(dmap, val, res); } TIMER_SAMPLE(timer); fprintf(stdout, "rangefrom() 1000 times total:%lld, time used:%lld\n", (long long int)all, PT_LU_USEC(timer)); fflush(stdout); srand(time(NULL)); TIMER_RESET(timer); all = 0; for(i = 0; i < 1000; i++) { val = 1356969600 + (rand()%31536000); all += dmap_rangeto(dmap, val, res); } TIMER_SAMPLE(timer); fprintf(stdout, "rangeto() 1000 times total:%lld, time used:%lld\n", (long long int)all, PT_LU_USEC(timer)); fflush(stdout); srand(time(NULL)); TIMER_RESET(timer); all = 0; for(i = 0; i < 1000; i++) { from = 1356969600 + (rand()%31536000); to = from + rand()%31536000; all += dmap_range(dmap, from, to, res); } TIMER_SAMPLE(timer); fprintf(stdout, "range(%p) 1000 times total:%lld, time used:%lld\n", res, (long long int)all, PT_LU_USEC(timer)); fflush(stdout); srand(time(NULL)); TIMER_RESET(timer); all = 0; for(i = 0; i < 1000; i++) { from = 1356969600 + (rand()%31536000); to = from + rand()%31536000; all += dmap_range(dmap, from, to, NULL); } TIMER_SAMPLE(timer); fprintf(stdout, "range(null) 1000 times total:%lld, time used:%lld\n", (long long int)all, PT_LU_USEC(timer)); fflush(stdout); #endif dmap_close(dmap); TIMER_CLEAN(timer); free(res); } }