using LLama.Abstractions; using System.Collections.Generic; using System.Runtime.InteropServices; namespace LLama.Native { #if NET6_0_OR_GREATER /// /// A native library compiled with avx support but without cuda/cublas. /// public class NativeLibraryWithAvx : INativeLibrary { private NativeLibraryName _libraryName; private AvxLevel _avxLevel; private bool _skipCheck; /// public NativeLibraryMetadata? Metadata { get { return new NativeLibraryMetadata(_libraryName, false, _avxLevel); } } /// /// /// /// /// /// public NativeLibraryWithAvx(NativeLibraryName libraryName, AvxLevel avxLevel, bool skipCheck) { _libraryName = libraryName; _avxLevel = avxLevel; _skipCheck = skipCheck; } /// public IEnumerable Prepare(SystemInfo systemInfo, NativeLogConfig.LLamaLogCallback? logCallback) { if (systemInfo.OSPlatform != OSPlatform.Windows && systemInfo.OSPlatform != OSPlatform.Linux && !_skipCheck) { // Not supported on systems other than Windows and Linux. return []; } var path = GetAvxPath(systemInfo, _avxLevel, logCallback); return path is null ? [] : [path]; } private string? GetAvxPath(SystemInfo systemInfo, AvxLevel avxLevel, NativeLogConfig.LLamaLogCallback? logCallback) { NativeLibraryUtils.GetPlatformPathParts(systemInfo.OSPlatform, out var os, out var fileExtension, out var libPrefix); var avxStr = NativeLibraryConfig.AvxLevelToString(avxLevel); if (!string.IsNullOrEmpty(avxStr)) avxStr += "/"; var relativePath = $"runtimes/{os}/native/{avxStr}{libPrefix}{_libraryName.GetLibraryName()}{fileExtension}"; return relativePath; } } #endif }