Skip to content

Commit b78c949

Browse files
authored
feat: Implemented SIMD version of poseidon2 (#29)
2 parents e42998c + f1c438c commit b78c949

File tree

13 files changed

+1867
-80
lines changed

13 files changed

+1867
-80
lines changed

.github/workflows/performance-benchmark.yml

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,30 @@ jobs:
2727
- name: Verify Zig installation
2828
run: zig version
2929

30+
- name: Setup Zig cache directory
31+
run: |
32+
mkdir -p ~/.cache/zig
33+
chmod 755 ~/.cache/zig
34+
echo "Zig cache directory created and permissions set"
35+
3036
- name: Build current version
3137
run: |
38+
echo "Building current version..."
3239
zig build -Doptimize=ReleaseFast
3340
echo "Current version built successfully"
41+
ls -la zig-out/bin/ || echo "No binary output directory found"
3442
3543
- name: Benchmark current version
3644
id: current_benchmark
3745
run: |
3846
echo "Running performance benchmark for current version..."
39-
if zig build benchmark -Doptimize=ReleaseFast; then
47+
if zig build simd-benchmark -Doptimize=ReleaseFast; then
48+
./zig-out/bin/hash-zig-simd-benchmark > current_results.txt 2>&1
49+
elif zig build benchmark -Doptimize=ReleaseFast; then
4050
./zig-out/bin/hash-zig-benchmark > current_results.txt 2>&1
4151
elif [ -f scripts/benchmark.zig ]; then
42-
echo "No 'benchmark' build step; compiling scripts/benchmark.zig directly"
43-
zig build-exe scripts/benchmark.zig -OReleaseFast --dep hash-zig -Mhash-zig=src/root.zig -obenchmark_current
52+
echo "No benchmark build step; compiling scripts/benchmark.zig directly"
53+
zig build-exe scripts/benchmark.zig -OReleaseFast --dep hash-zig -Mhash-zig=src/root.zig --name benchmark_current
4454
./benchmark_current > current_results.txt 2>&1
4555
else
4656
echo "No benchmark target or script found; skipping current metrics"
@@ -89,20 +99,30 @@ jobs:
8999
git checkout ${{ steps.base_commit.outputs.base_sha }}
90100
echo "Checked out base version"
91101
102+
- name: Setup Zig cache directory (base)
103+
run: |
104+
mkdir -p ~/.cache/zig
105+
chmod 755 ~/.cache/zig
106+
echo "Zig cache directory created and permissions set for base version"
107+
92108
- name: Build base version
93109
run: |
110+
echo "Building base version..."
94111
zig build -Doptimize=ReleaseFast
95112
echo "Base version built successfully"
113+
ls -la zig-out/bin/ || echo "No binary output directory found"
96114
97115
- name: Benchmark base version
98116
id: base_benchmark
99117
run: |
100118
echo "Running performance benchmark for base version..."
101-
if zig build benchmark -Doptimize=ReleaseFast; then
119+
if zig build simd-benchmark -Doptimize=ReleaseFast; then
120+
./zig-out/bin/hash-zig-simd-benchmark > base_results.txt 2>&1
121+
elif zig build benchmark -Doptimize=ReleaseFast; then
102122
./zig-out/bin/hash-zig-benchmark > base_results.txt 2>&1
103123
elif [ -f scripts/benchmark.zig ]; then
104-
echo "No 'benchmark' build step on base; compiling scripts/benchmark.zig directly"
105-
zig build-exe scripts/benchmark.zig -OReleaseFast --dep hash-zig -Mhash-zig=src/root.zig -obenchmark_base
124+
echo "No benchmark build step on base; compiling scripts/benchmark.zig directly"
125+
zig build-exe scripts/benchmark.zig -OReleaseFast --dep hash-zig -Mhash-zig=src/root.zig --name benchmark_base
106126
./benchmark_base > base_results.txt 2>&1
107127
else
108128
echo "No benchmark target or script found on base; skipping base metrics"

build.zig

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,59 @@ pub fn build(b: *std.Build) void {
101101
const benchmark_step = b.step("benchmark", "Run performance benchmark");
102102
benchmark_step.dependOn(&run_benchmark.step);
103103

104+
// Add SIMD modules
105+
const simd_winternitz_module = b.addModule("simd_winternitz", .{
106+
.root_source_file = b.path("src/simd_winternitz.zig"),
107+
.target = target,
108+
.optimize = optimize,
109+
});
110+
111+
const simd_poseidon2_module = b.addModule("simd_poseidon2", .{
112+
.root_source_file = b.path("src/poseidon2/simd_poseidon2.zig"),
113+
.target = target,
114+
.optimize = optimize,
115+
});
116+
117+
const simd_montgomery_module = b.addModule("simd_montgomery", .{
118+
.root_source_file = b.path("src/poseidon2/fields/koalabear/simd_montgomery.zig"),
119+
.target = target,
120+
.optimize = optimize,
121+
});
122+
123+
const simd_signature_module = b.addModule("simd_signature", .{
124+
.root_source_file = b.path("src/simd_signature.zig"),
125+
.target = target,
126+
.optimize = optimize,
127+
});
128+
129+
// Set up module dependencies
130+
simd_signature_module.addImport("simd_winternitz", simd_winternitz_module);
131+
simd_signature_module.addImport("simd_poseidon2", simd_poseidon2_module);
132+
simd_signature_module.addImport("params", hash_zig_module);
133+
134+
simd_winternitz_module.addImport("simd_montgomery", simd_montgomery_module);
135+
simd_winternitz_module.addImport("simd_poseidon2", simd_poseidon2_module);
136+
137+
simd_poseidon2_module.addImport("simd_montgomery", simd_montgomery_module);
138+
139+
// SIMD benchmark executable
140+
const simd_benchmark = b.addExecutable(.{
141+
.name = "hash-zig-simd-benchmark",
142+
.root_source_file = b.path("examples/simd_benchmark.zig"),
143+
.target = target,
144+
.optimize = optimize,
145+
});
146+
simd_benchmark.root_module.addImport("hash-zig", hash_zig_module);
147+
simd_benchmark.root_module.addImport("simd_signature", simd_signature_module);
148+
simd_benchmark.root_module.addImport("simd_winternitz", simd_winternitz_module);
149+
simd_benchmark.root_module.addImport("simd_poseidon2", simd_poseidon2_module);
150+
simd_benchmark.root_module.addImport("simd_montgomery", simd_montgomery_module);
151+
b.installArtifact(simd_benchmark);
152+
153+
const run_simd_benchmark = b.addRunArtifact(simd_benchmark);
154+
const simd_benchmark_step = b.step("simd-benchmark", "Run SIMD performance benchmark");
155+
simd_benchmark_step.dependOn(&run_simd_benchmark.step);
156+
104157
// Optimized benchmark executable (commented out for now)
105158
// const optimized_benchmark_module = b.createModule(.{
106159
// .root_source_file = b.path("examples/optimized_benchmark.zig"),
@@ -124,16 +177,12 @@ pub fn build(b: *std.Build) void {
124177
// const optimized_benchmark_step = b.step("optimized-benchmark", "Run optimized performance benchmark");
125178
// optimized_benchmark_step.dependOn(&run_optimized_benchmark.step);
126179

127-
// Documentation (separate from main library build)
128-
const docs_obj = b.addObject(.{
129-
.name = "hash-zig-docs",
130-
.root_module = hash_zig_module,
131-
});
180+
// Documentation
181+
const docs_step = b.step("docs", "Generate documentation");
132182
const install_docs = b.addInstallDirectory(.{
133-
.source_dir = docs_obj.getEmittedDocs(),
183+
.source_dir = lib.getEmittedDocs(),
134184
.install_dir = .prefix,
135185
.install_subdir = "docs",
136186
});
137-
const docs_step = b.step("docs", "Generate documentation");
138187
docs_step.dependOn(&install_docs.step);
139188
}

examples/basic_usage.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ const hash_sig = @import("hash-zig");
55

66
pub fn main() !void {
77
// zlinter-disable-next-line no_deprecated - Standard allocator pattern for examples
8-
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
9-
defer _ = gpa.deinit();
8+
var gpa = std.heap.ArenaAllocator.init(std.heap.page_allocator);
9+
defer gpa.deinit();
1010
const allocator = gpa.allocator();
1111

1212
std.debug.print("Hash-Sig Example\n", .{});

examples/optimized_benchmark.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ const optimized_signature = @import("optimized_signature");
44
const params = hash_zig.params;
55

66
pub fn main() !void {
7-
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
8-
defer _ = gpa.deinit();
7+
var gpa = std.heap.ArenaAllocator.init(std.heap.page_allocator);
8+
defer gpa.deinit();
99
const allocator = gpa.allocator();
1010

1111
std.debug.print("Optimized Hash-Zig Performance Benchmark\n", .{});

0 commit comments

Comments
 (0)