xorshift128plus_test.cc (17936B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #include <stdint.h> 7 8 #include <algorithm> 9 #include <vector> 10 11 #undef HWY_TARGET_INCLUDE 12 #define HWY_TARGET_INCLUDE "lib/jxl/xorshift128plus_test.cc" 13 #include <hwy/foreach_target.h> 14 #include <hwy/highway.h> 15 #include <hwy/tests/hwy_gtest.h> 16 17 #include "lib/jxl/base/data_parallel.h" 18 #include "lib/jxl/test_utils.h" 19 #include "lib/jxl/testing.h" 20 #include "lib/jxl/xorshift128plus-inl.h" 21 22 HWY_BEFORE_NAMESPACE(); 23 namespace jxl { 24 namespace HWY_NAMESPACE { 25 26 // These templates are not found via ADL. 27 using hwy::HWY_NAMESPACE::Or; 28 using hwy::HWY_NAMESPACE::ShiftRight; 29 using hwy::HWY_NAMESPACE::Sub; 30 31 // Define to nonzero in order to print the (new) golden outputs. 32 #define PRINT_RESULTS 0 33 34 const size_t kVectors = 64; 35 36 #if PRINT_RESULTS 37 38 template <int kNumLanes> 39 void Print(const uint64_t (&result)[kNumLanes]) { 40 printf("{ "); 41 for (int i = 0; i < kNumLanes; ++i) { 42 if (i != 0) { 43 printf(", "); 44 } 45 printf("0x%016llXull", result[i]); 46 } 47 printf("},\n"); 48 } 49 50 #else // PRINT_RESULTS 51 52 const uint64_t kExpected[kVectors][Xorshift128Plus::N] = { 53 {0x6E901576D477CBB1ull, 0xE9E53789195DA2A2ull, 0xB681F6DDA5E0AE99ull, 54 0x8EFD18CE21FD6896ull, 0xA898A80DF75CF532ull, 0x50CEB2C9E2DE7E32ull, 55 0x3CA7C2FEB25C0DD0ull, 0xA4D0866B80B4D836ull}, 56 {0x8CD6A1E6233D3A26ull, 0x3D4603ADE98B112Dull, 0xDC427AF674019E36ull, 57 0xE28B4D230705AC53ull, 0x7297E9BBA88783DDull, 0x34D3D23CFCD9B41Aull, 58 0x5A223615ADBE96B8ull, 0xE5EB529027CFBD01ull}, 59 {0xC1894CF00DFAC6A2ull, 0x18EDF8AE9085E404ull, 0x8E936625296B4CCDull, 60 0x31971EF3A14A899Bull, 0xBE87535FCE0BF26Aull, 0x576F7A752BC6649Full, 61 0xA44CBADCE0C6B937ull, 0x3DBA819BB17A353Aull}, 62 {0x27CE38DFCC1C5EB6ull, 0x920BEB5606340256ull, 0x3986CBC40C9AFC2Cull, 63 0xE22BCB3EEB1E191Eull, 0x6E1FCDD3602A8FBAull, 0x052CB044E5415A29ull, 64 0x46266646EFB9ECD7ull, 0x8F44914618D29335ull}, 65 {0xDD30AEDF72A362C5ull, 0xBC1D824E16BB98F4ull, 0x9EA6009C2AA3D2F1ull, 66 0xF65C0FBBE17AF081ull, 0x22424D06A8738991ull, 0x8A62763F2B7611D2ull, 67 0x2F3E89F722637939ull, 0x84D338BEF50AFD50ull}, 68 {0x00F46494898E2B0Bull, 0x81239DC4FB8E8003ull, 0x414AD93EC5773FE7ull, 69 0x791473C450E4110Full, 0x87F127BF68C959ACull, 0x6429282D695EF67Bull, 70 0x661082E11546CBA8ull, 0x5815D53FA5436BFDull}, 71 {0xB3DEADAB9BE6E0F9ull, 0xAA1B7B8F7CED0202ull, 0x4C5ED437699D279Eull, 72 0xA4471727F1CB39D3ull, 0xE439DA193F802F70ull, 0xF89401BB04FA6493ull, 73 0x3B08045A4FE898BAull, 0x32137BFE98227950ull}, 74 {0xFBAE4A092897FEF3ull, 0x0639F6CE56E71C8Eull, 0xF0AD6465C07F0C1Eull, 75 0xFF8E28563361DCE5ull, 0xC2013DB7F86BC6B9ull, 0x8EFCC0503330102Full, 76 0x3F6B767EA5C4DA40ull, 0xB9864B950B2232E1ull}, 77 {0x76EB58DE8E5EC22Aull, 0x9BBBF49A18B32F4Full, 0xC8405F02B2B2FAB9ull, 78 0xC3E122A5F146BC34ull, 0xC90BB046660F5765ull, 0xB933981310DBECCFull, 79 0x5A2A7BFC9126FD1Cull, 0x8BB388C94DF87901ull}, 80 {0x753EB89AD63EF3C3ull, 0xF24AAF40C89D65ADull, 0x23F68931C1A6AA6Dull, 81 0xF47E79BF702C6DD0ull, 0xA3AD113244EE7EAEull, 0xD42CBEA28F793DC3ull, 82 0xD896FCF1820F497Cull, 0x042B86D2818948C1ull}, 83 {0x8F2A4FC5A4265763ull, 0xEC499E6F95EAA10Cull, 0xE3786D4ECCD0DEB5ull, 84 0xC725C53D3AC4CC43ull, 0x065A4ACBBF83610Eull, 0x35C61C9FEF167129ull, 85 0x7B720AEAA7D70048ull, 0x14206B841377D039ull}, 86 {0xAD27D78BF96055F6ull, 0x5F43B20FF47ADCD4ull, 0xE184C2401E2BF71Eull, 87 0x30B263D78990045Dull, 0xC22F00EBFF9BA201ull, 0xAE7F86522B53A562ull, 88 0x2853312BC039F0A4ull, 0x868D619E6549C3C8ull}, 89 {0xFD5493D8AE9A8371ull, 0x773D5E224DF61B3Bull, 0x5377C54FBB1A8280ull, 90 0xCAD4DE3B8265CAFAull, 0xCDF3F19C91EBD5F6ull, 0xC8EA0F182D73BD78ull, 91 0x220502D593433FF1ull, 0xB81205E612DC31B1ull}, 92 {0x8F32A39EAEDA4C70ull, 0x1D4B0914AA4DAC7Full, 0x56EF1570F3A8B405ull, 93 0x29812CB17404A592ull, 0x97A2AAF69CAE90F2ull, 0x12BF5E02778BBFE5ull, 94 0x9D4B55AD42A05FD2ull, 0x06C2BAB5E6086620ull}, 95 {0x8DB4B9648302B253ull, 0xD756AD9E3AEA12C7ull, 0x68709B7F11D4B188ull, 96 0x7CC299DDCD707A4Bull, 0x97B860C370A7661Dull, 0xCECD314FC20E64F5ull, 97 0x55F412CDFB4C7EC3ull, 0x55EE97591193B525ull}, 98 {0xCF70F3ACA96E6254ull, 0x022FEDECA2E09F46ull, 0x686823DB60AE1ECFull, 99 0xFD36190D3739830Eull, 0x74E1C09027F68120ull, 0xB5883A835C093842ull, 100 0x93E1EFB927E9E4E3ull, 0xB2721E249D7E5EBEull}, 101 {0x69B6E21C44188CB8ull, 0x5D6CFB853655A7AAull, 0x3E001A0B425A66DCull, 102 0x8C57451103A5138Full, 0x7BF8B4BE18EAB402ull, 0x494102EB8761A365ull, 103 0xB33796A9F6A81F0Eull, 0x10005AB3BCCFD960ull}, 104 {0xB2CF25740AE965DCull, 0x6F7C1DF7EF53D670ull, 0x648DD6087AC2251Eull, 105 0x040955D9851D487Dull, 0xBD550FC7E21A7F66ull, 0x57408F484DEB3AB5ull, 106 0x481E24C150B506C1ull, 0x72C0C3EAF91A40D6ull}, 107 {0x1997A481858A5D39ull, 0x539718F4BEF50DC1ull, 0x2EC4DC4787E7E368ull, 108 0xFF1CE78879419845ull, 0xE219A93DD6F6DD30ull, 0x85328618D02FEC1Aull, 109 0xC86E02D969181B20ull, 0xEBEC8CD8BBA34E6Eull}, 110 {0x28B55088A16CE947ull, 0xDD25AC11E6350195ull, 0xBD1F176694257B1Cull, 111 0x09459CCF9FCC9402ull, 0xF8047341E386C4E4ull, 0x7E8E9A9AD984C6C0ull, 112 0xA4661E95062AA092ull, 0x70A9947005ED1152ull}, 113 {0x4C01CF75DBE98CCDull, 0x0BA076CDFC7373B9ull, 0x6C5E7A004B57FB59ull, 114 0x336B82297FD3BC56ull, 0x7990C0BE74E8D60Full, 0xF0275CC00EC5C8C8ull, 115 0x6CF29E682DFAD2E9ull, 0xFA4361524BD95D72ull}, 116 {0x631D2A19FF62F018ull, 0x41C43863B985B3FAull, 0xE052B2267038EFD9ull, 117 0xE2A535FAC575F430ull, 0xE004EEA90B1FF5B8ull, 0x42DFE2CA692A1F26ull, 118 0x90FB0BFC9A189ECCull, 0x4484102BD3536BD0ull}, 119 {0xD027134E9ACCA5A5ull, 0xBBAB4F966D476A9Bull, 0x713794A96E03D693ull, 120 0x9F6335E6B94CD44Aull, 0xC5090C80E7471617ull, 0x6D9C1B0C87B58E33ull, 121 0x1969CE82E31185A5ull, 0x2099B97E87754EBEull}, 122 {0x60EBAF4ED934350Full, 0xC26FBF0BA5E6ECFFull, 0x9E54150F0312EC57ull, 123 0x0973B48364ED0041ull, 0x800A523241426CFCull, 0x03AB5EC055F75989ull, 124 0x8CF315935DEEB40Aull, 0x83D3FC0190BD1409ull}, 125 {0x26D35394CF720A51ull, 0xCE9EAA15243CBAFEull, 0xE2B45FBAF21B29E0ull, 126 0xDB92E98EDE73F9E0ull, 0x79B16F5101C26387ull, 0x1AC15959DE88C86Full, 127 0x387633AEC6D6A580ull, 0xA6FC05807BFC5EB8ull}, 128 {0x2D26C8E47C6BADA9ull, 0x820E6EC832D52D73ull, 0xB8432C3E0ED0EE5Bull, 129 0x0F84B3C4063AAA87ull, 0xF393E4366854F651ull, 0x749E1B4D2366A567ull, 130 0x805EACA43480D004ull, 0x244EBF3AA54400A5ull}, 131 {0xBFDC3763AA79F75Aull, 0x9E3A74CC751F41DBull, 0xF401302A149DBC55ull, 132 0x6B25F7973D7BF7BCull, 0x13371D34FDBC3DAEull, 0xC5E1998C8F484DCDull, 133 0x7031B8AE5C364464ull, 0x3847F0C4F3DA2C25ull}, 134 {0x24C6387D2C0F1225ull, 0x77CCE960255C67A4ull, 0x21A0947E497B10EBull, 135 0xBB5DB73A825A9D7Eull, 0x26294A41999E553Dull, 0x3953E0089F87D925ull, 136 0x3DAE6E5D4E5EAAFEull, 0x74B545460341A7AAull}, 137 {0x710E5EB08A7DB820ull, 0x7E43C4E77CAEA025ull, 0xD4C91529C8B060C1ull, 138 0x09AE26D8A7B0CA29ull, 0xAB9F356BB360A772ull, 0xB68834A25F19F6E9ull, 139 0x79B8D9894C5734E2ull, 0xC6847E7C8FFD265Full}, 140 {0x10C4BCB06A5111E6ull, 0x57CB50955B6A2516ull, 0xEF53C87798B6995Full, 141 0xAB38E15BBD8D0197ull, 0xA51C6106EFF73C93ull, 0x83D7F0E2270A7134ull, 142 0x0923FD330397FCE5ull, 0xF9DE54EDFE58FB45ull}, 143 {0x07D44833ACCD1A94ull, 0xAAD3C9E945E2F9F3ull, 0xABF4C879B876AA37ull, 144 0xF29C69A21B301619ull, 0x2DDCE959111C788Bull, 0x7CEDB48F8AC1729Bull, 145 0x93F3BA9A02B659BEull, 0xF20A87FF17933CBEull}, 146 {0x8E96EBE93180CFE6ull, 0x94CAA12873937079ull, 0x05F613D9380D4189ull, 147 0xBCAB40C1DC79F38Aull, 0x0AD8907B7C61D19Eull, 0x88534E189D103910ull, 148 0x2DB2FAABA160AB8Full, 0xA070E7506B06F15Cull}, 149 {0x6FB1FCDAFFEF87A9ull, 0xE735CF25337A090Dull, 0x172C6EDCEFEF1825ull, 150 0x76957EA49EF0542Dull, 0x819BF4CD250F7C49ull, 0xD6FF23E4AD00C4D4ull, 151 0xE79673C1EC358FF0ull, 0xAC9C048144337938ull}, 152 {0x4C5387FF258B3AF4ull, 0xEDB68FAEC2CB1AA3ull, 0x02A624E67B4E1DA4ull, 153 0x5C44797A38E08AF2ull, 0x36546A70E9411B4Bull, 0x47C17B24D2FD9675ull, 154 0x101957AAA020CA26ull, 0x47A1619D4779F122ull}, 155 {0xF84B8BCDC92D9A3Cull, 0x951D7D2C74B3066Bull, 0x7AC287C06EDDD9B2ull, 156 0x4C38FC476608D38Full, 0x224D793B19CB4BCDull, 0x835A255899BF1A41ull, 157 0x4AD250E9F62DB4ABull, 0xD9B44F4B58781096ull}, 158 {0xABBAF99A8EB5C6B8ull, 0xFB568E900D3A9F56ull, 0x11EDF63D23C5DF11ull, 159 0xA9C3011D3FA7C5A8ull, 0xAEDD3CF11AFFF725ull, 0xABCA472B5F1EDD6Bull, 160 0x0600B6BB5D879804ull, 0xDB4DE007F22191A0ull}, 161 {0xD76CC9EFF0CE9392ull, 0xF5E0A772B59BA49Aull, 0x7D1AE1ED0C1261B5ull, 162 0x79224A33B5EA4F4Aull, 0x6DD825D80C40EA60ull, 0x47FC8E747E51C953ull, 163 0x695C05F72888BF98ull, 0x1A012428440B9015ull}, 164 {0xD754DD61F9B772BFull, 0xC4A2FCF4C0F9D4EBull, 0x461167CDF67A24A2ull, 165 0x434748490EBCB9D4ull, 0x274DD9CDCA5781DEull, 0x36BAC63BA9A85209ull, 166 0x30324DAFDA36B70Full, 0x337570DB4FE6DAB3ull}, 167 {0xF46CBDD57C551546ull, 0x8E02507E676DA3E3ull, 0xD826245A8C15406Dull, 168 0xDFB38A5B71113B72ull, 0x5EA38454C95B16B5ull, 0x28C054FB87ABF3E1ull, 169 0xAA2724C0BA1A8096ull, 0xECA83EC980304F2Full}, 170 {0x6AA76EC294EB3303ull, 0x42D4CDB2A8032E3Bull, 0x7999EDF75DCD8735ull, 171 0xB422BFFE696CCDCCull, 0x8F721461FD7CCDFEull, 0x148E1A5814FDE253ull, 172 0x4DC941F4375EF8FFull, 0x27B2A9E0EB5B49CFull}, 173 {0xCEA592EF9343EBE1ull, 0xF7D38B5FA7698903ull, 0x6CCBF352203FEAB6ull, 174 0x830F3095FCCDA9C5ull, 0xDBEEF4B81B81C8F4ull, 0x6D7EB9BCEECA5CF9ull, 175 0xC58ABB0FBE436C69ull, 0xE4B97E6DB2041A4Bull}, 176 {0x7E40FC772978AF14ull, 0xCDDA4BBAE28354A1ull, 0xE4F993B832C32613ull, 177 0xD3608093C68A4B35ull, 0x9A3B60E01BEE3699ull, 0x03BEF248F3288713ull, 178 0x70B9294318F3E9B4ull, 0x8D2ABB913B8610DEull}, 179 {0x37F209128E7D8B2Cull, 0x81D2AB375BD874BCull, 0xA716A1B7373F7408ull, 180 0x0CEE97BEC4706540ull, 0xA40C5FD9CDBC1512ull, 0x73CAF6C8918409E7ull, 181 0x45E11BCEDF0BBAA1ull, 0x612C612BFF6E6605ull}, 182 {0xF8ECB14A12D0F649ull, 0xDA683CD7C01BA1ACull, 0xA2203F7510E124C1ull, 183 0x7F83E52E162F3C78ull, 0x77D2BB73456ACADBull, 0x37FC34FC840BBA6Full, 184 0x3076BC7D4C6EBC1Full, 0x4F514123632B5FA9ull}, 185 {0x44D789DED935E884ull, 0xF8291591E09FEC9Full, 0xD9CED2CF32A2E4B7ull, 186 0x95F70E1EB604904Aull, 0xDE438FE43C14F6ABull, 0x4C8D23E4FAFCF8D8ull, 187 0xC716910A3067EB86ull, 0x3D6B7915315095D3ull}, 188 {0x3170FDBADAB92095ull, 0x8F1963933FC5650Bull, 0x72F94F00ABECFEABull, 189 0x6E3AE826C6AAB4CEull, 0xA677A2BF31068258ull, 0x9660CDC4F363AF10ull, 190 0xD81A15A152379EF1ull, 0x5D7D285E1080A3F9ull}, 191 {0xDAD5DDFF9A2249B3ull, 0x6F9721D926103FAEull, 0x1418CBB83FFA349Aull, 192 0xE71A30AD48C012B2ull, 0xBE76376C63751132ull, 0x3496467ACA713AE6ull, 193 0x8D7EC01369F991A3ull, 0xD8C73A88B96B154Eull}, 194 {0x8B5D9C74AEB4833Aull, 0xF914FB3F867B912Full, 0xB894EA034936B1DCull, 195 0x8A16D21BE51C4F5Bull, 0x31FF048ED582D98Eull, 0xB95AB2F4DC65B820ull, 196 0x04082B9170561AF7ull, 0xA215610A5DC836FAull}, 197 {0xB2ADE592C092FAACull, 0x7A1E683BCBF13294ull, 0xC7A4DBF86858C096ull, 198 0x3A49940F97BFF316ull, 0xCAE5C06B82C46703ull, 0xC7F413A0F951E2BDull, 199 0x6665E7BB10EB5916ull, 0x86F84A5A94EDE319ull}, 200 {0x4EA199D8FAA79CA3ull, 0xDFA26E5BF1981704ull, 0x0F5E081D37FA4E01ull, 201 0x9CB632F89CD675CDull, 0x4A09DB89D48C0304ull, 0x88142742EA3C7672ull, 202 0xAC4F149E6D2E9BDBull, 0x6D9E1C23F8B1C6C6ull}, 203 {0xD58BE47B92DEC0E9ull, 0x8E57573645E34328ull, 0x4CC094CCB5FB5126ull, 204 0x5F1D66AF6FB40E3Cull, 0x2BA15509132D3B00ull, 0x0D6545646120E567ull, 205 0x3CF680C45C223666ull, 0x96B28E32930179DAull}, 206 {0x5900C45853AC7990ull, 0x61881E3E8B7FF169ull, 0x4DE5F835DF2230FFull, 207 0x4427A9E7932F73FFull, 0x9B641BAD379A8C8Dull, 0xDF271E5BF98F4E5Cull, 208 0xDFDA16DB830FF5EEull, 0x371C7E7CFB89C0E9ull}, 209 {0x4410A8576247A250ull, 0x6AD2DA12B45AC0D9ull, 0x18DFC72AAC85EECCull, 210 0x06FC8BB2A0EF25C8ull, 0xEB287619C85E6118ull, 0x19553ECA67F25A2Cull, 211 0x3B9557F1DCEC5BAAull, 0x7BAD9E8B710D1079ull}, 212 {0x34F365D66BD22B28ull, 0xE6E124B9F10F835Dull, 0x0573C38ABF2B24DCull, 213 0xD32E6AF10A0125AEull, 0x383590ACEA979519ull, 0x8376ED7A39E28205ull, 214 0xF0B7F184DCBDA435ull, 0x062A203390E31794ull}, 215 {0xA2AFFD7E41918760ull, 0x7F90FC1BD0819C86ull, 0x5033C08E5A969533ull, 216 0x2707AF5C6D039590ull, 0x57BBD5980F17DF9Cull, 0xD3FE6E61D763268Aull, 217 0x9E0A0AE40F335A3Bull, 0x43CF4EB0A99613C5ull}, 218 {0xD4D2A397CE1A7C2Eull, 0x3DF7CE7CC3212DADull, 0x0880F0D5D356C75Aull, 219 0xA8AFC44DD03B1346ull, 0x79263B46C13A29E0ull, 0x11071B3C0ED58E7Aull, 220 0xED46DC9F538406BFull, 0x2C94974F2B94843Dull}, 221 {0xE246E13C39AB5D5Eull, 0xAC1018489D955B20ull, 0x8601B558771852B8ull, 222 0x110BD4C06DB40173ull, 0x738FC8A18CCA0EBBull, 0x6673E09BE0EA76E5ull, 223 0x024BC7A0C7527877ull, 0x45E6B4652E2EC34Eull}, 224 {0xD1ED26A1A375CDC8ull, 0xAABC4E896A617CB8ull, 0x0A9C9E8E57D753C6ull, 225 0xA3774A75FEB4C30Eull, 0x30B816C01C93E49Eull, 0xF405BABC06D2408Cull, 226 0xCC0CE6B4CE788ABCull, 0x75E7922D0447956Cull}, 227 {0xD07C1676A698BC95ull, 0x5F9AEA4840E2D860ull, 0xD5FC10D58BDF6F02ull, 228 0xF190A2AD4BC2EEA7ull, 0x0C24D11F51726931ull, 0xDB646899A16B6512ull, 229 0x7BC10670047B1DD8ull, 0x2413A5ABCD45F092ull}, 230 {0x4E66892190CFD923ull, 0xF10162440365EC8Eull, 0x158ACA5A6A2280AEull, 231 0x0D60ED11C0224166ull, 0x7CD2E9A71B9D7488ull, 0x450D7289706AB2A3ull, 232 0x88FAE34EC9A0D7DCull, 0x96FF9103575A97DAull}, 233 {0x77990FAC6046C446ull, 0xB174B5FB30C76676ull, 0xE352CE3EB56CF82Aull, 234 0xC6039B6873A9A082ull, 0xE3F80F3AE333148Aull, 0xB853BA24BA3539B9ull, 235 0xE8863E52ECCB0C74ull, 0x309B4CC1092CC245ull}, 236 {0xBC2B70BEE8388D9Full, 0xE48D92AE22216DCEull, 0xF15F3BF3E2C15D8Full, 237 0x1DD964D4812D8B24ull, 0xD56AF02FB4665E4Cull, 0x98002200595BD9A3ull, 238 0x049246D50BB8FA12ull, 0x1B542DF485B579B9ull}, 239 {0x2347409ADFA8E497ull, 0x36015C2211D62498ull, 0xE9F141F32EB82690ull, 240 0x1F839912D0449FB9ull, 0x4E4DCFFF2D02D97Cull, 0xF8A03AB4C0F625C9ull, 241 0x0605F575795DAC5Cull, 0x4746C9BEA0DDA6B1ull}, 242 {0xCA5BB519ECE7481Bull, 0xFD496155E55CA945ull, 0xF753B9DBB1515F81ull, 243 0x50549E8BAC0F70E7ull, 0x8614FB0271E21C60ull, 0x60C72947EB0F0070ull, 244 0xA6511C10AEE742B6ull, 0x48FB48F2CACCB43Eull}}; 245 246 #endif // PRINT_RESULTS 247 248 // Ensures Xorshift128+ returns consistent and unchanging values. 249 void TestGolden() { 250 HWY_ALIGN Xorshift128Plus rng(12345); 251 for (uint64_t vector = 0; vector < kVectors; ++vector) { 252 HWY_ALIGN uint64_t lanes[Xorshift128Plus::N]; 253 rng.Fill(lanes); 254 #if PRINT_RESULTS 255 Print(lanes); 256 #else 257 for (size_t i = 0; i < Xorshift128Plus::N; ++i) { 258 ASSERT_EQ(kExpected[vector][i], lanes[i]) 259 << "Where vector=" << vector << " i=" << i; 260 } 261 #endif 262 } 263 } 264 265 // Output changes when given different seeds 266 void TestSeedChanges() { 267 HWY_ALIGN uint64_t lanes[Xorshift128Plus::N]; 268 269 std::vector<uint64_t> first; 270 constexpr size_t kNumSeeds = 16384; 271 first.reserve(kNumSeeds); 272 273 // All 14-bit seeds 274 for (size_t seed = 0; seed < kNumSeeds; ++seed) { 275 HWY_ALIGN Xorshift128Plus rng(seed); 276 277 rng.Fill(lanes); 278 first.push_back(lanes[0]); 279 } 280 281 // All outputs are unique 282 ASSERT_EQ(kNumSeeds, first.size()); 283 std::sort(first.begin(), first.end()); 284 first.erase(std::unique(first.begin(), first.end()), first.end()); 285 EXPECT_EQ(kNumSeeds, first.size()); 286 } 287 288 void TestFloat() { 289 test::ThreadPoolForTests pool(8); 290 291 #ifdef JXL_DISABLE_SLOW_TESTS 292 const uint32_t kMaxSeed = 256; 293 #else // JXL_DISABLE_SLOW_TESTS 294 const uint32_t kMaxSeed = 4096; 295 #endif // JXL_DISABLE_SLOW_TESTS 296 EXPECT_TRUE(RunOnPool( 297 &pool, 0, kMaxSeed, ThreadPool::NoInit, 298 [](const uint32_t seed, size_t /*thread*/) { 299 HWY_ALIGN Xorshift128Plus rng(seed); 300 301 const HWY_FULL(uint32_t) du; 302 const HWY_FULL(float) df; 303 HWY_ALIGN uint64_t batch[Xorshift128Plus::N]; 304 HWY_ALIGN float lanes[MaxLanes(df)]; 305 double sum = 0.0; 306 size_t count = 0; 307 const size_t kReps = 2000; 308 for (size_t reps = 0; reps < kReps; ++reps) { 309 rng.Fill(batch); 310 for (size_t i = 0; i < Xorshift128Plus::N * 2; i += Lanes(df)) { 311 const auto bits = 312 Load(du, reinterpret_cast<const uint32_t*>(batch) + i); 313 // 1.0 + 23 random mantissa bits = [1, 2) 314 const auto rand12 = 315 BitCast(df, Or(ShiftRight<9>(bits), Set(du, 0x3F800000))); 316 const auto rand01 = Sub(rand12, Set(df, 1.0f)); 317 Store(rand01, df, lanes); 318 for (float lane : lanes) { 319 sum += lane; 320 count += 1; 321 EXPECT_LE(lane, 1.0f); 322 EXPECT_GE(lane, 0.0f); 323 } 324 } 325 } 326 327 // Verify average (uniform distribution) 328 EXPECT_NEAR(0.5, sum / count, 0.00702); 329 }, 330 "TestXorShift")); 331 } 332 333 // Not more than one 64-bit zero 334 void TestNotZero() { 335 test::ThreadPoolForTests pool(8); 336 337 #ifdef JXL_DISABLE_SLOW_TESTS 338 const uint32_t kMaxSeed = 500; 339 #else // JXL_DISABLE_SLOW_TESTS 340 const uint32_t kMaxSeed = 2000; 341 #endif // JXL_DISABLE_SLOW_TESTS 342 EXPECT_TRUE(RunOnPool( 343 &pool, 0, kMaxSeed, ThreadPool::NoInit, 344 [](const uint32_t task, size_t /*thread*/) { 345 HWY_ALIGN uint64_t lanes[Xorshift128Plus::N]; 346 347 HWY_ALIGN Xorshift128Plus rng(task); 348 size_t num_zero = 0; 349 for (size_t vectors = 0; vectors < 10000; ++vectors) { 350 rng.Fill(lanes); 351 for (uint64_t lane : lanes) { 352 num_zero += static_cast<size_t>(lane == 0); 353 } 354 } 355 EXPECT_LE(num_zero, 1u); 356 }, 357 "TestNotZero")); 358 } 359 360 // NOLINTNEXTLINE(google-readability-namespace-comments) 361 } // namespace HWY_NAMESPACE 362 } // namespace jxl 363 HWY_AFTER_NAMESPACE(); 364 365 #if HWY_ONCE 366 namespace jxl { 367 368 class Xorshift128Test : public hwy::TestWithParamTarget {}; 369 370 HWY_TARGET_INSTANTIATE_TEST_SUITE_P(Xorshift128Test); 371 372 HWY_EXPORT_AND_TEST_P(Xorshift128Test, TestNotZero); 373 HWY_EXPORT_AND_TEST_P(Xorshift128Test, TestGolden); 374 HWY_EXPORT_AND_TEST_P(Xorshift128Test, TestSeedChanges); 375 HWY_EXPORT_AND_TEST_P(Xorshift128Test, TestFloat); 376 377 } // namespace jxl 378 #endif