| // |
| // This confidential and proprietary software may be used only as |
| // authorised by a licensing agreement from ARM Limited |
| // (C) COPYRIGHT 2023 ARM Limited |
| // ALL RIGHTS RESERVED |
| // The entire notice above must be reproduced on all authorised |
| // copies and copies may only be made to the extent permitted |
| // by a licensing agreement from ARM Limited. |
| |
| == Appendix A |
| |
| NOTE: This appendix is at an early stage of development at this point in time |
| |
| === Random data generation |
| |
| The following function generates a pseudo-random floating-point value in the range -1.0 to +1.0 for use as test data. |
| It uses a modulo (1<<32) recurrent sequence with multiplier derived from "TOSASETS" and the set number. |
| |
| [source,c++] |
| ---- |
| float set_data(uint32_t set, uint32_t index) |
| { |
| uint32_t m = (8*set + 1) * 0x705A5E75; // mod (1<<32) calculation |
| uint32_t r = m + 1; // mod (1<<32) calculation |
| for (uint32_t i = 0; i < index; i++) { |
| r = r * m + 1; // mod (1<<32) calculation |
| } |
| float sign = (r>>31)==0 ? +1 : -1; |
| return sign * (float)(r & 0x7FFFFFFF) / (float)(0x7FFFFFFF); |
| } |
| ---- |
| |
| === Dot product floating-point test data sets |
| |
| Each test set is indexed by a pair (S, N) where: |
| |
| * S is the test set number |
| * N is the number of elements in a single test vector |
| |
| Each test set (S, N) contains multiple tests that statistics are calculated over. |
| The parameter T is the number of tests in a given set. |
| In the table below, t is the test number within a set in the range 0 to T-1. |
| |
| [cols="1,1,1,5,5"] |
| |=== |
| | Set S | N range | T | x[k] formula for k < N | w[k] formula for k < N |
| |
| | 0 |
| | 2-25,50,100,1000 |
| | 10 |
| | x[k]=set_data(S, 2*t*N+2*k) < 0 ? 0.0 : set_data(S, 2*t*N+2*k+1) |
| | w[k]=set_data(S, 2*t*N+2*k) < 0 ? set_data(S, 2*t*N+2*k+1) : 0.0 |
| |
| | 1 |
| | 2-25,50,100,1000 |
| | 1000 |
| | x[k]=2.0*set_data(S, 2*t*N + k) |
| | w[k]=2.0*set_data(S, (2*t+1)*N + k) |
| |
| | 2 |
| | 2-25,50,100,1000 |
| | 1000 |
| | x[0]=1.0, x[k]=set_data(S, 2*t*N + k)/sqrt(N) for k>0 |
| | w[0]=1.0, w[k]=set_data(S, (2*t+1)*N + k)/sqrt(N) for k>0 |
| |
| |=== |