Browse Source

nvidia opencl speed on par with CUDA

cl-refactor
Genoil 9 years ago
parent
commit
bf7dc79db9
  1. 124
      libethash-cl/ethash_cl_miner_kernel.cl

124
libethash-cl/ethash_cl_miner_kernel.cl

@ -79,9 +79,9 @@ static uint2 ROL2(const uint2 v, const int n)
} }
#endif #endif
static void keccak_f1600_round(uint2* a, uint r, uint out_size) static void keccak_f1600_round(uint2* a, uint r)
{ {
uint2 t[5]; uint2 t[25];
uint2 u, v; uint2 u, v;
// Theta // Theta
@ -123,75 +123,65 @@ static void keccak_f1600_round(uint2* a, uint r, uint out_size)
// Rho Pi // Rho Pi
u = a[1]; u = a[1];
a[1] = ROL2(a[6], 44); t[0] = a[0];
a[6] = ROL2(a[9], 20); t[1] = ROL2(a[6], 44);
a[9] = ROL2(a[22], 61); t[6] = ROL2(a[9], 20);
a[22] = ROL2(a[14], 39); t[9] = ROL2(a[22], 61);
a[14] = ROL2(a[20], 18); t[22] = ROL2(a[14], 39);
a[20] = ROL2(a[2], 62); t[14] = ROL2(a[20], 18);
a[2] = ROL2(a[12], 43); t[20] = ROL2(a[2], 62);
a[12] = ROL2(a[13], 25); t[2] = ROL2(a[12], 43);
a[13] = ROL2(a[19], 8); t[12] = ROL2(a[13], 25);
a[19] = ROL2(a[23], 56); t[13] = ROL2(a[19], 8);
a[23] = ROL2(a[15], 41); t[19] = ROL2(a[23], 56);
a[15] = ROL2(a[4], 27); t[23] = ROL2(a[15], 41);
a[4] = ROL2(a[24], 14); t[15] = ROL2(a[4], 27);
a[24] = ROL2(a[21], 2); t[4] = ROL2(a[24], 14);
a[21] = ROL2(a[8], 55); t[24] = ROL2(a[21], 2);
a[8] = ROL2(a[16], 45); t[21] = ROL2(a[8], 55);
a[16] = ROL2(a[5], 36); t[8] = ROL2(a[16], 45);
a[5] = ROL2(a[3], 28); t[16] = ROL2(a[5], 36);
a[3] = ROL2(a[18], 21); t[5] = ROL2(a[3], 28);
a[18] = ROL2(a[17], 15); t[3] = ROL2(a[18], 21);
a[17] = ROL2(a[11], 10); t[18] = ROL2(a[17], 15);
a[11] = ROL2(a[7], 6); t[17] = ROL2(a[11], 10);
a[7] = ROL2(a[10], 3); t[11] = ROL2(a[7], 6);
a[10] = ROL2(u, 1); t[7] = ROL2(a[10], 3);
t[10] = ROL2(u, 1);
// Chi // Chi
u = a[0]; a[0] = bitselect(t[0] ^ t[2], t[0], t[1]);
a[0] = bitselect(a[0] ^ a[2], a[0], a[1]); a[1] = bitselect(t[1] ^ t[3], t[1], t[2]);
a[2] = bitselect(t[2] ^ t[4], t[2], t[3]);
a[3] = bitselect(t[3] ^ t[0], t[3], t[4]);
a[4] = bitselect(t[4] ^ t[1], t[4], t[0]);
// Iota // Iota
a[0] ^= Keccak_f1600_RC[r]; a[0] ^= Keccak_f1600_RC[r];
if (out_size == 1) return; a[5] = bitselect(t[5] ^ t[7], t[5], t[6]);
// Continue Chi a[6] = bitselect(t[6] ^ t[8], t[6], t[7]);
v = a[1]; a[7] = bitselect(t[7] ^ t[9], t[7], t[8]);
a[1] = bitselect(a[1] ^ a[3], a[1], a[2]); a[8] = bitselect(t[8] ^ t[5], t[8], t[9]);
a[2] = bitselect(a[2] ^ a[4], a[2], a[3]); a[9] = bitselect(t[9] ^ t[6], t[9], t[5]);
a[3] = bitselect(a[3] ^ u, a[3], a[4]);
a[4] = bitselect(a[4] ^ v, a[4], u); a[10] = bitselect(t[10] ^ t[12], t[10], t[11]);
a[11] = bitselect(t[11] ^ t[13], t[11], t[12]);
u = a[5]; v = a[6]; a[12] = bitselect(t[12] ^ t[14], t[12], t[13]);
a[5] = bitselect(a[5] ^ a[7], a[5], a[6]); a[13] = bitselect(t[13] ^ t[10], t[13], t[14]);
a[6] = bitselect(a[6] ^ a[8], a[6], a[7]); a[14] = bitselect(t[14] ^ t[11], t[14], t[10]);
a[7] = bitselect(a[7] ^ a[9], a[7], a[8]);
a[8] = bitselect(a[8] ^ u, a[8], a[9]); a[15] = bitselect(t[15] ^ t[17], t[15], t[16]);
a[16] = bitselect(t[16] ^ t[18], t[16], t[17]);
if (out_size == 8) return; a[17] = bitselect(t[17] ^ t[19], t[17], t[18]);
a[18] = bitselect(t[18] ^ t[15], t[18], t[19]);
a[9] = bitselect(a[9] ^ v, a[9], u); a[19] = bitselect(t[19] ^ t[16], t[19], t[15]);
u = a[10]; v = a[11]; a[20] = bitselect(t[20] ^ t[22], t[20], t[21]);
a[10] = bitselect(a[10] ^ a[12], a[10], a[11]); a[21] = bitselect(t[21] ^ t[23], t[21], t[22]);
a[11] = bitselect(a[11] ^ a[13], a[11], a[12]); a[22] = bitselect(t[22] ^ t[24], t[22], t[23]);
a[12] = bitselect(a[12] ^ a[14], a[12], a[13]); a[23] = bitselect(t[23] ^ t[20], t[23], t[24]);
a[13] = bitselect(a[13] ^ u, a[13], a[14]); a[24] = bitselect(t[24] ^ t[21], t[24], t[20]);
a[14] = bitselect(a[14] ^ v, a[14], u);
u = a[15]; v = a[16];
a[15] = bitselect(a[15] ^ a[17], a[15], a[16]);
a[16] = bitselect(a[16] ^ a[18], a[16], a[17]);
a[17] = bitselect(a[17] ^ a[19], a[17], a[18]);
a[18] = bitselect(a[18] ^ u, a[18], a[19]);
a[19] = bitselect(a[19] ^ v, a[19], u);
u = a[20]; v = a[21];
a[20] = bitselect(a[20] ^ a[22], a[20], a[21]);
a[21] = bitselect(a[21] ^ a[23], a[21], a[22]);
a[22] = bitselect(a[22] ^ a[24], a[22], a[23]);
a[23] = bitselect(a[23] ^ u, a[23], a[24]);
a[24] = bitselect(a[24] ^ v, a[24], u);
} }
static void keccak_f1600_no_absorb(uint2* a, uint out_size, uint isolate) static void keccak_f1600_no_absorb(uint2* a, uint out_size, uint isolate)
@ -215,7 +205,7 @@ static void keccak_f1600_no_absorb(uint2* a, uint out_size, uint isolate)
// doesn't bother. // doesn't bother.
if (isolate) if (isolate)
{ {
keccak_f1600_round(a, r++, o); keccak_f1600_round(a, r++);
if (r == 23) o = out_size; if (r == 23) o = out_size;
} }
} }

Loading…
Cancel
Save