| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import numpy as np
- import os
- import sys
- def reverse_endian(data):
- result = bytearray()
- for i in range(len(data), 0, -1):
- result.append(data[i - 1])
- return bytes(result)
- def dtype_size(dtype):
- if dtype == np.float16:
- return 2
- elif dtype == np.float32:
- return 4
- else:
- raise ValueError(f"Unknown dtype {dtype}")
- def generate_numbers(cases, dtype=np.float16):
- dsize = dtype_size(dtype)
- x = np.frombuffer(os.urandom(cases * dsize), dtype=dtype)
- y = np.frombuffer(os.urandom(cases * dsize), dtype=dtype)
- return x, y, dsize
- def generate_fp_vector(cases, filename, dtype=np.float16, big_endian=False, comp_file=None):
- x, y, dsize = generate_numbers(cases, dtype)
- np.seterr(all='ignore')
- sum = x + y
- mul = x * y
- with open(filename, 'w') as f:
- for i in range(cases):
- t = lambda v: reverse_endian(v) if big_endian else v
- f.write(' '.join([
- t(x.tobytes()[i * dsize:i * dsize + dsize]).hex(),
- t(y.tobytes()[i * dsize:i * dsize + dsize]).hex(),
- t(sum.tobytes()[i * dsize:i * dsize + dsize]).hex(),
- t(mul.tobytes()[i * dsize:i * dsize + dsize]).hex(),
- ]) + '\n')
- if comp_file is not None:
- gt = x > y
- lt = x < y
- ge = x >= y
- le = x <= y
- eq = x == y
- with open(comp_file, 'w') as f:
- for i in range(cases):
- f.write(''.join([
- '1' if gt[i] else '0',
- '1' if lt[i] else '0',
- '1' if ge[i] else '0',
- '1' if le[i] else '0',
- '1' if eq[i] else '0'
- ]) + f' // {x[i]:10.3e} {y[i]:10.3e}\n')
- if __name__ == '__main__':
- generate = 50
- if len(sys.argv) == 2 and sys.argv[1].isdigit():
- generate = int(sys.argv[1])
- else:
- print(f"Usage: {sys.argv[0]} [number of generated tests]")
- generate_fp_vector(generate, 'fp16_test.hex', dtype=np.float16, big_endian=True)
- generate_fp_vector(generate, 'fp32_test.hex', dtype=np.float32, big_endian=True, comp_file='fp32_test_comp.hex')
|