Browse Source

Disable GPU on PascalCoinMiner

PascalCoin 6 years ago
parent
commit
4ac9aa0db8
2 changed files with 37 additions and 20 deletions
  1. 6 1
      src/core/UGPUMining.pas
  2. 31 19
      src/core/UPoolMinerThreads.pas

+ 6 - 1
src/core/UGPUMining.pas

@@ -189,7 +189,7 @@ begin
           end;
           end;
           if (nLap<CT_MAX_LAPS) then inc(nLap) else nLap := 0;
           if (nLap<CT_MAX_LAPS) then inc(nLap) else nLap := 0;
           inc(AuxStats.RoundsCount,CT_LAPS_ROUND);
           inc(AuxStats.RoundsCount,CT_LAPS_ROUND);
-        end;
+        end else sleep(1);
       finally
       finally
         FLock.Release;
         FLock.Release;
       end;
       end;
@@ -326,6 +326,11 @@ begin
   FLock.Acquire;
   FLock.Acquire;
   try
   try
     FReadyToGPU := (MinerValuesForWork.part1<>'') And (Assigned(FDCLKernel));
     FReadyToGPU := (MinerValuesForWork.part1<>'') And (Assigned(FDCLKernel));
+    if (FReadyToGPU) And (TPoolMinerThread.UseRandomHash(MinerValuesForWork.version)) then begin
+      // V4 RandomHash not available on GPU mining
+      FReadyToGPU:=False;
+      TLog.NewLog(ltError,ClassName,'RandomHash not available on GPU. Set to CPU');
+    end;
     If (Not FReadyToGPU) then begin
     If (Not FReadyToGPU) then begin
       IsMining := false;
       IsMining := false;
       exit;
       exit;

+ 31 - 19
src/core/UPoolMinerThreads.pas

@@ -81,6 +81,7 @@ Type
     Property MinerAddName : String read FMinerAddName write SetMinerAddName;
     Property MinerAddName : String read FMinerAddName write SetMinerAddName;
     Property TestingPoWLeftBits : Byte read FTestingPoWLeftBits write SetTestingPoWLeftBits;
     Property TestingPoWLeftBits : Byte read FTestingPoWLeftBits write SetTestingPoWLeftBits;
     Property TestingMode : Boolean read FTestingMode write FTestingMode;
     Property TestingMode : Boolean read FTestingMode write FTestingMode;
+    class Function UseRandomHash(const AProtocolVersion : Word) : Boolean;
   End;
   End;
 
 
   { TCustomMinerDeviceThread }
   { TCustomMinerDeviceThread }
@@ -295,6 +296,11 @@ begin
   FDevicesList.UnlockList;
   FDevicesList.UnlockList;
 end;
 end;
 
 
+class function TPoolMinerThread.UseRandomHash(const AProtocolVersion : Word) : Boolean;
+begin
+  Result := (CT_ACTIVATE_RANDOMHASH_V4 AND (AProtocolVersion >= CT_PROTOCOL_4));
+end;
+
 function TPoolMinerThread.GlobalMinerStats: TMinerStats;
 function TPoolMinerThread.GlobalMinerStats: TMinerStats;
 Var l : TList;
 Var l : TList;
   i : Integer;
   i : Integer;
@@ -381,12 +387,14 @@ begin
     for i := 0 to l.Count - 1 do begin
     for i := 0 to l.Count - 1 do begin
       minervfw := FGlobalMinerValuesForWork;
       minervfw := FGlobalMinerValuesForWork;
       minervfw.payload_start:=minervfw.payload_start+FMinerAddName;
       minervfw.payload_start:=minervfw.payload_start+FMinerAddName;
-      if (l.count>1) then minervfw.payload_start:=minervfw.payload_start+'/'+inttostr(i);
-      repeat
-        digest := minervfw.part1 + minervfw.payload_start + minervfw.part3 + '00000000';
-        ok := CanBeModifiedOnLastChunk(length(digest),j);
-        if (not ok) then minervfw.payload_start:=minervfw.payload_start+'-';
-      until (Ok);
+      if (l.count>1) then minervfw.payload_start:=minervfw.payload_start+inttostr(i);
+      if Not TPoolMinerThread.UseRandomHash(minervfw.version) then begin
+        repeat // Prepare payload_start with SHA256 compatible last chunk size
+          digest := minervfw.part1 + minervfw.payload_start + minervfw.part3 + '00000000';
+          ok := CanBeModifiedOnLastChunk(length(digest),j);
+          if (not ok) then minervfw.payload_start:=minervfw.payload_start+'-';
+        until (Ok);
+      end;
       If FTestingPoWLeftBits>0 then begin
       If FTestingPoWLeftBits>0 then begin
         auxminervfw := minervfw;
         auxminervfw := minervfw;
         auxminervfw.target:= ((((auxminervfw.target AND $FF000000) SHR 24)-FTestingPoWLeftBits) SHL 24) + (minervfw.target AND $00FFFFFF);
         auxminervfw.target:= ((((auxminervfw.target AND $FF000000) SHR 24)-FTestingPoWLeftBits) SHL 24) + (minervfw.target AND $00FFFFFF);
@@ -474,7 +482,7 @@ begin
   if length(digest)<8 then exit;
   if length(digest)<8 then exit;
   if TBaseType.BinStrComp(digest,FLastDigest)=0 then Exit;
   if TBaseType.BinStrComp(digest,FLastDigest)=0 then Exit;
   FLastDigest := digest;
   FLastDigest := digest;
-  LUseRandomHash := CT_ACTIVATE_RANDOMHASH_V4 AND (usedMinerValuesForWork.version >= CT_PROTOCOL_4);
+  LUseRandomHash := TPoolMinerThread.UseRandomHash(usedMinerValuesForWork.version);
   // Add timestamp and nonce
   // Add timestamp and nonce
   move(Timestamp,digest[length(digest)-7],4);
   move(Timestamp,digest[length(digest)-7],4);
   move(nOnce,digest[length(digest)-3],4);
   move(nOnce,digest[length(digest)-3],4);
@@ -523,15 +531,15 @@ end;
 procedure TCustomMinerDeviceThread.SetMinerValuesForWork(const Value: TMinerValuesForWork);
 procedure TCustomMinerDeviceThread.SetMinerValuesForWork(const Value: TMinerValuesForWork);
 var i,aux : Integer;
 var i,aux : Integer;
   canWork : Boolean;
   canWork : Boolean;
-  oldPayload : String;
 begin
 begin
   FMinerValuesForWork := Value;
   FMinerValuesForWork := Value;
-  oldPayload := FMinerValuesForWork.payload_start;
-  Repeat
-    i := Length(FMinerValuesForWork.part1)+Length(FMinerValuesForWork.payload_start)+Length(FMinerValuesForWork.part3)+8;
-    canWork := CanBeModifiedOnLastChunk(i,aux);
-    If Not canWork then FMinerValuesForWork.payload_start:=FMinerValuesForWork.payload_start+' ';
-  until (canWork);
+  if Not TPoolMinerThread.UseRandomHash(FMinerValuesForWork.version) then begin
+    repeat // Prepare payload_start with SHA256 compatible last chunk size
+      i := Length(FMinerValuesForWork.part1)+Length(FMinerValuesForWork.payload_start)+Length(FMinerValuesForWork.part3)+8;
+      canWork := CanBeModifiedOnLastChunk(i,aux);
+      If Not canWork then FMinerValuesForWork.payload_start:=FMinerValuesForWork.payload_start+' ';
+    until (canWork);
+  end;
   TLog.NewLog(ltinfo,classname,Format('Updated MinerValuesForWork: Target:%s Payload:%s Target_PoW:%s',[IntToHex(FMinerValuesForWork.target,8),FMinerValuesForWork.payload_start,TCrypto.ToHexaString(FMinerValuesForWork.target_pow)]));
   TLog.NewLog(ltinfo,classname,Format('Updated MinerValuesForWork: Target:%s Payload:%s Target_PoW:%s',[IntToHex(FMinerValuesForWork.target,8),FMinerValuesForWork.payload_start,TCrypto.ToHexaString(FMinerValuesForWork.target_pow)]));
   If Assigned(FOnMinerValuesChanged) then FOnMinerValuesChanged(Self);
   If Assigned(FOnMinerValuesChanged) then FOnMinerValuesChanged(Self);
 end;
 end;
@@ -693,11 +701,15 @@ begin
     // Prepare final data:
     // Prepare final data:
     CheckCPUs;
     CheckCPUs;
     npos := 0;
     npos := 0;
-    repeat
+    if Not TPoolMinerThread.UseRandomHash(FMinerValuesForWork.version) then begin
+      repeat // Prepare payload_start with SHA256 compatible last chunk size
+        digest := FMinerValuesForWork.part1 + FMinerValuesForWork.payload_start + FMinerValuesForWork.part3 + '00000000';
+        ok := CanBeModifiedOnLastChunk(length(digest),npos);
+        if (not ok) then FMinerValuesForWork.payload_start:=FMinerValuesForWork.payload_start+'.';
+      until (Ok);
+    end else begin
       digest := FMinerValuesForWork.part1 + FMinerValuesForWork.payload_start + FMinerValuesForWork.part3 + '00000000';
       digest := FMinerValuesForWork.part1 + FMinerValuesForWork.payload_start + FMinerValuesForWork.part3 + '00000000';
-      ok := CanBeModifiedOnLastChunk(length(digest),npos);
-      if (not ok) then FMinerValuesForWork.payload_start:=FMinerValuesForWork.payload_start+'.';
-    until (Ok);
+    end;
     PascalCoinPrepareLastChunk(digest,sflc,lc);
     PascalCoinPrepareLastChunk(digest,sflc,lc);
     nextmin := 0;
     nextmin := 0;
     for i:=0 to l.count-1 do begin
     for i:=0 to l.count-1 do begin
@@ -768,7 +780,7 @@ begin
         dstep := 2;
         dstep := 2;
         FLock.Acquire;
         FLock.Acquire;
         try
         try
-          LUseRandomHash := CT_ACTIVATE_RANDOMHASH_V4 AND (FCurrentMinerValuesForWork.version >= CT_PROTOCOL_4);
+          LUseRandomHash := TPoolMinerThread.UseRandomHash(FCurrentMinerValuesForWork.version);
           if (LUseRandomHash) then begin
           if (LUseRandomHash) then begin
             roundsToDo := 20;
             roundsToDo := 20;
           end else begin
           end else begin