lib/chant/src/profiling/versus/test.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const choir = @import("choir");
3 const sys = @import("sys");
4 const compiler = @import("compiler.zig");
5 const kernel_mod = @import("kernel.zig");
6 const oracle = choir.versus.oracle;
7 const root = @import("root.zig");
8 const workload_mod = choir.versus.workload;
9 const Workload = workload_mod.Workload;
10
11 test "chant versus package namespace" {
12 std.testing.refAllDecls(root);
13 }
14
15 test "chant compiles and verifies the corpus battery in miniature" {
16 var arena_state = std.heap.ArenaAllocator.init(std.testing.allocator);
17 defer arena_state.deinit();
18 const arena = arena_state.allocator();
19
20 const smoke = [_]Workload{
21 .{ .name = "saxpy_smoke", .kind = .saxpy, .n = 64 },
22 .{ .name = "dot_smoke", .kind = .dot, .n = 64 },
23 .{ .name = "sum_smoke", .kind = .sum, .n = 64 },
24 .{ .name = "matmul_smoke", .kind = .matmul, .n = 12 },
25 .{ .name = "polybench_gemm_smoke", .kind = .polybench_gemm, .n = 12 },
26 .{ .name = "stencil3_smoke", .kind = .stencil3, .n = 64 },
27 .{ .name = "clampsum_smoke", .kind = .clampsum, .n = 64 },
28 };
29
30 const environ = sys.env.current();
31 var compiled_count: usize = 0;
32 for (smoke) |workload| {
33 var ctx = try choir.Context.init(arena, choir.Context.Limits.testing);
34 defer ctx.deinit(arena);
35 try choir.dialects.registerAllDialects(&ctx);
36
37 const compiled = compiler.compileCorpus(std.testing.allocator, arena, &ctx, environ, workload, .{
38 .workdir = "/tmp",
39 }, null) catch |err| switch (err) {
40 error.PreprocessorUnavailable => return,
41 else => return err,
42 };
43
44 const symbol = workload.kind.symbol();
45 var lowered = false;
46 for (compiled.lowered.items) |name| {
47 if (std.mem.eql(u8, name, symbol)) lowered = true;
48 }
49 if (!lowered) continue;
50
51 var backend = try choir.backends.x86_64.backend.Backend.init(arena, &ctx, .testing);
52 defer backend.deinit();
53 const jit_module = try backend.compile(compiled.module.op);
54 const kernel = (try kernel_mod.open(&backend.runtime, jit_module, workload.kind)) orelse
55 return error.TestFailure;
56
57 var buffers = try oracle.Buffers.alloc(arena, workload);
58 buffers.reset();
59 kernel.call(workload, &buffers);
60 try oracle.verify(workload, &buffers);
61 compiled_count += 1;
62 }
63 try std.testing.expect(compiled_count >= 4);
64 }