рд▓рд╛рдЗрдЯрдХреЙрдЗрди рдЦрдирди рдЕрдиреБрдХреВрд▓рди

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рд▓рд╛рдЗрдЯрдХреВрдк рдХреЗ рд▓рд┐рдП рдЦрдирди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ред рдФрд░ рдореИрдВ рдЕрдкрдиреА рдХрд╣рд╛рдиреА рдПрдХ рдбрд╛рдпрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реВрдВрдЧрд╛ред

рджрд┐рди реж: рдореИрдВ рдПрдХ рдРрд╕реЗ рд╡рд┐рд╖рдп рдкрд░ рдЖрдпрд╛ рдерд╛, рдЬрд╣рд╛рдБ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣рдж рддрдХ рдХреБрдЫ рд╣рдж рддрдХ рдЦрдирди рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЙрд╕рдиреЗ рдЦреБрдж рд╕реЗ рдкреВрдЫрд╛: рдореИрдВ рдЙрд╕рд╕реЗ рднреА рдмрджрддрд░ рдХреНрдпреЛрдВ рд╣реВрдБ? рдореИрдВрдиреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред
рджрд┐рди 1: рдореБрдЭреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдпрд╛рдж рд╣реИ, рдореБрдЭреЗ рдУрдкрдирд╕реАрдПрд▓ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓реА рд╣реИред
рджрд┐рди 2: рдореИрдВ рдХреЛрдб рдХреА рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЖрдпрд╛:

#define Coord(x,y,z) x+y*(x ## SIZE)+z*(y ## SIZE)*(x ## SIZE) #define CO Coord(z,x,y) 


рджреВрд╕рд░реА рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рддреИрдпрд╛рд░ рдХреА, рдорд┐рд▓реА

 #define CO z+x*zSIZE+y*xSIZE*zSIZE 


рдмрдЧреАрдЪреЗ рдХреА рдмрд╛рдбрд╝ рд▓рдЧрд╛рдирд╛ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рдерд╛ - рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ ySIZE scrypt_core рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдореБрдЭреЗ i * 2 рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд░реЛрдЯрд▓ (i, 1U) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд░рд╣рдиреЗ рджреЛред

рджрд┐рди 3: рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЬреНрдЮрд╛рди рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдПрдХрдорд╛рддреНрд░ рдореМрдХрд╛ рд╣реИ, "рд╕реАрдУ" рдХреЗ рд╕рд╛рде рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдорджрдж рдХрд░рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░, z + x * zSIZE + y * xSIZE * zSIZE 8704 рдмрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрди рдЧрдгрдирд╛рдУрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕реЗ рдереЛрдбрд╝реА рдорджрдж рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ :) рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, zSIZE 8 рдХреЗ рдмрд░рд╛рдмрд░ рдПрдХ рд╕реНрдерд┐рд░ рд╣реИ, рдФрд░ xSIZE рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдирд┐рд░рдВрддрд░ рд╣реИред
рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рдЪрдХреНрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ "CO" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  for(uint y=0; y<1024/LOOKUP_GAP; ++y) { #pragma unroll for(uint z=0; z<zSIZE; ++z) lookup[CO] = X[z]; //    } 


рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ x * zSIZE рдПрдХ рд╕реНрдерд┐рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реВрдк рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди x рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде y 1 рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИред

рдЗрд╕реЗ рд╕рдордЭрддреЗ рд╣реБрдП, рдпрд╣ рдПрдХ рд╕реАрдУ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ x * zSIZE рд╢реБрд░реВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде, xSIZE * zSIZE рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЪрд░ z рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рдж рдПрдХ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рдЗрд╕ рдЪрд░ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдзрдХреЗрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рднреА рдЧрддрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред

рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИ:

  uint CO=rotl(x,3U);// x*zSIZE uint CO_tmp=rotl(xSIZE,3U);//xSIZE*zSIZE for(uint y=0; y<1024/LOOKUP_GAP; ++y, CO+=CO_tmp) { uint CO_reg=CO; #pragma unroll for(uint z=0; z<zSIZE; ++z, ++CO_reg) lookup[CO_reg] = X[z]; //    } 


рджрд┐рди 4: рдореИрдВ "CO" рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  for (uint i=0; i<1024; ++i) { uint4 V[8]; uint j = X[7].x & K[85];//K[85]=0x000003FFU uint y = (j/LOOKUP_GAP); #pragma unroll for(uint z=0; z<zSIZE; ++z) V[z] = lookup[CO]; //    } 


рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ y рдПрдХ рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓рддрд╛ рд░рд╣рддрд╛ рд╣реИ, рдЗрд╕ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ x * zSIZE рдФрд░ xSIZE * zSIZE рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред

  CO_tmp=rotl(x,3U); CO=rotl(xSIZE,3U); for (uint i=0; i<1024; ++i) { uint4 V[8]; uint j = X[7].x & K[85]; uint y = (j/LOOKUP_GAP); uint CO_reg=CO_tmp+CO*y; for(uint z=0; z<zSIZE; ++z, ++CO_reg) V[z] = lookup[CO_reg]; //    } 


рджрд┐рди 5: рдореИрдВ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ ~ 3% рдХреЗ рдореЗрд░реЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВред рдХрдИ рдмрд╛рд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдХреЛрдб рдХреЛ рдПрдХ рдорд╛рдирд╡ рд░реВрдк рдореЗрдВ рд▓рд╛рддрд╛ рд╣реВрдВ, рджреВрд╕рд░реЗ рдЪрдХреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди * i 2 рдХреЛ рд░реЛрдЯрд▓ (i, 1U) рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВред

"рд╕рд╛рдл" рдХреЛрдб рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдиреЗ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд┐рдпрд╛ - рдореЗрд░реЗ рдЕрдиреБрдХреВрд▓рди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдЧрддрд┐ рдмрд╣реБрдд рдХрдо рд╣реЛ рдЧрдИ рд╣реИред рдереЛрдбрд╝реА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд░реЛрдЯрд▓ (i, 1U) рдХреЗ рдмрдЬрд╛рдп i * 2 рдХреА рд╡рд╛рдкрд╕реА рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕реНрд╡рдпрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ - рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдЬрд╛рдВрдЪрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реА рдЖрд╢рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреЙрди рдХреЙрд▓рд┐рд╡рд╕ рдХреЗ рдореЗрд▓ рдкрд░ рднреЗрдЬрддрд╛ рд╣реВрдВред

рджрд┐рди 12: рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рднреАрддрд░ рдЬрд╡рд╛рдм рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛, рдореИрдВ рдЕрдкрдиреА рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд▓рд╛рдЗрдЯрдХреЛрдЗрди рдлреЛрд░рдо рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВред
рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЬрд▓реНрдж рд╣реА рджрд┐рдЦрд╛рдИ рджреА - рдореИрдВрдиреЗ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг 13.4 рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ (рдФрд░ рдУрдкрдирдХреНрд▓реЗ) рдХреЗ рд╕рд╛рде - рдЧрддрд┐ рд▓рдЧрднрдЧ рдПрдХ рддрд┐рд╣рд╛рдИ рдХрдо рд╣реЛ рдЧрдИред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ 13.1 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ (рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ - OpenCl рд╕рдВрд╕реНрдХрд░рдг рддрдм рддрдХ рдиреАрдЪреЗ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдПрдордбреА рдФрд░ рдУрдкрдирд╕реАрдПрд▓ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд╕рд╛рдл рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рдореИрдВ рдЕрдиреБрд╕рдВрдзрд╛рди рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рджрд┐рди 13: рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдбреНрд░реЙрдк i * 2 рдХреЗ рд░реЛрд▓реЗрдЯ (i, 1U) рдХреЗ рд╕рдорд╛рди рд░рд╣рд╕реНрдпрдордп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЗрд╕ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ, рдЧрддрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрддрд░ рдкрд░ рд▓реМрдЯ рдЖрддреА рд╣реИред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ: 13.4 рдХреЗ рд▓рд┐рдП, рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдПред

рджрд┐рди 13-40: 13.1 рдкрд░ рдЯреВрдЯреЗ рд╣реБрдП рдЕрдиреБрдХреВрд▓рди рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛, рдореИрдВ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди, рд▓реЛрд╣реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рддреБрд░рдВрдд рдордирд╛ рдХрд░ рджреЗрддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1024 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдХрд░ рдЬреЛ рдЧрдгрдирд╛ рдХреА рдЧрдИ y * xSIZE * zSIZE рдорд╛рдиреЛрдВ рдХреЛ y = 0..1023 рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ - рдЕрдиреБрдХреВрд▓рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдХреЛрдИ рдкрд░реАрдХреНрд╖рдХ рдирд╣реАрдВ рд╣реИрдВ), рд╕рд╛рде рд╣реА рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЧреИрд░-рд░реИрдЦрд┐рдХ рдкреНрд░рднрд╛рд╡ рднреА рд╣реИрдВ: рдореЗрд░реЗ 7850 рдкрд░ 1000/1300 рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░, рдЕрд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдереЗ, рдЬреИрд╕реЗ ~ 13 рдХреА рддреАрд╡реНрд░рддрд╛ рдкрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб ~ 340 рдХрд┐рд▓реЛрд╣рд┐рдЪ (рдпрд╣ рдЖрдкрдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪреБрдкрдЪрд╛рдк рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрд╕ рд╕рдордп рдмрд┐рдирд╛ рдЬреБрдЧрд▓рдмрдВрджреА рдХреЗред рдЬрдм рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдореЗрд░рд╛ рд╣реИ рдЯреА), ~ рдХреЗ рдмрдЬрд╛рдп рдореЗрд░реЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 200 kiloheshey рдФрд░ / рдпрд╛ рдЕрдиреНрдп рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ред

рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛ (рд▓рдЧрднрдЧ, рдЦреБрдж рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдЪрд╛ рд▓рд┐рдпрд╛)ред

Thethread-concurency рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ "рдореИрдЬрд┐рдХ рд╡реИрд▓реНрдпреВ" рднреА рдкрд╛рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕ рдкрд░ рдЧрддрд┐ рдмрдврд╝рддреА рд╣реИ, 2 ^ n + 1 рдХреЗ рдмрд░рд╛рдмрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 4097 рдпрд╛ 16385ред рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП, рдЦрдирди рдЧрддрд┐ рдХрдо рд╣реИред

рдореЗрд░реА рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ 2 ^ n + 1 рд╕реЗ рдЧреБрдгрд╛ рд╕рдмрд╕реЗ рддреЗрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 2 ^ n рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рд╕рд░рд▓ рдмрд┐рдЯ рд╢рд┐рдлреНрдЯ рд╣реИ, рдФрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рддреЗрдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ...

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖ:

  uint CO_tmp=xSIZE<<3U;//xSIZE*zSIZE uint CO_tmp2=x<<3U;//x*zSIZE for(uint y=0; y<1024/LOOKUP_GAP; ++y) { uint CO=y*CO_tmp+CO_tmp2; #pragma unroll for(uint z=0; z<zSIZE; ++z,++CO) lookup[CO] = X[z]; //    } //  for (uint i=0; i<1024; ++i) { uint4 V[8]; uint j = X[7].x & K[85]; uint y = (j/LOOKUP_GAP); uint CO=y*CO_tmp+CO_tmp2; #pragma unroll for(uint z=0; z<zSIZE; ++z) V[z] = lookup[CO+z]; //    } 


рдПрдХ рд╣реА рдордВрдЪ рдкрд░ 13.4 рд╕реЗ рдЕрдзрд┐рдХ рдЙрдореНрд░ рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ "рдЬрд╛рджреВ рдореВрд▓реНрдп" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЗрд╕ рддрд░рд╣ рд╕реЗ-рд╕рд╣рдорддрд┐ред рдФрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдкреВрд░рд╛ рдкрд╛рдпрд╛ред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬрд╛рдирдХрд╛рд░ рд▓реЛрдЧ рдореБрдЭреЗ рдмрддрд╛ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм i * 2 рдХреЛ рд░реЛрдЯрд▓ (i, 1U) рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде - thethread-concurency рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ "рдЬрд╛рджреБрдИ рдореВрд▓реНрдп" рдХреА рдкреНрд░рдХреГрддрд┐ред

Lightcoins рдордВрдЪ рдкрд░ рдореЗрд░рд╛ рд╡рд┐рд╖рдп: forum.litecoin.net/index.php?topic=4082.0

рдкреБрдирд╢реНрдЪ рд╕рднреА рдХрд╛рд░реНрдп scrypt.cl рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рдП рдЧрдП рдереЗ, рдЬреЛ рдХрд┐ рд▓рд╛рдЗрдЯрдХреЛрдЗрди рдЦрдирди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЦрдирд┐рдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

Source: https://habr.com/ru/post/In186664/


All Articles