|
21 | 21 | :- import_module require. |
22 | 22 | :- import_module string. |
23 | 23 | :- import_module thread. |
| 24 | +:- import_module thread.future. |
24 | 25 | :- import_module thread.mvar. |
25 | 26 |
|
26 | 27 | main(!IO) :- |
|
115 | 116 | ---> parallel_conj |
116 | 117 | ; parallel_spawn |
117 | 118 | ; parallel_spawn_native |
| 119 | + ; parallel_future |
118 | 120 | ; sequential. |
119 | 121 |
|
120 | 122 | :- pred process_options(option_table(option)::in, maybe_error(options)::out) |
|
143 | 145 | ; |
144 | 146 | ParallelStr = "spawn_native", |
145 | 147 | Parallel0 = parallel_spawn_native |
| 148 | + ; |
| 149 | + ParallelStr = "future", |
| 150 | + Parallel0 = parallel_future |
146 | 151 | ) |
147 | 152 | -> |
148 | 153 | MaybeParallel = ok(Parallel0) |
149 | 154 | ; |
150 | 155 | MaybeParallel = error( |
151 | | - "Parallel must be one of ""no"", ""conj"", ""spawn"" or " ++ |
152 | | - """spawn_native""") |
| 156 | + "Parallel must be one of ""no"", ""conj"", ""spawn"", " ++ |
| 157 | + """spawn_native"" or ""future""") |
153 | 158 | ), |
154 | 159 |
|
155 | 160 | getopt.lookup_maybe_int_option(Table, dim_x, MaybeX), |
|
198 | 203 | "\t\tThe dimensions of the image, specify neither or both\n", !IO), |
199 | 204 | write_string("\t-p <how> --parallel <how>\n", !IO), |
200 | 205 | write_string( |
201 | | - "\t\t<how> is one of ""no"", ""conj"", ""spawn"" or\n", !IO), |
| 206 | + "\t\t<how> is one of ""no"", ""conj"", ""spawn"",\n", !IO), |
| 207 | + write_string( |
| 208 | + "\t\t""spawn_native"" or ""future"". These may be grade", !IO), |
202 | 209 | write_string( |
203 | | - "\t\t""spawn_native"". These may be grade dependent.\n", !IO), |
| 210 | + "\t\tdependent.\n", !IO), |
204 | 211 | write_string("\t-d --dependent-conjunctions\n", !IO), |
205 | 212 | write_string( |
206 | 213 | "\t\tUse an accumulator to represent the rows rendered so far\n", !IO). |
|
241 | 248 | :- pred draw_rows_dep(parallel::in, list(float)::in, list(float)::in, |
242 | 249 | cord(colour)::out) is det. |
243 | 250 |
|
244 | | -draw_rows_dep(sequential, Xs, Ys, Rows) :- |
245 | | - map_foldl(draw_row(Xs), append_row, Ys, empty, Rows). |
246 | | -draw_rows_dep(parallel_conj, Xs, Ys, Rows) :- |
247 | | - map_foldl_par_conj(draw_row(Xs), append_row, Ys, empty, Rows). |
248 | | -draw_rows_dep(parallel_spawn, Xs, Ys, Rows) :- |
249 | | - map_foldl_par_spawn(draw_row(Xs), append_row, Ys, empty, Rows). |
250 | | -draw_rows_dep(parallel_spawn_native, Xs, Ys, Rows) :- |
251 | | - map_foldl_par_spawn_native(draw_row(Xs), append_row, Ys, empty, Rows). |
| 251 | +draw_rows_dep(Parallel, Xs, Ys, Rows) :- |
| 252 | + ( |
| 253 | + Parallel = sequential, |
| 254 | + map_foldl(draw_row(Xs), append_row, Ys, empty, Rows) |
| 255 | + ; |
| 256 | + Parallel = parallel_conj, |
| 257 | + map_foldl_par_conj(draw_row(Xs), append_row, Ys, empty, Rows) |
| 258 | + ; |
| 259 | + ( Parallel = parallel_spawn |
| 260 | + ; Parallel = parallel_spawn_native |
| 261 | + ; Parallel = parallel_future |
| 262 | + ), |
| 263 | + sorry($file, $pred, string(Parallel)) |
| 264 | + ). |
252 | 265 |
|
253 | 266 | :- pred draw_rows_indep(parallel::in, list(float)::in, list(float)::in, |
254 | 267 | cord(colour)::out) is det. |
|
270 | 283 | promise_equivalent_solutions [RowList] ( |
271 | 284 | my_map_par_spawn_native(draw_row(Xs), Ys, RowList) |
272 | 285 | ) |
| 286 | + ; |
| 287 | + Parallel = parallel_future, |
| 288 | + my_map_par_future(draw_row(Xs), Ys, RowList) |
273 | 289 | ), |
274 | 290 | foldl(append_row, RowList, empty, Rows). |
275 | 291 |
|
|
375 | 391 | map_foldl_par_conj(M, F, Xs, !Acc) |
376 | 392 | ). |
377 | 393 |
|
378 | | -:- pred map_foldl_par_spawn(pred(X, Y), pred(Y, A, A), list(X), A, A). |
379 | | -:- mode map_foldl_par_spawn(pred(in, out) is det, pred(in, in, out) is det, |
380 | | - in, in, out) is erroneous. |
381 | | - |
382 | | -map_foldl_par_spawn(_, _, _, !Acc) :- |
383 | | - % XXX: Do the parallel conjunction transformation by hand. |
384 | | - sorry($file, $pred, "Unimplemented"). |
385 | | - |
386 | | -:- pred map_foldl_par_spawn_native(pred(X, Y), pred(Y, A, A), list(X), A, A). |
387 | | -:- mode map_foldl_par_spawn_native(pred(in, out) is det, |
388 | | - pred(in, in, out) is det, in, in, out) is erroneous. |
389 | | - |
390 | | -map_foldl_par_spawn_native(_, _, _, !Acc) :- |
391 | | - % XXX: Do the parallel conjunction transformation by hand. |
392 | | - sorry($file, $pred, "Unimplemented"). |
393 | | - |
394 | 394 | :- pred my_map(pred(X, Y), list(X), list(Y)). |
395 | 395 | :- mode my_map(pred(in, out) is det, in, out) is det. |
396 | 396 |
|
|
407 | 407 | M(X, Y) & |
408 | 408 | my_map_par_conj(M, Xs, Ys). |
409 | 409 |
|
| 410 | +:- pred my_map_par_future(pred(X, Y), list(X), list(Y)). |
| 411 | +:- mode my_map_par_future(pred(in, out) is det, in, out) is det. |
| 412 | + |
| 413 | +my_map_par_future(_, [], []). |
| 414 | +my_map_par_future(M, [X | Xs], Ys) :- |
| 415 | + FutY = future((func) = Y0 :- M(X, Y0)), |
| 416 | + my_map_par_future(M, Xs, Ys0), |
| 417 | + Y = wait(FutY), |
| 418 | + Ys = [Y | Ys0]. |
| 419 | + |
410 | 420 | :- pred my_map_par_spawn(pred(X, Y), list(X), list(Y)). |
411 | 421 | :- mode my_map_par_spawn(pred(in, out) is det, in, out) is cc_multi. |
412 | 422 |
|
|
0 commit comments