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
}