mirror of
https://github.com/amadvance/snapraid.git
synced 2026-10-25 18:40:19 -04:00
Precompute direct Cauchy affine matrices for RAID GFNI generation
This commit is contained in:
parent
0c030c024e
commit
9d842b0dfb
4 changed files with 1817 additions and 10 deletions
20
raid/gfni.c
20
raid/gfni.c
|
|
@ -56,35 +56,35 @@ static __always_inline void raid_genX_avx2gfni_raid(int nd, size_t size, void **
|
|||
asm volatile ("vpxor %ymm12,%ymm0,%ymm0");
|
||||
asm volatile ("vpxor %ymm13,%ymm1,%ymm1");
|
||||
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[1][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfcauchyaffine_raid[d][0][0]));
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm12,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm2,%ymm2");
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm13,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm3,%ymm3");
|
||||
|
||||
if (np >= 3) {
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[2][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfcauchyaffine_raid[d][1][0]));
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm12,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm4,%ymm4");
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm13,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm5,%ymm5");
|
||||
}
|
||||
if (np >= 4) {
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[3][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfcauchyaffine_raid[d][2][0]));
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm12,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm6,%ymm6");
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm13,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm7,%ymm7");
|
||||
}
|
||||
if (np >= 5) {
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[4][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfcauchyaffine_raid[d][3][0]));
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm12,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm8,%ymm8");
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm13,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm9,%ymm9");
|
||||
}
|
||||
if (np >= 6) {
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[5][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%ymm14" : : "m" (raid_gfcauchyaffine_raid[d][4][0]));
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm12,%ymm15");
|
||||
asm volatile ("vpxor %ymm15,%ymm10,%ymm10");
|
||||
asm volatile ("vgf2p8affineqb $0,%ymm14,%ymm13,%ymm15");
|
||||
|
|
@ -153,15 +153,15 @@ static __always_inline void raid_genX_avx512gfni_raid(int nd, size_t size, void
|
|||
for (d = 1; d < nd; ++d) {
|
||||
asm volatile ("vmovdqa64 %0,%%zmm6" : : "m" (v[d][i]));
|
||||
|
||||
asm volatile ("vpbroadcastq %0,%%zmm7" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[1][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%zmm7" : : "m" (raid_gfcauchyaffine_raid[d][0][0]));
|
||||
if (np >= 3)
|
||||
asm volatile ("vpbroadcastq %0,%%zmm8" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[2][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%zmm8" : : "m" (raid_gfcauchyaffine_raid[d][1][0]));
|
||||
if (np >= 4)
|
||||
asm volatile ("vpbroadcastq %0,%%zmm9" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[3][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%zmm9" : : "m" (raid_gfcauchyaffine_raid[d][2][0]));
|
||||
if (np >= 5)
|
||||
asm volatile ("vpbroadcastq %0,%%zmm10" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[4][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%zmm10" : : "m" (raid_gfcauchyaffine_raid[d][3][0]));
|
||||
if (np >= 6)
|
||||
asm volatile ("vpbroadcastq %0,%%zmm11" : : "m" (raid_gfaffine_raid[raid_gfcauchy_raid[5][d]][0]));
|
||||
asm volatile ("vpbroadcastq %0,%%zmm11" : : "m" (raid_gfcauchyaffine_raid[d][4][0]));
|
||||
|
||||
asm volatile ("vgf2p8affineqb $0,%zmm7,%zmm6,%zmm12");
|
||||
if (np >= 3)
|
||||
|
|
|
|||
|
|
@ -362,6 +362,9 @@ extern const uint8_t raid_gfinv_raid[256] __aligned(256);
|
|||
extern const uint8_t raid_gfvandermonde_raid[3][256] __aligned(256);
|
||||
extern const uint8_t raid_gfcauchy_raid[6][256] __aligned(256);
|
||||
extern const uint8_t raid_gfaffine_raid[256][8] __aligned(256);
|
||||
#ifdef CONFIG_X86_64
|
||||
extern const uint8_t raid_gfcauchyaffine_raid[251][5][8] __aligned(256);
|
||||
#endif
|
||||
#if defined(CONFIG_X86) || defined(CONFIG_NEON) || defined(CONFIG_NEON32)
|
||||
extern const uint8_t raid_gfcauchypshufb_raid[251][5][2][16] __aligned(256);
|
||||
extern const uint8_t raid_gfmulpshufb_raid[256][2][16] __aligned(256);
|
||||
|
|
|
|||
|
|
@ -352,6 +352,39 @@ void tables(uint8_t poly, uint8_t generator, const char *tag)
|
|||
}
|
||||
printf("};\n\n");
|
||||
|
||||
if (poly == RAID_POLY_RAID) {
|
||||
uint8_t affine[8];
|
||||
|
||||
printf("#ifdef CONFIG_X86_64\n");
|
||||
printf("/**\n");
|
||||
printf(" * GFNI affine matrices for the RAID Cauchy coefficients.\n");
|
||||
printf(" *\n");
|
||||
printf(" * Indexes are [DISK][PARITY - 1][8].\n");
|
||||
printf(" * Where DISK is from 0 to %u and PARITY is from 2 to %u.\n", DISK - 1, PARITY);
|
||||
printf(" * The last index contains the 8 bytes of the affine matrix.\n");
|
||||
printf(" */\n");
|
||||
printf("const uint8_t __aligned(256) raid_gfcauchyaffine_raid[%u][%u][8] =\n",
|
||||
DISK, PARITY - 1);
|
||||
printf("{\n");
|
||||
for (i = 0; i < DISK; ++i) {
|
||||
printf("\t{\n");
|
||||
for (p = 1; p < PARITY; ++p) {
|
||||
set_affine(poly, matrix[p * DISK + i], affine);
|
||||
|
||||
printf("\t\t{ ");
|
||||
for (j = 0; j < 8; ++j) {
|
||||
printf("0x%02x", (unsigned)affine[j]);
|
||||
if (j != 7)
|
||||
printf(", ");
|
||||
}
|
||||
printf(" },\n");
|
||||
}
|
||||
printf("\t},\n");
|
||||
}
|
||||
printf("};\n");
|
||||
printf("#endif\n\n");
|
||||
}
|
||||
|
||||
printf("#if defined(CONFIG_X86) || defined(CONFIG_NEON) || defined(CONFIG_NEON32)\n");
|
||||
printf("/**\n");
|
||||
printf(" * PSHUFB tables for the Cauchy matrix.\n");
|
||||
|
|
|
|||
1771
raid/tables.c
1771
raid/tables.c
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue