Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/lamont/src/compiler/c-target/fragments/par-kdtree.in
ViewVC logotype

Diff of /branches/lamont/src/compiler/c-target/fragments/par-kdtree.in

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2581, Thu Apr 10 12:15:52 2014 UTC revision 2582, Thu Apr 10 19:28:22 2014 UTC
# Line 98  Line 98 
98          }          }
99          return low;          return low;
100  }  }
101    SpatialWorkerArgs_t * Diderot_Grab_SpatailWorkerSort(SpatialScheduler_t* sched,ParSpatialWorkerType workerType,int start, int end, int axis){
102    
103        SpatialWorkerArgs_t * retWorker = 0;
104        pthread_mutex_lock (&sched->lock);
105             for(int i = sched->nextWorker; i < sched->numWorkers; i++){
106                    if(sched->workerData[i].isIdle){
107                         sched->workerData[i].isIdle = false;
108                         sched->workerData[i].start = start;
109                         sched->workerData[i].end = end;
110                         sched->workerData[i].axis = axis;
111                         sched->workerData[i].workerType = workerType;
112                        retWorker = &sched->workerData[i];
113                         sched->jobsRunning +=1;
114                        pthread_cond_signal (&sched->workerData[i].runWait);
115                        sched->nextWorker++;
116                        if(sched->nextWorker == sched->numWorkers-1)
117                            sched->nextWorker = 0;
118                        break;
119                    }
120             }
121        pthread_mutex_unlock (&sched->lock);
122        return retWorker;
123    }
124    
125    
126  /* Assigns a worker to perform a spatial task (merge sort, merge,or tree node construction) */  /* Assigns a worker to perform a spatial task (merge sort, merge,or tree node construction) */
127  SpatialWorkerArgs_t * Diderot_Grab_SpatailWorker(SpatialScheduler_t* sched,ParSpatialWorkerType workerType,void * nodeData, bool * donePtr){  SpatialWorkerArgs_t * Diderot_Grab_SpatailWorker(SpatialScheduler_t* sched,ParSpatialWorkerType workerType,void * nodeData, bool * donePtr){
128    
# Line 238  Line 263 
263          while(!workerArg->sched->buildIsDone)          while(!workerArg->sched->buildIsDone)
264          {          {
265          //Wait until a task is assigned to the worker          //Wait until a task is assigned to the worker
         if(!workerArg->isIdle) {  
266              pthread_mutex_lock (&workerArg->sched->lock);              pthread_mutex_lock (&workerArg->sched->lock);
267              if(!workerArg->sched->buildIsDone || !workerArg->isIdle){              if(!workerArg->sched->buildIsDone){
268                  if(workerArg->sched->numRunning - 1 > 0 || workerArg->sched->jobsRunning > 0)                  if(workerArg->sched->numRunning - 1 > 0 || workerArg->sched->jobsRunning > 0)
269                  {                  {
270                     workerArg->sched->numRunning-=1;                     workerArg->sched->numRunning-=1;
271                       if(workerArg->isIdle)
272                         pthread_cond_wait (&workerArg->runWait,&workerArg->sched->lock);                         pthread_cond_wait (&workerArg->runWait,&workerArg->sched->lock);
273                     if(!workerArg->isIdle)                     if(!workerArg->isIdle)
274                       workerArg->sched->jobsRunning -=1;                       workerArg->sched->jobsRunning -=1;
# Line 255  Line 280 
280                              pthread_cond_signal (&workerArg->sched->workerData[i].runWait);                              pthread_cond_signal (&workerArg->sched->workerData[i].runWait);
281                      }                      }
282                      workerArg->sched->stopTime = (airTime() - workerArg->sched->startTime);                      workerArg->sched->stopTime = (airTime() - workerArg->sched->startTime);
283                        printf("NEW maybe fixed parallel time to sort=%f\n",workerArg->sched->stopTime);
284                        exit(1);
285    
286                  }                  }
287                  workerArg->sched->numRunning+=1;                  workerArg->sched->numRunning+=1;
288              }              }
289              pthread_mutex_unlock (&workerArg->sched->lock);              pthread_mutex_unlock (&workerArg->sched->lock);
         }  
290              if(workerArg->sched->buildIsDone){              if(workerArg->sched->buildIsDone){
291                          workerArg->isIdle = false;                          workerArg->isIdle = true;
292                  break;                  break;
293              }              }
294          //Based on the worker type perform the assigned task.          //Based on the worker type perform the assigned task.
295              if(workerArg->workerType == MERGESORT_WORKER){              if(workerArg->workerType == MERGESORT_WORKER){
296                      MergetSortNode_t * node = (MergetSortNode_t *)workerArg->data;                      MergetSortNode_t * node = (MergetSortNode_t *)workerArg->data;
297                          /*Diderot_Spatial_ParMergeSort(workerArg->wrld,                  //printf("<1>\n");
298                            Diderot_Spatial_ParMergeSort(workerArg->wrld,
299                                                    workerArg->sched,                                                    workerArg->sched,
300                                                    node->indices,                                                    node->indices,
301                                                    node->tmpIndices,                                                    node->tmpIndices,
302                                                        node->low,                                                        node->low,
303                                                        node->high,                                                        node->high,
304                                                        node->depth,                                                        node->depth,
305                                                        node->dim);*/                                                        node->dim);
306    
307              }else if(workerArg->workerType == MERGE_WORKER) {              }else if(workerArg->workerType == MERGE_WORKER) {
308                      MergeNode_t * node = (MergeNode_t *)workerArg->data;                      MergeNode_t * node = (MergeNode_t *)workerArg->data;
309                    /*  Diderot_Spatial_ParMerge(workerArg->wrld,                  //printf("<2>\n");
310                        Diderot_Spatial_ParMerge(workerArg->wrld,
311                                                workerArg->sched,                                                workerArg->sched,
312                                                node->indices,                                                node->indices,
313                                                node->tmpIndices,                                                node->tmpIndices,
# Line 288  Line 317 
317                                                node->highR,                                                node->highR,
318                                                node->low,                                                node->low,
319                                                node->depth,                                                node->depth,
320                                                node->dim);*/                                                node->dim);
321              }else if(workerArg->workerType == TREE_WORKER){              }else if(workerArg->workerType == TREE_WORKER){
322                      KDNode_t*  node = (KDNode_t  *)workerArg->data;                      KDNode_t*  node = (KDNode_t  *)workerArg->data;
323                 /* if((node->start + node->len)- 1> workerArg->wrld->numStrands || node->strandId  > workerArg->wrld->numStrands){                 /* if((node->start + node->len)- 1> workerArg->wrld->numStrands || node->strandId  > workerArg->wrld->numStrands){
324                      printf("worker=%d, PROBLEM start = %d len = %d id=%d\n",workerArg->id,node->start,node->len,node->strandId);                      printf("worker=%d, PROBLEM start = %d len = %d id=%d\n",workerArg->id,node->start,node->len,node->strandId);
325                      exit(1);                      exit(1);
326                  }*/                  }*/
327                    printf("Should not be called\n");
328                      node->right = Diderot_KDTree_BuildHelper(workerArg->wrld,                      node->right = Diderot_KDTree_BuildHelper(workerArg->wrld,
329                                                        workerArg->sched,                                                        workerArg->sched,
330                                                            node->start,                                                            node->start,
331                                                            node->len,                                                            node->len,
332                                                        node->axis);                                                        node->axis);
333    
334                }else if(workerArg->workerType == SORT_WORKER){
335                  //  printf("<3>\n");
336                    preSort(workerArg->wrld,
337                            workerArg->sched,
338                            workerArg->start,
339                            workerArg->end,
340                            workerArg->axis);
341              }              }
342          //Notify any worker waiting for this task to be completed.          //Notify any worker waiting for this task to be completed.
343                  if(workerArg->workerType == MERGESORT_WORKER ||                  if(workerArg->workerType == MERGESORT_WORKER ||
# Line 352  Line 389 
389      int startIdx = start + (axis * wrld->numStrands);      int startIdx = start + (axis * wrld->numStrands);
390      int endIdx = (start + len) + (axis * wrld->numStrands);      int endIdx = (start + len) + (axis * wrld->numStrands);
391    
392      //  printf("Begin sorting Leader=%d\n",sched->leaderId);
393      Diderot_Spatial_ParMergeSort(wrld,sched,wrld->spatialIndices,wrld->spatialTmpIndices,startIdx,endIdx- 1,333960,axis);      Diderot_Spatial_ParMergeSort(wrld,sched,wrld->spatialIndices,wrld->spatialTmpIndices,startIdx,endIdx- 1,333960,axis);
394      //  printf("Done sorting\n");
395      axis = (axis + 1) % wrld->spatialTree->dim;      axis = (axis + 1) % wrld->spatialTree->dim;
396      int mid = start + ((start + len)-start)/2;      int mid = start + ((start + len)-start)/2;
397    
398        SpatialWorkerArgs_t * worker = Diderot_Grab_SpatailWorkerSort(sched,SORT_WORKER,mid + 1,start + len - (mid+ 1), axis);
399    
400        if(!worker){
401      preSort(wrld,sched,start,mid - start, axis);      preSort(wrld,sched,start,mid - start, axis);
402      preSort(wrld,sched,mid + 1,start + len - (mid+ 1), axis);      preSort(wrld,sched,mid + 1,start + len - (mid+ 1), axis);
403        }else {
404           // printf("<1>\n");
405            preSort(wrld,sched,start,mid - start, axis);
406        }
407  }  }
   
408  @STRANDTY@ * find_median(@PREFIX@World_t *wrld,int start, int end, int dim){  @STRANDTY@ * find_median(@PREFIX@World_t *wrld,int start, int end, int dim){
409    
410      if(end <= start) return NULL;      if(end <= start) return NULL;
# Line 477  Line 522 
522     // double spatialTotalTimeS = (airTime() - spatialST0);     // double spatialTotalTimeS = (airTime() - spatialST0);
523      // if(spatialTotalTimeS >= 0.03)      // if(spatialTotalTimeS >= 0.03)
524      //    printf("maybe fixed parallel time to sort=%f\n",spatialTotalTimeS);      //    printf("maybe fixed parallel time to sort=%f\n",spatialTotalTimeS);
525      double spatialST0 = airTime();     // double spatialST0 = airTime();
526      preSort(wrld,sched,0,*(tree->numOfStrands),0);      preSort(wrld,sched,0,*(tree->numOfStrands),0);
527     double spatialTotalTimeS = (airTime() - spatialST0);     // double spatialTotalTimeS = (airTime() - spatialST0);
528      // if(spatialTotalTimeS >= 0.03)      // if(spatialTotalTimeS >= 0.03)
     printf("maybe fixed parallel time to sort=%f\n",spatialTotalTimeS);  
529    
530      exit(1);      pthread_mutex_lock(&sched->lock);
531            sched->numWorkers +=1;
532        pthread_mutex_unlock(&sched->lock);
533        treeWorker(&sched->workerData[id]);
534    
535      tree->root = Diderot_KDTree_BuildHelper(wrld, wrld->spatialSched,0,*(tree->numOfStrands),0);      tree->root = Diderot_KDTree_BuildHelper(wrld, wrld->spatialSched,0,*(tree->numOfStrands),0);
536     // printf("!!!!!!DONE!!!!\n");     // printf("!!!!!!DONE!!!!\n");
537      pthread_mutex_lock(&sched->lock);      pthread_mutex_lock(&sched->lock);
# Line 518  Line 566 
566      wrld->spatialSched = scheduler;      wrld->spatialSched = scheduler;
567    
568      for(unsigned int i = 0; i < nWorkers; i++){      for(unsigned int i = 0; i < nWorkers; i++){
569                workerArgs[i].isIdle = false;                workerArgs[i].isIdle = true;
570                workerArgs[i].data= 0;                workerArgs[i].data= 0;
571                workerArgs[i].sched = scheduler;                workerArgs[i].sched = scheduler;
572            workerArgs[i].wrld = wrld;            workerArgs[i].wrld = wrld;

Legend:
Removed from v.2581  
changed lines
  Added in v.2582

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0