Commit a2ec137b56cf73b4bd6b4693c9750e077ec2edf4
1 parent
f3c60625
Exists in
master
updated to PaCCS version 0.90d
Showing
9 changed files
with
61 additions
and
23 deletions
Show diff stats
README
1 | -PaCCS version 0.90c | 1 | +PaCCS version 0.90d |
2 | 2 | ||
3 | -All files Copyright (C) 2009-2015 Vasco Pedro <vp@di.uevora.pt> | 3 | +All files Copyright (C) 2009-2016 Vasco Pedro <vp@di.uevora.pt> |
4 | All rights reserved. | 4 | All rights reserved. |
5 | 5 | ||
6 | * Compiling | 6 | * Compiling |
@@ -103,7 +103,24 @@ Problem splitting: | @@ -103,7 +103,24 @@ Problem splitting: | ||
103 | teams) | 103 | teams) |
104 | 104 | ||
105 | See the TUNING file for the options to use with the different | 105 | See the TUNING file for the options to use with the different |
106 | -problems. | 106 | +problems, and the src/problem.c file for all the available options. |
107 | + | ||
108 | +** Arguments | ||
109 | + | ||
110 | +The arguments for some of the benchmark problems are: | ||
111 | + | ||
112 | + costas array-length | ||
113 | + golomb n.-of-marks | ||
114 | + k-queens [-k n.-of-copies] n.-of-queens | ||
115 | + langford n.-of-sets set-size | ||
116 | + magic-seq sequence-length | ||
117 | + magic-square square-size | ||
118 | + partition n.-of-values | ||
119 | + qap problem-name (see qap.h, DEFAULT is esc16i) | ||
120 | + queens n.-of-queens | ||
121 | + | ||
122 | +Arguments should come at the end of the command line, after any | ||
123 | +runtime option. | ||
107 | 124 | ||
108 | 125 | ||
109 | * Programming | 126 | * Programming |
TUNING
@@ -13,6 +13,8 @@ costas | @@ -13,6 +13,8 @@ costas | ||
13 | --label --most-constrained | 13 | --label --most-constrained |
14 | --split-even (first solution) | 14 | --split-even (first solution) |
15 | 15 | ||
16 | + N <= DOMAIN_BITS / 2 | ||
17 | + | ||
16 | queens | 18 | queens |
17 | -DDOMAIN_BOUNDS ??? [not ism] | 19 | -DDOMAIN_BOUNDS ??? [not ism] |
18 | --first-fail | 20 | --first-fail |
bench/costas.c
@@ -138,12 +138,20 @@ int main(int argc, char *argv[]) | @@ -138,12 +138,20 @@ int main(int argc, char *argv[]) | ||
138 | break; | 138 | break; |
139 | } | 139 | } |
140 | 140 | ||
141 | + fd_end(); | ||
142 | + | ||
143 | + { | ||
144 | + // avoid failure messages from mpirun | ||
145 | + extern int _fd_counting_solutions; // XXX: private variable | ||
146 | + | ||
147 | + if (_fd_counting_solutions) | ||
148 | + return 0; | ||
149 | + } | ||
150 | + | ||
141 | if (solutions) | 151 | if (solutions) |
142 | printf("%d solutions found\n", solutions); | 152 | printf("%d solutions found\n", solutions); |
143 | else | 153 | else |
144 | printf("inconsistent CSP\n"); | 154 | printf("inconsistent CSP\n"); |
145 | 155 | ||
146 | - fd_end(); | ||
147 | - | ||
148 | return !solutions; | 156 | return !solutions; |
149 | } | 157 | } |
bench/queens.c
@@ -129,12 +129,20 @@ int main(int argc, char *argv[]) | @@ -129,12 +129,20 @@ int main(int argc, char *argv[]) | ||
129 | break; | 129 | break; |
130 | } | 130 | } |
131 | 131 | ||
132 | + fd_end(); | ||
133 | + | ||
134 | + { | ||
135 | + // avoid failure messages from mpirun | ||
136 | + extern int _fd_counting_solutions; // XXX: private variable | ||
137 | + | ||
138 | + if (_fd_counting_solutions) | ||
139 | + return 0; | ||
140 | + } | ||
141 | + | ||
132 | if (solutions) | 142 | if (solutions) |
133 | printf("%d solutions found\n", solutions); | 143 | printf("%d solutions found\n", solutions); |
134 | else | 144 | else |
135 | printf("inconsistent CSP\n"); | 145 | printf("inconsistent CSP\n"); |
136 | 146 | ||
137 | - fd_end(); | ||
138 | - | ||
139 | return !solutions; | 147 | return !solutions; |
140 | } | 148 | } |
src/VERSION
src/agents-splitgo-mpi.c
@@ -44,7 +44,7 @@ | @@ -44,7 +44,7 @@ | ||
44 | # error "don't know which MPI type to use for MPI_DOMAIN_TYPE" | 44 | # error "don't know which MPI type to use for MPI_DOMAIN_TYPE" |
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | -#define MAX_AGENTS 256 | 47 | +#define MAX_AGENTS 1024 |
48 | 48 | ||
49 | // number of workers to use | 49 | // number of workers to use |
50 | int fd__workers = -1; | 50 | int fd__workers = -1; |
@@ -1441,12 +1441,12 @@ int _fd_dsolve() | @@ -1441,12 +1441,12 @@ int _fd_dsolve() | ||
1441 | if (nagents < 0) | 1441 | if (nagents < 0) |
1442 | { | 1442 | { |
1443 | nagents = 0; | 1443 | nagents = 0; |
1444 | - _fd_debug("[%d] using %d workers\n", tid, nagents); | 1444 | + fd__info("[%d] using %d workers\n", tid, nagents); |
1445 | } | 1445 | } |
1446 | else if (nagents > MAX_AGENTS) | 1446 | else if (nagents > MAX_AGENTS) |
1447 | { | 1447 | { |
1448 | nagents = MAX_AGENTS; | 1448 | nagents = MAX_AGENTS; |
1449 | - _fd_debug("[%d] using %d workers\n", tid, nagents); | 1449 | + fd__info("[%d] limiting workers to %d\n", tid, nagents); |
1450 | } | 1450 | } |
1451 | } | 1451 | } |
1452 | 1452 |
src/agents-splitgo.c
@@ -21,7 +21,7 @@ | @@ -21,7 +21,7 @@ | ||
21 | #error "must USE_STORE" | 21 | #error "must USE_STORE" |
22 | #endif | 22 | #endif |
23 | 23 | ||
24 | -#define MAX_AGENTS 256 | 24 | +#define MAX_AGENTS 1024 |
25 | 25 | ||
26 | // number of workers to use | 26 | // number of workers to use |
27 | int fd__workers = -1; | 27 | int fd__workers = -1; |
@@ -238,12 +238,12 @@ int _fd_dsolve() | @@ -238,12 +238,12 @@ int _fd_dsolve() | ||
238 | if (nagents < 0) | 238 | if (nagents < 0) |
239 | { | 239 | { |
240 | nagents = 0; | 240 | nagents = 0; |
241 | - _fd_debug("using %d workers\n", nagents); | 241 | + fd__info("using %d workers\n", nagents); |
242 | } | 242 | } |
243 | else if (nagents > MAX_AGENTS) | 243 | else if (nagents > MAX_AGENTS) |
244 | { | 244 | { |
245 | nagents = MAX_AGENTS; | 245 | nagents = MAX_AGENTS; |
246 | - _fd_debug("using %d workers\n", nagents); | 246 | + fd__info("limiting workers to %d\n", nagents); |
247 | } | 247 | } |
248 | } | 248 | } |
249 | 249 |
src/pool.c
@@ -18,6 +18,7 @@ static __thread int *split_variable; | @@ -18,6 +18,7 @@ static __thread int *split_variable; | ||
18 | #endif | 18 | #endif |
19 | 19 | ||
20 | #ifdef GROWABLE_POOL | 20 | #ifdef GROWABLE_POOL |
21 | +// number of stores in the pool | ||
21 | #define POOL_DEFAULT_SIZE 32 | 22 | #define POOL_DEFAULT_SIZE 32 |
22 | static __thread int pool_size; | 23 | static __thread int pool_size; |
23 | #endif | 24 | #endif |
@@ -31,13 +32,10 @@ static int EMPTY_POOL[] = { 0, 0 }; | @@ -31,13 +32,10 @@ static int EMPTY_POOL[] = { 0, 0 }; | ||
31 | 32 | ||
32 | #ifndef STORE_IN_POOL | 33 | #ifndef STORE_IN_POOL |
33 | #define STEAL_THRESHOLD 3 // an agent with less stores won't be stolen from | 34 | #define STEAL_THRESHOLD 3 // an agent with less stores won't be stolen from |
34 | -#define INDEX_SAFE 3 // XXX: explain.... | 35 | +#define INDEX_SAFE 3 // lock-free access with these many stores in the pool |
35 | #else | 36 | #else |
36 | -// XXX: should STEAL_THRESHOLD and INDEX_SAFE be changed (because | ||
37 | -// there's one extra store in the pool)? | ||
38 | -// changing for now, to be able to compare performances | ||
39 | -#define STEAL_THRESHOLD 4 | ||
40 | -#define INDEX_SAFE 4 | 37 | +#define STEAL_THRESHOLD (3 + 1) |
38 | +#define INDEX_SAFE (3 + 1) | ||
41 | #endif | 39 | #endif |
42 | 40 | ||
43 | static pthread_mutex_t *stores_mutexes; | 41 | static pthread_mutex_t *stores_mutexes; |
@@ -58,7 +56,7 @@ static __thread unsigned long pool_gets = 0; | @@ -58,7 +56,7 @@ static __thread unsigned long pool_gets = 0; | ||
58 | #endif | 56 | #endif |
59 | 57 | ||
60 | #ifdef STATS_STEALS | 58 | #ifdef STATS_STEALS |
61 | -#define MAX_AGENTS 256 // XXX: copied from agents-splitgo*.c | 59 | +#define MAX_AGENTS 1024 // XXX: copied from agents-splitgo*.c |
62 | static unsigned long sts_attempts[MAX_AGENTS + 1], sts_done[MAX_AGENTS + 1]; | 60 | static unsigned long sts_attempts[MAX_AGENTS + 1], sts_done[MAX_AGENTS + 1]; |
63 | #ifdef RANDOM_VICTIM | 61 | #ifdef RANDOM_VICTIM |
64 | static unsigned long sts_checks[MAX_AGENTS + 1], sts_slept[MAX_AGENTS + 1]; | 62 | static unsigned long sts_checks[MAX_AGENTS + 1], sts_slept[MAX_AGENTS + 1]; |
@@ -95,8 +93,10 @@ void _fd_init_store_depository(int agents) | @@ -95,8 +93,10 @@ void _fd_init_store_depository(int agents) | ||
95 | // XXX: check for NULL's | 93 | // XXX: check for NULL's |
96 | split_stores_ = calloc(agents, sizeof(*split_stores_)); | 94 | split_stores_ = calloc(agents, sizeof(*split_stores_)); |
97 | split_indexes = calloc(agents, sizeof(*split_indexes)); | 95 | split_indexes = calloc(agents, sizeof(*split_indexes)); |
98 | - // XXX: mitigate a race condition: another agent may try to access | ||
99 | - // this before proper initialisation by the owning agent | 96 | + |
97 | + // these will be properly initialised later, by the agent; | ||
98 | + // for now, just make sure that if another agent tries to access it | ||
99 | + // before that happens, it will find a sensible value there | ||
100 | for (i = 0; i < agents; ++i) | 100 | for (i = 0; i < agents; ++i) |
101 | split_indexes[i] = EMPTY_POOL; | 101 | split_indexes[i] = EMPTY_POOL; |
102 | 102 |
src/problem.c
@@ -98,6 +98,9 @@ static void _fd_parse_general_options(int *argc, char *argv[]) | @@ -98,6 +98,9 @@ static void _fd_parse_general_options(int *argc, char *argv[]) | ||
98 | ; | 98 | ; |
99 | #endif | 99 | #endif |
100 | else if (!strcmp(argv[i], "--no-sort")) /* miscellaneous */ | 100 | else if (!strcmp(argv[i], "--no-sort")) /* miscellaneous */ |
101 | + // Note: the meaning of this option depends on whether it | ||
102 | + // appears in the command line before or after the choice of the | ||
103 | + // variable selection heuristic (see the code above) | ||
101 | sort = false; | 104 | sort = false; |
102 | else if (!strncmp(argv[i], "--workers=", sizeof("--workers=") - 1)) | 105 | else if (!strncmp(argv[i], "--workers=", sizeof("--workers=") - 1)) |
103 | fd__workers = atoi(argv[i] + sizeof("--workers=") - 1); | 106 | fd__workers = atoi(argv[i] + sizeof("--workers=") - 1); |