00:00 gfxstrand[d]: Can someone at least tell me how to repro? Prime or no? Nouveau or Zink? Wayland or X11? Compositor?
00:01 redsheep[d]: Oh wow I went to go test on 6.9.3 and it's completely busted for me on plasma, I can't even get into sddm
00:02 gfxstrand[d]: 😫
00:02 gfxstrand[d]: It's got to be related to explicit sync somehow
00:03 redsheep[d]: I'm not sure if that's the same as what you were all talking about reproducing, but that's plasma 6.0.5 and mesa main from a week ago
00:04 redsheep[d]: Oh and zink l
00:04 airlied[d]: gfxstrand[d]: f40 just running against gnome-shell does it here
00:04 gfxstrand[d]: Kk
00:04 gfxstrand[d]: That's easy
00:04 gfxstrand[d]: airlied[d]: Prime or no?
00:04 airlied[d]: no prime
00:04 gfxstrand[d]: Kk
00:04 gfxstrand[d]: I'll test on the desktop then
00:04 airlied[d]: we try to use the kernel API due to getting a dedicated allocation with modifiers
00:05 gfxstrand[d]: Yeah but why? Why is the WSI code doing that to us?
00:06 esdrastarsis[d]: gfxstrand[d]: My setup: stand-alone, wayland, sway, just nvk, kernel 6.9.x and nvk from mesa 24.1
00:07 esdrastarsis[d]: I didn't use zink
00:07 gfxstrand[d]: Kk
00:08 gfxstrand[d]: I'm out buying groceries at the moment. I'll poke about when I get home.
00:08 airlied[d]: https://paste.centos.org/view/33bff343
00:08 airlied[d]: that seems to fix it
00:25 gfxstrand[d]: airlied[d]: Ugh... I thought I did that. 🤦🏻‍♀️ RB. Add a `Fixes:` and some `Closes:` tags and merge it. Or I can after a bit
00:31 airlied[d]: thrown to marge
00:43 gfxstrand[d]: Thanks
00:46 gfxstrand[d]: The worst part is that I was sure I'd double-checked like 3 times that we did that. 🤦🏻‍♀️
00:48 esdrastarsis[d]: And the fix missed the 24.1.1 release 💀
00:49 redsheep[d]: Shame I was caught up in testing the special gfxstrand nvk linux branch the whole time, probably could have gotten more eyes on this earlier
01:02 gfxstrand[d]: 🤷🏻‍♀️
01:02 gfxstrand[d]: We'll get it in the next one
01:19 gfxstrand[d]: I tweaked it a bit to line wrap and add another closes tag
02:45 gfxstrand[d]: And... Merged. 🥳
02:47 tiredchiku[d]: I can keep an eye out for issues that seem like mistakes from our end, if you'd like that
02:48 tiredchiku[d]: and are not perf/missing-feature related
14:03 zmike[d]: DB next I assume
15:08 gfxstrand[d]: Dependencies! It's always instruction dependencies...
15:16 karolherbst[d]: it is
16:01 gfxstrand[d]: I don't know why we use `bmov.clear`...
16:04 gfxstrand[d]: Uh.... The opclass for `bmov` is `bmov_dst64`...
16:04 gfxstrand[d]: Does that mean a barrier is actually 64 bits and I've been doing it wrong this whole time?!?
16:07 gfxstrand[d]: I'm using bmov.32
16:07 karolherbst[d]: gfxstrand[d]: it clears the value
16:08 gfxstrand[d]: karolherbst[d]: Well yes, I know that. But I don't get why we need to do that before `bssy`. Especially given that I'm always using `pT` for the predicate.
16:08 karolherbst[d]: barrier to barrier requires .CLEAR
16:09 karolherbst[d]: barrier to register it's optional
16:09 karolherbst[d]: and with barrier to barrier, I mean the general purpose ones
16:09 gfxstrand[d]: Oh, .64 is for those weird other bar values
16:10 karolherbst[d]: ATEXIT_PC only
16:10 karolherbst[d]: but yeah
16:10 gfxstrand[d]: what about register to barrier?
16:10 karolherbst[d]: that has no .CLEAR
16:11 karolherbst[d]: but it wouldn't make sense anyway, no?
16:11 karolherbst[d]: (though I also don't know why clearing the source barrier reg is needed in the first place)
16:33 dadschoorse[d]: does nvidia have native inverse_ballot?
16:33 gfxstrand[d]: I don't think so
16:34 gfxstrand[d]: I mean, we have ballot and a `!` modifier so...
16:34 karolherbst[d]: what's inverse ballot?
16:34 karolherbst[d]: ballot == `VOTE`, right?
16:35 karolherbst[d]: but yeah.. `VOTE` has `.ALL`, `.ANY` and `.EQ` modifiers and I'm sure you can do whatever you want with it
16:35 ahuillet[d]: it's dictatorship, the strongest thread wins
16:37 dadschoorse[d]: karolherbst[d]: inverse_ballot(a) -> a & (1 << subgroup_invocation_id) != 0
16:37 cwabbott: karolherbst[d]: no, ballot is not vote
16:37 dadschoorse[d]: basically, ballot takes a boolean and gives you a mask, inverse_ballot takes a mask and gives you a boolean
16:37 gfxstrand[d]: cwabbott: It is on nvidia
16:38 gfxstrand[d]: dadschoorse[d]: Yeah, we don't have that. We do have a system value with the mask so we can avoid the shift
16:38 dadschoorse[d]: afaiu nvidia has predicate registers, is there no way to move a value from a gpr to those?
16:39 dadschoorse[d]: or from a uniform register to a predicate
16:39 karolherbst[d]: okay
17:23 gfxstrand[d]: dadschoorse[d]: Not in a way that splits it across lanes
17:24 gfxstrand[d]: We can do `x != 0` but that's about it
17:24 gfxstrand[d]: Pretty much the only cross-lane communication NVIDIA has is VOTE (which also does ballot) and SHFL
17:25 gfxstrand[d]: (And SWZADD but that's really only for derivatives)
17:26 gfxstrand[d]: Importantly, no lane can write data in another lane. VOTE and SHFL only read the other lanes' data.
17:35 dadschoorse[d]: no subgroupBroadcast that reads one lane and writes a ugpr?
17:40 gfxstrand[d]: I don't think USHFL exists
17:41 gfxstrand[d]: You can `shfl` and then `r2ur`
17:42 karolherbst[d]: there is `VOTEU`
17:42 karolherbst[d]: but that only operates on uniform inputs
17:42 karolherbst[d]: ehh wait
17:42 karolherbst[d]: and writes into one
17:43 karolherbst[d]: gfxstrand[d]: ^^ in case you weren't aware of that
17:43 karolherbst[d]: why isn't it called `UVOTE`? No idea 🙂
17:43 karolherbst[d]: ohh
17:43 karolherbst[d]: the ballot is non uniform
17:44 asdqueerfromeu[d]: karolherbst[d]: `WEVOTE` 🗳️
17:44 karolherbst[d]: anyway
17:44 karolherbst[d]: `VOTEU` exists
17:45 dadschoorse[d]: how fast is SHFL?
17:46 dadschoorse[d]: gfxstrand[d]: is `r2ur` subgroupBroadcastFirst?
17:48 gfxstrand[d]: karolherbst[d]: Yes, I'm aware. VOTEU takes a non-uniform predicate source but returns a uniform ballot and vote.
17:48 gfxstrand[d]: dadschoorse[d]: I don't know
17:51 karolherbst[d]: r2ur is funky, but you can't select which thread
17:51 gfxstrand[d]: Yeah, the question is what thread does it pick?
17:51 gfxstrand[d]: I don't expect it's random
17:52 karolherbst[d]: "a thread"
17:52 karolherbst[d]: it will tell each thread if their value differs from the chosen thread
17:53 karolherbst[d]: gfxstrand[d]: predicate it off for any other thread?
17:53 karolherbst[d]: oh yeah :ferrisUpsideDown:
17:53 karolherbst[d]: just have a predicate which is true only for thread 0, and then...
17:54 karolherbst[d]: but anyway, I don't know which thread is choosen
20:08 gfxstrand[d]: Oh, right. I forgot there was a predicate. That's pretty neat, actually.
21:05 karolherbst[d]: gfxstrand[d]: as you mentioned.. uldc is fast, it's the only thing that needs a WaR latency
21:05 karolherbst[d]: uldc, umov, voteu needs to wait three cycles
21:05 karolherbst[d]: on other U* instructions
21:06 gfxstrand[d]: Yeah... pretty sure I've seen other WaR races
21:06 karolherbst[d]: ohh
21:06 karolherbst[d]: I have to correct myself
21:06 karolherbst[d]: WaR on uniform regs
21:06 karolherbst[d]: on normal regs the max wait is 2
21:07 karolherbst[d]: but the list is a bit ... complex
21:07 karolherbst[d]: voteu needs 2 for uniform predicates
21:07 karolherbst[d]: anyway...
21:07 karolherbst[d]: it's 3