Perl 6 - the future is here, just unevenly distributed

IRC log for #divine, 2014-03-26

| Channels | #divine index | Today | | Search | Google Search | Plain-Text | summary

All times shown according to UTC.

Time Nick Message
13:36 spito joined #divine
14:10 spito joined #divine
14:10 spito ad concurrentSet - ta chyba tam je, ale není úplně tam, kde ji hledáte
14:13 mornfall spito: a kde je? :-)
14:13 spito "hm, podle mě je ale blbě ta invalidace (souběh insertCell a rehashSegment): rehash,269: it->empty() uspěje ~> insert,198: cell.empty() uspěje, cell.tryStore uspěje ~> rehash,168: it->invalidate" - to máš pravdu, problém je ale v tom, že vkládající vlákno se vůbec nemá dostat tak daleko, pokud dochází ke zvětšování
14:14 spito http://divine.fi.muni.cz/trac/browser/divine/toolkit/concurrentset.h?rev=4531
14:14 spito tohle bylo blbě
14:15 mornfall :D
14:16 spito rehash it->empty() uspěje, cell.empty() uspěje, cell.tryStore zkusí vložit, ale nepodaří se mu to, protože je poznačeno, že se zvětšuje, takže sám invaliduje buňku a restartuje se
14:16 spito chjo
14:16 spito mornfall: dává to teď už smysl?
14:16 mornfall snad :-)
14:17 mornfall ale AtomicCell je furt blbě i když se tohle opraví, myslim
14:17 mornfall nebo ne?
14:17 mornfall teď nevim jestli ten invalid vůbec potřebujeme když tam není potřeba wait()
14:17 mornfall ůůůů
14:17 mornfall něco se rozbilo
14:18 mornfall hm, už to zase funguje
14:18 mornfall wat :-)
14:18 mornfall xstill: co myslíš?
14:30 spito ad "nehledě na to, že nechápu proč se buňka invaliduje potom co se přesune a ne před tím" - to je proto, že pak stačí mít 4 stavy buňky - empty, writing, nonempty, invalid
14:31 spito pokud by se provedla invalidace předtím, tak musíš mít více stavů - musíš nakombinovat (in)valid s (non)empty a writing
15:01 spito ad AtomicCell - celý to s invalidním příznakem je divný
15:20 xstill spito: nemusíš mít víc stavů, stačí ti vrátit starou buňku z invalidate. ale to nepomohlo
15:21 xstill můžeš být trochu konkrétnější k tomu "tohle bylo blbě"?
15:22 spito ten patch byl blbě
15:22 spito celý
15:22 xstill a jakto, že nevadí ta invalidace? Jak to vlákno co vkládá ví, že se zvětšuje, co když se zrovna začalo zvětšovat?
15:23 spito předtím, než se začne zvětšovat, se nastaví příznak
15:23 xstill kterej?
15:23 xstill aha growing asi
15:24 xstill ale nevidím kde by se ten použil v insert
15:24 spito hmm
15:25 spito tak jo, je tam pořád bug
15:25 xstill jako ten invalidate jsem vyřešil, můžu poslat patch
15:25 spito ten guard (odebraný v patchi 4531) nebyl kompletní
15:25 spito invaliduješ před kontrolou?
15:25 xstill jo
15:26 spito jak poznáš prázdnou a plnou buňku?
15:26 xstill vrátím bunku jak byla předtím z invalidate
15:26 xstill stačilo by vrátit jen stav, ale kvůli hashi v FastAtomicCell vracím celou buňku
15:27 xstill můžu po poslat a podíváš se na to
15:28 spito nojo, ale pořád máš problém - insert- poznačí zápis; growing - invalidate; (v tomto místě máš prázdnou buňku); insert - zapíše obsah a skončí bez dalších kontrol ----> ztratil jsi právě zapsanou hodnotu
15:29 spito invalidate před nebo po přesunu nic nemění, musí se zkontrolovat po zápisu do buňky, že je všechno stále validní
15:29 xstill jo myslíš že insert přepíše invalidate?
15:29 xstill to jsem taky opravil
15:29 xstill invalidate čeká na zápis
15:29 xstill pokud je buňka zamknutá
15:30 xstill ten patch by měl být odeslanej
15:31 xstill spito: tak se na ten patch pak podívej jestli to využiješ k tomu abys to opravdu spravil
15:32 xstill hm, akorát teda se mi povedlo rozbít jednou haldu, tak nevím
15:33 spito shared tabulkou?
15:34 xstill asi, před tím se to nestávalo, ale bylo to dost divný, double free or corruption
15:34 spito a nevíš, kde to lehlo?
15:34 xstill tuším v updateIndex
15:34 xstill ale už nemám ten výpis
15:35 xstill pouštěl jsem v cyklu test moment
15:35 xstill divine-test ConcurrentSet pStressCS
15:35 xstill nejspíš
15:36 xstill teda ono to šlo tuším z vektoru
15:36 xstill bohužel jsem si neuložil ten výpis a restartoval počítač
15:37 xstill (a musíš mít vytížený cpu aby ten assert failnul)
15:38 spito jo, já už vim
15:38 spito :D a taky vim, proč jsem tam používal pointry
15:39 xstill ?
15:41 spito 307 vs 313-319
15:42 spito do té podmínky může padnout víc vláken
15:42 spito ^--- podmínka na 307
15:43 xstill hmm
15:44 xstill takže potřebuješ atomic pointer místo vektoru v podstatě?
15:44 spito ale né, já jsem vůl.....korunovanej
15:44 spito jistě, že nepotřebuješ
15:44 spito stačí umět počítat
15:48 xstill hm, počkej pokud bys se stalo že dvě vlákna zovaljí acquireRow na řádek který má 0 workerů tak můžou se proložit takto, ne: A: ++tableWorkers, --tableWorkers ~> B: totéž: ~> A: assing ~> B: assing; bum, máš double free, ne?
15:48 xstill (~> je switch)
15:50 spito no samozřejmě
15:50 spito ono může být jedno vlákno oprávněný vlastník a to druhé omylný vlastník
15:52 xstill to s těma vlastníkama asi nechápu. Ale teda to nemohlo asi nastat v tom testu kde jsou jen 2 vlákna
15:53 spito mohlo právě
15:53 xstill hm
15:54 xstill jako že jedno dělá normální release protože zvětšuje tabulku a druhý "omylem" udělá acquire na ten starej řádek?
15:55 spito vlákno A chce zcela po právu odstranit řádek i, protože předtím si vyrobilo řádek i+1....vlákno B zjistilo, že řádek i-1 je zastaralý, ale má chybnou hodnotu nového řádku (jenom i, nikoliv i+1), takže zkusí si zabrat řádek i, jenže pak zkontroluje, že má nevyhovující hodnotu aktuálního řádku, tak to jde napravi.....vlákno A maže řádek......vlákno B maže....BUM
15:56 xstill (hm, super aura má load 567)
15:56 spito jop
15:58 xstill hm, a navíc je to bug který v praxi skoro nenastane protože ta tabulka má velkou počáteční velikost
15:59 spito ono by to šlo opravit jednoduše - http://pastebin.dqd.cz/mhUg/
15:59 spito s jedním malým detailem - tohle skončí v nekonečným cyklu :D
16:00 mornfall jo, ale to je takový drobný detail :P
16:00 spito protože iniciální řádek nemá zabraný nikdo
16:00 spito mornfall: přesně
16:00 mornfall navíc to čtení refcount by asi mělo být uvnitř toho cyklu ne? :-)
16:01 mornfall přečteš refcount nějakýho řádku a pak se ho snažíš nacpat do jinýho...
16:01 mornfall hm
16:01 xstill compare_exchange aktualizuje refCount
16:01 mornfall asi ne
16:02 mornfall zejména ten index = ... je jen když je refCount 0
16:02 mornfall ale stejně se mi to úplně nezdá
16:03 xstill no to dává smysl, ne? Pokud není 0 tak ho můžeš použít a nemusíš se posunout
16:04 spito přesně, protože u všech další řádků nastavuje iniciální hodnotu to vlákno, které alokovalo
16:04 spito takže tam bude nejmíň 1
16:05 mornfall ale jo, mohlo by to fungovat
16:05 mornfall a dokonce se to asi ani nezacyklí
16:06 mornfall i když tam je na začátku nula, tak index se stejně nezmění a celý to projde, ni?
16:06 spito vlastně jo
16:06 mornfall taky ten cas může být weak, řekl bych
16:07 spito ne, nebude to fungovat dobře
16:10 spito http://pastebin.dqd.cz/RWcc/
16:11 mornfall spito: no to ti jen ušetří jednu iteraci ne?
16:11 spito neušetří
16:11 spito to předtím nebylo korektní
16:11 mornfall spito: ten cas udělá to stejný
16:12 mornfall (krom toho if ( index ) teda, který je přinejmenším podezřelý)
16:13 spito A přečte refCount (=0), takže spadne do podmínky......aktualizuje si index (třeba =3), ale to vtom momentě B odmazává řádek 3.....A si vesela zabere řádek 3
16:13 spito je potřeba to znovu projet
16:14 spito a ve všech případech, kdy je refCount==0 je nutné po změně indexu ho načíst znova, kromě prvního řádku
16:14 mornfall však ten cas ho načte
16:15 spito ne, když se zrovna trefí do okna, kdy je na dalším řádku taky refCount==0
16:16 mornfall no, to že tu nulu načte ještě explicitně předtím na tom nic nezmění ale
16:17 spito chceš to namalovat?
16:18 spito (ale nemám foťák :D)
16:21 mornfall ok, vidim rozdíl -- tohle cyklí dokud je tam nula
16:21 mornfall přijde mi že to může taky cyklit donekonečna takhle :-)
16:21 spito ale stejně to nebude úplně korektní....chjo
16:22 spito nemůže, protože někde je aktuální řádek, který nemá refCount==0
16:23 mornfall jo, pravda
16:23 spito na co? na oboje?
16:24 mornfall na to že jednou to ten řádek doběhnout musí
16:24 mornfall (asi)
16:24 spito určitě
16:24 mornfall někde se čeká v grow až se ukážou všichni jo?
16:25 spito vzhledem k velikosti RAM pamětí je v dohledné době zaručeno, že dřív dostaneš OOM než že bys vyjel z indexu tabulky
16:25 mornfall :D
16:25 spito jo, čeká se na posledního, který přesouvá buňky
16:26 mornfall no a co je teda na téhle verzi špatně? :)
16:26 spito že to zase může chytnout okno, pokud se bude hrabat kolem 1. řádku
16:28 mornfall no a jak se může stát že ten if na 308 chytnou dvě vlákna najednou?
16:29 * spito v 16:55
16:29 mornfall no to mi právě není jasný :)
16:29 mornfall hmm
16:29 mornfall ten refcount může klesnout na nulu dvakrát
16:29 mornfall říkáš
16:29 spito jop
16:30 mornfall tzn. že někdo ho může z nuly zvýšit
16:30 spito někdo ho _musí_ navýšit
16:30 mornfall no, někdo kdo není ten první, žejo :)
16:31 mornfall jo, problému teď rozumim
16:31 spito ten první ho právě musí dostat 0 -> 1, ostatní by to měli mít zakázaný
16:31 spito jako flag by to řešil
16:31 spito asi
16:32 spito jo, flag by to řešil
16:32 mornfall co tak udělat cas v acquireRow?
16:33 mornfall šmaria
16:33 spito to by pomohlo čemu?
16:33 mornfall už blbnu :D
16:33 mornfall no to je to cos udělal žejo ;-)
16:33 spito jo
16:33 spito no já taky
16:34 spito a pořád přemýšlím nad tím, kterej blbec vymyslel tuhle datovou strukturu
16:34 mornfall ahem :P
16:35 spito jako jo, ty jsi mě do toho dokopal.....ale implementaci jsem si vymýšlel sám
16:35 mornfall já bych to vrátil do stavu že Row = std::atomic< Cell * > asi :-)
16:35 xstill a co kdyby row byl atomic pointer a release by dělalo auto old = _d.table[ index ].exchange( nullptr ); if ( old ) delete[] old
16:35 xstill hm :-D
16:36 mornfall xstill: mám pocit že tak jsem to původně vymyslel, ale spito tam chtěl vektor :D
16:36 mornfall (je možný že load ne-atomic pointru je rychlejší než load atomic pointru...)
16:36 mornfall (ale moc bych na to nevsadil zase)
16:37 xstill ne pokud děláš load( memory_order_relaxed )
16:37 xstill teda na x86 je údajně jen  memory_order_seq_cst pomalejší
16:37 xstill pro load
16:38 xstill ale to je samozřejmě default
16:38 xstill (je tam prej bariéra)
16:38 mornfall na bariéru se asi můžem vykašlat
16:38 xstill mfence nebo tak něco
16:39 mornfall takže začali jsme s jedním bugem a už máme tři :D
16:40 mornfall to je docela dobrej progress
16:40 xstill :-D
16:40 mornfall xstill: ale ten jeden máš už vlastně opravenej (invalidate), je tak?
16:40 mornfall teď ještě udělat správně guard to tryStore, řekl bych
16:41 spito 1) problém s invalidací, 2) problém s uvolňováním 3) ??
16:41 xstill invalidaci jsem poslal
16:41 spito takhle není potřeba to tryStore upravovat
16:41 mornfall jo, takže 1) je opravený
16:41 xstill ale podívejte se na to jestli to je ok
16:41 mornfall spito: no, 3) je ten původní bug
16:42 spito no, to je ale přesně ta 1)
16:42 spito nebo ne?
16:42 mornfall spito: no, s tím patchem to prý furt padá
16:42 mornfall (na double insert)
16:43 mornfall xstill: nebo ne? (je to napsaný v popisu patche :)
16:43 xstill jo padl mi ten assert včera
16:44 spito xstill: kam se vložil ten druhý insert? nový, nebo starý řádek?
16:44 xstill ale pak jsem tam ještě vlastně opravoval livelock
16:44 xstill spito: co já vím
16:45 spito no protože mám tušení, že do stejného řádku se to vložit nemůže
16:45 xstill ono není tak snadný to zjistit, a teď navíc nemám core
16:45 spito jo tak
16:45 xstill ale ono stejně nevím jak to z toho core dostat
16:45 xstill protože to selže až po vložení
16:46 xstill takže bych musal hledat nějak kde to je
16:46 xstill což by ale možná šlo
16:46 xstill zkusím to donutit spadnout znovu
16:47 mornfall spito: každopádně teda ten guard v zrovna tom testu kterej padá nic nedělal, takže tahle teorie taky padá ;-)
16:50 mornfall taky bych řekl, že concurrentset jako takový nemůže být až tak moc špatně, když s FastAtomicCell to nikdy nezdechne
16:52 spito jak nic nedělal?
16:52 spito co to znamená?
16:53 mornfall spito: no tryStore v AtomicCell ten guard nikdy nepoužil
16:56 spito hmm
16:56 spito takže FastAtomicCell funguje vesele....
16:56 mornfall no podle všeho funguje
16:57 xstill no ne, ten free bug a invalidate bug jsou tam vždycky, jen nepravděpodobné
16:57 mornfall xstill: no a není problém v tom, že invalid() v AtomicCell jede na 2x?
16:57 mornfall xstill: asi by měl udělat jeden load a udělat oba testy (na tag aj na empty) nad tím, ne?
16:57 xstill jak nadvakrát
16:57 xstill ?
16:58 mornfall no, udělá load na tag a když je 0 tak udělá load na obsah
16:58 xstill hm
16:58 xstill to je asi problém
16:59 spito jo, invalid, empty a invalidate musí být atomické
16:59 spito v podstatě
16:59 spito tak já nevim....mám si koupit čokoládu, nebo ne......
17:00 xstill jo
17:00 xstill :-D
17:03 xstill hm, ani když udělám invalid atomickej tak to nepomůže
17:07 mornfall xstill: dokážeš si skrz insert protáhnout output parametr do kterýho uložíš výslednej řádek kam se vložilo?
17:08 mornfall (něco jako int *result = nullptr, abys nemusel měnit všechno)
17:08 xstill proč?
17:08 mornfall abychom zjistili jestli je chyba v rámci řádku nebo při hledání toho správnýho řádku
17:09 xstill hm ok, ale nejdřív bych musal bejt schopnej to reprodukovat v debugu, v release mi asi bude core na nic
17:10 mornfall hmm
17:10 mornfall to je otázka, ale zrovna číslo řádku by mohlo jít vytáhnout aj z release core
17:12 mornfall xstill: jak často to tak zhruba padá? :)
17:13 xstill v clang release buildu dost často
17:13 mornfall já to nějak nedokážu shodit
17:13 xstill musíš mít vytížené cpu
17:13 mornfall clang 3.4, release a obě core vytížený na max
17:14 mornfall ha, už
17:14 mornfall potřebuju aspoň 4 busyloopy protože HT, asi... aj tak to padá dost občasně
17:25 mornfall supr, skončilo to ve stavu že to nejde zabít ani devítkou...
17:26 mornfall [1545766.168299] BUG: unable to handle kernel paging request at ffffc90018b34000
17:26 mornfall [1545766.190155] CPU: 0 PID: 12620 Comm: divine-test Tainted: G           O 3.12.7 #1-NixOS
17:26 mornfall [1545766.220202]  [<ffffffff811c3533>] ? elf_core_dump+0x9e3/0x1450
17:28 xstill mě to opakovaně končilo v deadlocku při zápisu core, nebo tak  něco
17:30 xstill ale vím, že to vložení navíc bylo do řádku 3 a aktivní byla 4 v době toho assertu
17:32 spito jsi schopný projít to pole a zjistit, jaké tam byly hodnoty?
17:32 mornfall tak nevim, (1/1) ConcurrentSet: double insert at row 5, current = 5, global current = 5
17:32 spito jako jestli tam ta hodnota, co vyassertila, byla fyzicky jednou, nebo víckrát
17:32 xstill hm, teoreticky asi jsem
17:33 spito to skoro vypadá, že se ta hodnota při přesouvání ztratí někde
17:33 xstill až na to, že nevím co hledám
17:33 spito resp. ztratí se ta původní a tak se vloží znova
17:33 xstill protože ta hodnota je vyoptimalizovaná pryč
17:33 mornfall tak, asi jakoukoliv duplicitu :-)
17:34 xstill hm, to dává smysl, protože v tom okamžiku kdy je invalidovaná se může stát že se vloží nová
17:34 mornfall já z toho core asi nedostanu...
17:34 xstill ale jakto, že ta přesouvaná se vloží?
17:34 xstill nemělo by se zjistit, že je to duplicita?
17:36 xstill (ten řádek má 32768 položek, takže sorry i kdybych věděl co hledám tak to tam z core nenajdu)
17:36 mornfall if ( empty ) -> if ( trystore ) -> success ... empty vrátí true aj na invalid, a trystore klidně invalid přepíše, ne?
17:36 spito neměl by
17:36 xstill empty nevrátít true na invalid
17:37 mornfall hm, ne, trystore nepřepíše invalid který není empty
17:50 spito dělá pořád bordel jeno AtomicCell?
17:51 mornfall jj
17:51 mornfall ale teda nevíme jistě jestli jen kvůli časování nebo je ta chyba fakt v něm
18:00 mornfall no, žádnej řádek tu hodnotu nemá 2x
18:06 mornfall jo, ten první insert je skutečně o řádek dřív
18:07 mornfall nebo občas i o dva
18:07 mornfall (1/1) ConcurrentSet: double insert at row 5, current = 5, global current = 5 (first: 3)
18:09 mornfall co udělá invalidate na prázdnej cell, hm?
18:10 mornfall ve FastAC ho změní -- už není empty... v AC? nic?
18:10 xstill nic
18:10 mornfall to je docela chyba ale :-)
18:10 xstill jo no
18:10 mornfall protože invalid+empty musí být invalid
18:10 mornfall aby tam nemohl nikdo nic uložit už
18:11 xstill hm
18:11 mornfall (a zejména invalid => !empty)
18:11 xstill ale jak to udělat
18:12 mornfall to asi není úplně složitý
18:12 mornfall např. tag = 1, value = 0 -> invalid
18:12 mornfall value = !0, tag = 0 -> invalid
18:13 mornfall value != 0, tag != 0 -> valid, !empty
18:13 mornfall value = 0, tag = 0 -> empty
18:13 xstill jo to bys musal do value něco zapsat v invalidate pokud je empty
18:13 xstill to bude dost těžko když nevíš co je value za typ
18:13 mornfall no nemusel právě
18:13 mornfall protože empty + tag == 1 -> invalid
18:14 mornfall empty: value == 0 && tag != 1
18:15 mornfall empty -> !tag && !value
18:15 xstill takže invalid() { return tag == 1 && !value || tag == 0 && value } ?
18:15 mornfall jo, tak něco :)
18:15 xstill hm
18:15 xstill tak to můžu zkusit
18:15 mornfall fajn, zkus :-)
18:15 spito no ale to jsem říkal hned od začátku, že tyhle podmínky musí být splněny
18:26 mornfall spito: kdy, kde? myslíš tohle?                 je proto, že pak stačí mít 4 stavy buňky - empty, writing, nonempty, invalid
18:28 spito asi jo....jenom jsem to formuloval dost nepřesně
18:29 xstill hm zajímavý, teď to vypadá že to nepadá
18:30 spito jenom ještě pozor na to, že po invalidate musí být platný obsah v buňce
18:31 xstill ano na obsah nesahám
18:43 xstill mornfall, spito: myslím že tenhle patch už funguje (až na ten double free teda)
18:48 mornfall super :-)
18:48 mornfall spito: dořešíš ten double free? :)
18:49 spito jop
18:49 spito ale až o víkendu
18:49 spito jestli to moc nevadí
18:49 spito teď jsem tím (a to jsem nic neudělal) zabil až moc času
18:49 mornfall :-) jo nevadí, taky mam do pátku ještě jinou práci
19:23 spito tak mě otravovali ze studijního, že si mám laskavě vyzvednout bakalářský diplom
19:23 xstill to trochu pozdě ne?
19:25 spito ani ne hele
19:27 mornfall no, já ho třeba furt nemam :-)
19:27 xstill :-D doufám že sis vyvedl aspoň ten magisterský
19:28 xstill ne že by na tom až tak záleželo teda když děláš doktorát
19:28 mornfall jo ten jo, ale taky to chvíli trvalo
19:34 mornfall hmm, a rozbil jsem všechny buildy s gcc zdá se
19:34 xstill super
19:35 mornfall wibble::str::Split má vadnej iterátor
19:42 xstill což mi připomíná že se mi tu válí nějaké wibble patche
19:50 xstill jo tak jsem ti je poslal, někdy se na ně podívej, to tak nějak vzniklo
21:58 spito left #divine

| Channels | #divine index | Today | | Search | Google Search | Plain-Text | summary