blob: 5a015a8c3eedf92e3fa72e5ae2d9a54581871459 [file] [log] [blame]
static void initTaskQDetails( TaskQ *t) {
TaskQList *shared = ( TaskQList *)&t->q.shared;
initTaskQList( shared, maxTasks);
}
static inline int getATaskFromHead( TaskQ *t, void *task[NUM_FIELDS]) {
TaskQList *shared = ( TaskQList *)&t->q.shared;
int found;
#ifdef ENABLE_PTHREADS
pthread_mutex_lock(&(t->lock));;
#endif //ENABLE_PTHREADS
found = shared->count;
if ( found) {
IF_STATS( t->statLocal++);
getEntryHead( shared, task);
}
#ifdef ENABLE_PTHREADS
pthread_mutex_unlock(&(t->lock));;
#endif //ENABLE_PTHREADS
return found;
}
static inline int stealTasksSpecialized( TaskQ *myT, TaskQ *srcT) {
TaskQList *srcShared = ( TaskQList *)&srcT->q.shared;
volatile int *srcCount = &srcShared->count;
if ( *srcCount == 0) return 0; // Quick Check. Unprotected.
TaskQList *myShared = ( TaskQList *)&myT->q.shared;
#ifdef ENABLE_PTHREADS
// Grab to locks in a total order to avoid deadlock
if ( ( long)myT < ( long)srcT) { pthread_mutex_lock(&(myT->lock));; pthread_mutex_lock(&(srcT->lock));; }
else { pthread_mutex_lock(&(srcT->lock));; pthread_mutex_lock(&(myT->lock));; }
#endif //ENABLE_PTHREADS
int toSteal = 0;
int found = ( int)*srcCount;
if ( found) {
toSteal = calculateNumSteal( found);
moveEntriesFromTailToHead( srcShared, myShared, toSteal);
}
#ifdef ENABLE_PTHREADS
pthread_mutex_unlock(&(myT->lock));;
pthread_mutex_unlock(&(srcT->lock));;
#endif //ENABLE_PTHREADS
return toSteal;
}
#if 0
static inline int getTasksFromTail( TaskQ *t, void *tasks[MAX_TASKS_TO_STEAL][NUM_FIELDS]){
TaskQList *shared = ( TaskQList *)&t->q.shared;
volatile int *count = &shared->count;
if ( *count == 0) return 0; // Quick Check. Unprotected.
int found,num_tasks_stolen=0;
#ifdef ENABLE_PTHREADS
pthread_mutex_lock(&(t->lock));;
#endif //ENABLE_PTHREADS
found = ( int)*count;
if (found)
num_tasks_stolen=getEntriesTail(shared,tasks);
#ifdef ENABLE_PTHREADS
pthread_mutex_unlock(&(t->lock));;
#endif //ENABLE_PTHREADS
return num_tasks_stolen;
}
#endif
static inline void taskQEnqueueTaskSpecialized( TaskQ *t, void *task[NUM_FIELDS]) {
TaskQList *shared = ( TaskQList *)&t->q.shared;
#ifdef ENABLE_PTHREADS
pthread_mutex_lock(&(t->lock));;
#endif //ENABLE_PTHREADS
putEntryHead( shared, task);
IF_STATS( t->statEnqueued++);
#ifdef ENABLE_PTHREADS
pthread_mutex_unlock(&(t->lock));;
#endif //ENABLE_PTHREADS
}
static inline void assignTasks( TaskQTask3 taskFn, int numDimensions, int queueNo,
long min[MAX_DIMENSION], long max[MAX_DIMENSION], long step[MAX_DIMENSION]) {
TaskQ *t = &taskQs[queueNo];
TaskQList *shared = ( TaskQList *)&t->q.shared;
long i, j, k;
// printf( "----------- %4d %4d ------------------------------\n", numDimensions, queueNo);
// for ( j = 0; j < numDimensions; j++) printf( " %ld :: %4ld %4ld %4ld\n", j, min[j], max[j], step[j]);
#ifdef ENABLE_PTHREADS
pthread_mutex_lock(&(t->lock));;
#endif //ENABLE_PTHREADS
for ( i = min[0]; i < max[0]; i++)
for ( j = min[1]; j < max[1]; j++)
for ( k = min[2]; k < max[2]; k++) {
IF_STATS( t->statEnqueued++);
void *task[NUM_FIELDS];
task[0] = ( void *)taskFn;
task[1] = ( void *)( i * step[0]);
task[2] = ( void *)( j * step[1]);
task[3] = ( void *)( k * step[2]);
// long m; for ( m = 0; m < NUM_FIELDS; m++) { printf( "%10ld", ( long)task[m]); } printf( "\n");
putEntryHead( shared, task);
}
#ifdef ENABLE_PTHREADS
pthread_mutex_unlock(&(t->lock));;
#endif //ENABLE_PTHREADS
}
static inline void taskQEnqueueGridSpecialized( TaskQTask3 taskFunction, TaskQThreadId threadId,
int numOfDimensions, long tileSize[MAX_DIMENSION]) {
TQ_ASSERT( MAX_DIMENSION == 3); // assignTasks assumes this
TQ_ASSERT( ( threadId == 0) && ( parallelRegion == 0)); // Since we are enqueuing tasks in other threads
}