Skip to content

Commit 72bebdf

Browse files
committedDec 3, 2020
move timing_stack field from jl_task_t onto the stack also
1 parent 59aedd1 commit 72bebdf

File tree

7 files changed

+20
-24
lines changed

7 files changed

+20
-24
lines changed
 

‎src/init.c

-3
Original file line numberDiff line numberDiff line change
@@ -745,9 +745,6 @@ void _julia_init(JL_IMAGE_SEARCH rel)
745745

746746
jl_init_tasks();
747747
jl_init_root_task(stack_lo, stack_hi);
748-
#ifdef ENABLE_TIMINGS
749-
jl_root_task->timing_stack = jl_root_timing;
750-
#endif
751748
jl_init_common_symbols();
752749
jl_init_flisp();
753750
jl_init_serializer();

‎src/julia.h

-2
Original file line numberDiff line numberDiff line change
@@ -1765,8 +1765,6 @@ typedef struct _jl_task_t {
17651765

17661766
// saved gc stack top for context switches
17671767
jl_gcframe_t *gcstack;
1768-
1769-
jl_timing_block_t *timing_stack;
17701768
} jl_task_t;
17711769

17721770
#define JL_TASK_STATE_RUNNABLE 0

‎src/julia_threads.h

+1
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ struct _jl_tls_states_t {
207207
struct _jl_task_t *previous_task;
208208
#endif
209209
struct _jl_task_t *root_task;
210+
struct _jl_timing_block_t *timing_stack;
210211
void *stackbase;
211212
size_t stacksize;
212213
jl_ucontext_t base_ctx; // base context of stack

‎src/rtutils.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ JL_DLLEXPORT void jl_enter_handler(jl_handler_t *eh)
221221
eh->world_age = ptls->world_age;
222222
current_task->eh = eh;
223223
#ifdef ENABLE_TIMINGS
224-
eh->timing_stack = current_task->timing_stack;
224+
eh->timing_stack = ptls->timing_stack;
225225
#endif
226226
}
227227

‎src/task.c

+5-6
Original file line numberDiff line numberDiff line change
@@ -519,9 +519,10 @@ JL_DLLEXPORT void jl_switch(void)
519519
ptls->finalizers_inhibited = 0;
520520

521521
#ifdef ENABLE_TIMINGS
522-
jl_timing_block_t *blk = ct->timing_stack;
522+
jl_timing_block_t *blk = ptls->timing_stack;
523523
if (blk)
524524
jl_timing_block_stop(blk);
525+
ptls->timing_stack = NULL;
525526
#endif
526527

527528
ctx_switch(ptls);
@@ -546,7 +547,8 @@ JL_DLLEXPORT void jl_switch(void)
546547
ptls->finalizers_inhibited = finalizers_inhibited;
547548

548549
#ifdef ENABLE_TIMINGS
549-
assert(blk == ct->timing_stack);
550+
assert(ptls->timing_stack == NULL);
551+
ptls->timing_stack = blk;
550552
if (blk)
551553
jl_timing_block_start(blk);
552554
#else
@@ -600,7 +602,7 @@ static void JL_NORETURN throw_internal(jl_value_t *exception JL_MAYBE_UNROOTED)
600602
jl_handler_t *eh = ptls->current_task->eh;
601603
if (eh != NULL) {
602604
#ifdef ENABLE_TIMINGS
603-
jl_timing_block_t *cur_block = ptls->current_task->timing_stack;
605+
jl_timing_block_t *cur_block = ptls->timing_stack;
604606
while (cur_block && eh->timing_stack != cur_block) {
605607
cur_block = jl_pop_timing_block(cur_block);
606608
}
@@ -701,9 +703,6 @@ JL_DLLEXPORT jl_task_t *jl_new_task(jl_function_t *start, jl_value_t *completion
701703
t->started = 0;
702704
t->prio = -1;
703705
t->tid = -1;
704-
#ifdef ENABLE_TIMINGS
705-
t->timing_stack = jl_root_timing;
706-
#endif
707706

708707
#if defined(JL_DEBUG_BUILD)
709708
if (!t->copy_stack)

‎src/timing.c

+9-9
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ extern "C" {
1717
#error Timings are not supported on your compiler
1818
#endif
1919

20-
jl_timing_block_t *jl_root_timing;
20+
static uint64_t t0;
2121
uint64_t jl_timing_data[(int)JL_TIMING_LAST] = {0};
2222
const char *jl_timing_names[(int)JL_TIMING_LAST] =
2323
{
@@ -28,32 +28,32 @@ const char *jl_timing_names[(int)JL_TIMING_LAST] =
2828

2929
void jl_print_timings(void)
3030
{
31-
uint64_t total_time = 0;
31+
uint64_t total_time = cycleclock() - t0;
32+
uint64_t root_time = total_time;
3233
for (int i = 0; i < JL_TIMING_LAST; i++) {
33-
total_time += jl_timing_data[i];
34+
root_time -= jl_timing_data[i];
3435
}
36+
jl_timing_data[0] = root_time;
3537
for (int i = 0; i < JL_TIMING_LAST; i++) {
3638
if (jl_timing_data[i] != 0)
37-
fprintf(stderr,"%-25s : %5.2f %% %" PRIu64 "\n", jl_timing_names[i],
39+
fprintf(stderr, "%-25s : %5.2f %% %" PRIu64 "\n", jl_timing_names[i],
3840
100 * (((double)jl_timing_data[i]) / total_time), jl_timing_data[i]);
3941
}
4042
}
4143

4244
void jl_init_timing(void)
4345
{
44-
jl_root_timing = (jl_timing_block_t*)malloc_s(sizeof(jl_timing_block_t));
45-
_jl_timing_block_init(jl_root_timing, JL_TIMING_ROOT);
46-
jl_root_timing->prev = NULL;
46+
t0 = cycleclock();
4747
}
4848

4949
void jl_destroy_timing(void)
5050
{
51-
jl_timing_block_t *stack = jl_current_task ? jl_current_task->timing_stack : jl_root_timing;
51+
jl_ptls_t ptls = jl_get_ptls_states();
52+
jl_timing_block_t *stack = ptls->timing_stack;
5253
while (stack) {
5354
_jl_timing_block_destroy(stack);
5455
stack = stack->prev;
5556
}
56-
free(jl_root_timing);
5757
}
5858

5959
jl_timing_block_t *jl_pop_timing_block(jl_timing_block_t *cur_block)

‎src/timing.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ extern "C" {
2323
#endif
2424
void jl_print_timings(void);
2525
jl_timing_block_t *jl_pop_timing_block(jl_timing_block_t *cur_block);
26-
extern jl_timing_block_t *jl_root_timing;
2726
void jl_timing_block_start(jl_timing_block_t *cur_block);
2827
void jl_timing_block_stop(jl_timing_block_t *cur_block);
2928
#ifdef __cplusplus
@@ -117,7 +116,8 @@ STATIC_INLINE uint64_t _jl_timing_block_init(jl_timing_block_t *block, int owner
117116

118117
STATIC_INLINE void _jl_timing_block_ctor(jl_timing_block_t *block, int owner) {
119118
uint64_t t = _jl_timing_block_init(block, owner);
120-
jl_timing_block_t **prevp = jl_current_task ? &jl_current_task->timing_stack : &jl_root_timing;
119+
jl_ptls_t ptls = jl_get_ptls_states();
120+
jl_timing_block_t **prevp = &ptls->timing_stack;
121121
block->prev = *prevp;
122122
if (block->prev)
123123
_jl_timing_block_stop(block->prev, t);
@@ -126,9 +126,10 @@ STATIC_INLINE void _jl_timing_block_ctor(jl_timing_block_t *block, int owner) {
126126

127127
STATIC_INLINE void _jl_timing_block_destroy(jl_timing_block_t *block) {
128128
uint64_t t = cycleclock();
129+
jl_ptls_t ptls = jl_get_ptls_states();
129130
_jl_timing_block_stop(block, t);
130131
jl_timing_data[block->owner] += block->total;
131-
jl_timing_block_t **pcur = jl_current_task ? &jl_current_task->timing_stack : &jl_root_timing;
132+
jl_timing_block_t **pcur = &ptls->timing_stack;
132133
assert(*pcur == block);
133134
*pcur = block->prev;
134135
if (block->prev)

0 commit comments

Comments
 (0)
Please sign in to comment.