public KernelOutputViewModel(IKernelOutput data) : this(data.GetId()) { _name = data.Name; _kernelRestartKeyword = data.KernelRestartKeyword; _isDualInSameLine = data.IsDualInSameLine; _totalSpeedPattern = data.TotalSpeedPattern; _gpuSpeedPattern = data.GpuSpeedPattern; _gpuGotOneIncorrectShare = data.GpuGotOneIncorrectShare; _totalSharePattern = data.TotalSharePattern; _acceptSharePattern = data.AcceptSharePattern; _foundOneShare = data.FoundOneShare; _acceptOneShare = data.AcceptOneShare; _rejectSharePattern = data.RejectSharePattern; _rejectOneShare = data.RejectOneShare; _rejectPercentPattern = data.RejectPercentPattern; _dualGpuSpeedPattern = data.DualGpuSpeedPattern; _dualAcceptSharePattern = data.DualAcceptSharePattern; _dualAcceptOneShare = data.DualAcceptOneShare; _dualRejectSharePattern = data.DualRejectSharePattern; _dualRejectOneShare = data.DualRejectOneShare; _dualRejectPercentPattern = data.DualRejectPercentPattern; _dualTotalSharePattern = data.DualTotalSharePattern; _dualTotalSpeedPattern = data.DualTotalSpeedPattern; _poolDelayPattern = data.PoolDelayPattern; _dualPoolDelayPattern = data.DualPoolDelayPattern; _speedUnit = data.SpeedUnit; _dualSpeedUnit = data.DualSpeedUnit; _gpuBaseIndex = data.GpuBaseIndex; _isMapGpuIndex = data.IsMapGpuIndex; }
private static void PickRejectPattern(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string rejectSharePattern = kernelOutput.RejectSharePattern; if (isDual) { rejectSharePattern = kernelOutput.DualRejectSharePattern; } if (string.IsNullOrEmpty(rejectSharePattern)) { return; } var match = Regex.Match(input, rejectSharePattern); if (match.Success) { string rejectShareText = match.Groups["rejectShare"].Value; int rejectShare; if (int.TryParse(rejectShareText, out rejectShare)) { ICoinShare share = root.CoinShareSet.GetOrCreate(coin.GetId()); share.RejectCount = rejectShare; share.ShareOn = DateTime.Now; Global.Happened(new ShareChangedEvent(share)); } } }
private static void PickAcceptShare(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string acceptSharePattern = kernelOutput.AcceptSharePattern; if (isDual) { acceptSharePattern = kernelOutput.DualAcceptSharePattern; } if (string.IsNullOrEmpty(acceptSharePattern)) { return; } var match = Regex.Match(input, acceptSharePattern, RegexOptions.Compiled); if (match.Success) { if (!isDual) { } string acceptShareText = match.Groups[Consts.AcceptShareGroupName].Value; int acceptShare; if (int.TryParse(acceptShareText, out acceptShare)) { root.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: acceptShare, rejectShareCount: null, now: DateTime.Now); } } }
private static void PickRejectPattern(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string rejectSharePattern = kernelOutput.RejectSharePattern; if (isDual) { rejectSharePattern = kernelOutput.DualRejectSharePattern; } if (string.IsNullOrEmpty(rejectSharePattern)) { return; } var match = Regex.Match(input, rejectSharePattern, RegexOptions.Compiled); if (match.Success) { string rejectShareText = match.Groups["rejectShare"].Value; int rejectShare; if (int.TryParse(rejectShareText, out rejectShare)) { root.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: null, rejectShareCount: rejectShare, now: DateTime.Now); } } }
public KernelOutputViewModel(IKernelOutput data) : this(data.GetId()) { _name = data.Name; _kernelRestartKeyword = data.KernelRestartKeyword; _prependDateTime = data.PrependDateTime; _isDualInSameLine = data.IsDualInSameLine; _totalSpeedPattern = data.TotalSpeedPattern; _gpuSpeedPattern = data.GpuSpeedPattern; _totalSharePattern = data.TotalSharePattern; _acceptSharePattern = data.AcceptSharePattern; _acceptOneShare = data.AcceptOneShare; _rejectSharePattern = data.RejectSharePattern; _rejectOneShare = data.RejectOneShare; _rejectPercentPattern = data.RejectPercentPattern; _dualGpuSpeedPattern = data.DualGpuSpeedPattern; _dualAcceptSharePattern = data.DualAcceptSharePattern; _dualAcceptOneShare = data.DualAcceptOneShare; _dualRejectSharePattern = data.DualRejectSharePattern; _dualRejectOneShare = data.DualRejectOneShare; _dualRejectPercentPattern = data.DualRejectPercentPattern; _dualTotalSharePattern = data.DualTotalSharePattern; _dualTotalSpeedPattern = data.DualTotalSpeedPattern; _poolDelayPattern = data.PoolDelayPattern; _dualPoolDelayPattern = data.DualPoolDelayPattern; }
public MineContext( string minerName, ICoin mainCoin, IPool mainCoinPool, IKernel kernel, IKernelInput kernelInput, IKernelOutput kernelOutput, ICoinKernel coinKernel, string mainCoinWallet, string commandLine, Dictionary <string, string> parameters, Dictionary <Guid, string> fragments, Dictionary <Guid, string> fileWriters, int[] useDevices) { this.Fragments = fragments; this.FileWriters = fileWriters; this.Id = Guid.NewGuid(); this.MinerName = minerName; this.MainCoin = mainCoin; this.MainCoinPool = mainCoinPool; this.Kernel = kernel; this.CoinKernel = coinKernel; this.MainCoinWallet = mainCoinWallet; this.AutoRestartKernelCount = 0; this.KernelSelfRestartCount = 0; this.CommandLine = commandLine ?? string.Empty; this.MineStartedOn = DateTime.MinValue; this.Parameters = parameters; this.UseDevices = useDevices; this.KernelInput = kernelInput; this.KernelOutput = kernelOutput; this.NewLogFileName(); }
public void Pick(Guid kernelId, ref string input, IMineContext mineContext) { try { InitOnece(); if (!_dicById.ContainsKey(kernelId)) { return; } if (string.IsNullOrEmpty(input)) { return; } IKernelOutput kernelOutput = _dicById[kernelId]; ICoin coin = mineContext.MainCoin; bool isDual = false; if ((mineContext is IDualMineContext dualMineContext) && !input.Contains(mineContext.MainCoin.Code)) { isDual = true; coin = dualMineContext.DualCoin; } PickTotalSpeed(_root, input, kernelOutput, coin, isDual); PickGpuSpeed(_root, input, kernelOutput, coin, isDual); PickTotalShare(_root, input, kernelOutput, coin, isDual); PickAcceptShare(_root, input, kernelOutput, coin, isDual); PickAcceptOneShare(_root, input, kernelOutput, coin, isDual); PickRejectPattern(_root, input, kernelOutput, coin, isDual); PickRejectOneShare(_root, input, kernelOutput, coin, isDual); PickRejectPercent(_root, input, kernelOutput, coin, isDual); } catch (Exception e) { Logger.ErrorDebugLine(e.Message, e); } }
private static void PickRejectPattern(INTMinerContext root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string rejectSharePattern = kernelOutput.RejectSharePattern; if (isDual) { rejectSharePattern = kernelOutput.DualRejectSharePattern; } if (string.IsNullOrEmpty(rejectSharePattern)) { return; } Regex regex = VirtualRoot.GetRegex(rejectSharePattern); var match = regex.Match(input); if (match.Success) { string rejectShareText = match.Groups[NTKeyword.RejectShareGroupName].Value; if (int.TryParse(rejectShareText, out int rejectShare)) { root.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: null, rejectShareCount: rejectShare, now: DateTime.Now); } } }
private static void PickTotalShare(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string totalSharePattern = kernelOutput.TotalSharePattern; if (isDual) { totalSharePattern = kernelOutput.DualTotalSharePattern; } if (string.IsNullOrEmpty(totalSharePattern)) { return; } Regex regex = VirtualRoot.GetRegex(totalSharePattern); var match = regex.Match(input); if (match.Success) { string totalShareText = match.Groups[NTKeyword.TotalShareGroupName].Value; if (int.TryParse(totalShareText, out int totalShare)) { ICoinShare share = root.CoinShareSet.GetOrCreate(coin.GetId()); root.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: totalShare - share.RejectShareCount, rejectShareCount: null, now: DateTime.Now); } } }
public static bool GetIsRejectOneGpuShare(this IKernelOutput kernelOutput) { if (kernelOutput == null) { return(false); } return(!string.IsNullOrEmpty(kernelOutput.RejectOneShare) || !string.IsNullOrEmpty(kernelOutput.GpuRejectShare)); }
public bool TryGetKernelOutput(Guid id, out IKernelOutput kernelOutput) { InitOnece(); var result = _dicById.TryGetValue(id, out KernelOutputData data); kernelOutput = data; return(result); }
private static void PickTotalSpeed(INTMinerRoot root, string input, IKernelOutput kernelOutput, bool isDual) { string totalSpeedPattern = kernelOutput.TotalSpeedPattern; if (isDual) { totalSpeedPattern = kernelOutput.DualTotalSpeedPattern; } if (string.IsNullOrEmpty(totalSpeedPattern)) { return; } Regex regex = VirtualRoot.GetRegex(totalSpeedPattern); Match match = regex.Match(input); if (match.Success) { string totalSpeedText = match.Groups[NTKeyword.TotalSpeedGroupName].Value; string totalSpeedUnit = match.Groups[NTKeyword.TotalSpeedUnitGroupName].Value; if (string.IsNullOrEmpty(totalSpeedUnit)) { if (isDual) { totalSpeedUnit = kernelOutput.DualSpeedUnit; } else { totalSpeedUnit = kernelOutput.SpeedUnit; } } double totalSpeed; if (double.TryParse(totalSpeedText, out totalSpeed)) { double totalSpeedL = totalSpeed.FromUnitSpeed(totalSpeedUnit); var now = DateTime.Now; IGpusSpeed gpuSpeeds = NTMinerRoot.Instance.GpusSpeed; gpuSpeeds.SetCurrentSpeed(NTMinerRoot.GpuAllId, totalSpeedL, isDual, now); string gpuSpeedPattern = kernelOutput.GpuSpeedPattern; if (isDual) { gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern; } if (string.IsNullOrEmpty(gpuSpeedPattern) && root.GpuSet.Count != 0) { // 平分总算力 double gpuSpeedL = totalSpeedL / root.GpuSet.Count; foreach (var item in gpuSpeeds) { if (item.Gpu.Index != NTMinerRoot.GpuAllId) { gpuSpeeds.SetCurrentSpeed(item.Gpu.Index, gpuSpeedL, isDual, now); } } } } } }
private static void PickGpuSpeed(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string gpuSpeedPattern = kernelOutput.GpuSpeedPattern; if (isDual) { gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern; } if (string.IsNullOrEmpty(gpuSpeedPattern)) { return; } var now = DateTime.Now; bool hasGpuId = gpuSpeedPattern.Contains("?<gpu>"); Regex regex = new Regex(gpuSpeedPattern); MatchCollection matches = regex.Matches(input); if (matches.Count > 0) { GpusSpeed gpuSpeeds = (GpusSpeed)NTMinerRoot.Instance.GpusSpeed; for (int i = 0; i < matches.Count; i++) { Match match = matches[i]; string gpuSpeedText = match.Groups["gpuSpeed"].Value; string gpuSpeedUnit = match.Groups["gpuSpeedUnit"].Value; int gpu = i; if (hasGpuId) { string gpuText = match.Groups["gpu"].Value; if (!int.TryParse(gpuText, out gpu)) { gpu = i; } } double gpuSpeed; if (double.TryParse(gpuSpeedText, out gpuSpeed)) { double gpuSpeedL = gpuSpeed.FromUnitSpeed(gpuSpeedUnit); gpuSpeeds.SetCurrentSpeed(gpu, gpuSpeedL, isDual, now); } } string totalSpeedPattern = kernelOutput.DualTotalSpeedPattern; if (isDual) { totalSpeedPattern = kernelOutput.DualTotalSpeedPattern; } if (string.IsNullOrEmpty(totalSpeedPattern)) { // 求和分算力 IGpuSpeed totalGpuSpeed = gpuSpeeds.First(a => a.Gpu.Index == NTMinerRoot.GpuAllId); double speed = isDual? gpuSpeeds.Where(a => a.Gpu.Index != NTMinerRoot.GpuAllId).Sum(a => a.DualCoinSpeed.Value) : gpuSpeeds.Where(a => a.Gpu.Index != NTMinerRoot.GpuAllId).Sum(a => a.MainCoinSpeed.Value); gpuSpeeds.SetCurrentSpeed(NTMinerRoot.GpuAllId, speed, isDual, now); } } }
private static void PickTotalSpeed(INTMinerContext context, string line, IKernelOutput kernelOutput, bool isDual) { string totalSpeedPattern = kernelOutput.TotalSpeedPattern; if (isDual) { totalSpeedPattern = kernelOutput.DualTotalSpeedPattern; } if (string.IsNullOrEmpty(totalSpeedPattern)) { return; } Regex regex = VirtualRoot.GetRegex(totalSpeedPattern); Match match = regex.Match(line); if (match.Success) { string totalSpeedText = match.Groups[NTKeyword.TotalSpeedGroupName].Value; string totalSpeedUnit = match.Groups[NTKeyword.TotalSpeedUnitGroupName].Value; if (string.IsNullOrEmpty(totalSpeedUnit)) { if (isDual) { totalSpeedUnit = kernelOutput.DualSpeedUnit; } else { totalSpeedUnit = kernelOutput.SpeedUnit; } } if (double.TryParse(totalSpeedText, out double totalSpeed)) { totalSpeed = totalSpeed.FromUnitSpeed(totalSpeedUnit); var now = DateTime.Now; IGpusSpeed gpuSpeeds = NTMinerContext.Instance.GpusSpeed; gpuSpeeds.SetCurrentSpeed(NTMinerContext.GpuAllId, totalSpeed, isDual, now); string gpuSpeedPattern = kernelOutput.GpuSpeedPattern; if (isDual) { gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern; } // 如果没有单卡算力正则则平分总算力作为单卡算力正则 if ((string.IsNullOrEmpty(gpuSpeedPattern) || context.GpuSet.Count == 1) && context.GpuSet.Count != 0) { double gpuSpeed = totalSpeed / context.GpuSet.Count; foreach (var item in gpuSpeeds.AsEnumerable()) { if (item.Gpu.Index != NTMinerContext.GpuAllId) { gpuSpeeds.SetCurrentSpeed(item.Gpu.Index, gpuSpeed, isDual, now); } } } } } }
public MineContext( bool isRestart, string minerName, ICoin mainCoin, IPool mainCoinPool, IKernel kernel, IKernelInput kernelInput, IKernelOutput kernelOutput, ICoinKernel coinKernel, string mainCoinWallet, string commandLine, Dictionary <string, string> parameters, Dictionary <Guid, string> fragments, Dictionary <Guid, string> fileWriters, int[] useDevices) { this.Fragments = fragments; this.FileWriters = fileWriters; this.Id = Guid.NewGuid(); this.IsRestart = isRestart; this.MinerName = minerName; this.MainCoin = mainCoin; this.MainCoinPool = mainCoinPool; this.Kernel = kernel; this.CoinKernel = coinKernel; this.MainCoinWallet = mainCoinWallet; this.AutoRestartKernelCount = 0; this.KernelSelfRestartCount = 0; this.CommandLine = commandLine ?? string.Empty; this.CreatedOn = DateTime.Now; this.Parameters = parameters; this.UseDevices = useDevices; this.KernelInput = kernelInput; this.KernelOutput = kernelOutput; string logFileName; if (this.CommandLine.Contains(NTKeyword.LogFileParameterName)) { this.KernelProcessType = KernelProcessType.Logfile; logFileName = $"{this.Kernel.Code}_{DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss_fff")}.log"; } else { this.KernelProcessType = KernelProcessType.Pip; logFileName = $"{kernel.Code}_pip_{DateTime.Now.Ticks.ToString()}.log"; } this.LogFileFullName = Path.Combine(SpecialPath.LogsDirFullName, logFileName); }
public static bool GetIsGotOneIncorrectGpuShare(this IKernelOutput kernelOutput) { if (kernelOutput == null) { return(false); } if (!string.IsNullOrEmpty(kernelOutput.GpuGotOneIncorrectShare) && kernelOutput.GpuGotOneIncorrectShare.Contains("?<gpu>")) { return(true); } if (!string.IsNullOrEmpty(kernelOutput.GpuIncorrectShare) && kernelOutput.GpuIncorrectShare.Contains("?<gpu>")) { return(true); } return(false); }
public KernelOutputViewModel(IKernelOutput data) : this(data.GetId()) { _name = data.Name; _gpuSpeedPattern = data.GpuSpeedPattern; _rejectSharePattern = data.RejectSharePattern; _totalSharePattern = data.TotalSharePattern; _acceptSharePattern = data.AcceptSharePattern; _rejectPercentPattern = data.RejectPercentPattern; _totalSpeedPattern = data.TotalSpeedPattern; _dualGpuSpeedPattern = data.DualGpuSpeedPattern; _dualRejectSharePattern = data.DualRejectSharePattern; _dualAcceptSharePattern = data.DualAcceptSharePattern; _dualRejectPercentPattern = data.DualRejectPercentPattern; _dualTotalSharePattern = data.DualTotalSharePattern; _dualTotalSpeedPattern = data.DualTotalSpeedPattern; }
private static void PickTotalSpeed(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string totalSpeedPattern = kernelOutput.TotalSpeedPattern; if (isDual) { totalSpeedPattern = kernelOutput.DualTotalSpeedPattern; } if (string.IsNullOrEmpty(totalSpeedPattern)) { return; } Match match = Regex.Match(input, totalSpeedPattern, RegexOptions.Compiled); if (match.Success) { string totalSpeedText = match.Groups["totalSpeed"].Value; string totalSpeedUnit = match.Groups["totalSpeedUnit"].Value; double totalSpeed; if (double.TryParse(totalSpeedText, out totalSpeed)) { double totalSpeedL = totalSpeed.FromUnitSpeed(totalSpeedUnit); var now = DateTime.Now; IGpusSpeed gpuSpeeds = NTMinerRoot.Instance.GpusSpeed; gpuSpeeds.SetCurrentSpeed(NTMinerRoot.GpuAllId, totalSpeedL, isDual, now); string gpuSpeedPattern = kernelOutput.GpuSpeedPattern; if (isDual) { gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern; } if (string.IsNullOrEmpty(gpuSpeedPattern)) { // 平分总算力 double gpuSpeedL = totalSpeedL / root.GpuSet.Count; foreach (var item in gpuSpeeds) { if (item.Gpu.Index != NTMinerRoot.GpuAllId) { gpuSpeeds.SetCurrentSpeed(item.Gpu.Index, gpuSpeedL, isDual, now); } } } } } }
public static bool GetIsFoundOneGpuShare(this IKernelOutput kernelOutput) { if (kernelOutput == null) { return(false); } if (!string.IsNullOrEmpty(kernelOutput.FoundOneShare) && kernelOutput.FoundOneShare.Contains("?<gpu>")) { return(true); } if (!string.IsNullOrEmpty(kernelOutput.AcceptOneShare) && kernelOutput.AcceptOneShare.Contains("?<gpu>")) { return(true); } if (!string.IsNullOrEmpty(kernelOutput.GpuAcceptShare) && kernelOutput.GpuAcceptShare.Contains("?<gpu>")) { return(true); } return(false); }
private static void PickRejectOneShare(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string rejectOneShare = kernelOutput.RejectOneShare; if (isDual) { rejectOneShare = kernelOutput.DualRejectOneShare; } if (string.IsNullOrEmpty(rejectOneShare)) { return; } var match = Regex.Match(input, rejectOneShare, RegexOptions.Compiled); if (match.Success) { ICoinShare share = root.CoinShareSet.GetOrCreate(coin.GetId()); root.CoinShareSet.UpdateShare(coin.GetId(), null, share.RejectShareCount + 1, DateTime.Now); } }
private static void PickPoolDelay(string input, IKernelOutput kernelOutput, bool isDual) { string poolDelayPattern = kernelOutput.PoolDelayPattern; if (isDual) { poolDelayPattern = kernelOutput.DualPoolDelayPattern; } if (string.IsNullOrEmpty(poolDelayPattern)) { return; } Match match = Regex.Match(input, poolDelayPattern, RegexOptions.Compiled); if (match.Success) { string poolDelayText = match.Groups["poolDelay"].Value; VirtualRoot.Happened(new PoolDelayPickedEvent(poolDelayText, isDual)); } }
private static void PickAcceptOneShare(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string acceptOneShare = kernelOutput.AcceptOneShare; if (isDual) { acceptOneShare = kernelOutput.DualAcceptOneShare; } if (string.IsNullOrEmpty(acceptOneShare)) { return; } var match = Regex.Match(input, acceptOneShare); if (match.Success) { ICoinShare share = root.CoinShareSet.GetOrCreate(coin.GetId()); root.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: share.AcceptShareCount + 1, rejectShareCount: null, now: DateTime.Now); } }
private static void PickPoolDelay(string input, IKernelOutput kernelOutput, bool isDual, Guid poolId) { string poolDelayPattern = kernelOutput.PoolDelayPattern; if (isDual) { poolDelayPattern = kernelOutput.DualPoolDelayPattern; } if (string.IsNullOrEmpty(poolDelayPattern)) { return; } Regex regex = VirtualRoot.GetRegex(poolDelayPattern); Match match = regex.Match(input); if (match.Success) { string poolDelayText = match.Groups[NTKeyword.PoolDelayGroupName].Value; VirtualRoot.RaiseEvent(new PoolDelayPickedEvent(poolId, isDual, poolDelayText)); } }
private static void PickRejectPercent(INTMinerContext root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string rejectPercentPattern = kernelOutput.RejectPercentPattern; if (isDual) { rejectPercentPattern = kernelOutput.DualRejectPercentPattern; } if (string.IsNullOrEmpty(rejectPercentPattern)) { return; } Regex regex = VirtualRoot.GetRegex(rejectPercentPattern); var match = regex.Match(input); string rejectPercentText = match.Groups[NTKeyword.RejectPercentGroupName].Value; if (double.TryParse(rejectPercentText, out double rejectPercent)) { ICoinShare share = root.CoinShareSet.GetOrCreate(coin.GetId()); root.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: null, rejectShareCount: (int)(share.TotalShareCount * rejectPercent), now: DateTime.Now); } }
private static void PickRejectPercent(INTMinerRoot root, string input, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string rejectPercentPattern = kernelOutput.RejectPercentPattern; if (isDual) { rejectPercentPattern = kernelOutput.DualRejectPercentPattern; } if (string.IsNullOrEmpty(rejectPercentPattern)) { return; } var match = Regex.Match(input, rejectPercentPattern, RegexOptions.Compiled); string rejectPercentText = match.Groups["rejectPercent"].Value; double rejectPercent; if (double.TryParse(rejectPercentText, out rejectPercent)) { ICoinShare share = root.CoinShareSet.GetOrCreate(coin.GetId()); root.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: null, rejectShareCount: (int)(share.TotalShareCount * rejectPercent), now: DateTime.Now); } }
private static void PickRejectOneShare(INTMinerContext root, IMineContext mineContext, string input, string preline, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string rejectOneShare = kernelOutput.RejectOneShare; if (isDual) { rejectOneShare = kernelOutput.DualRejectOneShare; } if (string.IsNullOrEmpty(rejectOneShare)) { return; } if (rejectOneShare.Contains("\n")) { input = preline + "\n" + input; } Regex regex = VirtualRoot.GetRegex(rejectOneShare); var match = regex.Match(input); if (match.Success) { if (!isDual) { // 决定不支持双挖的单卡份额统计 string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value; if (!string.IsNullOrEmpty(gpuText)) { if (int.TryParse(gpuText, out int gpuIndex)) { if (kernelOutput.IsMapGpuIndex && !string.IsNullOrWhiteSpace(mineContext.KernelInput.DevicesArg)) { if (mineContext.UseDevices.Length != 0 && mineContext.UseDevices.Length != root.GpuSet.Count && gpuIndex < mineContext.UseDevices.Length) { gpuIndex = mineContext.UseDevices[gpuIndex]; } } if (string.IsNullOrEmpty(kernelOutput.FoundOneShare)) { root.GpusSpeed.IncreaseFoundShare(gpuIndex); } root.GpusSpeed.IncreaseRejectShare(gpuIndex); } } else if (!string.IsNullOrEmpty(kernelOutput.FoundOneShare)) { // 哪个GPU最近找到了一个share就是那个GPU拒绝了一个share var gpuSpeeds = root.GpusSpeed.AsEnumerable(); IGpuSpeed gpuSpeed = null; foreach (var item in gpuSpeeds) { if (gpuSpeed == null) { gpuSpeed = item; } else if (item.FoundShareOn > gpuSpeed.FoundShareOn) { gpuSpeed = item; } } if (gpuSpeed != null) { var gpuIndex = gpuSpeed.Gpu.Index; root.GpusSpeed.IncreaseRejectShare(gpuIndex); } } } ICoinShare share = root.CoinShareSet.GetOrCreate(coin.GetId()); root.CoinShareSet.UpdateShare(coin.GetId(), null, share.RejectShareCount + 1, DateTime.Now); } }
private static bool IsMapGpuIndex(INTMinerContext context, IMineContext mineContext, IKernelOutput kernelOutput) { return(kernelOutput.IsMapGpuIndex && !string.IsNullOrWhiteSpace(mineContext.KernelInput.DevicesArg) && mineContext.UseDevices.Length != 0 && mineContext.UseDevices.Length != context.GpuSet.Count); }
private static void PickAcceptOneShare(INTMinerContext root, IMineContext mineContext, string input, string preline, IKernelOutput kernelOutput, ICoin coin, bool isDual) { string acceptOneShare = kernelOutput.AcceptOneShare; if (isDual) { acceptOneShare = kernelOutput.DualAcceptOneShare; } if (string.IsNullOrEmpty(acceptOneShare)) { return; } if (acceptOneShare.Contains("\n")) { input = preline + "\n" + input; } Regex regex = VirtualRoot.GetRegex(acceptOneShare); var match = regex.Match(input); if (match.Success) { if (!isDual) { // 决定不支持双挖的单卡份额统计 string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value; if (!string.IsNullOrEmpty(gpuText)) { if (int.TryParse(gpuText, out int gpuIndex)) { if (kernelOutput.IsMapGpuIndex && !string.IsNullOrWhiteSpace(mineContext.KernelInput.DevicesArg)) { if (mineContext.UseDevices.Length != 0 && mineContext.UseDevices.Length != root.GpuSet.Count && gpuIndex < mineContext.UseDevices.Length) { gpuIndex = mineContext.UseDevices[gpuIndex]; } } if (string.IsNullOrEmpty(kernelOutput.FoundOneShare)) { root.GpusSpeed.IncreaseFoundShare(gpuIndex); } root.GpusSpeed.IncreaseAcceptShare(gpuIndex); } } } ICoinShare share = root.CoinShareSet.GetOrCreate(coin.GetId()); root.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: share.AcceptShareCount + 1, rejectShareCount: null, now: DateTime.Now); } }
private static void PicGotOneIncorrectShare(INTMinerContext root, IMineContext mineContext, string input, string preline, IKernelOutput kernelOutput) { string pattern = kernelOutput.GpuGotOneIncorrectShare; if (string.IsNullOrEmpty(pattern)) { return; } if (pattern.Contains("\n")) { input = preline + "\n" + input; } Regex regex = VirtualRoot.GetRegex(pattern); var match = regex.Match(input); if (match.Success) { string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value; if (!string.IsNullOrEmpty(gpuText)) { if (int.TryParse(gpuText, out int gpuIndex)) { if (kernelOutput.IsMapGpuIndex && !string.IsNullOrWhiteSpace(mineContext.KernelInput.DevicesArg)) { if (mineContext.UseDevices.Length != 0 && mineContext.UseDevices.Length != root.GpuSet.Count && gpuIndex < mineContext.UseDevices.Length) { gpuIndex = mineContext.UseDevices[gpuIndex]; } } root.GpusSpeed.IncreaseIncorrectShare(gpuIndex); } } } }
private static void PickGpuSpeed(INTMinerContext root, IMineContext mineContext, string input, IKernelOutput kernelOutput, bool isDual) { string gpuSpeedPattern = kernelOutput.GpuSpeedPattern; if (isDual) { gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern; } if (string.IsNullOrEmpty(gpuSpeedPattern)) { return; } var now = DateTime.Now; bool hasGpuId = gpuSpeedPattern.Contains($"?<{NTKeyword.GpuIndexGroupName}>"); Regex regex = VirtualRoot.GetRegex(gpuSpeedPattern); MatchCollection matches = regex.Matches(input); if (matches.Count > 0) { IGpusSpeed gpuSpeeds = NTMinerContext.Instance.GpusSpeed; for (int i = 0; i < matches.Count; i++) { Match match = matches[i]; string gpuSpeedText = match.Groups[NTKeyword.GpuSpeedGroupName].Value; string gpuSpeedUnit = match.Groups[NTKeyword.GpuSpeedUnitGroupName].Value; if (string.IsNullOrEmpty(gpuSpeedUnit)) { if (isDual) { gpuSpeedUnit = kernelOutput.DualSpeedUnit; } else { gpuSpeedUnit = kernelOutput.SpeedUnit; } } int gpu = i; if (hasGpuId) { string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value; if (!int.TryParse(gpuText, out gpu)) { gpu = i; } else { gpu -= kernelOutput.GpuBaseIndex; if (gpu < 0) { continue; } } } if (kernelOutput.IsMapGpuIndex && !string.IsNullOrWhiteSpace(mineContext.KernelInput.DevicesArg)) { if (mineContext.UseDevices.Length != 0 && mineContext.UseDevices.Length != root.GpuSet.Count && gpu < mineContext.UseDevices.Length) { gpu = mineContext.UseDevices[gpu]; } } if (double.TryParse(gpuSpeedText, out double gpuSpeed)) { double gpuSpeedL = gpuSpeed.FromUnitSpeed(gpuSpeedUnit); gpuSpeeds.SetCurrentSpeed(gpu, gpuSpeedL, isDual, now); } } string totalSpeedPattern = kernelOutput.TotalSpeedPattern; if (isDual) { totalSpeedPattern = kernelOutput.DualTotalSpeedPattern; } if (string.IsNullOrEmpty(totalSpeedPattern)) { // 求和分算力 double speed = isDual? gpuSpeeds.AsEnumerable().Where(a => a.Gpu.Index != NTMinerContext.GpuAllId).Sum(a => a.DualCoinSpeed.Value) : gpuSpeeds.AsEnumerable().Where(a => a.Gpu.Index != NTMinerContext.GpuAllId).Sum(a => a.MainCoinSpeed.Value); gpuSpeeds.SetCurrentSpeed(NTMinerContext.GpuAllId, speed, isDual, now); } } }