44#define SCIPompInitLock(lock) (omp_init_lock(lock), SCIP_OKAY)
45#define SCIPompDestroyLock(lock) (omp_destroy_lock(lock))
46#define SCIPompAcquireLock(lock) (omp_set_lock(lock), SCIP_OKAY)
47#define SCIPompReleaseLock(lock) (omp_unset_lock(lock), SCIP_OKAY)
50#define SCIPompInitCondition(condition) ( omp_init_lock(&(condition)->_lock), \
51 (condition)->_waiters = 0, (condition)->_waitnum = 0, (condition)->_signals = 0, SCIP_OKAY )
52#define SCIPompDestroyCondition(condition) do { assert((condition)->_waiters == 0); assert((condition)->_waitnum == 0); assert((condition)->_signals == 0); omp_destroy_lock(&(condition)->_lock); } while(0)
121 _jobqueues->jobqueue.firstjob =
NULL;
122 _jobqueues->jobqueue.lastjob =
NULL;
123 _jobqueues->jobqueue.njobs = 0;
124 _jobqueues->finishedjobs.firstjob =
NULL;
125 _jobqueues->finishedjobs.lastjob =
NULL;
126 _jobqueues->finishedjobs.njobs = 0;
127 _jobqueues->ncurrentjobs = 0;
133 _jobqueues->currentjobs[
i] =
NULL;
171 _jobqueues->currentjobs[threadnum] = job;
177 _jobqueues->ncurrentjobs--;
178 _jobqueues->currentjobs[threadnum] =
NULL;
181 if( _jobqueues->finishedjobs.njobs == 0 )
183 _jobqueues->finishedjobs.firstjob = job;
184 _jobqueues->finishedjobs.lastjob = job;
188 _jobqueues->finishedjobs.lastjob->nextjob = job;
189 _jobqueues->finishedjobs.lastjob = job;
192 ++_jobqueues->finishedjobs.njobs;
210 waitnum = ++condition->_waitnum;
212 ++condition->_waiters;
217 #pragma omp taskyield
220 while( condition->_signals < waitnum );
222 --condition->_waiters;
224 if( condition->_waiters == 0 )
226 condition->_signals = 0;
227 condition->_waitnum = 0;
249 waitnum = ++condition->_waitnum;
251 ++condition->_waiters;
256 #pragma omp taskyield
259 while( condition->_signals < waitnum );
261 --condition->_waiters;
263 if( condition->_waiters == 0 )
265 condition->_signals = 0;
266 condition->_waitnum = 0;
296 if( _jobqueues->jobqueue.njobs == 1 )
298 job = _jobqueues->jobqueue.firstjob;
299 _jobqueues->jobqueue.firstjob =
NULL;
300 _jobqueues->jobqueue.lastjob =
NULL;
301 --(_jobqueues->jobqueue.njobs);
303 else if( _jobqueues->jobqueue.njobs > 1 )
305 job = _jobqueues->jobqueue.firstjob;
306 _jobqueues->jobqueue.firstjob = job->
nextjob;
307 --_jobqueues->jobqueue.njobs;
314 ++(_jobqueues->ncurrentjobs);
347 if( _jobqueues->jobqueue.njobs == 0 )
349 _jobqueues->jobqueue.firstjob = newjob;
350 _jobqueues->jobqueue.lastjob = newjob;
354 _jobqueues->jobqueue.lastjob->nextjob = newjob;
355 _jobqueues->jobqueue.lastjob = newjob;
358 _jobqueues->jobqueue.njobs++;
369 _jobqueues->ncurrentjobs++;
373 #pragma omp task firstprivate(newjob)
390 if( condition->_waitnum > condition->_signals )
391 ++condition->_signals;
407 condition->_signals = condition->_waitnum;
419 return omp_get_num_threads();
426 return omp_get_thread_num();
439 (*job)->jobid = jobid;
440 (*job)->jobfunc = jobfunc;
441 (*job)->args = jobarg;
442 (*job)->nextjob =
NULL;
452 static int currentjobid = 0;
455 #pragma omp atomic capture
456 jobid = ++currentjobid;
484 if( _jobqueues->ncurrentjobs > 0 )
486 for(
i = 0;
i < _jobqueues->nthreads; ++
i )
488 if( _jobqueues->currentjobs[
i] !=
NULL && _jobqueues->currentjobs[
i]->jobid == jobid )
503 if( _jobqueues->jobqueue.njobs > 0 )
506 currjob = _jobqueues->jobqueue.firstjob;
510 if( currjob->
jobid == jobid )
513 if( currjob == _jobqueues->jobqueue.lastjob )
541 if( _jobqueues->finishedjobs.njobs > 0 )
543 SCIP_JOB* currjob = _jobqueues->finishedjobs.firstjob;
549 if( currjob->
jobid == jobid )
557 if( currjob == _jobqueues->finishedjobs.firstjob )
558 _jobqueues->finishedjobs.firstjob = currjob->
nextjob;
561 if( prevjob !=
NULL )
565 if( currjob == _jobqueues->finishedjobs.lastjob )
566 _jobqueues->finishedjobs.lastjob = prevjob;
568 _jobqueues->finishedjobs.njobs--;
581 while( prevjob != _jobqueues->finishedjobs.lastjob );
616 assert(_jobqueues->finishedjobs.njobs == 0);
617 assert(_jobqueues->jobqueue.njobs == 0);
618 assert(_jobqueues->ncurrentjobs == 0);
638 omp_init_lock(&(*lock)->lock);
649 omp_destroy_lock(&(*lock)->lock);
658 omp_set_lock(&
lock->lock);
667 omp_unset_lock(&
lock->lock);
685 omp_init_lock(&(*condition)->_lock);
686 (*condition)->_waiters = 0;
687 (*condition)->_waitnum = 0;
688 (*condition)->_signals = 0;
698 assert((*condition)->_waiters == 0);
699 assert((*condition)->_waitnum == 0);
700 assert((*condition)->_signals == 0);
702 omp_destroy_lock(&(*condition)->_lock);
721 (void)
SCIPsnprintf(name, namesize,
"OpenMP %d", _OPENMP);
732 (void)
SCIPsnprintf(desc, descsize,
"shared-memory multiprocessing library (openmp.org)");
#define SCIP_CALL_ABORT(x)
int SCIPsnprintf(char *t, int len, const char *s,...)
assert(minobj< SCIPgetCutoffbound(scip))
memory allocation routines
#define BMSfreeMemory(ptr)
#define BMSallocMemoryArray(ptr, num)
#define BMSfreeMemoryArray(ptr)
#define BMSallocMemory(ptr)
public methods for message output
public data structures and miscellaneous methods
SCIP_JOBQUEUE finishedjobs
SCIP_CONDITION jobfinished
struct SCIP_Job * nextjob
SCIP_RETCODE(* jobfunc)(void *args)
the type definitions for the SCIP parallel interface
int SCIPtpiGetNumThreads(void)
#define SCIPompInitLock(lock)
SCIP_Bool SCIPtpiIsAvailable(void)
#define SCIPompAcquireLock(lock)
SCIP_RETCODE SCIPtpiWaitCondition(SCIP_CONDITION *condition, SCIP_LOCK *lock)
SCIP_RETCODE SCIPtpiCreateJob(SCIP_JOB **job, int jobid, SCIP_RETCODE(*jobfunc)(void *args), void *jobarg)
SCIP_RETCODE SCIPtpiSignalCondition(SCIP_CONDITION *condition)
static SCIP_RETCODE jobQueueAddJob(SCIP_JOB *newjob)
SCIP_RETCODE SCIPtpiAcquireLock(SCIP_LOCK *lock)
#define SCIPompReleaseLock(lock)
#define SCIPompDestroyLock(lock)
int SCIPtpiGetNumThreads()
SCIP_RETCODE SCIPtpiExit(void)
static void executeJob(SCIP_JOB *job)
SCIP_RETCODE SCIPtpiBroadcastCondition(SCIP_CONDITION *condition)
static SCIP_RETCODE freeJobQueue(void)
static void jobQueueProcessJob(void)
SCIP_RETCODE SCIPtpiSubmitJob(SCIP_JOB *job, SCIP_SUBMITSTATUS *status)
void SCIPtpiDestroyLock(SCIP_LOCK **lock)
void SCIPtpiGetLibraryDesc(char *desc, int descsize)
SCIP_RETCODE SCIPtpiCollectJobs(int jobid)
static SCIP_RETCODE SCIPompWaitCondition(SCIP_CONDITION *condition, omp_lock_t *lock)
static SCIP_RETCODE createJobQueue(int nthreads, int qsize, SCIP_Bool blockwhenfull)
struct SCIP_JobQueue SCIP_JOBQUEUE
static SCIP_Bool isJobRunning(int jobid)
static SCIP_Bool isJobWaiting(int jobid)
void SCIPtpiDestroyCondition(SCIP_CONDITION **condition)
#define SCIPompDestroyCondition(condition)
struct SCIP_JobQueues SCIP_JOBQUEUES
int SCIPtpiGetNewJobID(void)
void SCIPtpiGetLibraryName(char *name, int namesize)
SCIP_RETCODE SCIPtpiInitLock(SCIP_LOCK **lock)
int SCIPtpiGetThreadNum()
SCIP_RETCODE SCIPtpiReleaseLock(SCIP_LOCK *lock)
SCIP_RETCODE SCIPtpiInitCondition(SCIP_CONDITION **condition)
SCIP_RETCODE SCIPtpiInit(int nthreads, int queuesize, SCIP_Bool blockwhenfull)
#define SCIPompInitCondition(condition)
enum SCIP_Retcode SCIP_RETCODE
enum SCIP_Submitstatus SCIP_SUBMITSTATUS
struct SCIP_Condition SCIP_CONDITION
struct SCIP_Lock SCIP_LOCK