Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
SWIFTsim
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
SWIFT
SWIFTsim
Commits
00c70a1d
Commit
00c70a1d
authored
9 years ago
by
Pedro Gonnet
Browse files
Options
Downloads
Patches
Plain Diff
make scheduler_splittasks recursive and parallel via a threadpool.
parent
522da965
No related branches found
No related tags found
1 merge request
!176
Tasks cleanup
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/scheduler.c
+318
-337
318 additions, 337 deletions
src/scheduler.c
with
318 additions
and
337 deletions
src/scheduler.c
+
318
−
337
View file @
00c70a1d
...
@@ -103,62 +103,39 @@ void scheduler_addunlock(struct scheduler *s, struct task *ta,
...
@@ -103,62 +103,39 @@ void scheduler_addunlock(struct scheduler *s, struct task *ta,
* @param s The #scheduler we are working in.
* @param s The #scheduler we are working in.
*/
*/
void
scheduler_splittasks
(
struct
scheduler
*
s
)
{
void
scheduler_splittasks_mapper
(
void
*
map_data
,
void
*
extra_data
)
{
const
int
pts
[
7
][
8
]
=
{{
-
1
,
12
,
10
,
9
,
4
,
3
,
1
,
0
},
/* Static constants. */
{
-
1
,
-
1
,
11
,
10
,
5
,
4
,
2
,
1
},
const
static
int
pts
[
7
][
8
]
=
{{
-
1
,
12
,
10
,
9
,
4
,
3
,
1
,
0
},
{
-
1
,
-
1
,
-
1
,
12
,
7
,
6
,
4
,
3
},
{
-
1
,
-
1
,
11
,
10
,
5
,
4
,
2
,
1
},
{
-
1
,
-
1
,
-
1
,
-
1
,
8
,
7
,
5
,
4
},
{
-
1
,
-
1
,
-
1
,
12
,
7
,
6
,
4
,
3
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
12
,
10
,
9
},
{
-
1
,
-
1
,
-
1
,
-
1
,
8
,
7
,
5
,
4
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
11
,
10
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
12
,
10
,
9
},
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
12
}};
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
11
,
10
},
const
float
sid_scale
[
13
]
=
{
0
.
1897
,
0
.
4025
,
0
.
1897
,
0
.
4025
,
0
.
5788
,
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
12
}};
0
.
4025
,
0
.
1897
,
0
.
4025
,
0
.
1897
,
0
.
4025
,
const
static
float
sid_scale
[
13
]
=
{
0
.
1897
,
0
.
4025
,
0
.
1897
,
0
.
4025
,
0
.
5788
,
0
.
5788
,
0
.
4025
,
0
.
5788
};
0
.
4025
,
0
.
1897
,
0
.
4025
,
0
.
1897
,
0
.
4025
,
0
.
5788
,
0
.
4025
,
0
.
5788
};
/* Loop through the tasks... */
int
tid
=
0
,
redo
=
0
;
/* Extract the parameters. */
struct
task
*
t_old
=
NULL
;
struct
scheduler
*
s
=
(
struct
scheduler
*
)
extra_data
;
while
(
1
)
{
struct
task
*
t
=
(
struct
task
*
)
map_data
;
/* Get a pointer on the task. */
struct
task
*
t
=
t_old
;
if
(
redo
)
{
redo
=
0
;
}
else
{
const
int
ind
=
atomic_inc
(
&
tid
);
if
(
ind
<
s
->
nr_tasks
)
t_old
=
t
=
&
s
->
tasks
[
s
->
tasks_ind
[
ind
]];
else
break
;
}
/* Empty task? */
if
(
t
->
ci
==
NULL
||
(
t
->
type
==
task_type_pair
&&
t
->
cj
==
NULL
))
{
t
->
type
=
task_type_none
;
t
->
skip
=
1
;
continue
;
}
/* Non-local kick task? */
/* Iterate on this task until we're done with it. */
if
((
t
->
type
==
task_type_kick
)
&&
t
->
ci
->
nodeID
!=
s
->
nodeID
)
{
int
redo
=
1
;
t
->
type
=
task_type_none
;
while
(
redo
)
{
t
->
skip
=
1
;
continue
;
}
/* Non-local drift task? */
/* Reset the redo flag. */
if
((
t
->
type
==
task_type_drift
)
&&
t
->
ci
->
nodeID
!=
s
->
nodeID
)
{
redo
=
0
;
t
->
type
=
task_type_none
;
t
->
skip
=
1
;
continue
;
}
/* Non-local init task? */
/* Non-splittable task? */
if
((
t
->
type
==
task_type_init
)
&&
t
->
ci
->
nodeID
!=
s
->
nodeID
)
{
if
((
t
->
ci
==
NULL
||
(
t
->
type
==
task_type_pair
&&
t
->
cj
==
NULL
))
||
((
t
->
type
==
task_type_kick
)
&&
t
->
ci
->
nodeID
!=
s
->
nodeID
)
||
((
t
->
type
==
task_type_drift
)
&&
t
->
ci
->
nodeID
!=
s
->
nodeID
)
||
((
t
->
type
==
task_type_init
)
&&
t
->
ci
->
nodeID
!=
s
->
nodeID
))
{
t
->
type
=
task_type_none
;
t
->
type
=
task_type_none
;
t
->
skip
=
1
;
t
->
skip
=
1
;
continue
;
return
;
}
}
/* Self-interaction? */
/* Self-interaction? */
...
@@ -170,7 +147,7 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -170,7 +147,7 @@ void scheduler_splittasks(struct scheduler *s) {
/* Foreign task? */
/* Foreign task? */
if
(
ci
->
nodeID
!=
s
->
nodeID
)
{
if
(
ci
->
nodeID
!=
s
->
nodeID
)
{
t
->
skip
=
1
;
t
->
skip
=
1
;
continue
;
return
;
}
}
/* Is this cell even split? */
/* Is this cell even split? */
...
@@ -182,37 +159,38 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -182,37 +159,38 @@ void scheduler_splittasks(struct scheduler *s) {
/* convert to a self-subtask. */
/* convert to a self-subtask. */
t
->
type
=
task_type_sub
;
t
->
type
=
task_type_sub
;
}
/* Otherwise, make tasks explicitly. */
}
else
{
/* Otherwise, make tasks explicitly. */
else
{
/* Take a step back (we're going to recycle the current task)... */
/* Take a step back (we're going to recycle the current task)... */
redo
=
1
;
redo
=
1
;
/* Add the self task. */
/* Add the self task
s
. */
int
first_child
=
0
;
int
first_child
=
0
;
while
(
ci
->
progeny
[
first_child
]
==
NULL
)
first_child
++
;
while
(
ci
->
progeny
[
first_child
]
==
NULL
)
first_child
++
;
t
->
ci
=
ci
->
progeny
[
first_child
];
t
->
ci
=
ci
->
progeny
[
first_child
];
for
(
int
k
=
first_child
+
1
;
k
<
8
;
k
++
)
for
(
int
k
=
first_child
+
1
;
k
<
8
;
k
++
)
if
(
ci
->
progeny
[
k
]
!=
NULL
)
if
(
ci
->
progeny
[
k
]
!=
NULL
)
scheduler_addtask
(
s
,
task_type_self
,
t
->
subtype
,
0
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
k
],
NULL
,
0
);
scheduler_addtask
(
s
,
task_type_self
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
k
],
NULL
,
0
),
s
);
/* Make a task for each pair of progeny. */
/* Make a task for each pair of progeny. */
for
(
int
j
=
0
;
j
<
8
;
j
++
)
for
(
int
j
=
0
;
j
<
8
;
j
++
)
if
(
ci
->
progeny
[
j
]
!=
NULL
)
if
(
ci
->
progeny
[
j
]
!=
NULL
)
for
(
int
k
=
j
+
1
;
k
<
8
;
k
++
)
for
(
int
k
=
j
+
1
;
k
<
8
;
k
++
)
if
(
ci
->
progeny
[
k
]
!=
NULL
)
if
(
ci
->
progeny
[
k
]
!=
NULL
)
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
pts
[
j
][
k
],
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
j
],
ci
->
progeny
[
k
],
0
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
pts
[
j
][
k
],
0
,
ci
->
progeny
[
j
],
ci
->
progeny
[
k
],
0
),
s
);
}
}
}
}
}
/* Pair interaction? */
}
else
if
(
t
->
type
==
task_type_pair
)
{
/* Pair interaction? */
else
if
(
t
->
type
==
task_type_pair
)
{
/* Get a handle on the cells involved. */
/* Get a handle on the cells involved. */
struct
cell
*
ci
=
t
->
ci
;
struct
cell
*
ci
=
t
->
ci
;
...
@@ -223,7 +201,7 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -223,7 +201,7 @@ void scheduler_splittasks(struct scheduler *s) {
/* Foreign task? */
/* Foreign task? */
if
(
ci
->
nodeID
!=
s
->
nodeID
&&
cj
->
nodeID
!=
s
->
nodeID
)
{
if
(
ci
->
nodeID
!=
s
->
nodeID
&&
cj
->
nodeID
!=
s
->
nodeID
)
{
t
->
skip
=
1
;
t
->
skip
=
1
;
continue
;
return
;
}
}
/* Get the sort ID, use space_getsid and not t->flags
/* Get the sort ID, use space_getsid and not t->flags
...
@@ -244,10 +222,8 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -244,10 +222,8 @@ void scheduler_splittasks(struct scheduler *s) {
/* Make this task a sub task. */
/* Make this task a sub task. */
t
->
type
=
task_type_sub
;
t
->
type
=
task_type_sub
;
}
/* Otherwise, split it. */
}
else
{
/* Otherwise, split it. */
else
{
/* Take a step back (we're going to recycle the current task)... */
/* Take a step back (we're going to recycle the current task)... */
redo
=
1
;
redo
=
1
;
...
@@ -266,12 +242,18 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -266,12 +242,18 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
0
];
t
->
cj
=
cj
->
progeny
[
0
];
t
->
flags
=
1
;
t
->
flags
=
1
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
1
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
),
s
);
break
;
break
;
case
2
:
/* ( 1 , 1 , -1 ) */
case
2
:
/* ( 1 , 1 , -1 ) */
...
@@ -286,12 +268,18 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -286,12 +268,18 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
0
];
t
->
cj
=
cj
->
progeny
[
0
];
t
->
flags
=
3
;
t
->
flags
=
3
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
2
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
2
],
1
),
ci
->
progeny
[
5
],
cj
->
progeny
[
2
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
2
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
),
s
);
break
;
break
;
case
4
:
/* ( 1 , 0 , 0 ) */
case
4
:
/* ( 1 , 0 , 0 ) */
...
@@ -299,36 +287,66 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -299,36 +287,66 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
0
];
t
->
cj
=
cj
->
progeny
[
0
];
t
->
flags
=
4
;
t
->
flags
=
4
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
5
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
0
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
4
],
cj
->
progeny
[
1
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
4
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
5
],
cj
->
progeny
[
1
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
1
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
ci
->
progeny
[
4
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
4
],
cj
->
progeny
[
2
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
5
],
cj
->
progeny
[
2
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
4
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
4
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
2
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
2
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
4
],
cj
->
progeny
[
3
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
5
],
cj
->
progeny
[
3
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
3
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
4
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
3
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
ci
->
progeny
[
4
],
cj
->
progeny
[
2
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
2
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
4
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
2
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
2
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
4
],
cj
->
progeny
[
3
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
3
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
3
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
4
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
3
],
1
),
s
);
break
;
break
;
case
5
:
/* ( 1 , 0 , -1 ) */
case
5
:
/* ( 1 , 0 , -1 ) */
...
@@ -336,12 +354,18 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -336,12 +354,18 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
1
];
t
->
cj
=
cj
->
progeny
[
1
];
t
->
flags
=
5
;
t
->
flags
=
5
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
6
],
cj
->
progeny
[
3
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
3
],
1
),
ci
->
progeny
[
4
],
cj
->
progeny
[
3
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
ci
->
progeny
[
4
],
cj
->
progeny
[
3
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
),
s
);
break
;
break
;
case
6
:
/* ( 1 , -1 , 1 ) */
case
6
:
/* ( 1 , -1 , 1 ) */
...
@@ -356,12 +380,18 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -356,12 +380,18 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
3
];
t
->
cj
=
cj
->
progeny
[
3
];
t
->
flags
=
6
;
t
->
flags
=
6
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
5
],
cj
->
progeny
[
2
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
2
],
1
),
ci
->
progeny
[
4
],
cj
->
progeny
[
2
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
5
],
cj
->
progeny
[
3
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
ci
->
progeny
[
4
],
cj
->
progeny
[
2
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
3
],
1
),
s
);
break
;
break
;
case
8
:
/* ( 1 , -1 , -1 ) */
case
8
:
/* ( 1 , -1 , -1 ) */
...
@@ -376,12 +406,18 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -376,12 +406,18 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
0
];
t
->
cj
=
cj
->
progeny
[
0
];
t
->
flags
=
9
;
t
->
flags
=
9
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
4
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
4
],
1
),
ci
->
progeny
[
3
],
cj
->
progeny
[
4
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
),
s
);
break
;
break
;
case
10
:
/* ( 0 , 1 , 0 ) */
case
10
:
/* ( 0 , 1 , 0 ) */
...
@@ -389,36 +425,66 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -389,36 +425,66 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
0
];
t
->
cj
=
cj
->
progeny
[
0
];
t
->
flags
=
10
;
t
->
flags
=
10
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
3
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
0
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
2
],
cj
->
progeny
[
1
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
10
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
3
],
cj
->
progeny
[
1
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
1
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
ci
->
progeny
[
2
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
2
],
cj
->
progeny
[
4
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
3
],
cj
->
progeny
[
4
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
10
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
10
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
4
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
4
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
2
],
cj
->
progeny
[
5
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
3
],
cj
->
progeny
[
5
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
7
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
1
],
1
),
ci
->
progeny
[
6
],
cj
->
progeny
[
5
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
10
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
5
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
ci
->
progeny
[
2
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
10
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
2
],
cj
->
progeny
[
5
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
1
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
5
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
5
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
10
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
5
],
1
),
s
);
break
;
break
;
case
11
:
/* ( 0 , 1 , -1 ) */
case
11
:
/* ( 0 , 1 , -1 ) */
...
@@ -426,12 +492,18 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -426,12 +492,18 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
1
];
t
->
cj
=
cj
->
progeny
[
1
];
t
->
flags
=
11
;
t
->
flags
=
11
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
6
],
cj
->
progeny
[
5
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
5
],
1
),
ci
->
progeny
[
2
],
cj
->
progeny
[
5
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
ci
->
progeny
[
2
],
cj
->
progeny
[
5
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
ci
->
progeny
[
6
],
cj
->
progeny
[
1
],
1
),
s
);
break
;
break
;
case
12
:
/* ( 0 , 0 , 1 ) */
case
12
:
/* ( 0 , 0 , 1 ) */
...
@@ -439,45 +511,73 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -439,45 +511,73 @@ void scheduler_splittasks(struct scheduler *s) {
t
->
cj
=
cj
->
progeny
[
0
];
t
->
cj
=
cj
->
progeny
[
0
];
t
->
flags
=
12
;
t
->
flags
=
12
;
t
->
tight
=
1
;
t
->
tight
=
1
;
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
3
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
5
],
cj
->
progeny
[
0
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
1
],
cj
->
progeny
[
2
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
12
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
3
],
cj
->
progeny
[
2
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
2
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
0
],
1
),
ci
->
progeny
[
5
],
cj
->
progeny
[
2
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
2
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
ci
->
progeny
[
1
],
cj
->
progeny
[
2
],
1
),
ci
->
progeny
[
1
],
cj
->
progeny
[
4
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
3
],
cj
->
progeny
[
4
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
12
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
12
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
2
],
1
),
ci
->
progeny
[
5
],
cj
->
progeny
[
4
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
4
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
8
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
2
],
1
),
ci
->
progeny
[
1
],
cj
->
progeny
[
6
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
3
],
cj
->
progeny
[
6
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
5
,
0
,
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
2
],
1
),
ci
->
progeny
[
5
],
cj
->
progeny
[
6
],
1
);
s
);
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
12
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
7
],
cj
->
progeny
[
6
],
1
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
ci
->
progeny
[
1
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
6
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
12
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
11
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
4
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
1
],
cj
->
progeny
[
6
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
3
,
0
,
ci
->
progeny
[
3
],
cj
->
progeny
[
6
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
9
,
0
,
ci
->
progeny
[
5
],
cj
->
progeny
[
6
],
1
),
s
);
scheduler_splittasks_mapper
(
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
12
,
0
,
ci
->
progeny
[
7
],
cj
->
progeny
[
6
],
1
),
s
);
break
;
break
;
}
}
/* switch(sid) */
}
}
}
/* split this task? */
/* Otherwise, break it up if it is too large? */
}
else
if
(
scheduler_doforcesplit
&&
ci
->
split
&&
cj
->
split
&&
/* Otherwise, break it up if it is too large? */
(
ci
->
count
>
space_maxsize
/
cj
->
count
))
{
else
if
(
scheduler_doforcesplit
&&
ci
->
split
&&
cj
->
split
&&
(
ci
->
count
>
space_maxsize
/
cj
->
count
))
{
// message( "force splitting pair with %i and %i parts." , ci->count ,
// message( "force splitting pair with %i and %i parts." , ci->count ,
// cj->count );
// cj->count );
...
@@ -489,166 +589,47 @@ void scheduler_splittasks(struct scheduler *s) {
...
@@ -489,166 +589,47 @@ void scheduler_splittasks(struct scheduler *s) {
if
(
ci
->
progeny
[
j
]
!=
NULL
)
if
(
ci
->
progeny
[
j
]
!=
NULL
)
for
(
int
k
=
0
;
k
<
8
;
k
++
)
for
(
int
k
=
0
;
k
<
8
;
k
++
)
if
(
cj
->
progeny
[
k
]
!=
NULL
)
{
if
(
cj
->
progeny
[
k
]
!=
NULL
)
{
t
=
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
scheduler_splittasks_mapper
(
ci
->
progeny
[
j
],
cj
->
progeny
[
k
],
0
);
scheduler_addtask
(
s
,
task_type_pair
,
t
->
subtype
,
0
,
0
,
ci
->
progeny
[
j
],
cj
->
progeny
[
k
],
0
),
s
);
t
->
flags
=
space_getsid
(
s
->
space
,
&
t
->
ci
,
&
t
->
cj
,
shift
);
t
->
flags
=
space_getsid
(
s
->
space
,
&
t
->
ci
,
&
t
->
cj
,
shift
);
}
}
}
/* Otherwise, if not spilt, stitch-up the sorting. */
}
else
{
/* Otherwise, if not spilt, stitch-up the sorting. */
else
{
/* Create the sort for ci. */
/* Create the sort for ci. */
//
lock_lock( &ci->lock );
lock_lock
(
&
ci
->
lock
);
if
(
ci
->
sorts
==
NULL
)
if
(
ci
->
sorts
==
NULL
)
ci
->
sorts
=
ci
->
sorts
=
scheduler_addtask
(
s
,
task_type_sort
,
0
,
1
<<
sid
,
0
,
ci
,
NULL
,
0
);
scheduler_addtask
(
s
,
task_type_sort
,
0
,
1
<<
sid
,
0
,
ci
,
NULL
,
0
);
else
else
ci
->
sorts
->
flags
|=
(
1
<<
sid
);
ci
->
sorts
->
flags
|=
(
1
<<
sid
);
//
lock_unlock_blind( &ci->lock );
lock_unlock_blind
(
&
ci
->
lock
);
scheduler_addunlock
(
s
,
ci
->
sorts
,
t
);
scheduler_addunlock
(
s
,
ci
->
sorts
,
t
);
/* Create the sort for cj. */
/* Create the sort for cj. */
//
lock_lock( &cj->lock );
lock_lock
(
&
cj
->
lock
);
if
(
cj
->
sorts
==
NULL
)
if
(
cj
->
sorts
==
NULL
)
cj
->
sorts
=
cj
->
sorts
=
scheduler_addtask
(
s
,
task_type_sort
,
0
,
1
<<
sid
,
0
,
cj
,
NULL
,
0
);
scheduler_addtask
(
s
,
task_type_sort
,
0
,
1
<<
sid
,
0
,
cj
,
NULL
,
0
);
else
else
cj
->
sorts
->
flags
|=
(
1
<<
sid
);
cj
->
sorts
->
flags
|=
(
1
<<
sid
);
//
lock_unlock_blind( &cj->lock );
lock_unlock_blind
(
&
cj
->
lock
);
scheduler_addunlock
(
s
,
cj
->
sorts
,
t
);
scheduler_addunlock
(
s
,
cj
->
sorts
,
t
);
}
}
}
/* pair interaction? */
}
/* pair interaction? */
/* Gravity interaction? */
}
/* iterate over the current task. */
else
if
(
t
->
type
==
task_type_grav_mm
)
{
}
/* Get a handle on the cells involved. */
struct
cell
*
ci
=
t
->
ci
;
struct
cell
*
cj
=
t
->
cj
;
/* Self-interaction? */
if
(
cj
==
NULL
)
{
/* Ignore this task if the cell has no gparts. */
if
(
ci
->
gcount
==
0
)
t
->
type
=
task_type_none
;
/* If the cell is split, recurse. */
else
if
(
ci
->
split
)
{
/* Make a single sub-task? */
if
(
scheduler_dosub
&&
ci
->
gcount
<
space_subsize
/
ci
->
gcount
)
{
t
->
type
=
task_type_sub
;
t
->
subtype
=
task_subtype_grav
;
}
/* Otherwise, just split the task. */
else
{
/* Split this task into tasks on its progeny. */
t
->
type
=
task_type_none
;
for
(
int
j
=
0
;
j
<
8
;
j
++
)
if
(
ci
->
progeny
[
j
]
!=
NULL
&&
ci
->
progeny
[
j
]
->
gcount
>
0
)
{
if
(
t
->
type
==
task_type_none
)
{
t
->
type
=
task_type_grav_mm
;
t
->
ci
=
ci
->
progeny
[
j
];
t
->
cj
=
NULL
;
}
else
t
=
scheduler_addtask
(
s
,
task_type_grav_mm
,
task_subtype_none
,
0
,
0
,
ci
->
progeny
[
j
],
NULL
,
0
);
for
(
int
k
=
j
+
1
;
k
<
8
;
k
++
)
if
(
ci
->
progeny
[
k
]
!=
NULL
&&
ci
->
progeny
[
k
]
->
gcount
>
0
)
{
if
(
t
->
type
==
task_type_none
)
{
t
->
type
=
task_type_grav_mm
;
t
->
ci
=
ci
->
progeny
[
j
];
t
->
cj
=
ci
->
progeny
[
k
];
}
else
t
=
scheduler_addtask
(
s
,
task_type_grav_mm
,
task_subtype_none
,
0
,
0
,
ci
->
progeny
[
j
],
ci
->
progeny
[
k
],
0
);
}
}
redo
=
(
t
->
type
!=
task_type_none
);
}
}
/* Otherwise, just make a pp task out of it. */
else
t
->
type
=
task_type_grav_pp
;
}
/* Nope, pair. */
else
{
/* Make a sub-task? */
if
(
scheduler_dosub
&&
ci
->
gcount
<
space_subsize
/
cj
->
gcount
)
{
t
->
type
=
task_type_sub
;
t
->
subtype
=
task_subtype_grav
;
}
/* Otherwise, split the task. */
else
{
/* Get the opening angle theta. */
float
dx
[
3
],
theta
;
for
(
int
k
=
0
;
k
<
3
;
k
++
)
{
dx
[
k
]
=
fabs
(
ci
->
loc
[
k
]
-
cj
->
loc
[
k
]);
if
(
s
->
space
->
periodic
&&
dx
[
k
]
>
0
.
5
*
s
->
space
->
dim
[
k
])
dx
[
k
]
=
-
dx
[
k
]
+
s
->
space
->
dim
[
k
];
if
(
dx
[
k
]
>
0
.
0
f
)
dx
[
k
]
-=
ci
->
h
[
k
];
}
theta
=
(
dx
[
0
]
*
dx
[
0
]
+
dx
[
1
]
*
dx
[
1
]
+
dx
[
2
]
*
dx
[
2
])
/
(
ci
->
h
[
0
]
*
ci
->
h
[
0
]
+
ci
->
h
[
1
]
*
ci
->
h
[
1
]
+
ci
->
h
[
2
]
*
ci
->
h
[
2
]);
/* Ignore this task if the cell has no gparts. */
if
(
ci
->
gcount
==
0
||
cj
->
gcount
==
0
)
t
->
type
=
task_type_none
;
/* Split the interaction? */
else
if
(
theta
<
const_theta_max
*
const_theta_max
)
{
/* Are both ci and cj split? */
if
(
ci
->
split
&&
cj
->
split
)
{
/* Split this task into tasks on its progeny. */
t
->
type
=
task_type_none
;
for
(
int
j
=
0
;
j
<
8
;
j
++
)
if
(
ci
->
progeny
[
j
]
!=
NULL
&&
ci
->
progeny
[
j
]
->
gcount
>
0
)
{
for
(
int
k
=
0
;
k
<
8
;
k
++
)
if
(
cj
->
progeny
[
k
]
!=
NULL
&&
cj
->
progeny
[
k
]
->
gcount
>
0
)
{
if
(
t
->
type
==
task_type_none
)
{
t
->
type
=
task_type_grav_mm
;
t
->
ci
=
ci
->
progeny
[
j
];
t
->
cj
=
cj
->
progeny
[
k
];
}
else
t
=
scheduler_addtask
(
s
,
task_type_grav_mm
,
task_subtype_none
,
0
,
0
,
ci
->
progeny
[
j
],
cj
->
progeny
[
k
],
0
);
}
}
redo
=
(
t
->
type
!=
task_type_none
);
}
/* Otherwise, make a pp task out of it. */
else
t
->
type
=
task_type_grav_pp
;
}
}
}
/* gravity pair interaction? */
}
/* gravity interaction? */
void
scheduler_splittasks
(
struct
scheduler
*
s
)
{
}
/* loop over all tasks. */
/* Call the mapper on each current task. */
threadpool_map
(
s
->
threadpool
,
scheduler_splittasks_mapper
,
s
->
tasks
,
s
->
nr_tasks
,
sizeof
(
struct
task
),
s
);
}
}
/**
/**
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment