authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-07-16 06:27:56-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-07-16 06:28:41-04:00
log9d1820d20635ade6cb2dbfc36744353715653670
treec4efb8a3cf8a31153af696120b2a6a39202336f9
parentb0fe7eef54dcaab8f7f0c18be042bf1876274ca4

InternPool: reduce max tid width by one bit

@mlugg keeps stealing my bits!

3 files changed, 12 insertions(+), 8 deletions(-)

src/InternPool.zig+7-4
...@@ -10,6 +10,8 @@ shards: []Shard = &.{},...@@ -10,6 +10,8 @@ shards: []Shard = &.{},
10global_error_set: GlobalErrorSet = GlobalErrorSet.empty,10global_error_set: GlobalErrorSet = GlobalErrorSet.empty,
11/// Cached number of active bits in a `tid`.11/// Cached number of active bits in a `tid`.
12tid_width: if (single_threaded) u0 else std.math.Log2Int(u32) = 0,12tid_width: if (single_threaded) u0 else std.math.Log2Int(u32) = 0,
13/// Cached shift amount to put a `tid` in the top bits of a 30-bit value.
14tid_shift_30: if (single_threaded) u0 else std.math.Log2Int(u32) = if (single_threaded) 0 else 31,
13/// Cached shift amount to put a `tid` in the top bits of a 31-bit value.15/// Cached shift amount to put a `tid` in the top bits of a 31-bit value.
14tid_shift_31: if (single_threaded) u0 else std.math.Log2Int(u32) = if (single_threaded) 0 else 31,16tid_shift_31: if (single_threaded) u0 else std.math.Log2Int(u32) = if (single_threaded) 0 else 31,
15/// Cached shift amount to put a `tid` in the top bits of a 32-bit value.17/// Cached shift amount to put a `tid` in the top bits of a 32-bit value.
...@@ -4091,8 +4093,8 @@ pub const Index = enum(u32) {...@@ -4091,8 +4093,8 @@ pub const Index = enum(u32) {
40914093
4092 fn wrap(unwrapped: Unwrapped, ip: *const InternPool) Index {4094 fn wrap(unwrapped: Unwrapped, ip: *const InternPool) Index {
4093 assert(@intFromEnum(unwrapped.tid) <= ip.getTidMask());4095 assert(@intFromEnum(unwrapped.tid) <= ip.getTidMask());
4094 assert(unwrapped.index <= ip.getIndexMask(u31));4096 assert(unwrapped.index <= ip.getIndexMask(u30));
4095 return @enumFromInt(@as(u32, @intFromEnum(unwrapped.tid)) << ip.tid_shift_31 | unwrapped.index);4097 return @enumFromInt(@as(u32, @intFromEnum(unwrapped.tid)) << ip.tid_shift_30 | unwrapped.index);
4096 }4098 }
40974099
4098 pub fn getExtra(unwrapped: Unwrapped, ip: *const InternPool) Local.Extra {4100 pub fn getExtra(unwrapped: Unwrapped, ip: *const InternPool) Local.Extra {
...@@ -4131,8 +4133,8 @@ pub const Index = enum(u32) {...@@ -4131,8 +4133,8 @@ pub const Index = enum(u32) {
4131 .tid = .main,4133 .tid = .main,
4132 .index = @intFromEnum(index),4134 .index = @intFromEnum(index),
4133 } else .{4135 } else .{
4134 .tid = @enumFromInt(@intFromEnum(index) >> ip.tid_shift_31 & ip.getTidMask()),4136 .tid = @enumFromInt(@intFromEnum(index) >> ip.tid_shift_30 & ip.getTidMask()),
4135 .index = @intFromEnum(index) & ip.getIndexMask(u31),4137 .index = @intFromEnum(index) & ip.getIndexMask(u30),
4136 };4138 };
4137 }4139 }
41384140
...@@ -5822,6 +5824,7 @@ pub fn init(ip: *InternPool, gpa: Allocator, available_threads: usize) !void {...@@ -5822,6 +5824,7 @@ pub fn init(ip: *InternPool, gpa: Allocator, available_threads: usize) !void {
5822 });5824 });
58235825
5824 ip.tid_width = @intCast(std.math.log2_int_ceil(usize, used_threads));5826 ip.tid_width = @intCast(std.math.log2_int_ceil(usize, used_threads));
5827 ip.tid_shift_30 = if (single_threaded) 0 else 30 - ip.tid_width;
5825 ip.tid_shift_31 = if (single_threaded) 0 else 31 - ip.tid_width;5828 ip.tid_shift_31 = if (single_threaded) 0 else 31 - ip.tid_width;
5826 ip.tid_shift_32 = if (single_threaded) 0 else ip.tid_shift_31 +| 1;5829 ip.tid_shift_32 = if (single_threaded) 0 else ip.tid_shift_31 +| 1;
5827 ip.shards = try gpa.alloc(Shard, @as(usize, 1) << ip.tid_width);5830 ip.shards = try gpa.alloc(Shard, @as(usize, 1) << ip.tid_width);
src/Zcu/PerThread.zig+2-1
...@@ -3,7 +3,8 @@ zcu: *Zcu,...@@ -3,7 +3,8 @@ zcu: *Zcu,
3/// Dense, per-thread unique index.3/// Dense, per-thread unique index.
4tid: Id,4tid: Id,
55
6pub const Id = if (InternPool.single_threaded) enum { main } else enum(u8) { main, _ };6pub const IdBacking = u7;
7pub const Id = if (InternPool.single_threaded) enum { main } else enum(IdBacking) { main, _ };
78
8pub fn destroyDecl(pt: Zcu.PerThread, decl_index: Zcu.Decl.Index) void {9pub fn destroyDecl(pt: Zcu.PerThread, decl_index: Zcu.Decl.Index) void {
9 const zcu = pt.zcu;10 const zcu = pt.zcu;
src/main.zig+3-3
...@@ -3110,7 +3110,7 @@ fn buildOutputType(...@@ -3110,7 +3110,7 @@ fn buildOutputType(
3110 var thread_pool: ThreadPool = undefined;3110 var thread_pool: ThreadPool = undefined;
3111 try thread_pool.init(.{3111 try thread_pool.init(.{
3112 .allocator = gpa,3112 .allocator = gpa,
3113 .n_jobs = @min(@max(n_jobs orelse std.Thread.getCpuCount() catch 1, 1), std.math.maxInt(u8)),3113 .n_jobs = @min(@max(n_jobs orelse std.Thread.getCpuCount() catch 1, 1), std.math.maxInt(Zcu.PerThread.IdBacking)),
3114 .track_ids = true,3114 .track_ids = true,
3115 });3115 });
3116 defer thread_pool.deinit();3116 defer thread_pool.deinit();
...@@ -4961,7 +4961,7 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {...@@ -4961,7 +4961,7 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
4961 var thread_pool: ThreadPool = undefined;4961 var thread_pool: ThreadPool = undefined;
4962 try thread_pool.init(.{4962 try thread_pool.init(.{
4963 .allocator = gpa,4963 .allocator = gpa,
4964 .n_jobs = @min(@max(n_jobs orelse std.Thread.getCpuCount() catch 1, 1), std.math.maxInt(u8)),4964 .n_jobs = @min(@max(n_jobs orelse std.Thread.getCpuCount() catch 1, 1), std.math.maxInt(Zcu.PerThread.IdBacking)),
4965 .track_ids = true,4965 .track_ids = true,
4966 });4966 });
4967 defer thread_pool.deinit();4967 defer thread_pool.deinit();
...@@ -5399,7 +5399,7 @@ fn jitCmd(...@@ -5399,7 +5399,7 @@ fn jitCmd(
5399 var thread_pool: ThreadPool = undefined;5399 var thread_pool: ThreadPool = undefined;
5400 try thread_pool.init(.{5400 try thread_pool.init(.{
5401 .allocator = gpa,5401 .allocator = gpa,
5402 .n_jobs = @min(@max(std.Thread.getCpuCount() catch 1, 1), std.math.maxInt(u8)),5402 .n_jobs = @min(@max(std.Thread.getCpuCount() catch 1, 1), std.math.maxInt(Zcu.PerThread.IdBacking)),
5403 .track_ids = true,5403 .track_ids = true,
5404 });5404 });
5405 defer thread_pool.deinit();5405 defer thread_pool.deinit();