==> tests/fixture.h <==1/* The Rust tests' fleet: dgx-00, gx10-9959, being (x86), the Mac (Metal) (sched_tests.rs member/fleet4). */
2#ifndef FIXTURE_H
3#define FIXTURE_H
4
5#include "mesh/sched_member.h"
6#include "mesh/sched_needs.h"
7
8#include <string.h>
9
10static msm_member member(uint32_t id, const char *gpu, const char *host) {
11 msm_member m = msm_member_default();
12 m.id = id;
13 m.up = true;
14 MSM_SET(m.host, host);
15 MSM_SET(m.gpu, gpu);
16 MSM_SET(m.arch, strcmp(gpu, "cuda") == 0 && id == 2 ? "x86_64" : "aarch64");
17 m.cpus = 20;
18 m.ram_mb = 120000;
19 m.mem_avail_mb = 80000;
20 m.gpu_share = mof32_some(0.5f);
21 m.cpu_util = 0.1f;
22 m.psi_cpu = mof32_some(0.01f);
23 m.psi_mem = mof32_some(0.0f);
24 m.load_known = true;
25 m.nrtt = 4;
26 for (int i = 0; i < 4; i++) m.rtt_us[i] = mof32_some(300.0f);
27 m.heap_kb = 7000;
28 m.slots_free = 28;
29 m.max_threads = 1024;
30 m.max_shared = strcmp(gpu, "metal") == 0 ? 32768 : 101376;
31 return m;
32}
33
34static void fleet4(msm_member ms[4]) {
35 ms[0] = member(0, "cuda", "dgx-00");
36 ms[1] = member(1, "cuda", "gx10-9959");
37 ms[2] = member(2, "cuda", "being");
38 ms[3] = member(3, "metal", "monumentals-mac-studio.local");
39}
40
41static mesh_needs needs(const char *b0, const char *b1, const char *b2) {
42 mesh_needs n = msn_default();
43 mesh_strs_free(n.backends, n.nbackends), n.backends = NULL, n.nbackends = 0;
44 if (b0) msn_strs_push(&n.backends, &n.nbackends, b0);
45 if (b1) msn_strs_push(&n.backends, &n.nbackends, b1);
46 if (b2) msn_strs_push(&n.backends, &n.nbackends, b2);
47 return n;
48}
49
50static mesh_term term(mesh_term_kind k, const char *s, uint32_t sys) { return msn_term_new(k, s, sys); }
51
52#endif
53
54#include "mesh/fleet_doc.h"
55#include "mesh/sched_place.h"
56
57#include <stdlib.h>
58
59/* sched_tests.rs prog(): a program of these backends, view 4 KiB, needs adjusted by the caller. */
60static mfd_prog prog_of(mesh_needs n) {
61 if (!n.view_bytes) n.view_bytes = 0x1000;
62 mfd_prog p = mfd_prog_new("x", 1, true, &n);
63 p.lockstep = n.lockstep;
64 for (size_t i = 0; i < n.nbackends; i++) mt_push(&p.backends, n.backends[i]);
65 mesh_needs_free(&n);
66 return p;
67}
68
69static mfd_doc doc_new(void) { return (mfd_doc){.version = 1, .term = 1}; }
70
71/* place() with no measurements and the default weights: the document. */
72static mfd_doc placed(const msm_member *ms, size_t n, const mfd_doc *d) {
73 msm_perfs perf = {0};
74 msw_weights w = msw_default();
75 msp_input in = {d, ms, n, &perf, &w};
76 mt_strs ch;
77 msp_explains ex;
78 mfd_doc out = msp_place(&in, &ch, &ex);
79 mt_strs_free(&ch);
80 msp_explains_free(&ex);
81 return out;
82}
83
84static bool at_is(const mfd_doc *d, const char *name, const uint32_t *v, size_t n) {
85 const mfd_prog *p = mfd_prog_get(d, name);
86 if (!p || !p->at.some || p->at.l.n != n) return false;
87 for (size_t i = 0; i < n; i++)
88 if (p->at.l.v[i] != v[i]) return false;
89 return true;
90}
91
92static void free_members(msm_member *ms, size_t n) {
93 for (size_t i = 0; i < n; i++) msm_member_free(&ms[i]);
94}