skip to content
==> 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}