Adding some support for thread migration for the ParFUM/CUDA/TOPS program.
authorIsaac Dooley <idooley2@honest2.ncsa.uiuc.edu>
Thu, 4 Feb 2010 23:37:16 +0000 (17:37 -0600)
committerIsaac Dooley <idooley2@honest2.ncsa.uiuc.edu>
Thu, 4 Feb 2010 23:37:16 +0000 (17:37 -0600)
src/libs/ck-libs/ParFUM-Iterators/Makefile
src/libs/ck-libs/ParFUM-Iterators/ParFUM_Iterators.cc
src/libs/ck-libs/ParFUM-Iterators/ParFUM_Iterators.h

index 47768564d314029f24e25460d725f02ff0ead9cb..997518c7ec1a7d10b7eac636a460454a7997d84d 100644 (file)
@@ -6,7 +6,7 @@ CUDAC = nvcc
 CUDAINC = -I$(CUDASDK)/common/inc -I$(CUDADIR)/include
 
 CHARMC=$(CDIR)/bin/charmc -cc $(CUDAC) -c++ $(CUDAC) $(OPTS) -nobs
-CCFLAGS = -DCUDA -DFP_TYPE_FLOAT  -O2 -DSHARED_NODES_ONLY_NEIGHBOR
+CCFLAGS = -DCUDA -DFP_TYPE_FLOAT  -g -DSHARED_NODES_ONLY_NEIGHBOR
 
 
 #Headers to be copied to include directory so application users can see them
index 3bfd4048950fd4ee136e0011dc8fba00cd84fe9e..d8adf58d367893f7a962bdf2a1cb1202cbf7a02c 100644 (file)
@@ -79,7 +79,7 @@ void fillIDHash(MeshModel* model)
 // If the number of nodes or elements increases, then this function should be called
 // because the attribute arrays may have been resized, after which the old pointers
 // would be invalid.
-void setTableReferences(MeshModel* model, bool recomputeHash=false)
+void setTableReferences(MeshModel* model, bool recomputeHash)
 {
     model->ElemConn_T = &((FEM_IndexAttribute*)model->mesh->elem[MESH_ELEMENT_TET4].lookup(FEM_CONN,""))->get();
     model->elem_id_T = &((FEM_DataAttribute*)model->mesh->elem[MESH_ELEMENT_TET4].lookup(ATT_ELEM_ID,""))->getInt();
@@ -185,8 +185,8 @@ MeshModel* meshModel_Create_Init(){
   data values which were not done in init.
 
 */
-MeshModel* meshModel_Create_Driver(MeshDevice target_device, int elem_attr_sz,
-        int node_attr_sz, int model_attr_sz, void *mAtt) {
+void meshModel_Create_Driver(MeshDevice target_device, int elem_attr_sz,
+        int node_attr_sz, int model_attr_sz, void *mAtt, MeshModel &model) {
 
     CkAssert(ATT_NODE_ID != FEM_COORD);
     CkAssert(ATT_NODE_DATA != FEM_COORD);
@@ -204,37 +204,37 @@ MeshModel* meshModel_Create_Driver(MeshDevice target_device, int elem_attr_sz,
     CkAssert(elem_attr_sz > 0);
     CkAssert(node_attr_sz > 0);
     int which_mesh=FEM_Mesh_default_read();
-    MeshModel *model = new MeshModel;
-    memset(model, 0, sizeof(MeshModel));
+
+    memset(&model, 0, sizeof(MeshModel));
     
-    model->target_device = target_device;
-    model->elem_attr_size = elem_attr_sz;
-    model->node_attr_size = node_attr_sz;
-    model->model_attr_size = model_attr_sz;
+    model.target_device = target_device;
+    model.elem_attr_size = elem_attr_sz;
+    model.node_attr_size = node_attr_sz;
+    model.model_attr_size = model_attr_sz;
     
-    model->mesh = FEM_Mesh_lookup(which_mesh,"meshModel_Create_Driver");
-    model->mAtt = mAtt;
+    model.mesh = FEM_Mesh_lookup(which_mesh,"meshModel_Create_Driver");
+    model.mAtt = mAtt;
     
-    model->num_local_elem = model->mesh->elem[MESH_ELEMENT_TET4].size();
-    model->num_local_node = model->mesh->node.size();
+    model.num_local_elem = model.mesh->elem[MESH_ELEMENT_TET4].size();
+    model.num_local_node = model.mesh->node.size();
 
     // Allocate user model attributes
     FEM_Mesh_become_set(which_mesh);
-    char* temp_array = (char*) malloc(model->num_local_elem * model->elem_attr_size);
-    FEM_Mesh_data(which_mesh,FEM_ELEM+MESH_ELEMENT_TET4,ATT_ELEM_DATA,temp_array,0,model->num_local_elem,FEM_BYTE,model->elem_attr_size);
+    char* temp_array = (char*) malloc(model.num_local_elem * model.elem_attr_size);
+    FEM_Mesh_data(which_mesh,FEM_ELEM+MESH_ELEMENT_TET4,ATT_ELEM_DATA,temp_array,0,model.num_local_elem,FEM_BYTE,model.elem_attr_size);
     free(temp_array);
 
-    temp_array = (char*) malloc(model->num_local_node * model->node_attr_size);
-    FEM_Mesh_data(which_mesh,FEM_NODE,ATT_NODE_DATA,temp_array,0,model->num_local_node,FEM_BYTE,model->node_attr_size);
+    temp_array = (char*) malloc(model.num_local_node * model.node_attr_size);
+    FEM_Mesh_data(which_mesh,FEM_NODE,ATT_NODE_DATA,temp_array,0,model.num_local_node,FEM_BYTE,model.node_attr_size);
     free(temp_array);
 
 
-    const int connSize = model->mesh->elem[MESH_ELEMENT_TET4].getConn().width();
-    temp_array = (char*) malloc(model->num_local_node * connSize);
+    const int connSize = model.mesh->elem[MESH_ELEMENT_TET4].getConn().width();
+    temp_array = (char*) malloc(model.num_local_node * connSize);
     FEM_Mesh_data(which_mesh,FEM_ELEM+MESH_ELEMENT_TET4,ATT_ELEM_N2E_CONN,temp_array, 0, 1, FEM_INT, connSize);
     free(temp_array);
 
-    setTableReferences(model, true);
+    setTableReferences(&model, true);
 
     // Setup the adjacencies
     int nodesPerTuple = 3;
@@ -244,9 +244,9 @@ MeshModel* meshModel_Create_Driver(MeshDevice target_device, int elem_attr_sz,
     FEM_Add_elem2face_tuples(which_mesh, MESH_ELEMENT_TET4,  nodesPerTuple, tuplesPerTet, tetFaces);
     FEM_Add_elem2face_tuples(which_mesh, MESH_ELEMENT_COH3T3,  nodesPerTuple, tuplesPerCoh, cohFaces);
 
-    model->mesh->createNodeElemAdj();
-    model->mesh->createNodeNodeAdj();
-    model->mesh->createElemElemAdj();
+    model.mesh->createNodeElemAdj();
+    model.mesh->createNodeNodeAdj();
+    model.mesh->createElemElemAdj();
 
 #if CUDA
     int* n2eTable;
@@ -254,16 +254,16 @@ MeshModel* meshModel_Create_Driver(MeshDevice target_device, int elem_attr_sz,
     FEM_Mesh_create_node_elem_adjacency(which_mesh);
     FEM_Mesh* mesh = FEM_Mesh_lookup(which_mesh, "meshModel_Create_Driver");
     FEM_DataAttribute * at = (FEM_DataAttribute*) 
-        model->mesh->elem[MESH_ELEMENT_TET4].lookup(ATT_ELEM_N2E_CONN,"meshModel_Create_Driver");
+        model.mesh->elem[MESH_ELEMENT_TET4].lookup(ATT_ELEM_N2E_CONN,"meshModel_Create_Driver");
     n2eTable = at->getInt().getData();
 
     FEM_IndexAttribute * iat = (FEM_IndexAttribute*) 
-        model->mesh->elem[MESH_ELEMENT_TET4].lookup(FEM_CONN,"meshModel_Create_Driver");
+        model.mesh->elem[MESH_ELEMENT_TET4].lookup(FEM_CONN,"meshModel_Create_Driver");
     int* connTable  = iat->get().getData();
 
     int* adjElements;
     int size;
-    for (int i=0; i<model->num_local_node; ++i) {
+    for (int i=0; i<model.num_local_node; ++i) {
         mesh->n2e_getAll(i, adjElements, size);
         for (int j=0; j<size; ++j) {
             for (int k=0; k<connSize+1; ++k) {
@@ -297,12 +297,11 @@ MeshModel* meshModel_Create_Driver(MeshDevice target_device, int elem_attr_sz,
     FEM_Mesh_become_get(which_mesh);
 
 #if CUDA
-    if (model->target_device == DeviceGPU) {
-      allocateModelForCUDADevice(model);
+    if (model.target_device == DeviceGPU) {
+      allocateModelForCUDADevice(&model);
     }
 #endif
 
-    return model;
 }
 
 
index a87973f1c47bc26764312c8f5284cf212d572771..5bfddd5fd943dd4527fca9e739a859daa011351b 100644 (file)
@@ -70,6 +70,34 @@ class MeshModel{
             elemIDHash = NULL;
            allocatedForCUDADevice = false;
         }
+
+
+       void print(){
+         CkPrintf("MeshModel::print() on pe %d\n", CkMyPe());
+         CkPrintf("mesh=%p\n", mesh);
+         CkPrintf("mAtt=%p\n", mAtt);
+         CkPrintf("ElemData_T = %p\n", ElemData_T );
+         CkPrintf("GhostElemData_T = %p\n", GhostElemData_T);
+         CkPrintf("NodeData_T = %p\n", NodeData_T);
+          CkPrintf("GhostNodeData_T = %p\n", GhostNodeData_T);
+          CkPrintf("ElemConn_T = %p\n", ElemConn_T);
+          CkPrintf("coord_T = %p\n", coord_T);
+          CkPrintf("node_id_T = %p\n", node_id_T);
+          CkPrintf("elem_id_T = %p\n", elem_id_T);
+          CkPrintf("n2eConn_T = %p\n", n2eConn_T);
+
+          CkPrintf("nodeIDHash = %p\n", nodeIDHash);
+         CkPrintf("elemIDHash = %p\n", elemIDHash);
+
+         CkPrintf("node_attr_size = %d\n", node_attr_size);
+         CkPrintf("elem_attr_size = %d\n", elem_attr_size);
+          CkPrintf("model_attr_size = %d\n", model_attr_size);    
+          CkPrintf("num_local_elem = %d\n", num_local_elem);
+          CkPrintf("num_local_node = %d\n", num_local_node);
+          CkPrintf("target_device = %d\n", target_device);
+
+       }
+
 };
 
 
@@ -155,8 +183,8 @@ MeshModel* meshModel_Create_Init();
 
 
 /** Create and access a mesh model. Only call from Driver */
-MeshModel* meshModel_Create_Driver(MeshDevice target_device,
-        int elem_attr_sz, int node_attr_sz, int model_attr_sz, void* mAtt);
+void meshModel_Create_Driver(MeshDevice target_device,
+        int elem_attr_sz, int node_attr_sz, int model_attr_sz, void* mAtt, MeshModel &model);
 
 /** Cleanup a model. Currently does nothing */
 void meshModel_Destroy(MeshModel* m);
@@ -659,4 +687,9 @@ inline void meshFacetItr_Destroy (MeshFacetItr* itr){
 #endif
 
 
+
+
+void setTableReferences(MeshModel* model, bool recomputeHash=false);
+
+
 #endif