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)
110 SCIP_Bool blockwhenfull
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;
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;
510 if( currjob->
jobid == jobid )
549 if( currjob->
jobid == jobid )
561 if( prevjob !=
NULL )
599 SCIP_Bool blockwhenfull
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
#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)
static SCIP_Bool isJobRunning(int jobid)
static SCIP_Bool isJobWaiting(int jobid)
void SCIPtpiDestroyCondition(SCIP_CONDITION **condition)
#define SCIPompDestroyCondition(condition)
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