Skip to content

Commit ac22e24

Browse files
committed
raddbgi_from_pdb: switch string baking to using fixed per-thread maps, rather than per-task maps
1 parent 2fc0b4e commit ac22e24

File tree

2 files changed

+81
-27
lines changed

2 files changed

+81
-27
lines changed

src/raddbgi_from_pdb/raddbgi_from_pdb.c

Lines changed: 65 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3476,55 +3476,55 @@ p2r_convert(Arena *arena, P2R_User2Convert *in)
34763476
internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point)
34773477
{
34783478
P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)p;
3479-
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
3480-
ProfScope("bake src file strings") rdim_bake_string_chunk_list_map_push_src_files(arena, in->top, map, in->list);
3481-
return map;
3479+
ProfScope("bake src file strings") rdim_bake_string_chunk_list_map_push_src_files(arena, in->top, in->maps[thread_idx], in->list);
3480+
return 0;
34823481
}
34833482

34843483
internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point)
34853484
{
34863485
P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)p;
3487-
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
3488-
ProfScope("bake unit strings") rdim_bake_string_chunk_list_map_push_units(arena, in->top, map, in->list);
3489-
return map;
3486+
ProfScope("bake unit strings") rdim_bake_string_chunk_list_map_push_units(arena, in->top, in->maps[thread_idx], in->list);
3487+
return 0;
34903488
}
34913489

34923490
internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point)
34933491
{
34943492
P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)p;
3495-
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
34963493
ProfScope("bake type strings")
34973494
{
34983495
for(P2R_BakeTypesStringsInNode *n = in->first; n != 0; n = n->next)
34993496
{
3500-
rdim_bake_string_chunk_list_map_push_type_slice(arena, in->top, map, n->v, n->count);
3497+
rdim_bake_string_chunk_list_map_push_type_slice(arena, in->top, in->maps[thread_idx], n->v, n->count);
35013498
}
35023499
}
3503-
return map;
3500+
return 0;
35043501
}
35053502

35063503
internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point)
35073504
{
35083505
P2R_BakeUDTsStringsIn *in = (P2R_BakeUDTsStringsIn *)p;
3509-
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
3510-
ProfScope("bake udt strings") rdim_bake_string_chunk_list_map_push_udts(arena, in->top, map, in->list);
3511-
return map;
3506+
ProfScope("bake udt strings")
3507+
{
3508+
for(P2R_BakeUDTsStringsInNode *n = in->first; n != 0; n = n->next)
3509+
{
3510+
rdim_bake_string_chunk_list_map_push_udt_slice(arena, in->top, in->maps[thread_idx], n->v, n->count);
3511+
}
3512+
}
3513+
return 0;
35123514
}
35133515

35143516
internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point)
35153517
{
35163518
P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)p;
3517-
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
3518-
ProfScope("bake symbol strings") rdim_bake_string_chunk_list_map_push_symbols(arena, in->top, map, in->list);
3519-
return map;
3519+
ProfScope("bake symbol strings") rdim_bake_string_chunk_list_map_push_symbols(arena, in->top, in->maps[thread_idx], in->list);
3520+
return 0;
35203521
}
35213522

35223523
internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point)
35233524
{
35243525
P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)p;
3525-
RDIM_BakeStringChunkListMap *map = rdim_bake_string_chunk_list_map_make(arena, in->top);
3526-
ProfScope("bake scope strings") rdim_bake_string_chunk_list_map_push_scopes(arena, in->top, map, in->list);
3527-
return map;
3526+
ProfScope("bake scope strings") rdim_bake_string_chunk_list_map_push_scopes(arena, in->top, in->maps[thread_idx], in->list);
3527+
return 0;
35283528
}
35293529

35303530
//- rjf: bake string map sorting
@@ -3742,12 +3742,18 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
37423742
params->global_variables.total_count*2 +
37433743
params->thread_variables.total_count*2 +
37443744
params->types.total_count*2)};
3745+
RDIM_BakeStringChunkListMap **bake_string_chunk_list_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringChunkListMap *, ts_thread_count());
3746+
for(U64 idx = 0; idx < ts_thread_count(); idx += 1)
3747+
{
3748+
bake_string_chunk_list_maps__in_progress[idx] = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology);
3749+
}
37453750
TS_TicketList bake_string_map_build_tickets = {0};
37463751
{
37473752
// rjf: src files
37483753
{
37493754
P2R_BakeSrcFilesStringsIn *in = push_array(scratch.arena, P2R_BakeSrcFilesStringsIn, 1);
37503755
in->top = &bake_string_chunk_list_map_topology;
3756+
in->maps = bake_string_chunk_list_maps__in_progress;
37513757
in->list = &params->src_files;
37523758
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_src_files_strings_task__entry_point, 0, in));
37533759
}
@@ -3756,6 +3762,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
37563762
{
37573763
P2R_BakeUnitsStringsIn *in = push_array(scratch.arena, P2R_BakeUnitsStringsIn, 1);
37583764
in->top = &bake_string_chunk_list_map_topology;
3765+
in->maps = bake_string_chunk_list_maps__in_progress;
37593766
in->list = &params->units;
37603767
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_units_strings_task__entry_point, 0, in));
37613768
}
@@ -3764,12 +3771,13 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
37643771
{
37653772
for(RDIM_TypeChunkNode *chunk = params->types.first; chunk != 0; chunk = chunk->next)
37663773
{
3767-
U64 types_per_task = chunk->count;
3774+
U64 types_per_task = Min(4096, chunk->count);
37683775
U64 tasks_per_this_chunk = (chunk->count+types_per_task-1)/types_per_task;
37693776
for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1)
37703777
{
37713778
P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1);
37723779
in->top = &bake_string_chunk_list_map_topology;
3780+
in->maps = bake_string_chunk_list_maps__in_progress;
37733781
P2R_BakeTypesStringsInNode *n = push_array(scratch.arena, P2R_BakeTypesStringsInNode, 1);
37743782
SLLQueuePush(in->first, in->last, n);
37753783
n->v = chunk->v + task_idx*types_per_task;
@@ -3779,18 +3787,42 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
37793787
}
37803788
}
37813789

3790+
// rjf: UDTs
3791+
{
3792+
for(RDIM_UDTChunkNode *chunk = params->udts.first; chunk != 0; chunk = chunk->next)
3793+
{
3794+
U64 udts_per_task = Min(4096, chunk->count);
3795+
U64 tasks_per_this_chunk = (chunk->count+udts_per_task-1)/udts_per_task;
3796+
for(U64 task_idx = 0; task_idx < tasks_per_this_chunk; task_idx += 1)
3797+
{
3798+
P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1);
3799+
in->top = &bake_string_chunk_list_map_topology;
3800+
in->maps = bake_string_chunk_list_maps__in_progress;
3801+
P2R_BakeUDTsStringsInNode *n = push_array(scratch.arena, P2R_BakeUDTsStringsInNode, 1);
3802+
SLLQueuePush(in->first, in->last, n);
3803+
n->v = chunk->v + task_idx*udts_per_task;
3804+
n->count = udts_per_task;
3805+
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in));
3806+
}
3807+
}
3808+
}
3809+
3810+
#if 0
37823811
// rjf: UDTs
37833812
{
37843813
P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1);
37853814
in->top = &bake_string_chunk_list_map_topology;
3815+
in->maps = bake_string_chunk_list_maps__in_progress;
37863816
in->list = &params->udts;
37873817
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in));
37883818
}
3819+
#endif
37893820

37903821
// rjf: global variables
37913822
{
37923823
P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1);
37933824
in->top = &bake_string_chunk_list_map_topology;
3825+
in->maps = bake_string_chunk_list_maps__in_progress;
37943826
in->list = &params->global_variables;
37953827
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in));
37963828
}
@@ -3799,6 +3831,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
37993831
{
38003832
P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1);
38013833
in->top = &bake_string_chunk_list_map_topology;
3834+
in->maps = bake_string_chunk_list_maps__in_progress;
38023835
in->list = &params->thread_variables;
38033836
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in));
38043837
}
@@ -3807,6 +3840,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
38073840
{
38083841
P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1);
38093842
in->top = &bake_string_chunk_list_map_topology;
3843+
in->maps = bake_string_chunk_list_maps__in_progress;
38103844
in->list = &params->procedures;
38113845
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in));
38123846
}
@@ -3815,6 +3849,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
38153849
{
38163850
P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1);
38173851
in->top = &bake_string_chunk_list_map_topology;
3852+
in->maps = bake_string_chunk_list_maps__in_progress;
38183853
in->list = &params->scopes;
38193854
ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_scopes_strings_task__entry_point, 0, in));
38203855
}
@@ -3833,17 +3868,21 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
38333868
}
38343869

38353870
//- rjf: join string map building tasks
3836-
RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology);
38373871
ProfScope("join string map building tasks")
38383872
{
38393873
for(TS_TicketNode *n = bake_string_map_build_tickets.first; n != 0; n = n->next)
38403874
{
3841-
ProfBegin("waiting...");
3842-
RDIM_BakeStringChunkListMap *map = ts_join_struct(n->v, max_U64, RDIM_BakeStringChunkListMap);
3843-
ProfEnd();
3844-
ProfBegin("joining map...");
3845-
rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, map);
3846-
ProfEnd();
3875+
ts_join(n->v, max_U64);
3876+
}
3877+
}
3878+
3879+
//- rjf: produce joined string map
3880+
RDIM_BakeStringChunkListMap *unsorted_bake_string_chunk_list_map = rdim_bake_string_chunk_list_map_make(arena, &bake_string_chunk_list_map_topology);
3881+
ProfScope("produce joined string map")
3882+
{
3883+
for(U64 idx = 0; idx < ts_thread_count(); idx += 1)
3884+
{
3885+
rdim_bake_string_chunk_list_map_join_in_place(&bake_string_chunk_list_map_topology, unsorted_bake_string_chunk_list_map, bake_string_chunk_list_maps__in_progress[idx]);
38473886
}
38483887
}
38493888

src/raddbgi_from_pdb/raddbgi_from_pdb.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,13 +249,15 @@ typedef struct P2R_BakeSrcFilesStringsIn P2R_BakeSrcFilesStringsIn;
249249
struct P2R_BakeSrcFilesStringsIn
250250
{
251251
RDIM_BakeStringChunkListMapTopology *top;
252+
RDIM_BakeStringChunkListMap **maps;
252253
RDIM_SrcFileChunkList *list;
253254
};
254255

255256
typedef struct P2R_BakeUnitsStringsIn P2R_BakeUnitsStringsIn;
256257
struct P2R_BakeUnitsStringsIn
257258
{
258259
RDIM_BakeStringChunkListMapTopology *top;
260+
RDIM_BakeStringChunkListMap **maps;
259261
RDIM_UnitChunkList *list;
260262
};
261263

@@ -271,28 +273,41 @@ typedef struct P2R_BakeTypesStringsIn P2R_BakeTypesStringsIn;
271273
struct P2R_BakeTypesStringsIn
272274
{
273275
RDIM_BakeStringChunkListMapTopology *top;
276+
RDIM_BakeStringChunkListMap **maps;
274277
P2R_BakeTypesStringsInNode *first;
275278
P2R_BakeTypesStringsInNode *last;
276279
};
277280

281+
typedef struct P2R_BakeUDTsStringsInNode P2R_BakeUDTsStringsInNode;
282+
struct P2R_BakeUDTsStringsInNode
283+
{
284+
P2R_BakeUDTsStringsInNode *next;
285+
RDIM_UDT *v;
286+
RDI_U64 count;
287+
};
288+
278289
typedef struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsIn;
279290
struct P2R_BakeUDTsStringsIn
280291
{
281292
RDIM_BakeStringChunkListMapTopology *top;
282-
RDIM_UDTChunkList *list;
293+
RDIM_BakeStringChunkListMap **maps;
294+
P2R_BakeUDTsStringsInNode *first;
295+
P2R_BakeUDTsStringsInNode *last;
283296
};
284297

285298
typedef struct P2R_BakeSymbolsStringsIn P2R_BakeSymbolsStringsIn;
286299
struct P2R_BakeSymbolsStringsIn
287300
{
288301
RDIM_BakeStringChunkListMapTopology *top;
302+
RDIM_BakeStringChunkListMap **maps;
289303
RDIM_SymbolChunkList *list;
290304
};
291305

292306
typedef struct P2R_BakeScopesStringsIn P2R_BakeScopesStringsIn;
293307
struct P2R_BakeScopesStringsIn
294308
{
295309
RDIM_BakeStringChunkListMapTopology *top;
310+
RDIM_BakeStringChunkListMap **maps;
296311
RDIM_ScopeChunkList *list;
297312
};
298313

0 commit comments

Comments
 (0)