==> tests/member.c <==1/* executors, exec_for, rtt_to, the performance map's order and ranges. */
2#include "mesh/check.h"
3#include "mesh/sched_member.h"
4#include "mesh/mt.h"
5
6int main(void) {
7 msm_member m = msm_member_default();
8 m.id = 1;
9 MSM_SET(m.gpu, "metal");
10 const char *ex[3];
11 CHECK_U(msm_executors(&m, ex), 3);
12 CHECK_S(ex[0], "metal");
13 CHECK_S(ex[2], "native");
14 MSM_SET(m.gpu, "wasm");
15 CHECK_U(msm_executors(&m, ex), 2);
16 char *b[] = {"cuda", "native", "wasm"};
17 CHECK_S(msm_exec_for(&m, b, 3), "native");
18 CHECK(msm_exec_for(&m, b, 1) == NULL);
19 m.nrtt = 3;
20 m.rtt_us[2] = mof32_some(250.0f);
21 CHECK(msm_rtt_to(&m, 1).some && msm_rtt_to(&m, 1).v == 0.0f);
22 CHECK(msm_rtt_to(&m, 2).v == 250.0f && !msm_rtt_to(&m, 0).some && !msm_rtt_to(&m, 5).some);
23 m.busy = mt_strdup("x");
24 ms_set(&m.fails, "p", "why", true);
25 msm_member c = msm_member_clone(&m);
26 CHECK_S(c.busy, "x");
27 CHECK_S(ms_get(&c.fails, "p"), "why");
28 msm_member_free(&c);
29 msm_member_free(&m);
30 msm_perfs p = {0};
31 msm_perf a = {.hash = 1, .exec = "cuda", .task_us = {true, 100}};
32 msm_perfs_set(&p, "b", 2, &a);
33 msm_perfs_set(&p, "a", 3, &a);
34 msm_perfs_set(&p, "b", 0, &a);
35 msm_perfs_set(&p, "ab", 1, &a);
36 a.hash = 9;
37 msm_perfs_set(&p, "b", 2, &a);
38 CHECK_U(p.n, 4);
39 CHECK_S(p.name[0], "a");
40 CHECK_S(p.name[1], "ab");
41 CHECK(p.member[2] == 0 && p.member[3] == 2 && p.perf[3].hash == 9);
42 size_t lo, hi;
43 msm_perfs_range(&p, "b", &lo, &hi);
44 CHECK(lo == 2 && hi == 4);
45 msm_perfs_range(&p, "c", &lo, &hi);
46 CHECK(lo == hi);
47 CHECK(msm_perfs_get(&p, "ab", 1) != NULL && msm_perfs_get(&p, "ab", 2) == NULL);
48 msm_perfs c2 = msm_perfs_clone(&p);
49 msm_perfs_remove_at(&c2, 0);
50 CHECK(c2.n == 3 && msm_perf_eq(&c2.perf[2], &p.perf[3]));
51 msm_perfs_free(&c2);
52 msm_perfs_free(&p);
53 return mesh_check_done();
54}