gpu_darwin.go 1.18 KB
Newer Older
1
2
//go:build darwin

3
package gpu
4

5
6
7
8
9
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Foundation -framework CoreGraphics -framework Metal
#include "gpu_info_darwin.h"
*/
10
import "C"
11
import (
12
13
14
	"fmt"
	"log/slog"
	"os"
Daniel Hiltgen's avatar
Daniel Hiltgen committed
15
	"runtime"
16
	"strconv"
17
18
19
20
)

// CheckVRAM returns the free VRAM in bytes on Linux machines with NVIDIA GPUs
func CheckVRAM() (int64, error) {
21
22
23
24
25
26
27
28
29
30
	userLimit := os.Getenv("OLLAMA_MAX_VRAM")
	if userLimit != "" {
		avail, err := strconv.ParseInt(userLimit, 10, 64)
		if err != nil {
			return 0, fmt.Errorf("Invalid OLLAMA_MAX_VRAM setting %s: %s", userLimit, err)
		}
		slog.Info(fmt.Sprintf("user override OLLAMA_MAX_VRAM=%d", avail))
		return avail, nil
	}

31
32
33
34
	if runtime.GOARCH == "amd64" {
		// gpu not supported, this may not be metal
		return 0, nil
	}
35
36
	recommendedMaxVRAM := int64(C.getRecommendedMaxVRAM())
	return recommendedMaxVRAM, nil
37
38
}

39
func GetGPUInfo() GpuInfo {
40
	mem, _ := getCPUMem()
41
42
	if runtime.GOARCH == "amd64" {
		return GpuInfo{
43
			Library: "cpu",
44
45
46
47
			Variant: GetCPUVariant(),
			memInfo: mem,
		}
	}
48
	return GpuInfo{
49
		Library: "metal",
50
51
52
53
54
55
		memInfo: mem,
	}
}

func getCPUMem() (memInfo, error) {
	return memInfo{
56
57
		TotalMemory: 0,
		FreeMemory:  0,
58
		DeviceCount: 0,
59
	}, nil
60
}