@@ -14,23 +14,27 @@ typedef struct __attribute__((packed)) {
1414 uint found ;
1515} result ;
1616
17- __kernel void eradicate2_iterate (__global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round );
18- void eradicate2_result_update (const uchar * const hash , __global result * const pResult , const uchar score , const uchar scoreMax , const ulong round );
19- void eradicate2_score_leading (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round );
20- void eradicate2_score_benchmark (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round );
21- void eradicate2_score_matching (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round );
22- void eradicate2_score_range (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round );
23- void eradicate2_score_leadingrange (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round );
24- void eradicate2_score_mirror (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round );
25- void eradicate2_score_doubles (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round );
26-
27- __kernel void eradicate2_iterate (__global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round ) {
17+ __kernel void eradicate2_iterate (__global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round );
18+ void eradicate2_result_update (const uchar * const hash , __global result * const pResult , const uchar score , const uchar scoreMax , const uint deviceIndex , const uint round );
19+ void eradicate2_score_leading (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round );
20+ void eradicate2_score_benchmark (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round );
21+ void eradicate2_score_matching (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round );
22+ void eradicate2_score_range (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round );
23+ void eradicate2_score_leadingrange (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round );
24+ void eradicate2_score_mirror (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round );
25+ void eradicate2_score_doubles (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round );
26+
27+ __kernel void eradicate2_iterate (__global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round ) {
2828 ethhash h = { .q = { ERADICATE2_INITHASH } };
2929
30- // Salt have index h.b[21:52] inclusive, which covers QWORDS with index h.q[3:5] inclusive (they represent h.b[24:47] inclusive)
31- // We use two of those three QWORD indexes to generate a unique salt value for each round.
32- h .q [3 ] += get_global_id (0 );
33- h .q [4 ] += round ;
30+ // Salt have index h.b[21:52] inclusive, which covers WORDS with index h.d[6:12] inclusive (they represent h.b[24:51] inclusive)
31+ // We use three out of those six words to generate a unique salt value for each device, thread and round. We ignore any overflows
32+ // and assume that there'll never be more than 2**32 devices, threads or rounds. Worst case scenario with default settings
33+ // of 16777216 = 2**24 threads means the assumption fails after a device has tried 2**32 * 2**24 = 2**56 salts, enough to match
34+ // 14 characters in the address! A GTX 1070 with speed of ~700*10**6 combinations per second would hit this target after ~3 years.
35+ h .d [6 ] += deviceIndex ;
36+ h .d [7 ] += get_global_id (0 );
37+ h .d [8 ] += round ;
3438
3539 // Hash
3640 sha3_keccakf (& h );
@@ -41,45 +45,46 @@ __kernel void eradicate2_iterate(__global result * const pResult, __global const
4145 */
4246 switch (pMode -> function ) {
4347 case Benchmark :
44- eradicate2_score_benchmark (h .b + 12 , pResult , pMode , scoreMax , round );
48+ eradicate2_score_benchmark (h .b + 12 , pResult , pMode , scoreMax , deviceIndex , round );
4549 break ;
4650
4751 case Matching :
48- eradicate2_score_matching (h .b + 12 , pResult , pMode , scoreMax , round );
52+ eradicate2_score_matching (h .b + 12 , pResult , pMode , scoreMax , deviceIndex , round );
4953 break ;
5054
5155 case Leading :
52- eradicate2_score_leading (h .b + 12 , pResult , pMode , scoreMax , round );
56+ eradicate2_score_leading (h .b + 12 , pResult , pMode , scoreMax , deviceIndex , round );
5357 break ;
5458
5559 case Range :
56- eradicate2_score_range (h .b + 12 , pResult , pMode , scoreMax , round );
60+ eradicate2_score_range (h .b + 12 , pResult , pMode , scoreMax , deviceIndex , round );
5761 break ;
5862
5963 case Mirror :
60- eradicate2_score_mirror (h .b + 12 , pResult , pMode , scoreMax , round );
64+ eradicate2_score_mirror (h .b + 12 , pResult , pMode , scoreMax , deviceIndex , round );
6165 break ;
6266
6367 case Doubles :
64- eradicate2_score_doubles (h .b + 12 , pResult , pMode , scoreMax , round );
68+ eradicate2_score_doubles (h .b + 12 , pResult , pMode , scoreMax , deviceIndex , round );
6569 break ;
6670
6771 case LeadingRange :
68- eradicate2_score_leadingrange (h .b + 12 , pResult , pMode , scoreMax , round );
72+ eradicate2_score_leadingrange (h .b + 12 , pResult , pMode , scoreMax , deviceIndex , round );
6973 break ;
7074 }
7175}
7276
73- void eradicate2_result_update (const uchar * const H , __global result * const pResult , const uchar score , const uchar scoreMax , const ulong round ) {
77+ void eradicate2_result_update (const uchar * const H , __global result * const pResult , const uchar score , const uchar scoreMax , const uint deviceIndex , const uint round ) {
7478 if (score && score > scoreMax ) {
7579 const uchar hasResult = atomic_inc (& pResult [score ].found ); // NOTE: If "too many" results are found it'll wrap around to 0 again and overwrite last result. Only relevant if global worksize exceeds MAX(uint).
7680
7781 // Save only one result for each score, the first.
7882 if (hasResult == 0 ) {
7983 // Reconstruct state with hash and extract salt
8084 ethhash h = { .q = { ERADICATE2_INITHASH } };
81- h .q [3 ] += get_global_id (0 );
82- h .q [4 ] += round ;
85+ h .d [6 ] += deviceIndex ;
86+ h .d [7 ] += get_global_id (0 );
87+ h .d [8 ] += round ;
8388
8489 ethhash be ;
8590
@@ -94,7 +99,7 @@ void eradicate2_result_update(const uchar * const H, __global result * const pRe
9499 }
95100}
96101
97- void eradicate2_score_leading (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round ) {
102+ void eradicate2_score_leading (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round ) {
98103 int score = 0 ;
99104
100105 for (int i = 0 ; i < 20 ; ++ i ) {
@@ -111,17 +116,17 @@ void eradicate2_score_leading(const uchar * const hash, __global result * const
111116 }
112117 }
113118
114- eradicate2_result_update (hash , pResult , score , scoreMax , round );
119+ eradicate2_result_update (hash , pResult , score , scoreMax , deviceIndex , round );
115120}
116121
117- void eradicate2_score_benchmark (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round ) {
122+ void eradicate2_score_benchmark (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round ) {
118123 const size_t id = get_global_id (0 );
119124 int score = 0 ;
120125
121- eradicate2_result_update (hash , pResult , score , scoreMax , round );
126+ eradicate2_result_update (hash , pResult , score , scoreMax , deviceIndex , round );
122127}
123128
124- void eradicate2_score_matching (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round ) {
129+ void eradicate2_score_matching (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round ) {
125130 const size_t id = get_global_id (0 );
126131 int score = 0 ;
127132
@@ -131,10 +136,10 @@ void eradicate2_score_matching(const uchar * const hash, __global result * const
131136 }
132137 }
133138
134- eradicate2_result_update (hash , pResult , score , scoreMax , round );
139+ eradicate2_result_update (hash , pResult , score , scoreMax , deviceIndex , round );
135140}
136141
137- void eradicate2_score_range (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round ) {
142+ void eradicate2_score_range (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round ) {
138143 const size_t id = get_global_id (0 );
139144 int score = 0 ;
140145
@@ -151,10 +156,10 @@ void eradicate2_score_range(const uchar * const hash, __global result * const pR
151156 }
152157 }
153158
154- eradicate2_result_update (hash , pResult , score , scoreMax , round );
159+ eradicate2_result_update (hash , pResult , score , scoreMax , deviceIndex , round );
155160}
156161
157- void eradicate2_score_leadingrange (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round ) {
162+ void eradicate2_score_leadingrange (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round ) {
158163 const size_t id = get_global_id (0 );
159164 int score = 0 ;
160165
@@ -177,10 +182,10 @@ void eradicate2_score_leadingrange(const uchar * const hash, __global result * c
177182 }
178183 }
179184
180- eradicate2_result_update (hash , pResult , score , scoreMax , round );
185+ eradicate2_result_update (hash , pResult , score , scoreMax , deviceIndex , round );
181186}
182187
183- void eradicate2_score_mirror (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round ) {
188+ void eradicate2_score_mirror (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round ) {
184189 const size_t id = get_global_id (0 );
185190 int score = 0 ;
186191
@@ -204,10 +209,10 @@ void eradicate2_score_mirror(const uchar * const hash, __global result * const p
204209 ++ score ;
205210 }
206211
207- eradicate2_result_update (hash , pResult , score , scoreMax , round );
212+ eradicate2_result_update (hash , pResult , score , scoreMax , deviceIndex , round );
208213}
209214
210- void eradicate2_score_doubles (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const ulong round ) {
215+ void eradicate2_score_doubles (const uchar * const hash , __global result * const pResult , __global const mode * const pMode , const uchar scoreMax , const uint deviceIndex , const uint round ) {
211216 const size_t id = get_global_id (0 );
212217 int score = 0 ;
213218
@@ -220,5 +225,5 @@ void eradicate2_score_doubles(const uchar * const hash, __global result * const
220225 }
221226 }
222227
223- eradicate2_result_update (hash , pResult , score , scoreMax , round );
228+ eradicate2_result_update (hash , pResult , score , scoreMax , deviceIndex , round );
224229}
0 commit comments