00:21.26 | *** join/#brlcad infobot (~infobot@rikers.org) |
00:21.26 | *** topic/#brlcad is GSoC students: if you have a question, ask and wait for an answer ... responses may take minutes or hours. Ask and WAIT. ;) |
02:15.40 | *** join/#brlcad KimK (~Kim__@2600:8803:7a81:7400:7427:11e9:38a:213f) |
03:47.01 | *** join/#brlcad gabbar1947 (uid205515@gateway/web/irccloud.com/x-hkjuqzuczvysxpcq) |
06:53.04 | *** join/#brlcad teepee (~teepee@unaffiliated/teepee) |
07:11.05 | *** join/#brlcad teepee (~teepee@unaffiliated/teepee) |
07:41.08 | *** join/#brlcad teepee (~teepee@unaffiliated/teepee) |
08:30.04 | *** join/#brlcad DaRock (~Thunderbi@mail.unitedinsong.com.au) |
08:48.43 | *** join/#brlcad merzo (~merzo@user-94-45-58-139.skif.com.ua) |
09:53.43 | *** join/#brlcad merzo (~merzo@user-94-45-58-139.skif.com.ua) |
10:41.22 | *** join/#brlcad teepee (~teepee@unaffiliated/teepee) |
10:48.41 | *** join/#brlcad Caterpillar (~caterpill@unaffiliated/caterpillar) |
11:18.56 | *** join/#brlcad teepee (~teepee@unaffiliated/teepee) |
13:28.45 | *** join/#brlcad yorik (~yorik@2804:431:f720:80d8:290:f5ff:fedc:3bb2) |
14:45.08 | *** join/#brlcad kintel (~kintel@unaffiliated/kintel) |
14:56.31 | *** join/#brlcad merzo (~merzo@94.45.58.139) |
16:59.30 | *** join/#brlcad vasc (~vasc@bl14-42-37.dsl.telepac.pt) |
17:00.02 | vasc | hi mdtwenty[m] |
17:28.51 | mdtwenty[m] | hey |
17:30.31 | mdtwenty[m] | so the other day i tried the goliath scene with a cl_uint[16] bitvector first and it would take too much time to weave the segments |
17:32.23 | mdtwenty[m] | so i started to make some changes to the weave kernel to use a list structure instead of the array |
17:35.54 | mdtwenty[m] | the solution with the list is fast, but i am still trying to find the cause for some missing partitions when testing with csg scenes evolving difference operations |
17:37.45 | vasc | well, the array is slow with your present code for several reasons |
17:38.20 | vasc | like that this: |
17:38.21 | vasc | + pp = &partitions[offset]; |
17:38.21 | vasc | + //iterate over segments of partition |
17:38.21 | vasc | + for (uint i = pp->segs_start_index; i < pp->segs_start_index + pp->segs_in_partition; i++) { |
17:38.21 | vasc | + if (segs_in_pp[i].seg_sti == st_bit) { |
17:38.22 | vasc | + ret = 1; |
17:38.24 | vasc | + break; |
17:38.26 | vasc | + } |
17:38.28 | vasc | + } |
17:39.14 | mdtwenty[m] | yes, also inserting partitions on the array |
17:40.47 | mdtwenty[m] | the solution with 2 ints to reference the back and forward partition is fast |
17:40.59 | mdtwenty[m] | compared with the array version |
17:41.07 | vasc | well |
17:41.15 | vasc | i don't know if something like that can work really. |
17:42.06 | vasc | did you keep the other version you made friday someplace? |
17:42.24 | vasc | the one with the bitvector which didn't use whole segs but indexes |
17:42.45 | vasc | also |
17:43.01 | mdtwenty[m] | yes i made a backup with that version |
17:43.11 | vasc | good. keep that just in case. |
17:43.24 | vasc | in fact send it to me. |
17:45.53 | vasc | the thing is, without profiling the code, it's hard to know it its better to use the list or the bitvector. |
17:46.09 | vasc | like, what's the min and max size of the lists, or the average. |
17:46.41 | vasc | and how ofter is bu_ptbl_ins_unique used vs a plain list traversal |
17:46.44 | vasc | and so on |
17:47.51 | vasc | this is something which could be found out by instrumenting the ANSI C code and printing an instruction count out or something like that. |
17:48.46 | vasc | you can't optimize the code without knowing the data and the access patterns |
17:48.48 | mdtwenty[m] | posted a file: weave_segs_cl_uint16.patch (51KB) <https://matrix.org/_matrix/media/v1/download/matrix.org/gptQETCBWOirrbuoOVcaPlwv> |
17:52.09 | vasc | so i think you should instrument the code and this out. |
17:52.40 | vasc | 1) what's the min and max size of the lists, and the average. 2) how often is bu_ptbl_ins_unique used vs a plain list traversal. |
17:53.07 | vasc | i suspect the list is only traversed in the bool_eval phase. |
17:53.57 | vasc | right. take this example code: |
17:53.59 | vasc | + pp = &partitions[offset]; |
17:53.59 | vasc | + //iterate over segments of ray |
17:53.59 | vasc | + for (uint k=h[id]; k!=h[id+1]; k++) { |
17:53.59 | vasc | + if ((pp->segs[(k-h[id])/32] & (1 << (k - h[id]) % 32)) != 0) { |
17:53.59 | vasc | + RESULT_TYPE segp = segs+k; |
17:54.00 | vasc | + if (segp->seg_sti == st_bit) { |
17:54.02 | vasc | + ret = 1; |
17:54.04 | vasc | + break; |
17:54.06 | vasc | + } |
17:54.08 | vasc | + } |
17:54.10 | vasc | + } |
17:54.12 | vasc | you're gonna execute this for every partition right? |
17:54.21 | mdtwenty[m] | yes |
17:54.31 | mdtwenty[m] | it checks for every partition |
17:54.39 | vasc | this is too slow i think this would be faster if the loop was inverted. |
17:55.21 | vasc | forall i in 0..15 |
17:55.59 | vasc | you check if there are set bits in that bitvector, and if there are |
17:56.26 | vasc | then you check if that segment's seg_sti is equal to the st_bit |
17:56.47 | vasc | it seems slow right? coz its 16*32 iterations |
17:56.54 | vasc | but it's a sparse bitvector |
17:57.13 | vasc | so you don't need to iterate over all bits, just the ones that are one |
17:57.32 | mdtwenty[m] | yes i could try that |
17:57.37 | vasc | you can use popcnt to know how many bits are set. |
17:57.52 | vasc | even better use ffs. |
17:58.03 | vasc | there isn't an ffs function in opencl but you can do one with clz. |
17:58.08 | vasc | i mean |
17:59.23 | vasc | like |
17:59.44 | vasc | you iterate the bitvector |
17:59.56 | vasc | and for each segs[i] |
18:00.07 | vasc | you use clz(pp->segs[i]) |
18:00.41 | vasc | and while its != 32 |
18:00.51 | vasc | you extract that bit and test it |
18:01.05 | vasc | or something like that. |
18:01.34 | mdtwenty[m] | hm yeah i will try that |
18:01.35 | vasc | i think clz is like 1-cycle. |
18:02.11 | vasc | its not perfect but it should be less bad. |
18:02.23 | vasc | we need to profile the code to know if its better to build the list or not. |
18:02.26 | mdtwenty[m] | but i also think that one of the problems is with inserting partitions in the partitions array |
18:02.32 | mdtwenty[m] | at least for huge scenes like the goliath |
18:02.55 | vasc | possibly. for that you need to use a linked-list instead of an array i guess. |
18:03.29 | vasc | the ANSI C code uses double-linked lists but i think you only need a single-linked list. |
18:04.30 | vasc | but i'm not sure. |
18:05.13 | vasc | so you're working on that? |
18:05.24 | mdtwenty[m] | i started implementing a list to store the partitions, and the goliath scene would only take 0.55 sec or something IIRC, against the 40+ sec with the array version |
18:06.25 | vasc | nice. |
18:06.32 | mdtwenty[m] | there is still some issues with some missing partitions for scenes with difference operators |
18:06.52 | vasc | show me the code and i can help debug if you want. |
18:09.27 | mdtwenty[m] | 1 sec |
18:14.05 | *** join/#brlcad ``Erik (~erik@pool-100-16-14-17.bltmmd.fios.verizon.net) |
18:15.49 | mdtwenty[m] | posted a file: weave_partitions_list.patch (53KB) <https://matrix.org/_matrix/media/v1/download/matrix.org/aTomIMyTJtdGIWEZhzxmrMne> |
18:15.52 | mdtwenty[m] | ok this should be it |
18:16.15 | mdtwenty[m] | is still a work in progress |
18:19.54 | mdtwenty[m] | intersections and unions seems to be working |
18:20.43 | mdtwenty[m] | at least with the simple scenes that i have for testing |
18:21.12 | mdtwenty[m] | but without rt_boolfinal implemented it is hard to test with other scenes |
18:22.50 | vasc | seems kinda wonky |
18:28.13 | vasc | take this: |
18:28.14 | vasc | <PROTECTED> |
18:28.15 | vasc | + uint start_index = 2 * h[id]; |
18:28.15 | vasc | + tail_pp = append_partition_pp(partitions, ipartition, id, start_index); |
18:28.15 | vasc | +uint append_partition_pp(global struct partition *partitions, global uint *ipartition, size_t id, uint start_index) |
18:28.15 | vasc | +{ |
18:28.17 | vasc | + uint new = start_index + ipartition[id]; |
18:28.19 | vasc | + uint old = start_index + ipartition[id] - 1; |
18:28.21 | vasc | + |
18:28.23 | vasc | + if (ipartition[id] == 0) { |
18:28.25 | vasc | + //No partitions yet |
18:28.27 | vasc | + partitions[new].back_pp = new; |
18:28.29 | vasc | + partitions[new].forw_pp = new; |
18:28.31 | vasc | + return start_index; |
18:28.33 | vasc | + } |
18:28.35 | vasc | + |
18:28.37 | vasc | + partitions[new].back_pp = old; |
18:28.39 | vasc | + partitions[new].forw_pp = new; |
18:28.41 | vasc | + partitions[old].forw_pp = new; |
18:28.43 | vasc | + return new; |
18:28.45 | vasc | +} |
18:28.47 | vasc | why not call as append_partition_pp(partitions+start_index, ipartition, id); instead? |
18:28.55 | vasc | that would eliminate one variable. |
18:29.17 | vasc | as for the code in append_partition_pp.... |
18:30.15 | vasc | while it's not the case in this particular instruction |
18:30.26 | vasc | i thought you needed to insert the element at the end? |
18:30.53 | vasc | unless you're doing this like a C++ linked list |
18:31.08 | vasc | with a bogus node on the beggining which points to the end and start of list or something. |
18:32.14 | vasc | also you could just pass ipartition[id] since you never use each value seperately. |
18:32.54 | vasc | oh right. |
18:33.01 | vasc | ipartition says how many partitions there are |
18:33.04 | mdtwenty[m] | noted! and yes i use only the functions to update the back_pp and forw_pp values |
18:33.05 | vasc | so it points to the end of list |
18:33.15 | vasc | well |
18:34.14 | vasc | i disagree with this: |
18:34.15 | vasc | <vasc> + if (ipartition[id] == 0) { |
18:34.15 | vasc | <vasc> + //No partitions yet |
18:34.15 | vasc | <vasc> + partitions[new].back_pp = new; |
18:34.15 | vasc | <vasc> + partitions[new].forw_pp = new; |
18:34.15 | vasc | <vasc> + return start_index; |
18:34.17 | vasc | <vasc> + } |
18:34.32 | vasc | i think should be partitions[new].back_pp = partitions[new].forw_pp = 0; |
18:34.52 | vasc | if there's nothing else in the list there's no next or prev node. |
18:36.04 | vasc | in fact its better to just |
18:36.22 | vasc | i think should be partitions[start_index].back_pp = partitions[start_index].forw_pp = 0; |
18:36.30 | vasc | makes it more explicity |
18:36.35 | *** join/#brlcad teepee (~teepee@unaffiliated/teepee) |
18:36.37 | vasc | ^H |
18:36.59 | vasc | and this: |
18:37.07 | vasc | <vasc> + partitions[new].back_pp = old; |
18:37.07 | vasc | <vasc> + partitions[new].forw_pp = new; |
18:37.07 | vasc | <vasc> + partitions[old].forw_pp = new; |
18:37.10 | vasc | i think it should be |
18:37.33 | vasc | + partitions[new].back_pp = old; |
18:37.33 | vasc | + partitions[new].forw_pp = 0;+ partitions[old].forw_pp = new; |
18:37.39 | vasc | or something |
18:38.06 | vasc | the circular references are kinda weird. |
18:38.21 | vasc | so you basically know if its the end or start of the list because of the circular reference? |
18:38.23 | mdtwenty[m] | yes and i think the issue comes from that |
18:38.48 | mdtwenty[m] | ye that was my idea |
18:39.17 | vasc | it can be done that way i guess, but usually we just say there's no next or prev with a null pointer. |
18:39.19 | vasc | hm |
18:39.23 | vasc | now that i think about it |
18:39.34 | vasc | 0 itself is a valid position in our case |
18:39.39 | vasc | so you would have to use -1 or something |
18:39.44 | vasc | or MAX_INT |
18:40.30 | vasc | MAX_UINT ~0 |
18:40.42 | vasc | i guess your way also works |
18:40.53 | vasc | its just not very conventional... |
18:42.01 | mdtwenty[m] | and i am having trouble when there is only 1 partition |
18:43.55 | mdtwenty[m] | i think it makes more sense having the forw and back set to 0 if there is no previous/next partition |
18:45.05 | vasc | nah i can't be 0 because 0 is also a valid position |
18:45.07 | vasc | it |
18:45.37 | mdtwenty[m] | j = partitions[head_pp].back_pp; j != partitions[j].forw_pp; j = partitions[j].forw_pp) |
18:45.41 | vasc | your way of doing it with the circular references is ok. |
18:45.59 | mdtwenty[m] | when there is only 1 partition this for doenst work |
18:46.46 | vasc | wtf. |
18:47.11 | vasc | hm |
18:48.43 | vasc | well |
18:48.55 | vasc | the thing is your current code always skips the last element of the list from i see. |
18:49.20 | vasc | instead of using a while you need to use a do loop. |
18:49.26 | vasc | and you need to check for an empty list. |
18:49.29 | vasc | or something like that. |
18:51.02 | vasc | if its a one element list it skips the one element. or would it you didn't have that ipartition[id] == 1 check in there. |
18:51.13 | vasc | but in lists > 1 it skips the last element in the list as well. |
18:53.22 | mdtwenty[m] | hm yes i see that |
18:53.53 | vasc | or terminate the list with something other than a circular reference. |
18:54.29 | vasc | otherwise you can't disambiguate between the last element and being past the last element. |
18:54.53 | vasc | without extra checks. |
18:55.39 | vasc | we can use 0 because its also a valid position |
18:55.41 | vasc | so |
18:55.46 | vasc | MAX_UINT |
18:56.04 | vasc | is NULL |
18:57.39 | ``Erik | sweet jeebus, use a pastebin |
18:58.12 | vasc | we can talk private if you want. |
18:58.27 | vasc | its just too small to use pastebin. |
18:58.47 | ``Erik | public is good, but for gobs of code, chuck it on a paste bin (even if it's 3 lines) and shoot a link, then do edits/mods there or something :) |
18:59.35 | vasc | that's the thing though. I don't want to write code for him. :-) |
18:59.38 | vasc | just comment on it. |
18:59.55 | vasc | i'm kinda overdoing it though i guess. |
19:00.11 | ``Erik | if these back_pp and forw_pp linked list things are using the BRL-CAD linked list "stuff", there are macros for handling them, including an iterator iirc |
19:01.37 | ``Erik | BU_LIST_FOR() et al... include/bu/list.h |
19:02.44 | mdtwenty[m] | this is opencl code |
19:03.58 | ``Erik | ah, 'k, cool, n/m me O:-) *wanders back off* |
19:05.02 | vasc | we should make some macros eventually. |
19:05.46 | vasc | or at least inline functions. |
19:09.16 | vasc | we can't directly port the libbu macros. we don't have malloc(). |
19:09.29 | vasc | and we don't wanna do a malloc per node either. |
19:10.00 | vasc | memory allocation in opencl is done on the host code. |
19:10.10 | vasc | the device just uses memory. |
19:35.43 | *** join/#brlcad ChanServ (ChanServ@services.) |
19:35.43 | *** mode/#brlcad [+o ChanServ] by card.freenode.net |
19:40.34 | mdtwenty[m] | ok good news.. fixed the issues with that cycle and the code now seems to be working for all the test scenes i am using |
19:42.51 | mdtwenty[m] | i will add the code for the dynamic bit vector and optimize the bool_eval and will upload the patch later tonight |
19:43.27 | mdtwenty[m] | optimize the bool_eval = inverting the cycle as you suggested |
19:46.44 | vasc | okay |
20:34.27 | ``Erik | mdtwenty[m]: remember to test edge cases (last element, first element, after the last, before the first, ...) :) |
20:34.53 | ``Erik | vasc: port malloc? :D it ain't magic *duck* :) |
20:36.06 | vasc | well, it's a performance hog to call it too often. |
20:36.18 | vasc | we're better off with regular memory pools. |
20:38.56 | vasc | malloc and free need to have support for variable blocks, degrag, etc, this has a negative performance impact. |
20:39.14 | vasc | defrag |
20:47.20 | Stragus | I think of malloc/free like the rand() of memory management. Useful to get started, not for real code |
20:47.41 | Stragus | wrote his own memory manager about a decade ago and never looked back |
20:48.25 | vasc | most of the time it's not necessary to have something which supports variable sized blocks anyway. |
20:49.02 | Stragus | Indeed, and if all you need are constant sized blocks, you can have an overhead approaching zero bytes per block |
20:49.11 | vasc | yes. |
20:49.12 | Stragus | malloc() is darn wasteful |
20:49.45 | vasc | it's also a problem if you call it once per element, because of all the possible system calls. |
20:50.04 | vasc | malloc implementations themselves usually buffer things. |
20:51.01 | vasc | but malloc isn't omniscient. the programmer usually has more details on the type of memory uses to make something better than that. |
20:51.09 | Stragus | And that behavior depends on the libc/OS. Linux loves to buffer things for higher malloc() performance, FreeBSD and Windows free aggressively |
20:51.28 | ``Erik | O.o your malloc doesn't have to smell or look anything like the unix alloca malloc (which is generally split into like 4 different impls, with phkmalloc and whatever the one glibc/linux uses as the two big open source ones) |
20:51.44 | vasc | first game i programmed on was an ANSI C MUD, it came with its own custom allocator because of that. |
20:51.57 | ``Erik | like a diku? |
20:52.01 | ``Erik | or circle? |
20:52.04 | Stragus | Bottom line, use your own memory manager, and make it NUMA-aware |
20:52.11 | vasc | yes. a Diku Merc Envy MUD. |
20:53.03 | vasc | i ran one of the MUDs in our campus. |
20:53.39 | vasc | so i programmed custom classes and things like that. |
20:53.53 | vasc | first time I did socket programming. |
20:55.06 | ``Erik | Stragus: I'd say that's bad advice for most programmers, most aren't able to do it better than the system and will introduce unnecessary and difficult bugs attempting, and the few that can will probably never hit that situation... you do weird shit, not everyone is as weird as you... :D |
20:55.44 | vasc | malloc is a nice tool to have, but i think a memory pool abstraction would have been good enough for most people. |
20:56.07 | ``Erik | off to the library and day care with me, Excelsior! https://www.youtube.com/watch?v=otOARxAOp2g |
20:56.09 | gcibot | [ Excelcior!.wmv - YouTube ] |
20:57.43 | Stragus | ``Erik: Then people should use whatever is written by people who know that stuff. :) No use should rand() either, people grab the Mersenne Twister or any other fancy RNG of the day |
20:58.23 | vasc | problem with RNG is like you said with malloc, quality of implementation between OSes varies quite a lot. |
20:59.11 | vasc | funilly enough, that MUD also had its own custom RNG... |
20:59.58 | vasc | also its own custom string allocator. |
21:00.03 | Stragus | I'll agree that rand() is a lot far worse than malloc() |
21:00.43 | vasc | Shared String Manager i think was the name they gave it. |
21:01.34 | vasc | i've also seen games have their own disk I/O functions and things like that. |
21:03.08 | Stragus | Of course. Any reasonable game should have a thread dedicated to asynchronous disk I/O |
21:04.09 | vasc | the network code in that MUD disabled naggle and did its own buffering. |
21:05.05 | vasc | that was kind of fun afterwards in classes. |
21:05.11 | Stragus | That Naggle buffering is terrible. You can feel the 200ms delay |
21:05.39 | vasc | we had to write a non-blocking program. like everyone did it with UDP, and i did it with non-block TCP |
21:06.03 | vasc | the teacher was kinda amazed i thought about it (we didn't learn that in class) |
21:06.17 | vasc | well i had seen it before... |
21:06.45 | Stragus | I once wrote an online game too, browser-based... but it was entirely written from scratch in C, it was its own HTTP server |
21:06.56 | vasc | cool. |
21:07.04 | vasc | i thought about doing something like that once. |
21:07.13 | Stragus | Kind of crazy, it was so demanding in time and energy that I just gave it up one day |
21:07.17 | vasc | MUDs are basically a sort of telnet server usually. |
21:07.25 | Stragus | Also, I didn't know what I was doing so the code was terrible |
21:07.44 | vasc | well HTTP has a lot of its own verbiage I guess. |
21:07.57 | Stragus | Well, HTTP was just a tiny piece of the whole thing |
21:09.16 | vasc | i thought about rewriting an http server, like lighthttpd or whatever it was called, or make an apache module out of it :-) |
21:09.26 | vasc | or making an CGI |
21:09.53 | Stragus | People expect a lot more interactivity from games these days |
21:10.00 | Stragus | Mine generated HTML 3.0 stuff, eh |
21:10.17 | vasc | well, those browser game can still be quite popular |
21:10.22 | Stragus | It had a few thousand players (up to 2002 or so?), and I actually changed my online nickname because I felt bad answering questions from people who knew about it and asked where I had disappeared |
21:10.34 | vasc | heh |
21:10.40 | Stragus | Administrating an online game is a _lot_ of trouble |
21:10.59 | vasc | i had enough trouble with like 100 college MUD players. |
21:11.22 | vasc | when I was a Freeciv administrator we did have a game server... but I wasn't the main guy administrating it so... |
21:12.04 | vasc | still I think it was useful to interact with the game players to figure out where to advance the game next, so I guess I messed with it more than the average maintainer. |
21:12.10 | Stragus | I had set up an alert where the mods could make my computer play music to wake me up in the middle of the night if there was some serious problem/bug needing attention |
21:12.22 | vasc | sheesh. |
21:12.48 | vasc | i just let it crash and restarted it later :-) |
21:13.05 | vasc | that's one good thing about games, people know stability isn't always up to scratch :-) |
21:13.19 | Stragus | You feel bad about that when you have 4000 players logging in many times a day :) |
21:13.38 | Stragus | So yes, it was way too stressful, but it was a good learning experience |
21:13.40 | vasc | we did have an auto-restart script. |
21:14.19 | vasc | and perioric saves. |
21:14.23 | vasc | periodic |
21:14.45 | vasc | one of the first things I did with Freeciv was rewriting the network code. |
21:14.51 | vasc | it didn't use non-blocking sockets. |
21:14.55 | Stragus | Darn |
21:15.18 | vasc | it was really bad because it has simultaneous moves. |
21:15.45 | vasc | sometimes people had lousy dial-up connections, their connection froze, and the OS timer was like 5 minutes. |
21:15.54 | vasc | until it disconnected them. |
21:15.56 | Stragus | My HTTP thing was a single thread, non-blocking sockets. It ran pretty smoothly, the whole universe "ticks" were taking 5 seconds (so the server would delay HTTP requests for 5 seconds every 10 minutes) |
21:16.31 | vasc | yeah if it's well programmed its quite amazing the amount of connections you can multiplex with non-block TCP. |
21:16.45 | vasc | people dismiss it too easily. |
21:17.07 | Stragus | Well, you don't really want to go beyond a thousand sockets per thread |
21:17.21 | vasc | Freeciv only has like, I dunno the limit now, but usually people played with like 16 player or 8. |
21:17.59 | Stragus | I tried Freeciv and disliked many things about the gameplay |
21:18.21 | vasc | well i only enhanced it, i wasn't one of the original authors :-) |
21:18.31 | Stragus | :) Right |
21:18.47 | vasc | i wrote a game client basically. |
21:18.58 | vasc | at least that's how i started. |
21:19.15 | Stragus | I still occasionally get brief dreams about writing a game. The last time was in 2013, I did that: http://www.rayforce.net/newproject024.png |
21:19.34 | vasc | there's a lot of things i didn't like but it became really hard to refractor it without breaking backwards compatiblity. |
21:19.48 | Stragus | The hydrography is actually computed by darn Computation Fluid Dynamics, with a water cycle and underground flow |
21:20.03 | vasc | it looks nice. |
21:20.35 | Stragus | I think I am way too perfectionist to ever finish something |
21:20.50 | vasc | that's half the work to do a simple flight sim or strategy god game. |
21:21.19 | Stragus | These trees? http://www.rayforce.net/newproject032.png - Procedurally generated from 200k triangles, then reduced by an algorithm to an optimal set of just 8 triangles to represent the best geometry with the least distorsion possible |
21:21.32 | Stragus | And that algorithm was like 7k lines |
21:22.00 | Stragus | I need to learn _not_ to aim for the best job I can do. Because it takes too darn long |
21:22.05 | vasc | well good foliage can be really complicated. that's why most game engines used SpeedTree SDK... |
21:22.23 | vasc | and i'm saying game engines not games. |
21:22.58 | Stragus | I have a hard time using people's code, when I feel like I could write better |
21:23.07 | Stragus | The problem is that "writing better" can take months |
21:23.32 | vasc | i've wanted to design my own computer programming language more than once. |
21:23.45 | vasc | it's not like i haven't written a compiler before. |
21:24.14 | Stragus | I wouldn't personally go down that route |
21:24.18 | Stragus | hugs and cuddles C |
21:24.46 | vasc | well i've written design specs more than once. but never actually liked one of my language designs enough to go through with it. |
21:25.34 | Stragus | I would add a few keywords to the C language, to provide more contextual information to the compiler to produce better assembly |
21:25.39 | Stragus | But I wouldn't write a new language |
21:26.38 | vasc | well. |
21:27.00 | vasc | i had like module declaration and implementation like Modula-2, syntax like C, advanced array support. |
21:27.10 | vasc | and I think I added SIMD to the specs. |
21:27.44 | Stragus | GNU C has vector extensions |
21:27.53 | Stragus | thinks of GNU C as the one true C |
21:27.57 | vasc | it does. but opencl is a lot better. |
21:28.37 | Stragus | Yes well, that targets different hardware, with completely different approaches and algorithms |
21:30.23 | vasc | I mixed Pascal/Modula-2 and C |
21:30.25 | vasc | so it was like |
21:31.03 | vasc | func xpto(a, b, c: int) : (a, b: int) |
21:31.25 | vasc | {} |
21:32.07 | Stragus | Any advantage over C besides a different syntax? :) |
21:32.36 | vasc | like you can see it supports multiple value return in functions. |
21:32.44 | vasc | even if it's just syntatic sugar anyway.. |
21:32.50 | vasc | you can do that with a C struct. |
21:32.57 | Stragus | Multiple return values is good |
21:33.45 | Stragus | I wish C also had statements like break continue; instead of having to use goto |
21:34.08 | vasc | i think i had that at one point, like break 2; or something. |
21:34.11 | Stragus | And __attribute__((__may_alias__)) should be in the standard instead of that silly union thing |
21:34.31 | vasc | but it seemed kinda messed up. |
21:35.35 | vasc | i agree that it would be better to have some more control flow mechanisms. |
21:36.08 | vasc | i can't say i'm a fan of C declarations though. or should I say C++ declarations. |
21:36.17 | vasc | because if you look at K&R declarations they're nothing like that. |
21:36.25 | Stragus | And I really would like to be able to tell the compiler the probability of each branch |
21:36.44 | Stragus | __builtin_expect() is too absolute, it's like 100% or 0% |
21:37.04 | Stragus | And compilers should obey the "register" keyword, darn it |
21:37.32 | vasc | thing is sometimes there's register spills. so the compiler disables or ignore the hint. |
21:37.51 | Stragus | And if you have a switch() without a default case and the input value isn't handled, it should be undefined behavior |
21:38.06 | Stragus | I don't want a darn bound check every time I put a switch() |
21:38.12 | ``Erik | pats swift O:-) |
21:38.35 | Stragus | vasc: The hint is just ignored now because "compilers know better" |
21:39.21 | vasc | well I looked at Nim some time ago ``Erik but it just seemed to have an overly complicated syntax. |
21:39.49 | vasc | as for Swift is seems layered on top of the rest of the Apple runtime. |
21:39.51 | vasc | it |
21:40.42 | Stragus | I want more low-level control, and all new fancy languages "designed to replace C" tend to move _away_ from that |
21:40.44 | vasc | and Go has a garbage collector so... |
21:40.52 | vasc | exactly. |
21:41.00 | vasc | they're pseudo-systems programming languages. |
21:41.13 | vasc | they're Java wannabees rather than C replacements. |
21:41.24 | ``Erik | nim kinda smells pythony |
21:41.40 | vasc | like Go, it seems to be used mostly for what Java was used, network servers and the ilk. |
21:42.00 | ``Erik | vasc: yeh, I've been doing ios code lately, so apple stack, arm cpu, etc... |
21:42.10 | vasc | oh right forgot to mention Rust |
21:42.17 | ``Erik | common lisp on the back end because I'm twisted |
21:42.34 | vasc | i actually liked Common Lisp. |
21:42.57 | vasc | you might hate it or love it, but the syntax makes sense for what it does. |
21:43.06 | vasc | and it just feels right. |
21:43.27 | vasc | problem is when you have to interact with the rest of the system, quite often its designed in C. |
21:44.43 | vasc | oh right the complicated syntax is Rust, not Nim |
21:45.11 | vasc | Nim's issue is garbage collection |
21:46.02 | vasc | whenever someone claims to have written a "systems programming language" and then they add a garbage collector the features list. |
21:46.09 | vasc | it's a hint they don't have a freakin clue. |
21:46.51 | vasc | i mean its nice to just ignore memory allocation on a lot of programs |
21:47.02 | vasc | but not on systems. |
21:48.05 | vasc | i can guess what Linus would say about rewriting the kernel to use a garbage collected language. |
21:48.55 | vasc | and as much as I hate Wirth, at least he followed people's advice and actually tried to write an OS kernel with his later languages. |
21:49.59 | vasc | which is why Module-2 is so much better than Pascal. except it was too late for people to care about it. |
21:50.03 | vasc | Modula-2 |
21:53.05 | vasc | other than C and OpenCL i like Python and Lisp |
21:53.27 | vasc | Java is kinda ok. |
21:53.47 | vasc | the frameworks are mostly horrible, horrible. |
21:54.25 | vasc | Java itself, I think its good for what it was designed for, the only wart is the type system. |
22:01.38 | vasc | oops gotta go |
22:24.22 | *** join/#brlcad teepee (~teepee@unaffiliated/teepee) |
22:32.11 | *** join/#brlcad kintel (~kintel@unaffiliated/kintel) |
23:08.16 | Stragus | Woohoo, the first AMD Epyc motherboard is out, no dual-socket yet... It supports 1 tetrabyte of RAM though, and 7 PCIe slots for a couple GPUs |