TestDriver(CkArgMsg* args) { N = atoi(args->argv[1]); numElementsPerPe = atoll(args->argv[2]); localTableSize = (1l << N) / numElementsPerPe; if (!localTableSize) CkAbort("Table size is too small, or number of chares is too large\n"); tableSize = localTableSize * CkNumPes() * numElementsPerPe; CkPrintf("Global table size = 2^%d * %d = %lld words\n", N, CkNumPes(), tableSize); CkPrintf("Number of processors = %d\nNumber of updates = %lld\n", CkNumPes(), 4 * tableSize); driverProxy = thishandle; // Create the chares storing and updating the global table updater_array = CProxy_Updater::ckNew(CkNumPes() * numElementsPerPe); int dims[2] = {CkNumNodes(), CkNumPes() / CkNumNodes()}; CkPrintf("Aggregation topology: %d %d\n", dims[0], dims[1]); // Instantiate communication library group with a handle to the client //aggregator = // CProxy_ArrayMeshStreamer<dtype, int, Updater, SimpleMeshRouter> // ::ckNew(numMsgsBuffered, 2, dims, updater_array, 1); delete args; }
BFSGraph(CmiUInt8 nVertex, bool directed = true) : directed(directed), GraphLib::Graph< BFSMultiVertex, BFSEdge, CProxy_BFSMultiVertex, GraphLib::TransportType::Charm >(CmiNumPes()) { int dims[2] = {CkNumNodes(), CkNumPes() / CkNumNodes()}; CkPrintf("Aggregation topology: %d %d\n", dims[0], dims[1]); aggregator = CProxy_ArrayMeshStreamer<dtype, long long, BFSMultiVertex, SimpleMeshRouter> ::ckNew(numMsgsBuffered, 2, dims, g, 1); }
main::main(CkArgMsg *msg) { CmiPrintf("Megatest is running on %d nodes %d processors. \n", CkNumNodes(), CkNumPes()); int argc = msg->argc; char **argv = msg->argv; int numtests, i; delete msg; mainhandle = thishandle; if (nTests<=0) CkAbort("Megatest: No tests registered-- is MEGATEST_REGISTER_TEST malfunctioning?"); for (i=0; i<nTests; i++) (tests[i].initializer)(); test_bank_size = nTests; next_test_index = 0; next_test_number = 0; test_negate_skip=0; test_repeat = 0; for (i=1; i<argc; i++) { if (strcmp(argv[i],"-only")==0) test_negate_skip = 1; if (strcmp(argv[i],"-repeat")==0) test_repeat = 1; } num_tests_to_skip = argc; tests_to_skip = argv; CProxy_main(thishandle).start(); }
void maindone(void) { niter++; if(niter == START_TRACE_ITER) _traceControl.startTrace(); if(niter == END_TRACE_ITER) _traceControl.endTrace(); if(niter == iterations) { double pingTimer = CkWallTimer() - start_time; CkPrintf("Pingping %d\t\t %d \t\t%d \t\t%d \t\t%d \t\t%.1f\n", nodeIndex, CharesPerPE, PEsPerNode, PEsPerNode * CharesPerPE, payload, 1000*1000*pingTimer/(iterations-WARM_UP)); if(nodeIndex == CkNumNodes() -1) CkExit(); else { niter = 0; for(int i=0; i<PEsPerNode * CharesPerPE; i++) arr1[i].start(nodeIndex); } nodeIndex++; }else { if(niter == WARM_UP) start_time = CkWallTimer(); for(int i=0; i<PEsPerNode * CharesPerPE; i++) arr1[i].start(nodeIndex); } };
main(CkArgMsg* m) { if(m->argc < 5) CkPrintf("Usage: payload PEs CharesPerPE iteration\n"); niter = 0; iterations=NITER; payload=PAYLOAD; if(m->argc>1) totalPayload=atoi(m->argv[1]); if(m->argc>2) PEsPerNode = atoi(m->argv[2]); if(m->argc>3) CharesPerPE = atoi(m->argv[3]); if(m->argc>4) iterations=atoi(m->argv[4]); payload = totalPayload/PEsPerNode/CharesPerPE; mainProxy = thishandle; arr1 = CProxy_Ping1::ckNew(CkNumNodes()* PEsPerNode * CharesPerPE ); start_time = CkWallTimer(); nodeIndex = 1; int x,y,z,t; TopoManager tmgr; for(int i=0; i<CmiNumPes(); i+=CmiMyNodeSize()) { tmgr.rankToCoordinates(i, x,y, z, t); CkPrintf(" %d [%d:%d:%d:%d]\n", i, x, y, z, t); } CkPrintf("NodeIndex Chares Workers NoOfMsgs Bytes Total Time(us)\n"); _traceControl = CProxy_TraceControl::ckNew(); for(int i=0; i<PEsPerNode * CharesPerPE; i++) arr1[i].start(nodeIndex); delete m; };
int ScriptTcl::Tcl_numNodes(ClientData, Tcl_Interp *interp, int argc, char **) { if ( argc > 1 ) { Tcl_SetResult(interp,"no arguments needed",TCL_VOLATILE); return TCL_ERROR; } Tcl_SetObjResult(interp, Tcl_NewIntObj(CkNumNodes())); return TCL_OK; }
// Converse immediate handler void immediatering_startHandler(void *vmsg) { const int maxRings = 1000; immediateMsg *msg=(immediateMsg *)vmsg; if(0!=strcmp(msg->data,"Array!")) { CkAbort("Message corrupted"); } if(CkMyNode()==0) msg->iter++; if (msg->iter < maxRings) { /* Keep passing message around the ring */ /* This is questionable: */ sendImmediate((CkMyNode()+1) % CkNumNodes(),msg->iter); } else /* msg->iter>=maxRings, so stop: */ { /* megatest_finish isn't safe from an immediate, so send a regular non-immediate message out: */ int size=CmiMsgHeaderSizeBytes; void *msg=CmiAlloc(size); CmiSetHandler(msg,immediatering_finishHandlerIdx); CmiSyncSendAndFree(0,size,(char *)msg); } CmiFree(msg); }
void immRing_nodegroup::start(immMessage *msg) { const int maxRings = 50; //CkPrintf("[%d] start %d\n", thisIndex, msg->iter); if(!msg->check()) { CkError("Message corrupted!\n"); megatest_finish(); return; } if(CkMyNode()==0) msg->iter++; if (msg->iter < maxRings) { thisProxy[(CkMyNode()+1) % CkNumNodes()].start(msg); } else { delete msg; //megatest_finish(); int size=CmiMsgHeaderSizeBytes; void *msg=CmiAlloc(size); CmiSetHandler(msg,immediatering_finishHandlerIdx); CmiSyncSendAndFree(0,size,(char *)msg); } }
FVectorCache::FVectorCache() { eps_chares_x = 7; eps_chares_y = 7; totalSize = 0; GWBSE *gwbse = GWBSE::get(); L = gwbse->gw_parallel.L; int total_eps_chares = eps_chares_x*eps_chares_y; my_chare_count = total_eps_chares/CkNumNodes(); my_chare_start = CkMyNode()*my_chare_count; int remaining = total_eps_chares%CkNumNodes(); if(CkMyNode()>0) my_chare_start += remaining; if(CkMyNode()==0) my_chare_count += remaining; my_eps_chare_indices_x = new int[my_chare_count]; my_eps_chare_indices_y = new int[my_chare_count]; findIndices(); int count = 0; for(int i=eps_start_chare_x;i<=eps_end_chare_x;i++){ int j = 0; if(i==eps_start_chare_x) j = eps_start_chare_y; int j_end = eps_chares_y-1; if(i==eps_end_chare_x) j_end = eps_end_chare_y; while(j<=j_end){ my_eps_chare_indices_x[count] = i; my_eps_chare_indices_y[count++] = j; j++; } } ndata = gwbse->gw_parallel.n_elems; data_size_x = ndata/eps_chares_x; if(ndata%eps_chares_x > 0) data_size_x += 2; data_size_y = ndata/eps_chares_y; if(ndata%eps_chares_y > 0) data_size_y += 2; data_offset_x = new int[my_chare_count]; data_offset_y = new int[my_chare_count]; for(int i=0;i<my_chare_count;i++){ data_offset_x[i] = my_eps_chare_indices_x[i]*data_size_x; data_offset_y[i] = my_eps_chare_indices_y[i]*data_size_y; } int size_x = data_size_x; int size_y = data_size_y; local_offset = new int[my_chare_count*2]; global_offset = new int[my_chare_count*2]; for(int i=0;i<my_chare_count;i++){ global_offset[2*i] = data_offset_x[i];//totalSize; local_offset[2*i] = totalSize; totalSize += size_x; global_offset[2*i+1] = data_offset_y[i];//totalSize; local_offset[2*i+1] = totalSize; totalSize += size_y; } fs = new complex[NSIZE*L*totalSize]; contribute(CkCallback(CkReductionTarget(Controller,fCacheReady), controller_proxy)); }
Main(CkArgMsg *args) { if (args->argc >= 3) { dataSizeMin = atoi(args->argv[1]); dataSizeMax = atoi(args->argv[2]); } else { dataSizeMin = 32; dataSizeMax = 16384; } bufferSize = args->argc == 4 ? atoi(args->argv[3]) : TRAM_BUFFER_SIZE; CkPrintf("size of envelope: %d\n\n", sizeof(envelope)); delete args; iters = dataSizeMin / DATA_ITEM_SIZE; allToAllGroup = CProxy_Participant::ckNew(); #if !CMK_BLUEGENEQ int nDims = 2; int dims[2] = {CkNumNodes(), CkNumPes() / CkNumNodes()}; CkPrintf("TEST 1: Using %dD TRAM Topology: %d %d\n", nDims, dims[0], dims[1]); // Alternative 3D topology // int nDims = 3; // int dim1 = CkNumNodes(); // int dim2 = 1; // if (dim1 != 1) { // while (dim2 < dim1) { // dim2 *= 2; // dim1 /= 2; // } // } // int dims[3] = {dim1, dim2, CkNumPes() / CkNumNodes()}; // CkPrintf("Topology: %d %d %d\n", dims[0], dims[1], dims[2]); #else TopoManager tmgr; int nDims = 3; int dims[3] = {tmgr.getDimNA() * tmgr.getDimNB(), tmgr.getDimNC() * tmgr.getDimND() * tmgr.getDimNE(), tmgr.getDimNT()}; CkPrintf("TEST 1: Using %dD TRAM Topology: %d %d %d\n", nDims, dims[0], dims[1], dims[2]); // Alternative TRAM topologies for Blue Gene/Q using Topology Manager // int nDims = 4; // int dims[4] = {tmgr.getDimNA() * tmgr.getDimNB(), tmgr.getDimNC(), // tmgr.getDimND() * tmgr.getDimNE(), tmgr.getDimNT()}; // int nDims = 6; // int dims[6] = {tmgr.getDimNA(), tmgr.getDimNB(), tmgr.getDimNC(), // tmgr.getDimND() * tmgr.getDimNE(), // tmgr.getDimNT() / 8, 8}; #endif mainProxy = thisProxy; aggregator = CProxy_GroupMeshStreamer<DataItem, Participant, SimpleMeshRouter>:: ckNew(nDims, dims, allToAllGroup, bufferSize, 1, 0.1); testType = usingTram; }