File size: 3,030 Bytes
c95a088
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* ds4_gpu_args.h — shared CLI argument parser for --gpu-vram and
 * --gpu-devices flags. Used by ds4_cli, ds4_server, ds4_agent, and
 * ds4_bench. See mgpu-cli-wiring task (wave 2) for design.
 *
 * The parser does not link CUDA headers directly. On CUDA builds the
 * "auto" path is gated and dispatches to ds4_gpu_args_probe_auto_cuda,
 * which is defined in ds4_cuda.cu. On Metal/CPU builds, "auto" returns
 * an error.
 */
#ifndef DS4_GPU_ARGS_H
#define DS4_GPU_ARGS_H

#include <stdbool.h>
#include <stddef.h>

#include "ds4_gpu_mgpu.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Single canonical parser. Populates *out and *out_skip_cuda on
 * success; returns 0 on success, nonzero on parse error (errbuf
 * populated). Caller zeroes out and out_skip_cuda before calling.
 *
 *   vram_arg may be:
 *     NULL       -- flag unset
 *     "0"        -- skip CUDA entirely; sets *out_skip_cuda = true
 *     "auto"     -- query free VRAM via CUDA (CUDA build only)
 *     "N[,N...]" -- explicit GB budgets per device
 *
 *   devices_arg may be:
 *     NULL       -- 0..n-1 of visible devices (or 0..vram_count-1)
 *     "N[,N...]" -- explicit CUDA device indices
 *
 * Constraints:
 *   - If both args are given and counts differ, error.
 *   - Negative or non-integer values error.
 *   - Counts > DS4_MAX_GPUS error.
 */
int parse_gpu_vram_arg(
    const char     *vram_arg,
    const char     *devices_arg,
    ds4_gpu_config *out,
    bool           *out_skip_cuda,
    char           *errbuf,
    size_t          errbuflen);

/* Format the layout echo line written to stdout right before
 * ds4_engine_create_with_gpu_config is called.
 *
 * Example output:
 *   ds4: GPU config: 2 devices [0,1] requested, budgets 40,12 GB; auto=true
 *
 * Returns the number of bytes written (excluding the trailing NUL), or
 * -1 if out is NULL/outlen is 0.
 */
int format_gpu_layout_line(const ds4_gpu_config *cfg,
                           bool                  was_auto,
                           char                 *out,
                           size_t                outlen);

/* CUDA-only auto probe. Defined in ds4_cuda.cu under the same gate.
 * Returns 0 on success, nonzero on failure (errbuf populated).
 * device_filter may be NULL (use all visible devices) or a list of
 * length filter_len (use only those device indices).
 *
 * Declared here for the parser's use; not called by application code
 * directly. The Mac/CPU builds skip this branch via the
 * #if !defined(DS4_NO_GPU) && !defined(__APPLE__) gate in the parser. */
#if !defined(DS4_NO_GPU) && !defined(__APPLE__)
int ds4_gpu_args_probe_auto_cuda(const int      *device_filter,
                                  int             filter_len,
                                  ds4_gpu_config *out,
                                  size_t          safety_margin_bytes,
                                  char           *errbuf,
                                  size_t          errbuflen);
#endif

#ifdef __cplusplus
}
#endif

#endif /* DS4_GPU_ARGS_H */