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

SCM Repository

[diderot] Annotation of /branches/vis15/src/lib/parallel-target/scheduler.cxx
ViewVC logotype

Annotation of /branches/vis15/src/lib/parallel-target/scheduler.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4637 - (view) (download) (as text)

1 : jhr 4180 /*! \file scheduler.cxx
2 :     *
3 :     * \author John Reppy
4 :     */
5 :    
6 :     /*
7 :     * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
8 :     *
9 :     * COPYRIGHT (c) 2016 The University of Chicago
10 :     * All rights reserved.
11 :     */
12 :    
13 :     #include "diderot/parallel.hxx"
14 :    
15 :     #if defined (__APPLE__)
16 :     # include <sys/sysctl.h>
17 : jhr 4266 #elif defined(HAVE__PROC_CPUINFO)
18 :     # include <cstdio> // for sscanf
19 :     # include <fstream>
20 :     # ifdef HAVE_LIBNUMA
21 :     # include <numa.h>
22 :     # endif
23 : jhr 4180 #endif
24 :     #include <errno.h>
25 :    
26 :     namespace diderot {
27 :    
28 :     bool scheduler::get_cpu_info (world_base *wrld)
29 :     {
30 :     #if defined(HAVE__PROC_CPUINFO)
31 :     /* Get information from /proc/cpuinfo. The interesting
32 :     * fields are:
33 :     *
34 :     * processor : <id> # logical processor id
35 :     * physical id : <id> # node id
36 :     * core id : <id> # core id (per node)
37 :     * cpu cores : <n> # number of cores per node
38 :     */
39 : jhr 4351 std::ifstream cpuinfo("/proc/cpuinfo");
40 :     if (cpuinfo.good()) {
41 :     int maxProcId = 0, maxNodeId = 0, maxCoreId = 0, nCores = 0;
42 :     char buf[1024];
43 :     cpuinfo.getline (buf, sizeof(buf));
44 :     while (cpuinfo.good()) {
45 :     int tmp;
46 :     if (sscanf(buf, "processor : %d", &tmp) == 1) {
47 :     maxProcId = (tmp > maxProcId) ? tmp : maxProcId;
48 :     }
49 :     else if (sscanf(buf, "physical id : %d", &tmp) == 1) {
50 :     maxNodeId = (tmp > maxNodeId) ? tmp : maxNodeId;
51 :     }
52 :     else if (sscanf(buf, "core id : %d", &tmp) == 1) {
53 :     maxCoreId = (tmp > maxCoreId) ? tmp : maxCoreId;
54 :     }
55 :     else if (sscanf(buf, "cpu cores : %d", &tmp) == 1) {
56 :     nCores = (tmp > nCores) ? tmp : nCores;
57 :     }
58 :     cpuinfo.getline (buf, sizeof(buf));
59 :     }
60 :     cpuinfo.close();
61 : jhr 4180 #ifdef HAVE_LIBNUMA
62 : jhr 4351 this->_numHWThreads = this->_numHWCores = maxProcId + 1;
63 :     this->_numHWNodes = numa_max_node()+1;
64 :     this->_numThdsPerCore = 1;
65 :     this->_numCoresPerNode = this->_numHWThreads / this->_numHWNodes;
66 : jhr 4180 #else
67 : jhr 4351 this->_numHWNodes = maxNodeId + 1;
68 :     this->_numHWCores = this->_numHWNodes * nCores;
69 :     this->_numHWThreads = maxProcId + 1;
70 :     this->_numCoresPerNode = nCores;
71 :     this->_numThdsPerCore = this->_numHWThreads / this->_numHWCores;
72 : jhr 4180 #endif
73 : jhr 4351 return false;
74 :     }
75 :     else {
76 :     wrld->error ("unable to determine the number of processors\n");
77 :     return true;
78 :     }
79 : jhr 4180 #elif defined(__APPLE__)
80 : jhr 4351 size_t len = sizeof(int);
81 : jhr 4180
82 :     /* the number of nodes */
83 : jhr 4351 if (sysctlbyname("hw.packages", &(this->_numHWNodes), &len, 0, 0) < 0) {
84 :     if (errno == ENOENT) {
85 :     // "hw.packages" is not known
86 :     this->_numHWNodes = 1;
87 :     }
88 :     else {
89 :     wrld->error ("unable to determine the number of nodes\n");
90 :     return true;
91 :     }
92 :     }
93 : jhr 4180
94 :     /* the number of cores */
95 : jhr 4351 if (sysctlbyname("hw.physicalcpu", &(this->_numHWCores), &len, 0, 0) < 0) {
96 :     wrld->error ("unable to determine the number of physical CPUs\n");
97 :     return true;
98 :     }
99 : jhr 4180
100 :     /* the number of hardware threads */
101 : jhr 4351 if (sysctlbyname("hw.logicalcpu", &(this->_numHWThreads), &len, 0, 0) < 0) {
102 :     if (errno == ENOENT) {
103 :     // "hw.packages" is not known
104 :     this->_numHWThreads = this->_numHWCores;
105 :     }
106 :     else {
107 :     wrld->error ("unable to determine the number of logical CPUs\n");
108 :     return true;
109 :     }
110 :     }
111 : jhr 4180
112 : jhr 4351 this->_numCoresPerNode = this->_numHWCores / this->_numHWNodes;
113 :     this->_numThdsPerCore = this->_numHWThreads / this->_numHWCores;
114 : jhr 4180
115 : jhr 4351 return false;
116 : jhr 4180 #else
117 : jhr 4351 return true;
118 : jhr 4180 #endif
119 :     }
120 :    
121 :     scheduler::scheduler ()
122 : jhr 4351 : _numHWNodes(0), _numHWCores(0), _numHWThreads(0), _numCoresPerNode(0),
123 :     _numThdsPerCore(0), _numWorkers(0), _workSize(0), _nextStrand(0),
124 :     _nactive(0), _nstable(0), _navail(0), _nidle(0), _nsteps(0)
125 : jhr 4180 {
126 : jhr 4351 pthread_mutex_init (&this->_lock, nullptr);
127 :     pthread_cond_init (&this->_runWait, nullptr);
128 : jhr 4180 }
129 :    
130 :     scheduler::~scheduler ()
131 :     {
132 : jhr 4351 pthread_mutex_destroy (&this->_lock);
133 :     pthread_cond_destroy (&this->_runWait);
134 : jhr 4180 }
135 :    
136 : jhr 4637 void worker_main (void *data)
137 :     {
138 :     worker_info *myInfo = static_cast<worker_info *>(data);
139 :     scheduler *sched = myInfo->_sched;
140 :    
141 :     while (true) {
142 :     // wait on barrier
143 :     // check for termination
144 :     if (sched->_done) {
145 :     return;
146 :     }
147 :     // run the task
148 :     sched->_task (myInfo);
149 :     }
150 :    
151 :     }
152 :    
153 :    
154 : jhr 4180 } // namepace diderot

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