# `Snakepit.Telemetry.GPUProfiler`
[🔗](https://github.com/nshkrdotcom/snakepit/blob/v0.13.0/lib/snakepit/telemetry/gpu_profiler.ex#L1)

GPU memory and utilization profiler.

> #### Legacy Optional Module {: .warning}
>
> `Snakepit` does not call this module internally. It remains available for
> compatibility and may be removed in `v0.16.0` or later.
>
> Prefer host-managed GPU sampling and direct `:telemetry` emission for new
> integrations.

Periodically samples GPU metrics and emits telemetry events.
Supports NVIDIA CUDA GPUs via nvidia-smi.

# `state`

```elixir
@type state() :: %{
  interval_ms: pos_integer(),
  enabled: boolean(),
  sample_count: non_neg_integer(),
  last_sample_time: integer() | nil,
  timer_ref: reference() | nil,
  devices: [Snakepit.Hardware.Selector.device()],
  sampler_fun: (Snakepit.Hardware.Selector.device() -&gt;
                  {:ok, map()} | {:error, term()}),
  sample_task_ref: reference() | nil,
  sample_task_pid: pid() | nil,
  sample_now_waiters: [GenServer.from()]
}
```

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `disable`

```elixir
@spec disable(GenServer.server()) :: :ok
```

Disables GPU sampling.

# `enable`

```elixir
@spec enable(GenServer.server()) :: :ok
```

Enables GPU sampling.

# `get_stats`

```elixir
@spec get_stats(GenServer.server()) :: map()
```

Returns profiler statistics.

# `sample_now`

```elixir
@spec sample_now(GenServer.server()) :: :ok | {:error, :no_gpu}
```

Triggers an immediate GPU sample.

# `set_interval`

```elixir
@spec set_interval(GenServer.server(), pos_integer()) ::
  :ok | {:error, :invalid_interval}
```

Updates the sampling interval.

# `start_link`

```elixir
@spec start_link(keyword()) :: GenServer.on_start()
```

Starts the GPU profiler.

## Options

- `:interval_ms` - Sampling interval in milliseconds (default: 5000)
- `:enabled` - Whether to start sampling immediately (default: true)
- `:name` - GenServer name (default: __MODULE__)

---

*Consult [api-reference.md](api-reference.md) for complete listing*
