Viewing file: m512-check.h (3.01 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#include <immintrin.h> #include "m256-check.h"
typedef union { __m512i x; char a[64]; } union512i_b;
typedef union { __m512i x; short a[32]; } union512i_w;
typedef union { __m512i x; int a[16]; } union512i_d;
typedef union { __m512i x; long long a[8]; } union512i_q;
typedef union { __m512 x; float a[16]; } union512;
typedef union { __m512d x; double a[8]; } union512d;
typedef union { __m512i x; unsigned char a[64]; } union512i_ub; typedef union { __m512i x; unsigned short a[32]; } union512i_uw; typedef union { __m512i x; unsigned int a[16]; } union512i_ud; typedef union { __m512i x; unsigned long long a[8]; } union512i_uq;
typedef union { __m128h x; _Float16 a[8]; } union128h;
typedef union { __m256h x; _Float16 a[16]; } union256h;
typedef union { __m512h x; _Float16 a[32]; } union512h;
CHECK_EXP (union512i_b, char, "%d") CHECK_EXP (union512i_w, short, "%d") CHECK_EXP (union512i_d, int, "0x%x") CHECK_EXP (union512i_q, long long, "0x%llx") CHECK_EXP (union512, float, "%f") CHECK_EXP (union512d, double, "%f") CHECK_EXP (union512i_ub, unsigned char, "%d") CHECK_EXP (union512i_uw, unsigned short, "%d") CHECK_EXP (union512i_ud, unsigned int, "0x%x") CHECK_EXP (union512i_uq, unsigned long long, "0x%llx")
CHECK_FP_EXP (union512, float, ESP_FLOAT, "%f") CHECK_FP_EXP (union512d, double, ESP_DOUBLE, "%f")
#define CHECK_ROUGH_EXP(UNION_TYPE, VALUE_TYPE, FMT) \ static int \ __attribute__((noinline, unused)) \ check_rough_##UNION_TYPE (UNION_TYPE u, const VALUE_TYPE *v, \ VALUE_TYPE eps) \ { \ int i; \ int err = 0; \ \ for (i = 0; i < ARRAY_SIZE (u.a); i++) \ { \ /* We can have have v[i] == 0 == u.a[i] for some i, \ when we test zero-masking. */ \ if (v[i] == 0.0 && u.a[i] == 0.0) \ continue; \ if (v[i] == 0.0 && u.a[i] != 0.0) \ { \ err++; \ PRINTF ("%i: " FMT " != " FMT "\n", \ i, v[i], u.a[i]); \ } \ VALUE_TYPE rel_err = (u.a[i] - v[i]) / v[i]; \ if (((rel_err < 0) ? -rel_err : rel_err) > eps) \ { \ err++; \ PRINTF ("%i: " FMT " != " FMT "\n", \ i, v[i], u.a[i]); \ } \ } \ return err; \ }
CHECK_ROUGH_EXP (union512, float, "%f") CHECK_ROUGH_EXP (union512d, double, "%f") CHECK_ROUGH_EXP (union256, float, "%f") CHECK_ROUGH_EXP (union256d, double, "%f") CHECK_ROUGH_EXP (union128, float, "%f") CHECK_ROUGH_EXP (union128d, double, "%f")
#ifdef AVX512FP16
CHECK_EXP (union128h, _Float16, "%f") CHECK_EXP (union256h, _Float16, "%f") CHECK_EXP (union512h, _Float16, "%f")
#ifndef ESP_FLOAT16 #define ESP_FLOAT16 0.27 #endif
CHECK_FP_EXP (union128h, _Float16, ESP_FLOAT16, "%f") CHECK_FP_EXP (union256h, _Float16, ESP_FLOAT16, "%f") CHECK_FP_EXP (union512h, _Float16, ESP_FLOAT16, "%f")
CHECK_ROUGH_EXP (union128h, _Float16, "%f") CHECK_ROUGH_EXP (union256h, _Float16, "%f") CHECK_ROUGH_EXP (union512h, _Float16, "%f") #endif
|