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 }