public static List <CpuExtensionType> SupportedExtensions(CpuID cpuID) { var ret = new List <CpuExtensionType>(); foreach (var ext in _detectOrder) { if (HasExtensionSupport(ext, cpuID)) { ret.Add(ext); } } return(ret); }
public static Task <CPUDevice> TryQueryCPUDeviceTask() { return(Task.Run(() => { if (!CpuUtils.IsCpuMiningCapable()) { return null; } var cpuDetectResult = QueryCPUDevice(); // get all CPUs var cpuCount = CpuID.GetPhysicalProcessorCount(); var name = CpuID.GetCpuName().Trim(); // get all cores (including virtual - HT can benefit mining) var threadsPerCpu = cpuDetectResult.VirtualCoresCount / cpuCount; // TODO important move this to settings var threadsPerCpuMask = threadsPerCpu; if (threadsPerCpu * cpuCount > 64) { // set lower threadsPerCpuMask = 64; } List <ulong> affinityMasks = null; // multiple CPUs are identified as a single CPU from nhm perspective, it is the miner plugins job to handle this correctly if (cpuCount > 1) { name = $"({cpuCount}x){name}"; affinityMasks = new List <ulong>(); for (var i = 0; i < cpuCount; i++) { var affinityMask = CpuUtils.CreateAffinityMask(i, threadsPerCpuMask); affinityMasks.Add(affinityMask); } } var hashedInfo = $"{0}--{name}--{threadsPerCpu}"; foreach (var cpuInfo in cpuDetectResult.CpuInfos) { hashedInfo += $"{cpuInfo.Family}--{cpuInfo.ModelName}--{cpuInfo.NumberOfCores}--{cpuInfo.PhysicalID}--{cpuInfo.VendorID}"; } var uuidHEX = UUID.GetHexUUID(hashedInfo); var uuid = $"CPU-{uuidHEX}"; // plugin device var bd = new BaseDevice(DeviceType.CPU, uuid, name, 0); var cpu = new CPUDevice(bd, cpuCount, threadsPerCpu, cpuDetectResult.IsHyperThreadingEnabled, affinityMasks, CpuUtils.SupportedExtensions()); return cpu; })); }
/// <summary> /// HasExtensionSupport checks CPU extensions support, if type automatic just return false. /// </summary> /// <param name="type"></param> /// <returns>False if type Automatic otherwise True if supported</returns> private static bool HasExtensionSupport(CpuExtensionType type) { switch (type) { case CpuExtensionType.AVX2_AES: return((CpuID.SupportsAVX2() == 1) && (CpuID.SupportsAES() == 1)); case CpuExtensionType.AVX2: return(CpuID.SupportsAVX2() == 1); case CpuExtensionType.AVX_AES: return((CpuID.SupportsAVX() == 1) && (CpuID.SupportsAES() == 1)); case CpuExtensionType.AVX: return(CpuID.SupportsAVX() == 1); case CpuExtensionType.AES: return(CpuID.SupportsAES() == 1); case CpuExtensionType.SSE2: return(CpuID.SupportsSSE2() == 1); default: // CPUExtensionType.Automatic break; } return(false); }
/// <summary> /// HasExtensionSupport checks CPU extensions support, if type automatic just return false. /// </summary> /// <param name="type"></param> /// <returns>False if type Automatic otherwise True if supported</returns> private static bool HasExtensionSupport(CpuExtensionType type, CpuID cpuID) { switch (type) { case CpuExtensionType.AVX2_AES: return(cpuID.SupportsAVX2 && cpuID.SupportsAES_SSE42); case CpuExtensionType.AVX2: return(cpuID.SupportsAVX2); case CpuExtensionType.AVX_AES: return(cpuID.SupportsAVX && cpuID.SupportsAES_SSE42); case CpuExtensionType.AVX: return(cpuID.SupportsAVX); case CpuExtensionType.AES: return(cpuID.SupportsAES_SSE42); case CpuExtensionType.SSE2: return(cpuID.SupportsSSE2); default: // CPUExtensionType.Automatic break; } return(false); }
/// <summary> /// HasExtensionSupport checks CPU extensions support, if type automatic just return false. /// </summary> /// <param name="type"></param> /// <returns>False if type Automatic otherwise True if supported</returns> private static bool HasExtensionSupport(CpuExtensionType type, CpuID cpuID) => type switch {
/// <summary> /// Checks if CPU mining is capable, CPU must have AES support /// </summary> /// <returns></returns> public static bool IsCpuMiningCapable(CpuID cpuID) { return(HasExtensionSupport(CpuExtensionType.AES, cpuID)); }