|
@@ -16,12 +16,13 @@ import (
|
|
|
"os"
|
|
|
"path/filepath"
|
|
|
"runtime"
|
|
|
+ "strconv"
|
|
|
"strings"
|
|
|
"sync"
|
|
|
"unsafe"
|
|
|
|
|
|
- "github.com/ollama/ollama/envconfig"
|
|
|
"github.com/ollama/ollama/format"
|
|
|
+ "github.com/ollama/ollama/envconfig"
|
|
|
)
|
|
|
|
|
|
type handles struct {
|
|
@@ -104,6 +105,8 @@ func initGPUHandles() *handles {
|
|
|
var cudartMgmtPatterns []string
|
|
|
var nvcudaMgmtName string
|
|
|
var nvcudaMgmtPatterns []string
|
|
|
+ var oneapiMgmtName string
|
|
|
+ var oneapiMgmtPatterns []string
|
|
|
|
|
|
tmpDir, _ := PayloadsDir()
|
|
|
switch runtime.GOOS {
|
|
@@ -115,6 +118,8 @@ func initGPUHandles() *handles {
|
|
|
// Aligned with driver, we can't carry as payloads
|
|
|
nvcudaMgmtName = "nvcuda.dll"
|
|
|
nvcudaMgmtPatterns = NvcudaWindowsGlobs
|
|
|
+ oneapiMgmtName = "ze_intel_gpu64.dll"
|
|
|
+ oneapiMgmtPatterns = OneapiWindowsGlobs
|
|
|
case "linux":
|
|
|
cudartMgmtName = "libcudart.so*"
|
|
|
if tmpDir != "" {
|
|
@@ -125,6 +130,8 @@ func initGPUHandles() *handles {
|
|
|
// Aligned with driver, we can't carry as payloads
|
|
|
nvcudaMgmtName = "libcuda.so*"
|
|
|
nvcudaMgmtPatterns = NvcudaLinuxGlobs
|
|
|
+ oneapiMgmtName = "libze_intel_gpu.so"
|
|
|
+ oneapiMgmtPatterns = OneapiLinuxGlobs
|
|
|
default:
|
|
|
return gpuHandles
|
|
|
}
|
|
@@ -152,6 +159,17 @@ func initGPUHandles() *handles {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ oneapiLibPaths := FindGPULibs(oneapiMgmtName, oneapiMgmtPatterns)
|
|
|
+ if len(oneapiLibPaths) > 0 {
|
|
|
+ deviceCount, oneapi, libPath := LoadOneapiMgmt(oneapiLibPaths)
|
|
|
+ if oneapi != nil {
|
|
|
+ slog.Debug("detected Intel GPUs", "library", libPath, "count", deviceCount)
|
|
|
+ gpuHandles.oneapi = oneapi
|
|
|
+ gpuHandles.deviceCount = deviceCount
|
|
|
+ return gpuHandles
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return gpuHandles
|
|
|
}
|
|
|
|
|
@@ -227,6 +245,18 @@ func GetGPUInfo() GpuInfoList {
|
|
|
// TODO potentially sort on our own algorithm instead of what the underlying GPU library does...
|
|
|
resp = append(resp, gpuInfo)
|
|
|
}
|
|
|
+ if gpuHandles.oneapi != nil {
|
|
|
+ gpuInfo := GpuInfo{
|
|
|
+ Library: "oneapi",
|
|
|
+ }
|
|
|
+ C.oneapi_check_vram(*gpuHandles.oneapi, &memInfo)
|
|
|
+ var totalFreeMem float64 = float64(memInfo.free) * 0.95 // work-around: leave some reserve vram for mkl lib used in ggml-sycl backend.
|
|
|
+ memInfo.free = C.uint64_t(totalFreeMem)
|
|
|
+ gpuInfo.TotalMemory = uint64(memInfo.total)
|
|
|
+ gpuInfo.FreeMemory = uint64(memInfo.free)
|
|
|
+ gpuInfo.ID = strconv.Itoa(i)
|
|
|
+ resp = append(resp, gpuInfo)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Then AMD
|