diff --git a/sources/main.cu b/sources/main.cu
index 6dedef8..794c98a 100644
--- a/sources/main.cu
+++ b/sources/main.cu
@@ -83,22 +83,30 @@ __device__ __forceinline__ void rmbytes(unsigned char* buf, curandState* state)
 }
 __global__ void KeyGen(curandState* randStates) {
     int idx = blockIdx.x * blockDim.x + threadIdx.x;
+    unsigned local_d_high;
+    if (threadIdx.x == 0) {
+        local_d_high = d_high;
+    }
+    __syncthreads();
     curandState localState = randStates[idx];
-    //printf("Seed: %s\n", ktos(seed).data);
     while (true) {
         Key32 seed;
         KeysBox32 keys;
         rmbytes(seed, &localState);
         ed25519_keygen(keys.PrivateKey, keys.PublicKey, seed);
-        if (unsigned zeros = getZeros(keys.PublicKey); zeros > atomicMax((unsigned*)&d_high, zeros)) {
-            Addr16 raw;
-            Key32 inv;
-            invertKey(keys.PublicKey, inv);
-            getRawAddress(zeros, inv, raw);
-            printf("\nIPv6:\t%s\nPK:\t%s\nSK:\t%s\n", getAddr(raw).data, ktos(keys.PublicKey).data, ktos(keys.PrivateKey).data);
+        if (unsigned zeros = getZeros(keys.PublicKey); zeros > local_d_high) {
+            if (zeros > atomicMax((unsigned*)&d_high, zeros)) {
+                Addr16 raw;
+                Key32 inv;
+                invertKey(keys.PublicKey, inv);
+                getRawAddress(zeros, inv, raw);
+                printf("\nIPv6:\t%s\nPK:\t%s\nSK:\t%s\n", getAddr(raw).data, ktos(keys.PublicKey).data, ktos(keys.PrivateKey).data);
+                local_d_high = zeros;
+            }
         }
     }
 }
+
 #define THREADS_P_B 256
 int main(int argc, char* argv[]) {
     int* d_result, mBpSM, h_high;