Skip to content

Latest commit

 

History

History
83 lines (65 loc) · 5.44 KB

msvc-divergence.md

File metadata and controls

83 lines (65 loc) · 5.44 KB

MSVC portability report

MSVC is a portability profile, not a managed parity oracle. The managed implementation is verified bit-for-bit against GCC. This report preserves the independently reproduced MSVC findings without retaining its full raw-output fixture.

Provenance

  • MVerb commit: 9f9512e9d990fcf265e00fc7c2ee47ad20c8019f
  • MVerb.h Git blob: 1e895dc8777c62eff627107c848355d1bc487490
  • MSVC: 19.51.36248.0 (_MSC_FULL_VER 195136248), Windows x64, Release, /fp:strict
  • GCC: 16.1.0, Windows x64, Release
  • Removed full MSVC fixture SHA-256: EC9CC742EEC56347A6A58B7DD300F0B8240D1BECD17C577833A00456C74F0DDE
  • Canonical GCC fixture SHA-256: C3B19849240DB60823859C11D3714747C460B5A71657C035F2FCBFA5CF4B8636

Both captures contain the exact scenario set below, bit-identical inputs, equal output lengths, matching finite/non-finite classification, and bit-identical outputs for default_long_impulse, parameters_defaults, and parameters_roundtrip.

Input hashes are SHA-256 over the fixture's comma-joined lowercase 0xNNNNNNNN bit strings with no whitespace.

Scenario Input SHA-256 First differing output Largest finite difference Maximum finite absolute difference
block_partitioning 07193402FFCAE51E5B0CF17E2FC5220546B52D0CC850CED7D69583DC625914D3 1744 30371 0.2535189241170883
configured_variable_blocks 5E0D0EC730EC0D1C89D3A4C63AA3C019ED0795F60DFDAB15E8F02BE8F70915AF 1900 29855 0.2797214388847351
default_long_impulse 36AF0FFD80D741194FD9963CBA56FD7B10773C9C14DA850CCE7DCE84091AC6FA none none 0
in_place EDF3D2ADE290827F775CC4B07B87BFACC22609FF71064AD798C70B42FB8A7BFB 1900 8177 0.06549897789955139
parameter_sweep 63C4BB66D5F31950CEAB6F7C7CA6D6FE18023CE8B241E45941054733B8C86DD8 1900 8092 0.0005610883235931396
parameters_defaults E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 none none 0
parameters_roundtrip 1ACA5FDF2EB91DCE96ED0C22BD16C44BE745CF2D5F90452118FE54741AF39A02 none none 0
reset_lifecycle E3AC25D2BEC52C30073EDF6210BA080AF1D832C274A76401FA529501CDD920D4 1900 32625 0.16403096914291382
sample_rate_matrix CF9B65BA95026939C6834C1A10DDB926FD174C2DE5968C72B66BFB0000C7AD24 316 16304 0.16701101139187813
sample_rate_reconfiguration 9A02931851502F1E4DB5BCF524FD940046E8C8B94E7FB573E602D5108C2F4F36 1744 16229 0.13454195857048035
size_reconfiguration 84AB0F89F8FBD9D9EF46AE6F41E6B23B2B051ECC38FFF75C71507C8E2D17837D 1900 22321 0.23899008333683014
zero_frame_lifecycle BD4E3F3D2A8EAE781C47308467A6493CAAC828C90D9CB5887D8E8A4B9730A6B0 1744 2008 0.0020544305443763733

The parameter/default evidence is retained compactly:

  • parameters_defaults output bits: 0x42b40000,0x00000000,0x42b40000,0x42480000,0x48d75500,0x42c80000,0x42c80000,0x42c80000,0x42c80000,0x00000000
  • parameters_defaults output SHA-256: 1F81089C0C9177036BB2452D8305CF886A60ACD6EEB63ABBB0708C281D3458CC
  • parameters_roundtrip output SHA-256: 8E0B6C5B98D05D119BA0157ADB6C5A6EE4A2EF7621DACEBFA7C42F077ECA795D
  • default_long_impulse output SHA-256: 615BF9FB48568FEE07B119E4C93C8FE1745C65F862846CF7337E119CC278BC88

What the difference means

The first visible differences are small, but MVerb repeatedly feeds each tank into the other channel. Once compiler rounding changes delayed state, the recursive tails dephase and their pointwise difference can become large. The values above are not a tolerance and MSVC is not accepted as an alternative managed trajectory.

The 8 kHz segment of sample_rate_matrix deliberately preserves another upstream behavior. Its configured damping and bandwidth targets are 11,692 Hz and 15,372 Hz while Nyquist is 4,000 Hz. Upstream does not clamp those controls, and both native profiles first produce the same NaN bit pattern at output 2618 (stereo frame 1309). Managed GCC parity includes that raw-bit contract; the portability check requires MSVC to retain the same finite/non-finite classification.

Focused compiler-flag matrix

The divergence is stable under the relevant non-fast floating-point modes:

Configuration Resulting fixture
MSVC /fp:strict, Release MSVC baseline
MSVC /fp:precise, Release Exact MSVC baseline
MSVC /fp:strict, Debug Exact MSVC baseline
MSVC /fp:fast, Release Distinct third trajectory
GCC Release GCC parity baseline
GCC -ffp-contract=off Exact GCC baseline
GCC -fexcess-precision=standard Exact GCC baseline
GCC -frounding-math -ffp-contract=off Exact GCC baseline
GCC Debug with contraction disabled Exact GCC baseline
GCC -ffast-math Distinct third trajectory

Both baseline executables import sinf from api-ms-win-crt-math-l1-1-0.dll, so the observed difference is not a different sine library. No tested strict/precise flag combination makes MSVC reproduce GCC.

Reproduce

./tools/parity/scripts/regenerate-parity.ps1 -Profile msvc -OutputPath ./artifacts/parity/reference.msvc.json
./tools/parity/scripts/verify-msvc-portability.ps1 -MsvcFixture ./artifacts/parity/reference.msvc.json

The verifier requires compiler identity, the exact scenario set, bit-identical inputs, equal output lengths, matching finite/non-finite classification, stable parameter/default paths, and explicit divergence in every feedback-sensitive scenario. The full MSVC capture remains a transient artifact.