Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/libs/ck-libs/collide/collide_util.C
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ void CollideGrid3d::init(const vector3d &Norigin,//Grid voxel corner 0,0,0
sizes[i]=desiredSize[i];
#endif
((double *)scales)[i]=1.0/((double *)sizes)[i];
testMapping(*this,i,((double *)origin)[i],((double *)sizes)[i]);
//testMapping(*this,i,((double *)origin)[i],((double *)sizes)[i]);
}

}
Expand Down
57 changes: 52 additions & 5 deletions src/libs/ck-libs/collide/collidecharm.C
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/
#include "charm++.h"
#include "collidecharm_impl.h"
#include <iostream>

#define COLLIDE_TRACE 0
#if COLLIDE_TRACE
Expand Down Expand Up @@ -51,6 +52,17 @@ CkGroupID CollideDistributedClient(CkCallback clientCb)
return cl;
}

/// Call this on all processors at restart to reinitialize the Collision client
/// with correct clientFn and clientParam.
void CollideSerialClientRestart(
CollideHandle h,
CollisionClientFn clientFn,
void *clientParam )
{
CProxy_collideMgr mgr(h);
mgr.ckLocalBranch()->reinitClient(clientFn, clientParam);
}

/// Create a collider group to contribute objects to.
/// Should be called on processor 0.
CollideHandle CollideCreate(const CollideGrid3d &gridMap,
Expand Down Expand Up @@ -329,7 +341,7 @@ static const char * voxName(const CkIndex3D &idx,char *buf,int n) {
collideMgr::collideMgr(const CollideGrid3d &gridMap_,
const CProxy_collideClient &client_,
const CProxy_collideVoxel &voxels)
:thisproxy(thisgroup), voxelProxy(voxels),
:voxelProxy(voxels),
gridMap(gridMap_), client(client_), aggregator(gridMap,this)
{
steps=0;
Expand All @@ -340,6 +352,27 @@ collideMgr::collideMgr(const CollideGrid3d &gridMap_,
collisionStarted = false;
}

collideMgr::collideMgr(CkMigrateMessage* m) :
CBase_collideMgr(m),
gridMap(CollideGrid3d(CkVector3d(0, 0, 0),CkVector3d(2, 100, 2))),
aggregator(gridMap,this)
{
steps=0;
nContrib=0;
contribCount=0;
msgsSent=msgsRecvd=0;
totalLocalVoxels = -1;
collisionStarted = false;
}

// Reinitialize collideClient's state on restart
void collideMgr::reinitClient(
CollisionClientFn clientFn,
void *clientParam )
{
client.ckLocalBranch()->setClient(clientFn, clientParam);
}

//Maintain contributor registration count
void collideMgr::registerContributor(int chunkNo)
{
Expand Down Expand Up @@ -417,7 +450,8 @@ void collideMgr::tryAdvance(void)
steps++;
contribCount=0;
msgsSent=msgsRecvd=0;
contribute(CkCallback(CkReductionTarget(collideMgr,reductionFinished), thisProxy[0]));
CProxy_collideMgr proxy(ckGetGroupID());
contribute(CkCallback(CkReductionTarget(collideMgr,reductionFinished), proxy[0]));
}
}

Expand All @@ -426,8 +460,9 @@ void collideMgr::reductionFinished(void)
{
CM_STATUS("collideMgr::reductionFinished");
//Broadcast Collision start:
thisProxy.determineNumVoxels();
voxelProxy.initiateCollision(thisProxy);
CProxy_collideMgr proxy(ckGetGroupID());
proxy.determineNumVoxels();
voxelProxy.initiateCollision(proxy);
}

void collideMgr::checkRegistrationComplete() {
Expand Down Expand Up @@ -586,6 +621,10 @@ void collideVoxel::startCollision(int step,
CC_STATUS("} startCollision");
}

collideClient::collideClient() {}

collideClient::collideClient(CkMigrateMessage* m) : Group(m) {}

collideClient::~collideClient() {}

/********************** serialCollideClient *****************/
Expand All @@ -596,6 +635,13 @@ serialCollideClient::serialCollideClient(void) {
useCb = false;
}

serialCollideClient::serialCollideClient(CkMigrateMessage* m) : collideClient(m)
{
clientFn = NULL;
clientParam = NULL;
clientCb = CkCallback(CkCallback::ignore);
}

serialCollideClient::serialCollideClient(CkCallback clientCb_) {
clientFn=NULL;
clientParam=NULL;
Expand Down Expand Up @@ -626,8 +672,9 @@ void serialCollideClient::reductionDone(CkReductionMsg *msg)
{
int nColl=msg->getSize()/sizeof(Collision);
CM_STATUS("serialCollideClient with "<<nColl<<" collisions");
if (clientFn!=NULL) //User wants Collisions on node 0
if (clientFn!=NULL) {//User wants Collisions on node 0
(clientFn)(clientParam,nColl,(Collision *)msg->getData());
}
else //FIXME: never registered a client
CkAbort("Forgot to call serialCollideClient::setClient!\n");
delete msg;
Expand Down
4 changes: 2 additions & 2 deletions src/libs/ck-libs/collide/collidecharm.ci
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module collidecharm {

group collideClient {
};
group serialCollideClient : collideClient {
group [migratable] serialCollideClient : collideClient {
entry serialCollideClient();
entry serialCollideClient(CkCallback clientCb_);
entry void reductionDone(CkReductionMsg *m);
Expand All @@ -13,7 +13,7 @@ module collidecharm {
entry distributedCollideClient(CkCallback clientCb_);
};

group collideMgr {
group [migratable] collideMgr {
entry collideMgr(CollideGrid3d gridMap,
CProxy_collideClient client,
CkArrayID cells);
Expand Down
17 changes: 14 additions & 3 deletions src/libs/ck-libs/collide/collidecharm.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
#include "collide_util.h"
#include "collidecharm.decl.h"

/// This client function is called on PE 0 with a Collision list
typedef void (*CollisionClientFn)(void *param,int nColl,Collision *colls);

/********************** collideClient *****************
A place for the assembled Collision lists to go.
Each voxel calls this "Collisions" method with their
Expand All @@ -22,16 +25,17 @@
*/
class collideClient : public Group {
public:
collideClient();
collideClient(CkMigrateMessage* m);
virtual ~collideClient();
virtual void collisions(int step,CollisionList &colls) =0;
virtual void setClient(CollisionClientFn clientFn,
void *clientParam) = 0;
};

/********************** serialCollideClient *****************
Reduces the Collision list down to processor 0.
*/
/// This client function is called on PE 0 with a Collision list
typedef void (*CollisionClientFn)(void *param,int nColl,Collision *colls);

/// Call this on processor 0 to build a Collision client that
/// just calls this serial routine on processor 0 with the final,
/// complete Collision list.
Expand All @@ -47,6 +51,13 @@ CkGroupID CollideDistributedClient(CkCallback clientCb);
/****************** Collision Interface ******************/
typedef CkGroupID CollideHandle;

/// Call this on all processors at restart to reinitialize the Collision client
/// with the correct clientFn and clientParam.
void CollideSerialClientRestart(
CollideHandle h,
CollisionClientFn clientFn,
void *clientParam );

/// Create a collider group to contribute objects to.
/// Should be called on processor 0.
CollideHandle CollideCreate(const CollideGrid3d &gridMap,
Expand Down
24 changes: 23 additions & 1 deletion src/libs/ck-libs/collide/collidecharm_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ class CollisionAggregator {

class collideMgr : public CBase_collideMgr
{
CProxy_collideMgr thisproxy;
private:
void status(const char *msg) {
CkPrintf("CMgr pe %d> %s\n",CkMyPe(),msg);
Expand Down Expand Up @@ -131,11 +130,26 @@ class collideMgr : public CBase_collideMgr
collideMgr(const CollideGrid3d &gridMap,
const CProxy_collideClient &client,
const CProxy_collideVoxel &voxels);
collideMgr(CkMigrateMessage* m);

void pup(PUP::er &p) {
// The migrate constructor does not initialize Group/CkReductionMgr state.
// Restore it explicitly so group reductions have a valid thisProxy/tree.
Group::pup(p);
p | voxelProxy;
p | gridMap;
p | client;
}

//Maintain contributor registration count
void registerContributor(int chunkNo);
void unregisterContributor(int chunkNo);

// Reinitialize collideClient's state on restart
void reinitClient(
CollisionClientFn clientFn,
void *clientParam );

//Clients call this to contribute their objects
void addBoxes(int chunkNo, int n, const bbox3d* boxes, const int* prio);

Expand Down Expand Up @@ -194,6 +208,13 @@ class serialCollideClient : public collideClient {
public:
serialCollideClient(void);
serialCollideClient(CkCallback clientCb_);
serialCollideClient(CkMigrateMessage *m);
void pup(PUP::er &p) {
// The reduction callback in collisions() relies on Group/CkReductionMgr
// state restored by Group::pup(), including thisgroup and thisProxy.
Group::pup(p);
p | useCb;
}

/// Call this client function on processor 0:
void setClient(CollisionClientFn clientFn,void *clientParam);
Expand All @@ -216,6 +237,7 @@ class distributedCollideClient : public collideClient {

/// Called by voxel array on each processor:
virtual void collisions(int step,CollisionList &colls);
void setClient(CollisionClientFn, void *) {}
};


Expand Down
3 changes: 3 additions & 0 deletions src/libs/ck-libs/collide/threadCollide.C
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ class threadCollideMgr : public CBase_threadCollideMgr
contrib[chunkNo]=NULL;
}

/// Placeholder for collideClient's restart reinitialization interface.
void setClient(CollisionClientFn, void *) {}

/// collideClient interface (called by voxels)
/// Splits up collisions by destination PE
void collisions(int step,CollisionList &colls);
Expand Down
Loading