Last active
April 24, 2017 08:22
-
-
Save satoru-takeuchi/92886abf821445c0539632687ce19214 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <errno.h> | |
#include <err.h> | |
#define PAGESIZE 4096 | |
#define DISKS 4 | |
typedef unsigned char u8; | |
typedef unsigned long u64; | |
static const struct raid6_avx2_constants { | |
u64 x1d[4]; | |
} raid6_avx2_constants __attribute__((aligned(32))) = { | |
{ 0x1d1d1d1d1d1d1d1dULL, 0x1d1d1d1d1d1d1d1dULL, | |
0x1d1d1d1d1d1d1d1dULL, 0x1d1d1d1d1d1d1d1dULL,}, | |
}; | |
static void raid6_avx21_gen_syndrome(int disks, size_t bytes, void **ptrs) | |
{ | |
u8 **dptr = (u8 **)ptrs; | |
u8 *p, *q; | |
int d, z, z0; | |
z0 = disks - 3; /* Highest data disk */ | |
p = dptr[z0+1]; /* XOR parity */ | |
q = dptr[z0+2]; /* RS syndrome */ | |
asm volatile("vmovdqa %0,%%ymm0" : : "m" (raid6_avx2_constants.x1d[0])); | |
asm volatile("vpxor %ymm3,%ymm3,%ymm3"); /* Zero temp */ | |
for (d = 0; d < bytes; d += 32) { | |
asm volatile("prefetchnta %0" : : "m" (dptr[z0][d])); | |
asm volatile("vmovdqa %0,%%ymm2" : : "m" (dptr[z0][d]));/* P[0] */ | |
asm volatile("prefetchnta %0" : : "m" (dptr[z0-1][d])); | |
asm volatile("vmovdqa %ymm2,%ymm4");/* Q[0] */ | |
asm volatile("vmovdqa %0,%%ymm6" : : "m" (dptr[z0-1][d])); | |
for (z = z0-2; z >= 0; z--) { | |
asm volatile("prefetchnta %0" : : "m" (dptr[z][d])); | |
asm volatile("vpcmpgtb %ymm4,%ymm3,%ymm5"); | |
asm volatile("vpaddb %ymm4,%ymm4,%ymm4"); | |
asm volatile("vpand %ymm0,%ymm5,%ymm5"); | |
asm volatile("vpxor %ymm5,%ymm4,%ymm4"); | |
asm volatile("vpxor %ymm6,%ymm2,%ymm2"); | |
asm volatile("vpxor %ymm6,%ymm4,%ymm4"); | |
asm volatile("vmovdqa %0,%%ymm6" : : "m" (dptr[z][d])); | |
} | |
asm volatile("vpcmpgtb %ymm4,%ymm3,%ymm5"); | |
asm volatile("vpaddb %ymm4,%ymm4,%ymm4"); | |
asm volatile("vpand %ymm0,%ymm5,%ymm5"); | |
asm volatile("vpxor %ymm5,%ymm4,%ymm4"); | |
asm volatile("vpxor %ymm6,%ymm2,%ymm2"); | |
asm volatile("vpxor %ymm6,%ymm4,%ymm4"); | |
asm volatile("vmovntdq %%ymm2,%0" : "=m" (p[d])); | |
asm volatile("vpxor %ymm2,%ymm2,%ymm2"); | |
asm volatile("vmovntdq %%ymm4,%0" : "=m" (q[d])); | |
asm volatile("vpxor %ymm4,%ymm4,%ymm4"); | |
} | |
asm volatile("sfence" : : : "memory"); | |
} | |
static char *data[DISKS]; | |
int main(void) | |
{ | |
int i; | |
for (i = 0; i < DISKS; i++) | |
if ((errno = posix_memalign((void **)&data[i], PAGESIZE, PAGESIZE))) { | |
err(EXIT_FAILURE, "posix_memalign() failed"); | |
} | |
raid6_avx21_gen_syndrome(DISKS, PAGESIZE, (void **)data); | |
exit(EXIT_SUCCESS); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment