skip to content
==> tests/needs.c <==
1/* sched_tests.rs needs_round_trip_and_terms, and the error messages. */
2#include "mesh/check.h"
3#include "mesh/sched_needs.h"
4
5#include <stdlib.h>
6
7static msm_member member(uint32_t id, const char *gpu, const char *host, const char *arch) {
8    msm_member m = msm_member_default();
9    m.id = id;
10    MSM_SET(m.gpu, gpu);
11    MSM_SET(m.host, host);
12    MSM_SET(m.arch, arch);
13    return m;
14}
15
16static mesh_term term(const char *s) {
17    mesh_term t;
18    char *err = NULL;
19    if (!mesh_term_parse(s, &t, &err)) {
20        fprintf(stderr, "%s\n", err);
21        free(err), err = NULL;
22        abort();
23    }
24    return t;
25}
26
27static void round_trip(const mesh_needs *n) {
28    char *e = msn_encode(n);
29    CHECK(strchr(e, ' ') == NULL);
30    mesh_needs d;
31    char *err = NULL;
32    CHECK(msn_decode(e, &d, &err));
33    CHECK(mesh_needs_eq(&d, n));
34    mesh_needs_free(&d);
35    free(e);
36}
37
38int main(void) {
39    mesh_needs n = msn_default();
40    mesh_strs_free(n.backends, n.nbackends), n.backends = NULL, n.nbackends = 0;
41    msn_strs_push(&n.backends, &n.nbackends, "cuda");
42    msn_strs_push(&n.backends, &n.nbackends, "wasm");
43    n.arch = mt_strdup("aarch64");
44    n.min_mem_mb = 4096;
45    msn_terms_push(&n.prefer, &n.nprefer, term("cuda"));
46    msn_terms_push(&n.prefer, &n.nprefer, term("host:dgx-00"));
47    msn_terms_push(&n.avoid, &n.navoid, term("system:3"));
48    n.replicas = (mesh_replicas){false, 2};
49    n.pack = true;
50    n.colocate_with = mt_strdup("pipehash");
51    msn_strs_push(&n.feeds, &n.nfeeds, "a");
52    n.group = mt_strdup("g");
53    n.group_size = 3;
54    msn_terms_push(&n.group_members, &n.ngroup_members, term("arch:aarch64"));
55    n.priority = -2;
56    n.cpu = 0.5f;
57    n.mem_mb = 64;
58    n.migrate = MESH_MIGRATE_RESTART;
59    n.lockstep = true;
60    n.view_bytes = 0x10000;
61    n.warps = 8;
62    n.shared = 0x3000;
63    round_trip(&n);
64    char *e = msn_encode(&n);
65    CHECK_S(e, "b=cuda,wasm;ar=aarch64;mm=4096;pf=cuda,host:dgx-00;av=system:3;r=2;sp=pack;co=pipehash;fd=a;g=g;gs=3;gm=arch:aarch64;pr=-2;cpu=0.5;mem=64;mg=restart;ls=1;vb=65536;w=8;sh=12288");
66    free(e);
67    char *s = msn_summary(&n);
68    CHECK_S(s, "replicas 2 pack backends cuda,wasm arch aarch64 min_mem_mb 4096 prefer cuda,host:dgx-00 avoid system:3 colocate_with pipehash group g size 3 members arch:aarch64 priority -2 cpu 0.50 mem_mb 64 view 64 KiB node 8 warps, 12288 shared bytes migrate restart");
69    free(s);
70    mesh_needs_free(&n);
71    n = msn_default();
72    round_trip(&n);
73    e = msn_encode(&n);
74    CHECK_S(e, "b=cuda;ar=-;mm=0;pf=-;av=-;r=all;sp=spread;co=-;fd=-;g=-;gs=0;gm=-;pr=0;cpu=0;mem=0;mg=state;ls=0;vb=0;w=1;sh=0");
75    free(e);
76    s = msn_summary(&n);
77    CHECK_S(s, "replicas all backends cuda view 0 KiB migrate state");
78    free(s);
79    mesh_needs_free(&n);
80    char *err = NULL;
81    mesh_needs d;
82    CHECK(!msn_decode("cpu=nan", &d, &err));
83    CHECK_S(err, "needs: cpu=\"nan\"");
84    free(err), err = NULL;
85    CHECK(!msn_decode("zz=1", &d, &err));
86    CHECK_S(err, "needs: unknown key \"zz\"");
87    free(err), err = NULL;
88    CHECK(!msn_decode("w=0", &d, &err));
89    CHECK_S(err, "needs: w=\"0\"");
90    free(err), err = NULL;
91    CHECK(!msn_decode("b", &d, &err));
92    CHECK_S(err, "needs: \"b\"");
93    free(err), err = NULL;
94    mesh_term t;
95    CHECK(!mesh_term_parse("host:", &t, &err));
96    CHECK_S(err, "\"host:\": a backend (cuda, metal, wasm, native), \"host:NAME\", \"system:K\" or \"arch:A\"");
97    free(err), err = NULL;
98    CHECK(!mesh_term_parse("gpu", &t, &err));
99    free(err), err = NULL;
100    CHECK(!mesh_term_parse("system:9", &t, &err));
101    free(err), err = NULL;
102    msm_member mac = member(3, "metal", "monumentals-mac-studio.local", "aarch64");
103    msm_member dgx = member(0, "cuda", "dgx-00", "aarch64");
104    msm_member being = member(2, "cuda", "being", "x86_64");
105    t = term("host:monumentals-mac-studio");
106    CHECK(msn_term_matches(&t, &mac));
107    free(t.s);
108    t = term("metal");
109    CHECK(msn_term_matches(&t, &mac) && !msn_term_matches(&t, &dgx));
110    free(t.s);
111    t = term("arch:x86_64");
112    CHECK(msn_term_matches(&t, &being));
113    free(t.s);
114    t = term("system:2");
115    CHECK(msn_term_matches(&t, &being) && !msn_term_matches(&t, &mac));
116    char *w = mesh_term_word(&t);
117    CHECK_S(w, "system:2");
118    free(w);
119    return mesh_check_done();
120}