BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Защо е имплементирано така
Bender
Публикувано на: 05-12-2017, 23:02
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 4873
Регистриран на: 19.06.14



Защо е имплементирано така [1]


CODE
uint64_t s[2];

static inline uint64_t rotl(const uint64_t x, int k) {
      return (x << k) | (x >> (64 - k));
}

uint64_t next(void) {
      const uint64_t s0 = s[0];
      uint64_t s1 = s[1];
      const uint64_t result = s0 + s1;

      s1 ^= s0;
      s[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14); // a, b
      s[1] = rotl(s1, 36); // c

      return result;
}


А не по по-кратък начин ?

CODE

uint64_t next(void) {
      const uint64_t x = s[1] ^ s[0];
      s[0] = rotl(s[0], 55) ^ x ^ (x << 14);
      s[1] = rotl(x, 36);
      return s[0] + s[1];


Даже може да махнем и променливата X:

CODE

uint64_t next(void) {
      s[1] ^= s[0];
      s[0] = rotl(s[0], 55) ^ s[1] ^ (s[1] << 14);
      s[1] = rotl(s[1], 36);
      return s[0] + s[1];


Наистина вариант 1 не точно еквивалентен на 2, защото 2 реално е едно извикване напред, но тъй като става въпрос за случайни числа, то това не е от значение. Та интересно ми е къде е далаверата да се напише по по-дългия и сложен начин вместо по по-краткия ?
[1] http://xoroshiro.di.unimi.it/xoroshiro128plus.c


--------------------
Живота е спагети, кода за да работи добре трябва да го наподобява - Дон Реба
...
Живеем в греховни времена, какво очакваш богоугоден и благочестив код ли? - Дон Реба
...
много положителна енергия черпя от вас двамата,единият комунистически девствен,другият яко яхнал асемблерните розови понита - saruman
...
Рано или късно усерите на Виндофс разбират че стоят от неправилната страна на хуя. - ici
PM
Top
saruman
Публикувано на: 05-12-2017, 23:15
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1655
Регистриран на: 21.07.10



Според мен заради тоя конст

CODE
const uint64_t s0 = s[0];


--------------------
http://www.wefunkradio.com/radio/

Remember,remember the fifth of November
PMEmail Poster
Top
martinradev
Публикувано на: 05-12-2017, 23:18
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 244
Регистриран на: 06.08.14



CODE


const uint64_t result = s0 + s1;

... modify s[0] and s[1]

return result



vs

CODE


... modify s[0] and s[1]

return s[0] + s[1]


I wonder.

PMEmail Poster
Top
saruman
Публикувано на: 05-12-2017, 23:24
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1655
Регистриран на: 21.07.10



Ааа да,аз чак сега забелязах,че навсякъде копия,мноо бъгав тоя код Бендере,къде си се завирал пак по кофите icon_lol.gif


--------------------
http://www.wefunkradio.com/radio/

Remember,remember the fifth of November
PMEmail Poster
Top
Bender
Публикувано на: 05-12-2017, 23:30
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 4873
Регистриран на: 19.06.14



QUOTE (martinradev @ 06-12-2017, 00:18)
CODE


const uint64_t result = s0 + s1;

... modify s[0] and s[1]

return result



vs

CODE


... modify s[0] and s[1]

return s[0] + s[1]


I wonder.

Няма какво да се чудиш - това е генератор на псевдо случайни числа. Представи си че оригинала започва с 1вото число от редицата, докато съкратената версия - от второто, но в крайна сметка редицата е една и съща. Та затова не мога да си обясня тия копия и константи дето на практика са ненужни (или поне така изглежда)

QUOTE
Ааа да,аз чак сега забелязах,че навсякъде копия,мноо бъгав тоя код Бендере,къде си се завирал пак по кофите icon_lol.gif
Ти пък, това професори, умни хора са го писали :Д

Чудя се дали няма общо с паралелизъм на ниво инструкции в pipeline-a на процесора, но не съм толкова навътре в нещата


--------------------
Живота е спагети, кода за да работи добре трябва да го наподобява - Дон Реба
...
Живеем в греховни времена, какво очакваш богоугоден и благочестив код ли? - Дон Реба
...
много положителна енергия черпя от вас двамата,единият комунистически девствен,другият яко яхнал асемблерните розови понита - saruman
...
Рано или късно усерите на Виндофс разбират че стоят от неправилната страна на хуя. - ici
PM
Top
saruman
Публикувано на: 05-12-2017, 23:35
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1655
Регистриран на: 21.07.10



QUOTE (Bender @ 05-12-2017, 23:30)
Ти пък, това професори, умни хора са го писали :Д

Чудя се дали няма общо с паралелизъм на ниво инструкции в pipeline-a на процесора, но не съм толкова навътре в нещата

ЪЪ,тъп съм и аз,отказвам се,време е Шелдън да ни образова малко от позицията на ПеХаДе в Тесла Моторс icon_wink.gif


--------------------
http://www.wefunkradio.com/radio/

Remember,remember the fifth of November
PMEmail Poster
Top
martinradev
Публикувано на: 06-12-2017, 00:05
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 244
Регистриран на: 06.08.14



QUOTE (Bender @ 05-12-2017, 23:30)
QUOTE (martinradev @ 06-12-2017, 00:18)
CODE


const uint64_t result = s0 + s1;

... modify s[0] and s[1]

return result



vs

CODE


... modify s[0] and s[1]

return s[0] + s[1]


I wonder.

Няма какво да се чудиш - това е генератор на псевдо случайни числа. Представи си че оригинала започва с 1вото число от редицата, докато съкратената версия - от второто, но в крайна сметка редицата е една и съща. Та затова не мога да си обясня тия копия и константи дето на практика са ненужни (или поне така изглежда)

QUOTE
Ааа да,аз чак сега забелязах,че навсякъде копия,мноо бъгав тоя код Бендере,къде си се завирал пак по кофите icon_lol.gif
Ти пък, това професори, умни хора са го писали :Д

Чудя се дали няма общо с паралелизъм на ниво инструкции в pipeline-a на процесора, но не съм толкова навътре в нещата

Това е единствената разлика в двата кода. Какво друго очакваш?
PMEmail Poster
Top
Дон Реба
Публикувано на: 06-12-2017, 07:34
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5779
Регистриран на: 11.11.06



според мен просто е преписан папирус някакъв, не че има голяма разлика. втория вариант дори ми изглежда по-читав, защото ако с1 и с0 не са много случайни в началото, първо разджурква, после връща резултата, докато първия връща директно, демек първото извикване след инит ще е по-малко случайно при първия вариант
PM
Top
gat3way
Публикувано на: 06-12-2017, 10:16
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1724
Регистриран на: 22.06.12



Микрооптимизации са това, а дали има смисъл зависи от контекста (целия сорс ме мързи да го гледам, разсъждавам върху примера само).

Кеширането на глобалната променлива в локална има смисъл поради две причини - първата е че така компилаторът има по-голяма вероятност да държи стойността й в регистър вместо да я презарежда от/записва в паметта всеки път когато я достъпваш. А достъпа до регистрите е с порядъци по-бърз от достъпа до паметта, дори ако става въпрос за нещо в кеша.

Втората причина е че по презюмпция паметта алокирана в стека е "гореща памет", т.е стек фрейма е достъпван много наскоро (при викане на функцията) и с много голяма вероятност е в кеша. Тя s въпреки че е глобална променлива все пак се достъпва често и файдата от цялата работа е почти никаква в случая обаче.
PMEmail Poster
Top
kierenski
Публикувано на: 06-12-2017, 10:43
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 135
Регистриран на: 10.01.16



QUOTE (gat3way @ 06-12-2017, 10:16)
Микрооптимизации са това, а дали има смисъл зависи от контекста (целия сорс ме мързи да го гледам, разсъждавам върху примера само).

Кеширането на глобалната променлива в локална има смисъл поради две причини - първата е че така компилаторът има по-голяма вероятност да държи стойността й в регистър вместо да я презарежда от/записва в паметта всеки път когато я достъпваш. А достъпа до регистрите е с порядъци по-бърз от достъпа до паметта, дори ако става въпрос за нещо в кеша.

Втората причина е че по презюмпция паметта алокирана в стека е "гореща памет", т.е стек фрейма е достъпван много наскоро (при викане на функцията) и с много голяма вероятност е в кеша. Тя s въпреки че е глобална променлива все пак се достъпва често и файдата от цялата работа е почти никаква в случая обаче.

+1
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0