2
#include "atlas_taffinity.h" /* include this file first! */
4
#include "atlas_misc.h"
5
#include "atlas_threads.h"
7
#if !defined(ATL_NOAFFINITY) && defined(ATL_PAFF_SELF)
8
static int ATL_setmyaffinity(ATL_thread_t *me)
10
* Attempts to sets the affinity of an already-running thread. The
11
* aff_set flag is set to true whether we succeed or not (no point in
12
* trying multiple times).
13
* RETURNS: 0 on success, non-zero error code on error
16
#ifdef ATL_RANK_IS_PROCESSORID
17
const int bindID = me->rank % ATL_AFF_NUMID;
19
const int bindID = ATL_affinityIDs[me->rank%ATL_AFF_NUMID];
22
plpa_cpu_set_t cpuset;
23
PLPA_CPU_ZERO(&cpuset);
24
PLPA_CPU_SET(bindID, &cpuset);
28
return(plpa_sched_setaffinity((pid_t)0, sizeof(cpuset), &cpuset));
29
#elif defined(ATL_PAFF_PBIND)
30
return(processor_bind(P_LWPID, P_MYID, bindID, NULL));
31
#elif defined(ATL_PAFF_SCHED)
34
CPU_SET(bindID, &cpuset);
38
return(sched_setaffinity(0, sizeof(cpuset), &cpuset));
39
#elif defined (ATL_PAFF_RUNON)
43
return(pthread_setrunon_np(bindID));
44
#elif defined(ATL_PAFF_BINDP)
48
return(bindprocessor(BINDTHREAD, thread_self(), bindID));
49
#elif defined(ATL_PAFF_CPUSET) /* untried FreeBSD code */
51
CPU_ZERO(&mycpuset); /* no manpage, so guess works like linux */
52
CPU_SET(bindID, &mycpuset);
56
return(cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1,
57
sizeof(mycpuset), &mycpuset));
62
#if defined(ATL_TUNING) && defined(ATL_NOAFFINITY)
63
void *ATL_dyntlaunch_noaff(void *vp)
65
void *ATL_dyntlaunch(void *vp)
68
ATL_thread_t *tp = vp, *btp;
69
ATL_LAUNCHSTRUCT_t *lp;
70
const int iam = tp->rank, P = tp->P;
71
int i, src, dest, nthrP2, mask, abit;
75
acnt = lp->acounts[0];
78
* Set my affinity if I haven't already
82
ATL_setmyaffinity(tp);
84
dest = ATL_DecGlobalAtomicCount(acnt, iam);
88
ATL_thread_start(btp+dest, dest, 0, ATL_dyntlaunch, btp+dest);
89
dest = ATL_DecGlobalAtomicCount(acnt, iam);
96
* Do combine in minimum spanning tree, combining results as required
98
for (i=0; (1<<i) < P; i++);
101
for (i=0; i < nthrP2; i++)
111
while (lp->chkin[src] != ATL_CHK_DONE_OP)
114
lp->DoComb(lp->opstruct, iam, src);
119
lp->chkin[iam] = ATL_CHK_DONE_OP;
120
ATL_thread_exit(NULL);