]> zoso.dev Git - libnemo.git/commitdiff
Unroll blake compression rounds.
authorChris Duncan <chris@zoso.dev>
Sun, 5 Jan 2025 10:47:09 +0000 (02:47 -0800)
committerChris Duncan <chris@zoso.dev>
Sun, 5 Jan 2025 10:47:09 +0000 (02:47 -0800)
src/lib/workers/powgpu.ts

index 6ade30dcfb154c0ef117cd6853b19d913aaee62b..37acec9e132641a73adb9e36f5efda0f7003d5b3 100644 (file)
@@ -200,16 +200,125 @@ export class PowGpu extends WorkerInterface {
                        /**
                        * Twelve rounds of mixing as part of BLAKE2b compression step
                        */
-                       for (var r: u32 = 0u; r < 12u; r = r + 1u) {
-                               G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[r * 16u + 0u], SIGMA82[r * 16u + 1u]);
-                               G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[r * 16u + 2u], SIGMA82[r * 16u + 3u]);
-                               G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[r * 16u + 4u], SIGMA82[r * 16u + 5u]);
-                               G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[r * 16u + 6u], SIGMA82[r * 16u + 7u]);
-                               G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[r * 16u + 8u], SIGMA82[r * 16u + 9u]);
-                               G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[r * 16u + 10u], SIGMA82[r * 16u + 11u]);
-                               G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[r * 16u + 12u], SIGMA82[r * 16u + 13u]);
-                               G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[r * 16u + 14u], SIGMA82[r * 16u + 15u]);
-                       }
+                       // ROUND(0)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[0u], SIGMA82[1u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[2u], SIGMA82[3u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[4u], SIGMA82[5u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[6u], SIGMA82[7u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[8u], SIGMA82[9u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[10u], SIGMA82[11u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[12u], SIGMA82[13u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[14u], SIGMA82[15u]);
+
+                       // ROUND(1)
+       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[16u], SIGMA82[17u]);
+         G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[18u], SIGMA82[19u]);
+           G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[20u], SIGMA82[21u]);
+       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[22u], SIGMA82[23u]);
+         G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[24u], SIGMA82[25u]);
+           G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[26u], SIGMA82[27u]);
+       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[28u], SIGMA82[29u]);
+           G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[30u], SIGMA82[31u]);
+
+                       // ROUND(2)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[32u], SIGMA82[33u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[34u], SIGMA82[35u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[36u], SIGMA82[37u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[38u], SIGMA82[39u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[40u], SIGMA82[41u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[42u], SIGMA82[43u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[44u], SIGMA82[45u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[46u], SIGMA82[47u]);
+
+                       // ROUND(3)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[48u], SIGMA82[49u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[50u], SIGMA82[51u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[52u], SIGMA82[53u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[54u], SIGMA82[55u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[56u], SIGMA82[57u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[58u], SIGMA82[59u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[60u], SIGMA82[61u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[62u], SIGMA82[63u]);
+
+                       // ROUND(4)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[64u], SIGMA82[65u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[66u], SIGMA82[67u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[68u], SIGMA82[69u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[70u], SIGMA82[71u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[72u], SIGMA82[73u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[74u], SIGMA82[75u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[76u], SIGMA82[77u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[78u], SIGMA82[79u]);
+
+                       // ROUND(5)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[80u], SIGMA82[81u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[82u], SIGMA82[83u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[84u], SIGMA82[85u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[86u], SIGMA82[87u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[88u], SIGMA82[89u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[90u], SIGMA82[91u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[92u], SIGMA82[93u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[94u], SIGMA82[95u]);
+
+                       // ROUND(6)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[96u], SIGMA82[97u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[98u], SIGMA82[99u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[100u], SIGMA82[101u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[102u], SIGMA82[103u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[104u], SIGMA82[105u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[106u], SIGMA82[107u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[108u], SIGMA82[109u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[110u], SIGMA82[111u]);
+
+                       // ROUND(7)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[112u], SIGMA82[113u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[114u], SIGMA82[115u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[116u], SIGMA82[117u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[118u], SIGMA82[119u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[120u], SIGMA82[121u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[122u], SIGMA82[123u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[124u], SIGMA82[125u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[126u], SIGMA82[127u]);
+
+                       // ROUND(8)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[128u], SIGMA82[129u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[130u], SIGMA82[131u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[132u], SIGMA82[133u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[134u], SIGMA82[135u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[136u], SIGMA82[137u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[138u], SIGMA82[139u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[140u], SIGMA82[141u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[142u], SIGMA82[143u]);
+
+                       // ROUND(9)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[144u], SIGMA82[145u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[146u], SIGMA82[147u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[148u], SIGMA82[149u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[150u], SIGMA82[151u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[152u], SIGMA82[153u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[154u], SIGMA82[155u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[156u], SIGMA82[157u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[158u], SIGMA82[159u]);
+
+                       // ROUND(10)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[160u], SIGMA82[161u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[162u], SIGMA82[163u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[164u], SIGMA82[165u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[166u], SIGMA82[167u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[168u], SIGMA82[169u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[170u], SIGMA82[171u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[172u], SIGMA82[173u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[174u], SIGMA82[175u]);
+
+                       // ROUND(11)
+                       G(&v, &m, 0u, 8u, 16u, 24u, SIGMA82[176u], SIGMA82[177u]);
+                       G(&v, &m, 2u, 10u, 18u, 26u, SIGMA82[178u], SIGMA82[179u]);
+                       G(&v, &m, 4u, 12u, 20u, 28u, SIGMA82[180u], SIGMA82[181u]);
+                       G(&v, &m, 6u, 14u, 22u, 30u, SIGMA82[182u], SIGMA82[183u]);
+                       G(&v, &m, 0u, 10u, 20u, 30u, SIGMA82[184u], SIGMA82[185u]);
+                       G(&v, &m, 2u, 12u, 22u, 24u, SIGMA82[186u], SIGMA82[187u]);
+                       G(&v, &m, 4u, 14u, 16u, 26u, SIGMA82[188u], SIGMA82[189u]);
+                       G(&v, &m, 6u, 8u, 18u, 28u, SIGMA82[190u], SIGMA82[191u]);
 
                        /**
                        * Set nonce if it passes the threshold and no other thread has set it