diff options
-rw-r--r-- | testsuite/Makefile | 15 | ||||
-rw-r--r-- | testsuite/ctlz.c | 74 | ||||
-rw-r--r-- | testsuite/maxub8.c | 108 | ||||
-rw-r--r-- | testsuite/maxuw4.c | 111 | ||||
-rw-r--r-- | testsuite/minmax.h | 4 | ||||
-rw-r--r-- | testsuite/minub8.c | 111 | ||||
-rw-r--r-- | testsuite/minuw4.c | 108 |
7 files changed, 531 insertions, 0 deletions
diff --git a/testsuite/Makefile b/testsuite/Makefile new file mode 100644 index 0000000..3a1d2ce --- /dev/null +++ b/testsuite/Makefile @@ -0,0 +1,15 @@ +CC=gcc +CFLAGS=-O2 -mcpu=ev67 #-funroll-loops -pipe + +EXES=maxub8.exe maxuw4.exe minub8.exe minuw4.exe addusw4.exe ctlz.exe + +all: ${EXES} + +clean: + rm -f ${EXES} + +rebuild: clean all +remake: rebuild + +%.exe: %.c + ${CC} ${CFLAGS} -o $@ $< ${OBJ} diff --git a/testsuite/ctlz.c b/testsuite/ctlz.c new file mode 100644 index 0000000..1fc0cf1 --- /dev/null +++ b/testsuite/ctlz.c @@ -0,0 +1,74 @@ +#include <stdio.h> +#include <stdint.h> +#include <time.h> +#include <string.h> + +#include "../alpha_mmintrin.h" + +#define ITERATIONS 10000 + +int main(int argc, char ** argv) { + uint64_t a[512], b[512], c[512]; + uint64_t l1, l2; + uint64_t start, end, overhead; + uint64_t cix_total = 0, noncix_total = 0; + int i, j, count = 0; + + start = __rpcc(); + end = __rpcc(); + overhead = end - start; + + srand(time(NULL)); + + for (i = 0; i < 512; i++) { + a[i] = rand(); + } + + for (j = 0; j < ITERATIONS; j++) { + start = __rpcc(); + + for (i = 0; i < 512; i++) { + l1 = a[i]; + + l2 = 1 << (64 - __ctlz(l1)); + + b[i] = l2; + } + + end = __rpcc(); + cix_total += end - start - overhead; + memset(b, 4096, 0); + } + + for (j = 0; j < ITERATIONS; j++) { + start = __rpcc(); + + for (i = 0; i < 512; i++) { + l1 = a[i]; + while (l1 != 0) { + l1 >>= 1; + count += 1; + } + l2 = 1 << count; + c[i] = l2; + // printf("nextpow2 of %lu is %lu\n", i, l2); + count = 0; + } + + end = __rpcc(); + noncix_total += end - start - overhead; + memset(c, 4096, 0); + } + + noncix_total /= ITERATIONS; + cix_total /= ITERATIONS; + + if (memcmp(b, c, 4096) == 0) { + printf("%s:\n", argv[0]); + printf(" CIX time: %9lu nanoseconds\n non-CIX time: %9lu nanoseconds\n", cix_total, noncix_total); + } else { + puts("Final arrays are not equal. Something happened."); + } + + return 0; +} diff --git a/testsuite/maxub8.c b/testsuite/maxub8.c new file mode 100644 index 0000000..de2a9e7 --- /dev/null +++ b/testsuite/maxub8.c @@ -0,0 +1,108 @@ +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <time.h> + +#include "../alpha_mmintrin.h" +#include "minmax.h" + +#define ITERATIONS 10000 + +int main(int argc, char ** argv[]) { + static uint64_t a[512], b[512]; + static uint64_t c[512] = {0}, d[512] = {0}; + + uint64_t l64_0, l64_1, l64_2; + uint64_t *a64, *b64, *c64, *d64; + + uint64_t start, end, overhead; + uint64_t simd_total = 0, no_simd_total = 0; + + uint8_t l8_0, l8_1, l8_2; + uint8_t *a8, *b8, *c8; + + int i, j; + + start = __rpcc(); + end = __rpcc(); + overhead = end - start; + + srand(time(NULL)); + + a8 = (uint8_t *)a; + b8 = (uint8_t *)b; + + for (i = 0; i < 4096; i++) { + *a8 = rand() % 255; + *b8 = rand() % 255; + + a8++; + b8++; + } + + for (j = 0; j < ITERATIONS; j++) { + a8 = (uint8_t *)a; + b8 = (uint8_t *)b; + c8 = (uint8_t *)c; + + start = __rpcc(); + + for (i = 0; i < 4096; i++ ) { + l8_1 = *a8; + l8_2 = *b8; + + l8_0 = MAX(l8_1, l8_2); + + *c8 = l8_0; + + a8++; + b8++; + c8++; + } + + end = __rpcc() - overhead; + no_simd_total += end - start; + + memset(c, 4096, 0); + } + + no_simd_total /= ITERATIONS; + + + for (j = 0; j < ITERATIONS; j++) { + a64 = a; + b64 = b; + d64 = d; + + start = __rpcc(); + + for (i = 0; i < 512; i++) { + l64_1 = *a64; + l64_2 = *b64; + + l64_0 = __maxub8(l64_1, l64_2); + + *d64 = l64_0; + + a64++; + b64++; + d64++; + } + + end = __rpcc() - overhead; + simd_total += end - start; + + memset(d, 4096, 0); + } + + simd_total /= ITERATIONS; + + if (memcmp(c, d, 4096) == 0) { + printf("%s:\n", argv[0]); + printf(" SIMD time: %9lu nanoseconds\nnon-SIMD time: %9lu nanoseconds\n", simd_total, no_simd_total); + } else { + puts("Final arrays are not equal. Something happened."); + } + + return 0; +} diff --git a/testsuite/maxuw4.c b/testsuite/maxuw4.c new file mode 100644 index 0000000..3b8e942 --- /dev/null +++ b/testsuite/maxuw4.c @@ -0,0 +1,111 @@ +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <time.h> + +#include "../alpha_mmintrin.h" +#include "minmax.h" + +#define ITERATIONS 10000 + +int main(int argc, char ** argv[]) { + static uint64_t a[512], b[512]; + static uint64_t c[512] = {0}, d[512] = {0}; + + uint64_t l64_0, l64_1, l64_2; + uint64_t *a64, *b64, *c64, *d64; + + uint64_t start, end, overhead; + uint64_t simd_total = 0, no_simd_total = 0; + + uint16_t l16_0, l16_1, l16_2; + uint16_t *a16, *b16, *c16; + + uint8_t l8_0, l8_1, l8_2; + uint8_t *a8, *b8, *c8; + + int i, j; + + start = __rpcc(); + end = __rpcc(); + overhead = end - start; + + srand(time(NULL)); + + a8 = (uint8_t *)a; + b8 = (uint8_t *)b; + + for (i = 0; i < 4096; i++) { + *a8 = rand() % 255; + *b8 = rand() % 255; + + a8++; + b8++; + } + + for (j = 0; j < ITERATIONS; j++) { + a16 = (uint16_t *)a; + b16 = (uint16_t *)b; + c16 = (uint16_t *)c; + + start = __rpcc(); + + for (i = 0; i < 2048; i++ ) { + l16_1 = *a16; + l16_2 = *b16; + + l16_0 = MAX(l16_1, l16_2); + + *c16 = l16_0; + + a16++; + b16++; + c16++; + } + + end = __rpcc() - overhead; + no_simd_total += end - start; + + memset(c, 4096, 0); + } + + no_simd_total /= ITERATIONS; + + + for (j = 0; j < ITERATIONS; j++) { + a64 = a; + b64 = b; + d64 = d; + + start = __rpcc(); + + for (i = 0; i < 512; i++) { + l64_1 = *a64; + l64_2 = *b64; + + l64_0 = __maxuw4(l64_1, l64_2); + + *d64 = l64_0; + + a64++; + b64++; + d64++; + } + + end = __rpcc() - overhead; + simd_total += end - start; + + memset(d, 4096, 0); + } + + simd_total /= ITERATIONS; + + if (memcmp(c, d, 4096) == 0) { + printf("%s:\n", argv[0]); + printf(" SIMD time: %9lu nanoseconds\nnon-SIMD time: %9lu nanoseconds\n", simd_total, no_simd_total); + } else { + puts("Final arrays are not equal. Something happened."); + } + + return 0; +} diff --git a/testsuite/minmax.h b/testsuite/minmax.h new file mode 100644 index 0000000..bead827 --- /dev/null +++ b/testsuite/minmax.h @@ -0,0 +1,4 @@ + +#define MAX(a, b) (a > b ? a : b) +#define MIN(a, b) (a < b ? a : b) + diff --git a/testsuite/minub8.c b/testsuite/minub8.c new file mode 100644 index 0000000..5b54e0a --- /dev/null +++ b/testsuite/minub8.c @@ -0,0 +1,111 @@ +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <time.h> + +#include "../alpha_mmintrin.h" +#include "minmax.h" + +#define ITERATIONS 10000 + +int main(int argc, char ** argv[]) { + static uint64_t a[512], b[512]; + static uint64_t c[512] = {0}, d[512] = {0}; + + uint64_t l64_0, l64_1, l64_2; + uint64_t *a64, *b64, *c64, *d64; + + uint64_t start, end, overhead; + uint64_t simd_total = 0, no_simd_total = 0; + + uint8_t l8_0, l8_1, l8_2; + uint8_t *a8, *b8, *c8; + + int i, j; + + start = __rpcc(); + end = __rpcc(); + overhead = end - start; + + srand(time(NULL)); + + a8 = (uint8_t *)a; + b8 = (uint8_t *)b; + + for (i = 0; i < 4096; i++) { + *a8 = rand() % 255; + *b8 = rand() % 255; + + a8++; + b8++; + } + + for (j = 0; j < ITERATIONS; j++) { + a8 = (uint8_t *)a; + b8 = (uint8_t *)b; + c8 = (uint8_t *)c; + + start = __rpcc(); + + for (i = 0; i < 4096; i++ ) { + l8_1 = *a8; + l8_2 = *b8; + + l8_0 = MIN(l8_1, l8_2); + + *c8 = l8_0; + + //printf("MIN of %3u and %3u is %3u\n", l8_1, l8_2, l8_0); + + a8++; + b8++; + c8++; + } + + end = __rpcc() - overhead; + //printf("%d - %lu nanoseconds\n", j, end - start); + no_simd_total += end - start; + + memset(c, 4096, 0); + } + + no_simd_total /= ITERATIONS; + + + for (j = 0; j < ITERATIONS; j++) { + a64 = a; + b64 = b; + d64 = d; + + start = __rpcc(); + + for (i = 0; i < 512; i++) { + l64_1 = *a64; + l64_2 = *b64; + + l64_0 = __minub8(l64_1, l64_2); + + *d64 = l64_0; + + a64++; + b64++; + d64++; + } + + end = __rpcc() - overhead; + simd_total += end - start; + + memset(d, 4096, 0); + } + + simd_total /= ITERATIONS; + + if (memcmp(c, d, 4096) == 0) { + printf("%s:\n", argv[0]); + printf(" SIMD time: %9lu nanoseconds\nnon-SIMD time: %9lu nanoseconds\n", simd_total, no_simd_total); + } else { + puts("Final arrays are not equal. Something happened."); + } + + return 0; +} diff --git a/testsuite/minuw4.c b/testsuite/minuw4.c new file mode 100644 index 0000000..205d32e --- /dev/null +++ b/testsuite/minuw4.c @@ -0,0 +1,108 @@ +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <time.h> + +#include "../alpha_mmintrin.h" +#include "minmax.h" + +#define ITERATIONS 10000 + +int main(int argc, char ** argv[]) { + static uint64_t a[512], b[512]; + static uint64_t c[512] = {0}, d[512] = {0}; + + uint64_t l64_0, l64_1, l64_2; + uint64_t *a64, *b64, *c64, *d64; + + uint64_t start, end, overhead; + uint64_t simd_total = 0, no_simd_total = 0; + + uint16_t l16_0, l16_1, l16_2, l16_3, l16_4, l16_5, l16_6, l16_7, l16_8, l16_9, l16_10, l16_11, l16_12; + uint16_t *a16, *b16, *c16; + + uint8_t l8_0, l8_1, l8_2; + uint8_t *a8, *b8, *c8; + + int i, j; + + start = __rpcc(); + end = __rpcc(); + overhead = end - start; + + srand(time(NULL)); + + a8 = (uint8_t *)a; + b8 = (uint8_t *)b; + + for (i = 0; i < 4096; i++) { + *a8 = rand() % 255; + *b8 = rand() % 255; + + a8++; + b8++; + } + + for (j = 0; j < ITERATIONS; j++) { + a16 = (uint16_t *)a; + b16 = (uint16_t *)b; + c16 = (uint16_t *)c; + + start = __rpcc(); + + for (i = 0; i < 2048; i++) { + l16_1 = *a16; + l16_2 = *b16; + l16_0 = MIN(l16_1, l16_2); + *c16 = l16_0; + a16++; + b16++; + c16++; + } + + end = __rpcc() - overhead; + no_simd_total += end - start; + + memset(c, 4096, 0); + } + + no_simd_total /= ITERATIONS; + + + for (j = 0; j < ITERATIONS; j++) { + a64 = a; + b64 = b; + d64 = d; + + start = __rpcc(); + + for (i = 0; i < 512; i++) { + l64_1 = *a64; + l64_2 = *b64; + + l64_0 = __minuw4(l64_1, l64_2); + + *d64 = l64_0; + + a64++; + b64++; + d64++; + } + + end = __rpcc() - overhead; + simd_total += end - start; + + memset(d, 4096, 0); + } + + simd_total /= ITERATIONS; + + if (memcmp(c, d, 4096) == 0) { + printf("%s:\n", argv[0]); + printf(" SIMD time: %9lu nanoseconds\nnon-SIMD time: %9lu nanoseconds\n", simd_total, no_simd_total); + } else { + puts("Final arrays are not equal. Something happened."); + } + + return 0; +} |