Size: a a a

2021 April 16

ΑZ

Αλεχ Zhukovsky in rust_offtopic
обычно берут какой-нибудь нормальный алгоритм типа Мерсенна (MT19937) и его с книжки списывают прост.
Не понял при чем тут флоаты. Floats are just new integers
источник

DP

Defragmented Panda in rust_offtopic
15*3 mod 32 = 13
тут остались младшие биты. то как работают int в cpu, overflow, часто делают mod 2^32 например

floor (15*3 / 32) = 1
тут остались только старшие биты. так работает gpu.

я не могу использовать алгоритмы которые опираются на эффект (overflow) которого нет в gpu. а без него потребление памяти и скорость падают в разы если я буду пытаться делать полное умножение без потерь бит.

если у меня есть 10 бит, 2 числа, то результат умножения занимает 20 бит. но отдельно 10 верхних и 10 нижних бит обычно не дают. Дают или верхние (gpu) или нижние (cpu). существенная разница на мой взгляд
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Ну так кто знал что ты про гпу.

Судя по всему интеджер оверфлоу на гпу - UB, так что никак не сделать
источник

DP

Defragmented Panda in rust_offtopic
если я правильно понимаю, польза старших и младших бит для гпсч одинаково ценна

т.е. в теории можно построить другой гпсч, опираясь не на overflow (где берут младшие биты), а float (старшие биты)

возможно заменив + на -, чтобы изменения шли в нужном направлении по ряду бит

но все алгоритмы что я видел для gpu просто случайным образом берут кучу формул, не заботясь о полном периоде
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
старшие и младшие биты это вообще ерунда. А то у тебя получается что качество ГПСЧ зависит от endianness числа)) Что конечно же ерунда.

Число это просто массив бит, порядок нам неважен. Нам важно чтобы каждый нолик и единичка имели равномерное распределение. А старшие они младшие или ещё какие - пофиг
источник

DP

Defragmented Panda in rust_offtopic
ненене, я про endianness даже не говорю )

я имею ввиду что умножение двух больших чисел требует в 2 раза больше места. обычно это называют high bits, low bits

32бит * 32 бит = 64 бит результат
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
ну и что? Ты отбрасываешь половину бит. Какую половину: старшую, младшую или все четные например - плевать. Если качество каждого бита в отдельности правильное, то отбрасывать можно любые
источник

DP

Defragmented Panda in rust_offtopic
вот я так же думаю

и в теории этой половины бит достаточно чтобы сделать гпсч

но я не знаю как
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
хз, с рандомом легко накосячить. например Z = X + Y дают треугольное распределение а не равномерное, для равномерных X и Y
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
но на уровне бит по идеевсе должно работать как угодно. Просто легко сделать бессмысленные пассы руками которые в лучшем случае ничего не улучшают)
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
а в худшем портят качество распределения
источник

DP

Defragmented Panda in rust_offtopic
вооот. поэтому я и подумал что кто-то умный это таки решил уже )
источник

KR

Kai Ren in rust_offtopic
Так а папиры prng for gpu гуглил?
источник

KR

Kai Ren in rust_offtopic
Вот, к примеру, сходу в выдаче:
https://ieeexplore.ieee.org/document/4630894
источник

KR

Kai Ren in rust_offtopic
Ох блин, его не скачать >_<
источник

KR

Kai Ren in rust_offtopic
источник

p

polunin.ai in rust_offtopic
Так так вы о чем
источник

p

polunin.ai in rust_offtopic
Рандомные числа с гпу генерить нельхя
источник

p

polunin.ai in rust_offtopic
Точнее можно но seed придется пробрасывать сверху
источник

KR

Kai Ren in rust_offtopic
Ну вот по линку последнему так и пишут в конце. А ты уже всё знаешь, умница!
источник