re-nest enum vals & members into udts; we want to keep the building API flexible with order of member building, and we can assume ~statistically-uniform distribution across all udts, so it makes more sense to just parallelize on udts, and pay the small cost of an upfront per-lane layout.

This commit is contained in:
Ryan Fleury
2025-09-04 11:58:36 -07:00
parent 8b83e5ef48
commit a84142ed77
5 changed files with 35 additions and 145 deletions
-44
View File
@@ -837,50 +837,6 @@ rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList
RDIM_IdxedChunkListConcatInPlace(RDIM_TypeChunkNode, dst, to_push);
}
//- rjf: UDT members
RDI_PROC RDIM_UDTMember *
rdim_udt_member_chunk_list_push(RDIM_Arena *arena, RDIM_UDTMemberChunkList *list, RDI_U64 cap)
{
RDIM_IdxedChunkListPush(arena, list, RDIM_UDTMemberChunkNode, RDIM_UDTMember, cap, result);
return result;
}
RDI_PROC RDI_U64
rdim_idx_from_udt_member(RDIM_UDTMember *member)
{
RDIM_IdxedChunkListElementGetIdx(member, idx);
return idx;
}
RDI_PROC void
rdim_udt_member_chunk_list_concat_in_place(RDIM_UDTMemberChunkList *dst, RDIM_UDTMemberChunkList *to_push)
{
RDIM_IdxedChunkListConcatInPlace(RDIM_UDTMemberChunkNode, dst, to_push);
}
//- rjf: UDT enum values
RDI_PROC RDIM_UDTEnumVal *
rdim_udt_enum_val_chunk_list_push(RDIM_Arena *arena, RDIM_UDTEnumValChunkList *list, RDI_U64 cap)
{
RDIM_IdxedChunkListPush(arena, list, RDIM_UDTEnumValChunkNode, RDIM_UDTEnumVal, cap, result);
return result;
}
RDI_PROC RDI_U64
rdim_idx_from_udt_enum_val(RDIM_UDTEnumVal *enum_val)
{
RDIM_IdxedChunkListElementGetIdx(enum_val, idx);
return idx;
}
RDI_PROC void
rdim_udt_enum_val_chunk_list_concat_in_place(RDIM_UDTEnumValChunkList *dst, RDIM_UDTEnumValChunkList *to_push)
{
RDIM_IdxedChunkListConcatInPlace(RDIM_UDTEnumValChunkNode, dst, to_push);
}
//- rjf: UDTs
RDI_PROC RDIM_UDT *
-54
View File
@@ -723,7 +723,6 @@ struct RDIM_TypeChunkList
typedef struct RDIM_UDTMember RDIM_UDTMember;
struct RDIM_UDTMember
{
struct RDIM_UDTMemberChunkNode *chunk;
RDIM_UDTMember *next;
RDI_MemberKind kind;
RDIM_String8 name;
@@ -731,55 +730,16 @@ struct RDIM_UDTMember
RDI_U32 off;
};
typedef struct RDIM_UDTMemberChunkNode RDIM_UDTMemberChunkNode;
struct RDIM_UDTMemberChunkNode
{
RDIM_UDTMemberChunkNode *next;
RDIM_UDTMember *v;
RDI_U64 count;
RDI_U64 cap;
RDI_U64 base_idx;
};
typedef struct RDIM_UDTMemberChunkList RDIM_UDTMemberChunkList;
struct RDIM_UDTMemberChunkList
{
RDIM_UDTMemberChunkNode *first;
RDIM_UDTMemberChunkNode *last;
RDI_U64 chunk_count;
RDI_U64 total_count;
};
//- rjf: UDT enum values
typedef struct RDIM_UDTEnumVal RDIM_UDTEnumVal;
struct RDIM_UDTEnumVal
{
struct RDIM_UDTEnumValChunkNode *chunk;
RDIM_UDTEnumVal *next;
RDIM_String8 name;
RDI_U64 val;
};
typedef struct RDIM_UDTEnumValChunkNode RDIM_UDTEnumValChunkNode;
struct RDIM_UDTEnumValChunkNode
{
RDIM_UDTEnumValChunkNode *next;
RDIM_UDTEnumVal *v;
RDI_U64 count;
RDI_U64 cap;
RDI_U64 base_idx;
};
typedef struct RDIM_UDTEnumValChunkList RDIM_UDTEnumValChunkList;
struct RDIM_UDTEnumValChunkList
{
RDIM_UDTEnumValChunkNode *first;
RDIM_UDTEnumValChunkNode *last;
RDI_U64 chunk_count;
RDI_U64 total_count;
};
//- rjf: UDTs
typedef struct RDIM_UDT RDIM_UDT;
@@ -1078,8 +1038,6 @@ struct RDIM_BakeParams
RDIM_UnitChunkList units;
RDIM_TypeChunkList types;
RDIM_UDTChunkList udts;
RDIM_UDTMemberChunkList members;
RDIM_UDTEnumValChunkList enum_vals;
RDIM_SrcFileChunkList src_files;
RDIM_LineTableChunkList line_tables;
RDIM_LocationChunkList locations;
@@ -1718,22 +1676,10 @@ RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkL
RDI_PROC RDI_U64 rdim_idx_from_type(RDIM_Type *type);
RDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push);
//- rjf: UDT members
RDI_PROC RDIM_UDTMember *rdim_udt_member_chunk_list_push(RDIM_Arena *arena, RDIM_UDTMemberChunkList *list, RDI_U64 cap);
RDI_PROC RDI_U64 rdim_idx_from_udt_member(RDIM_UDTMember *member);
RDI_PROC void rdim_udt_member_chunk_list_concat_in_place(RDIM_UDTMemberChunkList *dst, RDIM_UDTMemberChunkList *to_push);
//- rjf: UDT enum values
RDI_PROC RDIM_UDTEnumVal *rdim_udt_enum_val_chunk_list_push(RDIM_Arena *arena, RDIM_UDTEnumValChunkList *list, RDI_U64 cap);
RDI_PROC RDI_U64 rdim_idx_from_udt_enum_val(RDIM_UDTEnumVal *enum_val);
RDI_PROC void rdim_udt_enum_val_chunk_list_concat_in_place(RDIM_UDTEnumValChunkList *dst, RDIM_UDTEnumValChunkList *to_push);
//- rjf: UDTs
RDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap);
RDI_PROC RDI_U64 rdim_idx_from_udt(RDIM_UDT *udt);
RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push);
//- TODO(rjf): to be removed:
RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt);
RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt);
+13 -27
View File
@@ -2171,19 +2171,13 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
if(lane_idx() == 0)
{
p2r2_shared->lanes_udts = push_array(arena, RDIM_UDTChunkList, lane_count());
p2r2_shared->lanes_members = push_array(arena, RDIM_UDTMemberChunkList, lane_count());
p2r2_shared->lanes_enum_vals = push_array(arena, RDIM_UDTEnumValChunkList, lane_count());
}
lane_sync();
//- rjf: do wide fill
{
U64 udts_chunk_cap = 4096;
U64 members_chunk_cap = 4096;
U64 enum_vals_chunk_cap = 4096;
RDIM_UDTChunkList *udts = &p2r2_shared->lanes_udts[lane_idx()];
RDIM_UDTMemberChunkList *members = &p2r2_shared->lanes_members[lane_idx()];
RDIM_UDTEnumValChunkList *enum_vals = &p2r2_shared->lanes_enum_vals[lane_idx()];
Rng1U64 range = lane_range(itype_opl);
for EachInRange(idx, range)
{
@@ -2371,7 +2365,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
next_read_ptr = name.str+name.size+1;
// rjf: emit member
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_DataField;
mem->name = name;
mem->type = p2r_type_ptr_from_itype(lf->itype);
@@ -2393,7 +2387,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
next_read_ptr = name.str+name.size+1;
// rjf: emit member
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_StaticData;
mem->name = name;
mem->type = p2r_type_ptr_from_itype(lf->itype);
@@ -2471,7 +2465,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
{
default:
{
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_Method;
mem->name = name;
mem->type = method_type;
@@ -2479,7 +2473,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
}break;
case CV_MethodProp_Static:
{
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_StaticMethod;
mem->name = name;
mem->type = method_type;
@@ -2490,7 +2484,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
case CV_MethodProp_Intro:
case CV_MethodProp_PureIntro:
{
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_VirtualMethod;
mem->name = name;
mem->type = method_type;
@@ -2529,7 +2523,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
{
default:
{
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_Method;
mem->name = name;
mem->type = method_type;
@@ -2537,7 +2531,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
}break;
case CV_MethodProp_Static:
{
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_StaticMethod;
mem->name = name;
mem->type = method_type;
@@ -2548,7 +2542,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
case CV_MethodProp_Intro:
case CV_MethodProp_PureIntro:
{
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_VirtualMethod;
mem->name = name;
mem->type = method_type;
@@ -2569,7 +2563,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
next_read_ptr = name.str+name.size+1;
// rjf: emit member
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_NestedType;
mem->name = name;
mem->type = p2r_type_ptr_from_itype(lf->itype);
@@ -2590,7 +2584,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
next_read_ptr = name.str+name.size+1;
// rjf: emit member
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_NestedType;
mem->name = name;
mem->type = p2r_type_ptr_from_itype(lf->itype);
@@ -2612,7 +2606,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
next_read_ptr = offset_ptr+offset.encoded_size;
// rjf: emit member
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_Base;
mem->type = p2r_type_ptr_from_itype(lf->itype);
mem->off = (U32)offset64;
@@ -2638,7 +2632,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
next_read_ptr = (U8 *)(lf+1);
// rjf: emit member
RDIM_UDTMember *mem = rdim_udt_member_chunk_list_push(arena, members, members_chunk_cap);
RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);
mem->kind = RDI_MemberKind_VirtualBase;
mem->type = p2r_type_ptr_from_itype(lf->itype);
new_member = mem;
@@ -2810,7 +2804,7 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
next_read_ptr = name.str+name.size+1;
// rjf: emit member
RDIM_UDTEnumVal *enum_val = rdim_udt_enum_val_chunk_list_push(arena, enum_vals, enum_vals_chunk_cap);
RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt);
enum_val->name = name;
enum_val->val = val64;
new_enum_val = enum_val;
@@ -2842,8 +2836,6 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
}
lane_sync();
RDIM_UDTChunkList *lanes_udts = p2r2_shared->lanes_udts;
RDIM_UDTMemberChunkList *lanes_members = p2r2_shared->lanes_members;
RDIM_UDTEnumValChunkList *lanes_enum_vals = p2r2_shared->lanes_enum_vals;
//////////////////////////////////////////////////////////////
//- rjf: join all UDTs
@@ -2853,14 +2845,10 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
for EachIndex(idx, lane_count())
{
rdim_udt_chunk_list_concat_in_place(&p2r2_shared->all_udts, &lanes_udts[idx]);
rdim_udt_member_chunk_list_concat_in_place(&p2r2_shared->all_members, &lanes_members[idx]);
rdim_udt_enum_val_chunk_list_concat_in_place(&p2r2_shared->all_enum_vals, &lanes_enum_vals[idx]);
}
}
lane_sync();
RDIM_UDTChunkList all_udts = p2r2_shared->all_udts;
RDIM_UDTMemberChunkList all_members = p2r2_shared->all_members;
RDIM_UDTEnumValChunkList all_enum_vals = p2r2_shared->all_enum_vals;
//////////////////////////////////////////////////////////////
//- rjf: produce symbols from all streams
@@ -3934,8 +3922,6 @@ p2r2_convert(Arena *arena, P2R_ConvertParams *params)
result.units = all_units;
result.types = all_types;
result.udts = all_udts;
result.members = all_members;
result.enum_vals = all_enum_vals;
result.src_files = all_src_files;
result.line_tables = all_line_tables;
result.locations = all_locations;
-4
View File
@@ -84,12 +84,8 @@ struct P2R2_Shared
RDIM_TypeChunkList all_types__pre_typedefs;
RDIM_UDTChunkList *lanes_udts;
RDIM_UDTMemberChunkList *lanes_members;
RDIM_UDTEnumValChunkList *lanes_enum_vals;
RDIM_UDTChunkList all_udts;
RDIM_UDTMemberChunkList all_members;
RDIM_UDTEnumValChunkList all_enum_vals;
RDIM_LocationChunkList *syms_locations;
RDIM_LocationCaseChunkList *syms_location_cases;
+22 -16
View File
@@ -766,23 +766,23 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params)
}
}
// rjf: push strings from udt members
ProfScope("udt members")
// rjf: push strings from udts
ProfScope("udts")
{
for EachNode(n, RDIM_UDTMemberChunkNode, params->members.first)
for EachNode(n, RDIM_UDTChunkNode, params->udts.first)
{
Rng1U64 range = lane_range(n->count);
rdim_bake_string_map_loose_push_udt_member_slice(arena, lane_map_top, lane_map, n->v + range.min, dim_1u64(range));
}
}
// rjf: push strings from udt enum values
ProfScope("udt enum values")
{
for EachNode(n, RDIM_UDTEnumValChunkNode, params->enum_vals.first)
{
Rng1U64 range = lane_range(n->count);
rdim_bake_string_map_loose_push_udt_enum_val_slice(arena, lane_map_top, lane_map, n->v + range.min, dim_1u64(range));
for EachInRange(idx, range)
{
for EachNode(mem, RDIM_UDTMember, n->v[idx].first_member)
{
rdim_bake_string_map_loose_insert(arena, lane_map_top, lane_map, 4, mem->name);
}
for EachNode(enum_val, RDIM_UDTEnumVal, n->v[idx].first_enum_val)
{
rdim_bake_string_map_loose_insert(arena, lane_map_top, lane_map, 4, enum_val->name);
}
}
}
}
@@ -1808,12 +1808,12 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params)
}
if(lane_idx() == lane_from_task_idx(3))
{
rdim2_shared->baked_udts.members_count = params->members.total_count+1;
rdim2_shared->baked_udts.members_count = params->udts.total_member_count+1;
rdim2_shared->baked_udts.members = push_array(arena, RDI_Member, rdim2_shared->baked_udts.members_count);
}
if(lane_idx() == lane_from_task_idx(4))
{
rdim2_shared->baked_udts.enum_members_count = params->enum_vals.total_count+1;
rdim2_shared->baked_udts.enum_members_count = params->udts.total_enum_val_count+1;
rdim2_shared->baked_udts.enum_members = push_array(arena, RDI_EnumMember, rdim2_shared->baked_udts.enum_members_count);
}
if(lane_idx() == lane_from_task_idx(5))
@@ -1960,6 +1960,7 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params)
}
//- rjf: bake UDT members
#if 0
ProfScope("bake UDT members")
{
for EachNode(n, RDIM_UDTMemberChunkNode, params->members.first)
@@ -1992,6 +1993,7 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params)
}
}
}
#endif
//- rjf: bake UDTs
ProfScope("bake UDTs")
@@ -2011,19 +2013,23 @@ rdim2_bake(Arena *arena, RDIM_BakeParams *params)
dst_udt->col = src_udt->col;
//- rjf: fill member info
#if 0
if(src_udt->member_count != 0)
{
dst_udt->member_first = rdim_idx_from_udt_member(src_udt->first_member);
dst_udt->member_count = src_udt->member_count;
}
#endif
//- rjf: fill enum members
#if 0
else if(src_udt->enum_val_count != 0)
{
dst_udt->flags |= RDI_UDTFlag_EnumMembers;
dst_udt->member_first = rdim_idx_from_udt_enum_val(src_udt->first_enum_val);
dst_udt->member_count = src_udt->enum_val_count;
}
#endif
}
}
}