WEBVTT 1 00:06:34.978 --> 00:06:39.689 Oh, okay, good afternoon. People. 2 00:06:39.689 --> 00:06:46.019 Parallel class 30th. 3 00:06:46.019 --> 00:06:52.559 2021. 4 00:06:52.559 --> 00:06:59.819 So, the usual a question Connor waiting. 5 00:07:00.838 --> 00:07:07.949 To get in. Okay, you can hear me. Can you here? 6 00:07:10.769 --> 00:07:15.869 Getting an echo. 7 00:07:17.668 --> 00:07:20.879 So. 8 00:07:22.619 --> 00:07:26.218 Question is. 9 00:07:28.649 --> 00:07:32.699 Is curious, can you also see my screen or not? 10 00:07:34.048 --> 00:07:38.579 Screen is still loading. Okay. 11 00:07:38.579 --> 00:07:44.428 Well, I'll describe what's happening today is our. 12 00:07:45.509 --> 00:07:59.999 Product presentations points about the paper format if you're going to if you're project sharing prior work, then tell me what's new what you're sharing and what's new. 13 00:07:59.999 --> 00:08:12.718 And I got some inspiration inspiration for you sharing your term projects, underhanded see, contest, obfuscate, ITC contests and so on and examples of failures that finally turned into successes. 14 00:08:12.718 --> 00:08:21.059 Some of how I productive program stuff. I've also got some blurbs on the site about excess scale computing. 15 00:08:21.059 --> 00:08:26.908 More stuff, if you have time how you're welcome to look at about C. plus plus. 16 00:08:26.908 --> 00:08:35.458 It's going into parallelism and so on. So if you have time, you might want to have fun for that. I have a link to the Super computing conference. 17 00:08:35.458 --> 00:08:45.899 Um, which is relevant to parallel computing and linkage act on. He's the person who maintains the top 500 list, for example, and got a couple of. 18 00:08:45.899 --> 00:08:49.499 He gives a talk and emerging technologies and so on. 19 00:08:50.693 --> 00:09:05.303 The next thing is the core survey in this course I tried to be a curator, I tried to select the best stuff relating to parallel computing and present it to you. I've created this. Course, in fact, I asked to be given permission to create the course. 20 00:09:05.724 --> 00:09:18.833 And so if you like the course if you thought it was worth your time intuition dollars then say so, on the course survey. I mean, most courses a very small percentage of the students fill up the survey if a larger percentage fill it out and thank you. 21 00:09:19.139 --> 00:09:28.589 And after the semester, I'm open to questions and discussions about any legal ethical topic after you graduate. 22 00:09:28.589 --> 00:09:32.399 So, does it have to be about parallel of computing. 23 00:09:32.399 --> 00:09:44.639 So, now it's time for your presentations and 1st, Ben and Jack and then Blaine Conner Dan, and I just did it in alphabetical order. 24 00:09:44.639 --> 00:09:53.639 So, Ben and Jack, and maybe you might have better luck than me about sharing your screen. So, give it a try. Now. 25 00:09:53.639 --> 00:10:02.278 And see, what happens. All right. Hello? Just want to Mike check real quick. 26 00:10:02.278 --> 00:10:07.649 You hear me, thank you. 27 00:10:08.668 --> 00:10:15.808 You guys also hear me I just want to make sure as well. Yeah, I can hear you. Great low volume, but yes. 28 00:10:15.808 --> 00:10:20.698 Okay, and not see your screen now. Oh, doing. 29 00:10:20.698 --> 00:10:24.328 Good I can see your screen. You got better luck than me. 30 00:10:24.328 --> 00:10:27.418 All right, so. 31 00:10:27.418 --> 00:10:33.058 For our project here, we're taking a look at micro structures. This was a. 32 00:10:33.058 --> 00:10:36.359 Combined project with my capstone. 33 00:10:36.359 --> 00:10:46.558 Project so, for some background inspiration yeah, this was a capstone project that I was a part of basically we were tasked with. 34 00:10:46.558 --> 00:10:50.278 Creating a web app slash web interface for. 35 00:10:50.278 --> 00:10:55.019 Primarily for engineering, 1600 students, so that they could use this. 36 00:10:55.019 --> 00:11:01.619 Learn some material science concepts in a way that they wouldn't otherwise be able to with the textbook and. 37 00:11:01.619 --> 00:11:04.918 The main thing here was that. 38 00:11:04.918 --> 00:11:08.639 A sponsor for the project who was a materials professor. 39 00:11:08.639 --> 00:11:18.119 Gave us an algorithm to generate to run a certain type of simulation and what students would be able to learn here or what they'd be able to see here is. 40 00:11:18.119 --> 00:11:21.359 Like, a dynamic picture changing. 41 00:11:21.359 --> 00:11:24.719 So, there's a time element here, something that they wouldn't get. 42 00:11:24.719 --> 00:11:29.399 In a textbook, um, and so some things to note, it's. 43 00:11:29.399 --> 00:11:34.048 I wrote that algorithm is very intensive. I should rather say that the. 44 00:11:34.048 --> 00:11:38.879 Implementation on our live servers very CPU intensive. 45 00:11:38.879 --> 00:11:44.129 Um, and multiple clients can easily overload this, um. 46 00:11:44.129 --> 00:11:52.198 I posted the link to it if you guys are on campus, or in our network, you can actually go to this link and see our project. 47 00:11:52.198 --> 00:11:57.958 I guess just, for the sake of time, I have it up here. So basically. 48 00:11:57.958 --> 00:12:01.198 This image right here is. 49 00:12:01.198 --> 00:12:07.139 A structure, this is what you would see under a microscope if looking at a. 50 00:12:07.139 --> 00:12:10.408 Material or a composition of materials. 51 00:12:10.408 --> 00:12:15.089 Changing transitioning from a liquid phase to a solid phase. So. 52 00:12:15.089 --> 00:12:23.999 Light blue being the liquid phase, and the darker blue, being the solid phase solid blobs. So you can play around. 53 00:12:25.109 --> 00:12:28.288 With some variables here and. 54 00:12:28.288 --> 00:12:32.188 Change a see how it relates to a phase diagram. This is another. 55 00:12:32.188 --> 00:12:37.979 Materials concept that they're stressing to teach, but this is the main focus point of our project. 56 00:12:37.979 --> 00:12:41.639 So, yeah, you can play around with these. 57 00:12:41.639 --> 00:12:45.418 See, this picture change correspondingly. 58 00:12:45.418 --> 00:12:49.859 So, let's get back to this. 59 00:12:49.859 --> 00:12:54.058 Yeah, I just kind of covered some of this, but yeah, microstructure is a. 60 00:12:54.058 --> 00:12:59.399 Representation of a solid structure under a microscope so you can see each 1 of these little. 61 00:12:59.399 --> 00:13:02.548 Locks if you will are called grains. 62 00:13:03.568 --> 00:13:10.168 And, yeah, so we took this algorithm and we tried to make it parallel. 63 00:13:10.168 --> 00:13:13.828 I will, I guess, give it over to ban you can talk about. 64 00:13:13.828 --> 00:13:18.058 Some of the specifics technical details. 65 00:13:18.058 --> 00:13:25.589 Sure, yeah, so the main tool we decide to use was 2 Pi. 66 00:13:25.589 --> 00:13:37.528 The microstructure program already used dump pie, which has some limited CPU parallelization, but it wasn't too expensive. It wasn't a huge speed up. So. 67 00:13:37.528 --> 00:13:46.229 We thought that would be even better. So coupon uses and could a platform. 68 00:13:46.229 --> 00:13:50.188 Um, you know, which is, you know, stuff that we've done. 69 00:13:50.188 --> 00:13:54.509 So, we took the your program. 70 00:13:54.509 --> 00:13:58.168 Um, and modified it to take advantage. 71 00:13:58.168 --> 00:14:01.379 Coupon the platform. 72 00:14:01.379 --> 00:14:04.379 So, I want to go to the next slide. 73 00:14:05.698 --> 00:14:08.969 So, here's just a little bit of the code. This is like. 74 00:14:08.969 --> 00:14:12.958 Some of the meat of a lot of where we modify it and. 75 00:14:12.958 --> 00:14:17.818 Chain stuff to use the library. 76 00:14:17.818 --> 00:14:22.288 Live a visual here we can go to the next 1. 77 00:14:25.198 --> 00:14:31.229 So, on smaller simulations, there wasn't a whole lot of time improvement. 78 00:14:31.229 --> 00:14:34.859 But where parallelization. 79 00:14:34.859 --> 00:14:39.208 And optimization really shines as the larger scale. 80 00:14:39.208 --> 00:14:42.328 Um, applications, so we found that. 81 00:14:42.328 --> 00:14:46.558 When we increase the 2 sizes of, you know. 82 00:14:46.558 --> 00:14:52.589 A 1000 by 5,000 by 4,000 pixel wise simulations improvements got. 83 00:14:52.589 --> 00:14:55.739 Much larger than it did with. 84 00:14:55.739 --> 00:14:59.489 Much faster than it was with numb pie and with. 85 00:14:59.489 --> 00:15:06.658 Uh, yeah, so the original. 86 00:15:06.658 --> 00:15:15.448 Simulation ran about 256 by 256 and at that level, it wasn't a whole lot of change, but at the level of 4,000 by 4,000, it got. 87 00:15:15.448 --> 00:15:22.198 Be much greater change, so, got a table on the next slide to show some of that. 88 00:15:22.198 --> 00:15:26.428 Um, so, yeah, point, you know. 89 00:15:26.428 --> 00:15:32.668 Point 01 seconds and point 03 seconds that the big of a deal, but at a size of 5,000 by 5,000. 90 00:15:32.668 --> 00:15:36.149 You know, simulated particles it was much faster. 91 00:15:37.438 --> 00:15:41.818 There's also I just want to know, I think it's important to point out that. 92 00:15:41.818 --> 00:15:48.538 We would never want to generate an image of 4,000 by 4,000, but this was just a way to sort of simulate. 93 00:15:48.538 --> 00:15:53.489 That the best stress test year would be to have multiple concurrent users on it, but. 94 00:15:53.489 --> 00:15:57.178 Generating an image of 16 times the size would. 95 00:15:57.178 --> 00:16:01.078 There will be the equivalent of 16 users, so. 96 00:16:03.149 --> 00:16:07.259 Yeah, so that was a pretty good success. 97 00:16:07.259 --> 00:16:12.538 Up next we've got a little demo to show the difference. Yeah. 98 00:16:12.538 --> 00:16:18.269 So, to set this up, I had a. 99 00:16:21.178 --> 00:16:27.928 Um, I had my Python environment activated here and then 1st, I just want to show you guys the. 100 00:16:27.928 --> 00:16:33.599 Plain numb pie version. This is 1000 by 24. 101 00:16:33.599 --> 00:16:39.538 Obviously pretty large for a computer screen, but again, just want to simulate concurrency. 102 00:16:40.798 --> 00:16:44.548 So, if I move this around each new. 103 00:16:44.548 --> 00:16:49.528 Liquid fraction value that pops up. You'll see a time. 104 00:16:49.528 --> 00:16:52.619 Start to complete for generating the new picture. 105 00:16:52.619 --> 00:16:59.969 It's just sitting right around 2 tenths of a 2nd point 2, 2, 2 1. 106 00:16:59.969 --> 00:17:04.469 So, this isn't very, it's a very useful. 107 00:17:04.469 --> 00:17:10.048 For someone trying to learn through dynamic visualizations is very choppy. 108 00:17:10.048 --> 00:17:16.229 Do you guys are able to see it over Webex but it is pretty choppy and. 109 00:17:16.229 --> 00:17:22.138 Here's the time to prove it, so. 110 00:17:22.138 --> 00:17:25.288 I cleared again and then if I were to run our. 111 00:17:25.288 --> 00:17:29.189 Who Pi version. 112 00:17:29.189 --> 00:17:35.009 Same image size same exact simulation. Really? But now. 113 00:17:35.009 --> 00:17:39.538 Bring these sliders they're are seeing. 114 00:17:39.538 --> 00:17:43.558 About 20 times speed improvement. 115 00:17:43.558 --> 00:17:48.419 There's much better, much lower latency from. 116 00:17:48.419 --> 00:17:52.348 Me sliding this to getting a new image, though. I can see the dynamics. 117 00:17:52.348 --> 00:17:55.828 Very well. 118 00:17:55.828 --> 00:18:01.348 So, yeah, and I think this is an improvement that I wanted to. 119 00:18:02.429 --> 00:18:07.318 Stress for the following semester, my capstone project since, uh. 120 00:18:07.318 --> 00:18:15.929 Right now the live version is only running on a I think it's an 8,700 K and a VM. So there's only a couple of CPU cores. 121 00:18:15.929 --> 00:18:22.769 I guess my CPU implementation was a pretty best case scenario. So I have a pretty. 122 00:18:22.769 --> 00:18:25.888 Fast single core. 123 00:18:25.888 --> 00:18:31.499 But, yeah, I guess we, we can take some questions down. There are any. 124 00:18:31.499 --> 00:18:40.288 That's just about what we have. Well, thank you. Interesting. It's sort of like a morphological dilation operation. It looks like. 125 00:18:40.288 --> 00:18:49.409 Growing the circles yeah, so I wasn't I wasn't quite sure of the exact math that goes into this, but it definitely. 126 00:18:49.409 --> 00:18:52.439 Is a pixel by pixel calculation. 127 00:18:52.439 --> 00:18:56.669 And there's a lot of vector operations. Here's. 128 00:18:56.669 --> 00:19:00.778 It'll accept the random seed, which is basically we'll see the center point. 129 00:19:00.778 --> 00:19:06.749 Of these grains, so I could change the seed and we would get a completely different image, but yet. 130 00:19:06.749 --> 00:19:11.249 Basically, you have a center point for grains. 131 00:19:11.249 --> 00:19:16.288 And you have a growth rate, also random within certain bands and. 132 00:19:16.288 --> 00:19:21.568 Each pixel is calculated hey, which grain will get to me. 1st. 133 00:19:21.568 --> 00:19:25.138 From there, we can create an image. 134 00:19:25.138 --> 00:19:28.739 Okay, I see what you're doing now. Anyone else have any questions. 135 00:19:28.739 --> 00:19:33.898 Did you say you have job opportunities available for people on this. 136 00:19:34.949 --> 00:19:44.729 I didn't, I didn't say that I'm sorry I was seeing if this project were to continue into the following semester. I think this is a. 137 00:19:44.729 --> 00:19:52.019 Important route of implementation. I got it for a classroom environment. Yeah. Everyone's going to be on this. 138 00:19:52.019 --> 00:19:58.409 Thank you other questions. Okay. 139 00:20:00.148 --> 00:20:03.598 Blame you. 140 00:20:03.598 --> 00:20:11.578 I just saw a question pop up. Oh, sorry. Yeah. It's always tough to see it when I'm sharing. So you can just read it. What Python class. 141 00:20:13.259 --> 00:20:18.148 Um, we're using a to draw the window here. 142 00:20:18.148 --> 00:20:25.108 And then from a non Pi array, or I guess in this case, a, we're using pillow. 143 00:20:25.108 --> 00:20:28.739 Pillows image from array method. 144 00:20:28.739 --> 00:20:33.358 To create the image, does that answer your question? 145 00:20:33.358 --> 00:20:39.239 Okay, other questions. 146 00:20:39.239 --> 00:20:43.648 Great. Okay. 147 00:20:43.648 --> 00:20:46.769 Lane, what do you have to tell us. 148 00:20:46.769 --> 00:20:49.769 Can you guys hear me? Yes. 149 00:20:49.769 --> 00:20:52.919 Okay, great. I'll try sharing my screen now. 150 00:20:55.378 --> 00:21:00.689 Working perfectly. Okay. Great. Great. Good to hear. 151 00:21:00.689 --> 00:21:04.499 Uh, yeah, so let me get started then. 152 00:21:04.499 --> 00:21:08.038 So, uh, I did my projects on. 153 00:21:08.038 --> 00:21:14.519 Um, evaluating moves for the board game corridor, using parallel computing so that I could make a. 154 00:21:14.519 --> 00:21:17.759 Very basic that you could play against in the game. 155 00:21:19.108 --> 00:21:25.259 So just an overview for the game, because a lot of this might not make sense if you don't have a visualization of what the game looks like. 156 00:21:25.259 --> 00:21:34.138 Um, it's an eye by 9 boards. There's between each 1 of these boards you can put a 2 by 2 wall piece, which can either be facing up or sideways. So there's. 157 00:21:34.523 --> 00:21:48.413 8, by 8 different places, you can put it in 2 directions each 1 and each player gets 10. well, also there's 20 wells in total. So each round, you can either place a wall or move your player and you're not allowed to entirely cut off the other side. You can't make it impossible for the player. 158 00:21:48.443 --> 00:21:54.983 You just can make it as circuitous as you want and the 1st player to the other side wins alternating rounds of, like. 159 00:21:55.288 --> 00:21:59.429 Being able to either play softball or move or place to move and trying to make it to the other side. 160 00:22:00.509 --> 00:22:09.239 So the way I broke this problem down was, um, into a couple of different, like, main files 1 of them that was just handling, like, um. 161 00:22:09.239 --> 00:22:15.509 The board itself, and the structure that I use for, like, indicating what the, like, moves are. 162 00:22:15.509 --> 00:22:20.669 A path finding algorithms so that you could figure out if it, if the other sites been cut off or not. 163 00:22:20.669 --> 00:22:31.618 Um, game dot H, which handles the valid player moves to figure out like, if I'm here, what can I actually do in terms of being able to place wells or being able to move. 164 00:22:31.618 --> 00:22:38.489 And then finally the actual parallel component of this games research that goes through all of the different. 165 00:22:38.489 --> 00:22:42.838 Possibilities down to a certain depth and tries to. 166 00:22:42.838 --> 00:22:47.669 Make a prediction on what an opponent would do based on how those moves the play apps. 167 00:22:47.669 --> 00:22:59.578 So, the main algorithm here is what's known as many maps. It's a game research algorithm. So here is an example of a game tree with tic TAC toe, just because it's an incredibly simple game. 168 00:22:59.578 --> 00:23:03.088 Where you could imagine, like, given some starting board state. 169 00:23:03.088 --> 00:23:14.848 A certain player could only make, like, a certain number of moves and then in contrast, in response to those, the next player could make a certain number of moves. And in response to that 1, you could make another move and. 170 00:23:14.848 --> 00:23:19.019 Assuming that the game doesn't go on sufficiently long. 171 00:23:19.019 --> 00:23:28.648 You could go through for a simple enough game, all of the possibilities, and just tell what would let you win based on what all possible responses you could do for the other player. 172 00:23:28.648 --> 00:23:34.229 However, uh, that is problematic with games with large search speech and search spaces because, um. 173 00:23:34.229 --> 00:23:37.949 Unlike tic TAC toe, which only has like, this 3 by 3 grid. 174 00:23:39.144 --> 00:23:51.894 There is no possible way to go through all of the different, like, wall possibilities because there's, um, 133 different move possibilities at each Player's position. So it grows exponentially way too fast for it to be controlled. 175 00:23:53.009 --> 00:23:56.249 So, the idea here is that, um. 176 00:23:56.249 --> 00:23:59.459 Using parallel computing break the sub tree down. 177 00:23:59.459 --> 00:24:04.618 Into smaller subseries that can be solved on their own and then have the solutions brought back together. 178 00:24:04.618 --> 00:24:10.019 Because using those parallel computing resources, you can explore more of the train, the same amount of time. 179 00:24:10.019 --> 00:24:15.628 I did this mainly with an algorithm called alphabet recruiting, which lets you. 180 00:24:15.628 --> 00:24:21.328 Trim off or prune branches from the tree that look no rational player would do like. 181 00:24:21.328 --> 00:24:27.388 If all the notes on a certain cyber to lead to you losing or lead to the opponent player. 182 00:24:27.388 --> 00:24:33.028 Having a relative advantage, where, you know that they wouldn't choose that move, because it would let you be better off. 183 00:24:33.028 --> 00:24:37.618 Then you can sort of disregard a whole part of the tree and not have to keep searching in it. 184 00:24:37.618 --> 00:24:44.638 And since it's an algorithm, that's quasi independent from each other. There's a couple of variables that get passed around. It can be paralyzed. 185 00:24:44.638 --> 00:24:48.088 So the main parallelization here was using open and P. 186 00:24:48.088 --> 00:24:55.949 Um, so each, um, open MP thread gots a set of like, its own boards from the starting node. Uh. 187 00:24:55.949 --> 00:25:05.128 So, like, the board is in a current state, and you're current player, and there's a list of options you can do. And each of the open entry threads was handling part of this for loop. 188 00:25:05.128 --> 00:25:11.068 For deciding, I'm like, going through the whole game tree down to a certain depth. Um. 189 00:25:11.068 --> 00:25:16.798 For what they would be able to do from there so that that initial process is split apart. 190 00:25:16.798 --> 00:25:21.598 So, what that would look like, is a parallel section where each thread gets its own copy of the immediate board. 191 00:25:21.598 --> 00:25:30.298 And each 1 is helping to solve through this for loop of all the 1st level moves it could make. And then in its own time calling the century solver. 192 00:25:31.409 --> 00:25:39.534 So there were some complications with this where alpha beta printing also returns a variable that you have to, like, or 2 variables that you have to keep track of that's global to all of them. 193 00:25:39.804 --> 00:25:47.304 Because if you don't keep the variables global, then the centuries can't learn information from the other ones and evaluates like, what would be the best move faster. 194 00:25:47.638 --> 00:25:54.479 But open and works better when we have the least amount of information that must be passed around, like, atomics and criticals because they tend to. 195 00:25:54.479 --> 00:26:06.118 Have a lot of overhead and hold stuff up. So, um, after, like, I initially wrote this up, uh, just to speed it up. I did too many things. I rewrote the algorithm to have for you to fewer critical blocks by, um. 196 00:26:06.118 --> 00:26:10.979 Rewriting it so that there was only an upper bound instead of a lower end upper bound. 197 00:26:10.979 --> 00:26:17.699 And that ended up causing me decent speed increase and, um, adding what's known as a transposition table, which is just a record of, like. 198 00:26:17.699 --> 00:26:26.098 At this board location, what ended up being the result so that multiple trees could talk to each other through that board and. 199 00:26:26.098 --> 00:26:34.409 Um, if 1 of them has already evaluated this possibility, like, there's more than 1 way to get to the same configuration of a board. Like, you could move somewhere and then move back. 200 00:26:34.409 --> 00:26:38.578 But the, you don't have to reevaluate that a 2nd time. If you've already cash the results. 201 00:26:39.719 --> 00:26:46.588 So here are my basic results, uh, for the optimizations I just talked about in my original code for running, like. 202 00:26:46.588 --> 00:26:51.929 With Max parameters each time I added 1 of the optimizations I was matched to. 203 00:26:51.929 --> 00:26:55.078 Save a couple of seconds off the total thing. 204 00:26:55.078 --> 00:27:00.689 And then just in comparison to it, being single threaded after adding each number of thread in open MP. 205 00:27:00.689 --> 00:27:08.489 Starts to give a pretty decent time saving, but, uh, as you get into extremely high numbers of threads, I'm assuming the overhead starts to overtake. 206 00:27:08.489 --> 00:27:22.798 The advantage of having multiple things solving trees so I can also give a demonstration of this. I need a little output and hopefully this will cooperate with me and display but otherwise I have the video. 207 00:27:22.798 --> 00:27:28.558 I'll just have to switch to a different thing. So what we have here is. 208 00:27:28.558 --> 00:27:32.578 On that board, each of these is representing in empty space. 209 00:27:32.578 --> 00:27:35.669 As is the 2nd player he is the primary player. 210 00:27:35.669 --> 00:27:42.388 And as they move around, just me, being the secondary player, playing against the AI. 211 00:27:42.388 --> 00:27:47.848 You can place down different pieces and different walls that block off different sections. 212 00:27:47.848 --> 00:27:53.038 And actually, it doesn't seem that this isn't rendering, right? 213 00:27:54.419 --> 00:28:02.038 Give me a 2nd. Okay this might be a little bit better. 214 00:28:09.868 --> 00:28:13.288 So, your player, the computer player. 215 00:28:14.398 --> 00:28:17.398 You're trying to get to the other side and you can put up walls or move. 216 00:28:17.398 --> 00:28:21.298 So, initially I put down a lot of stuff then, but it only bought me a turn. 217 00:28:21.298 --> 00:28:25.798 And then the AI just sort of slowly boxes me in. 218 00:28:28.858 --> 00:28:32.159 And then when I try to escape, puts down another wall and another wall. 219 00:28:37.078 --> 00:28:44.278 And puts down its own wall so that I can't stop it from going somewhere until eventually it gets to where it's 1 space away from the end. And it's 1. 220 00:28:52.979 --> 00:29:06.689 So, just to get back to where we were, uh, so, uh, some other possible improvements I thought of, although wasn't able to implement in the time for this thing, we're trying to make the open empty structures more efficient. Like, I could try to whittle down the critical section a bit more. 221 00:29:06.689 --> 00:29:10.528 I could catch more information between rounds because when I have it. 222 00:29:10.528 --> 00:29:19.618 Set up to play against an, a, I, I don't cash the information between each time. You try again it restarts the whole thing and throws out the cash each time. 223 00:29:19.618 --> 00:29:27.868 Because I didn't want, um, a lower quality previous estimate to mess up with its new estimates since it's in a new position. 224 00:29:28.223 --> 00:29:37.104 But, it would be much more efficient if I were to figure out a way to make that work. And there are some entirely different algorithms that I had no time to implement for this type of thing. But are absolutely amazing. 225 00:29:37.374 --> 00:29:48.923 Like, um, 1, alternative to Minnie Max and alpha beta for name is the Monte Carlo tree search where you just go down a certain number of moves in the game tree. And then after that, since you couldn't possibly explore them all. 226 00:29:49.229 --> 00:30:03.808 What it does is, it would just randomly go through the rest of the roofs and until it hits the end of the game and then give a probability value at each note of how likely you are to win based, on random movements following the depth. You can explore. 227 00:30:03.808 --> 00:30:07.828 Which is what Google use when they train the alpha going. 228 00:30:07.828 --> 00:30:12.719 It's pretty interesting. So, um, any questions. 229 00:30:14.159 --> 00:30:22.558 Yeah, thank you. Interesting. What the idea is extend to a different game or a bigger game. 230 00:30:22.558 --> 00:30:26.669 Oh, yeah, yeah, totally medium X and alpha beta printing. 231 00:30:26.669 --> 00:30:31.919 Are, uh, pretty generic thing they work for any game, which is why they're usually talked about in, like. 232 00:30:31.919 --> 00:30:35.729 To player game, programming, type stuff. 233 00:30:35.729 --> 00:30:42.898 I had originally got the inspiration from this, because a couple of years back, I had taken interaction to artificial intelligence. 234 00:30:42.898 --> 00:30:49.769 The CS course, and 1 of the things we had done was implement these types of things but for Pac, man. 235 00:30:49.769 --> 00:31:01.769 The PacMan so much more simple game where the movements are much more predictive. So I was wondering to try it out using, like, both parallel computing and, um, a totally different game. So I could write it all from scratch and see what I could do. 236 00:31:04.528 --> 00:31:12.509 Okay, thank you. Anything else. What type of do you use? I didn't use the GPU. I used. 237 00:31:12.509 --> 00:31:18.358 Um, purely the CPU because it got really messy to try to make. 238 00:31:18.358 --> 00:31:26.878 So, like, at each node, there's a lot of different decisions that have to happen in terms of branching and I just couldn't find a way to get around to the. 239 00:31:26.878 --> 00:31:33.568 Like, the, the work problem of if 1 of the things is going in a different direction, you have issues. 240 00:31:33.568 --> 00:31:37.979 And I read a couple of papers for some people managed to get around that. 241 00:31:37.979 --> 00:31:45.598 But nowadays, if people are going to use the GPU, most people would write up the Monte Carlo research because you can use that. They're on that to solve the. 242 00:31:45.598 --> 00:31:48.959 Instead of randomness, continuing on, you can use the. 243 00:31:48.959 --> 00:31:57.179 Averages to train and are on it and then use the neural net to go beyond what you can explore in a treaty. 244 00:31:57.179 --> 00:32:01.739 Okay, I got it. Thank you. Great. 245 00:32:01.739 --> 00:32:10.259 On or you're up next let me let me pull everything. 246 00:32:10.259 --> 00:32:25.169 Okay, let me know when you can see my screen. 247 00:32:26.219 --> 00:32:29.878 Now, job, search, web, scraping through. Indeed dot com. 248 00:32:30.203 --> 00:32:44.993 Wonderful All righty. So hey, everyone my project was focused on developing a personalized job search application to be applied through. Indeed. Com, using web scraping. 249 00:32:45.358 --> 00:32:54.538 So, at this point, we've all had to deal with the pain of going through a job search, whether that be for internships and Co Ops or for. 250 00:32:54.538 --> 00:33:05.759 Full time employment, following graduation and I don't know about you, but I really hate the endless scrolling through different job boards on sites like LinkedIn. Indeed. And glass door. 251 00:33:06.324 --> 00:33:15.953 There are so many jobs posted on these sites every day, which don't get me wrong is great when looking for a position, and it opens up doors to a lot of potential opportunities. 252 00:33:16.223 --> 00:33:21.624 But it seems like finding the right fitting position is like, finding a needle in a haystack. 253 00:33:21.898 --> 00:33:25.288 Like, you can see in the top rate screenshot. 254 00:33:25.288 --> 00:33:39.173 These job boards seek to overcome this large volume of postings by providing different search features and qualifications only return the postings that match the users search specifications and they offer quite a few great search criteria, 255 00:33:39.173 --> 00:33:41.693 such as location experience and salary. 256 00:33:41.993 --> 00:33:51.054 But the problem is that these job boards aren't smart enough to understand the context surrounding the keywords and the qualifications that the user inputs and. 257 00:33:51.358 --> 00:33:55.709 Not all physicians in the same industry, especially in software engineering. 258 00:33:55.709 --> 00:34:01.019 Use the same technologies or techniques. So, 1 position may be a better fit than another. 259 00:34:01.019 --> 00:34:08.338 Uh, even if they both mentioned the same key word so take, for example, the screenshot on the bottom here. Um. 260 00:34:08.338 --> 00:34:16.139 This is the requirement section of 1 of the top positions that comes up on. Indeed. When you search for a software engineer Python. 261 00:34:16.139 --> 00:34:24.478 Um, you can see highlighted in blue that it does mention Python and it meets the search criteria as a result of that. 262 00:34:24.478 --> 00:34:37.284 You're the only problem for me personally, is that I despise doing any sort of web development, and I want to discard any searches that focus on web development and looking at the rest of these requirements in this list. 263 00:34:37.284 --> 00:34:47.423 And specifically the technologies that I've mentioned, uh, looking for extreme proficiency, and such as no react and restful web services. 264 00:34:47.639 --> 00:34:55.134 I can tell you that this position and focuses on web development, but again indeed doesn't know that. Indeed doesn't recognize. 265 00:34:55.134 --> 00:35:03.143 The Python is only mentioned as just other technologies and that it was likely included as just another keyword in the posting. 266 00:35:03.449 --> 00:35:11.429 The same could work the other way around. I wouldn't want to exclude a job posting just because it mentioned Java script somewhere in the listing. 267 00:35:11.429 --> 00:35:17.009 But when web technologies become a large portion of the listed technologies in the description. 268 00:35:17.009 --> 00:35:28.103 It's fair to assume that I'm no longer interested in the position and I have now spend the time reading through the description, and looking at the company just to discard it. And while it may not have taken me very long. 269 00:35:28.103 --> 00:35:34.074 This can happen dozens of times in just a short browsing session. And this time does quickly add up. 270 00:35:34.378 --> 00:35:39.958 So, how do we get around this and only focus on the postings that might actually be a good personal fit. 271 00:35:39.958 --> 00:35:49.228 Well, so my 1st idea was to use web scraping if I could scrape and collect the relevant information and keywords from these job postings. 272 00:35:49.228 --> 00:36:03.623 I could then use that collected information to process and filter the different jobs, using the technical and contextual knowledge that I have above what each job search functionality has for instance I could only show myself the job postings. 273 00:36:03.623 --> 00:36:17.903 That contain less than say, 20%, web, related technologies. And are the positions that meet, say, 75% of the technologies that I want to work with, and that I meet the qualifications for. So, to understand how I needed to go about doing this. 274 00:36:19.318 --> 00:36:26.159 i1st need to do a little research to gain some general knowledge about the scraping and the associated technologies. So. 275 00:36:26.159 --> 00:36:35.909 What is web scraping? Well, a formal definition of web scraping is the process of collecting structured data web data in an automated fashion. 276 00:36:35.909 --> 00:36:43.259 More generally, it's essentially just collecting the publicly available data from the web, or from a website. 277 00:36:43.259 --> 00:36:50.668 And there are a few different ways to do it most general of, which is essentially just straight website. 278 00:36:50.668 --> 00:36:55.409 You take in the website and you scrape or filter out the information that you're interested in. 279 00:36:55.409 --> 00:37:02.128 Say the images are just the headings, um, if you've copied and pasted something from a Web site, you've done. 280 00:37:02.128 --> 00:37:15.778 Some form of scraping, you took your knowledge of the content of the site and the context in which it was presented and you pulled or scraped the relevant definition or other texts that you were interested in. But this process. 281 00:37:15.778 --> 00:37:24.748 Uh, is very manual and gets incredibly slow and it's very time consuming so a web scraping fame framework can help to automate this. 282 00:37:24.748 --> 00:37:33.418 To apply this more specifically to the parallel computing topic of the class. We can look into distributed web crawling web, scraping. 283 00:37:33.418 --> 00:37:38.489 Um, yes, there is a difference between crawling and scraping. 284 00:37:38.489 --> 00:37:49.829 With crawling pretty much, just being indexing the sites. Um, this is pretty much what search engines do is they use massive computing clusters to crawl the connected parts of the Internet. 285 00:37:49.829 --> 00:37:56.938 And this is where the term deep web comes from, the deep web is essentially just the parts of the Internet. 286 00:37:56.938 --> 00:38:01.528 Uh, whereas scraping is more focused on the collection of data from these websites. 287 00:38:01.528 --> 00:38:07.679 So, distributed scraping models, essentially employ many computers to scrape information from websites. 288 00:38:07.679 --> 00:38:20.760 The scraping can be very repetitive and very tedious. Especially when you start looking at similarly formatted websites, or you crawl out to connected sites, for instance, following the links on a web page. 289 00:38:20.760 --> 00:38:30.119 Um, and then trying to scrape that new link that you found, and then repetitively recursively doing that through all of the link sites. Um. 290 00:38:30.385 --> 00:38:33.295 This lends itself super well to parallelization. 291 00:38:33.775 --> 00:38:45.864 So while a distributed model may be slightly overkill for the job search application that I'm specifically implementing as I'm not going to be scraping thousands or hundreds of thousands of websites. 292 00:38:46.139 --> 00:38:51.925 It is still good to look into and it was good to research and tie that back into the class. 293 00:38:52.315 --> 00:39:04.135 So, after having gotten a little bit of general knowledge about scraping and seen a few tutorials about how to get it working, it was time to start looking specifically into what technologies to use to do it. 294 00:39:04.614 --> 00:39:08.335 So, I quickly decided that Python was going to be my go to here. 295 00:39:08.610 --> 00:39:16.170 And started researching different, I'm scraping frameworks for Python and scraping. Is what immediately came up. 296 00:39:16.735 --> 00:39:30.925 From the research I did, it's probably the most popular Python frameworks for web scraping. It is entirely open source, but it's consistently maintained and it's very widely used, which makes it a good and reliable or open source project to use. 297 00:39:31.704 --> 00:39:33.715 It's also very intuitive. 298 00:39:34.019 --> 00:39:42.659 It makes it very easy to get started with web, scraping and crawling, allowing a user to write a functional spider and probably 10 lines of code. 299 00:39:42.659 --> 00:39:46.500 But despite this ease of use, it can also be expanded. 300 00:39:46.500 --> 00:39:56.940 To be applied to very complex crawling jobs and there's also a distributed version called scraped, be distributed that allows for those large scale, computationally demanding jobs to be done. 301 00:39:56.940 --> 00:40:03.030 Granted, the scraper distributed platform is less widely used and less maintained. 302 00:40:04.135 --> 00:40:18.925 While scraping is great on its own. It can also be used in conjunction with web, which is something that I found out later in the project and That'll be important here in a few slides. But this is a big deal, because usually web scraping is done as an alternative to using a web. 303 00:40:19.739 --> 00:40:23.670 So the fact that you can use both really is very appealing. 304 00:40:23.670 --> 00:40:30.239 So, after settling on, I needed to do a little bit of Recon on the website that I'd be scraping. 305 00:40:30.355 --> 00:40:44.364 As any developer, or as any crawler that you develop will be specific to the outline of the format of the associated website and you can't really have a spider that collects information from all kinds of websites, or is a general kind of scraper. 306 00:40:45.264 --> 00:40:49.885 So, for the sake of creating a use case, I focus specifically on indeed dot com. 307 00:40:50.219 --> 00:40:54.150 Uh, through the Recon, I was able to find a few different things, so. 308 00:40:54.150 --> 00:41:07.590 For 1, while each job posting on, indeed includes a description and position outline. There's no set format for these. So the structure quality and amount of content in these descriptions varies from posting to posting. 309 00:41:07.590 --> 00:41:17.844 And the variability made it rather difficult to scrape completely, but I could at least searched for keywords within those descriptions, regardless of that format. Right? 310 00:41:18.715 --> 00:41:29.635 So upon further research, I also found that indeed, actually offers 2 different web. It offers a get job and a job search API and through reading through these and testing them out. 311 00:41:29.909 --> 00:41:38.159 I found that I could really easily use the job search API in conjunction with the scraping application to get some more structured data than I would. 312 00:41:38.159 --> 00:41:52.135 Otherwise be able to because of the variability and the job descriptions, and then I could use the get job API to return. The filter drops back to the user for viewing. There was also some variability on the application links. 313 00:41:52.164 --> 00:41:56.485 So, my idea was to follow the links to the actual company site. 314 00:41:57.324 --> 00:42:09.414 To perhaps scrape some information from them about the specific requisition ID, or really any other additional information that may be on that site. But not all of the company's site links, take you to the listing. 315 00:42:09.894 --> 00:42:12.925 Some sites will take you to a job posting on the company's site. 316 00:42:13.199 --> 00:42:24.539 But others will take you to an online application page through a site, like work day and then others don't even have a company of link at all and they just take you to a quick apply capability or indeed. Itself. 317 00:42:24.539 --> 00:42:32.880 So, the indeed API would that was going to be the most important for my application was the job search. 318 00:42:33.385 --> 00:42:47.065 This would essentially provide the functionality of performing the search itself and provide me with the list of jobs that I would then be interested in scraping. So there were a few main highlights of this API that made it very useful in developing the desired functionality. 319 00:42:48.025 --> 00:42:50.695 1st, you're able to specify the output data format. 320 00:42:50.940 --> 00:43:02.909 So, for me, this was really important because I needed the Jason data in order to make it efficient enough to collect the scraped information and then parse it for the processing back to the user. 321 00:43:02.909 --> 00:43:10.469 Also, so through many of the functionalities, the offers that are well connected to Java script. 322 00:43:10.469 --> 00:43:19.650 Such as the ability to pass a call back function directly to the API, it became clear that I probably should have done this in Java script. But. 323 00:43:19.650 --> 00:43:23.250 I wasn't I wasn't about to deal with that so. 324 00:43:23.250 --> 00:43:30.030 The API also allows any of the parameters that are passed in for the search parameters. 325 00:43:30.030 --> 00:43:35.849 Um, available in the as well as a start index parameter. 326 00:43:35.849 --> 00:43:41.429 And this start index became hugely important to my application. 327 00:43:41.429 --> 00:43:51.900 Because it allowed me to just update an existing search and I did give me the ability to have persistence between searches. So, using this index. 328 00:43:51.900 --> 00:43:57.300 I only had to track the ending ID of the last return job for any previous search. 329 00:43:57.300 --> 00:44:06.179 And then I could pass that ID back to future searches to give the functionality of just updating the scraping as opposed to having to. 330 00:44:06.179 --> 00:44:09.929 Search through all of the jobs and scrape through all of them again. 331 00:44:09.929 --> 00:44:17.909 This not only makes the future collections much quicker, but it also only returns that newly posted jobs to the users. 332 00:44:17.909 --> 00:44:24.239 So, with all of that information, I was able to come up with the final design and then develop my application. 333 00:44:24.239 --> 00:44:31.409 So, my final design would focus on taking input from the user in the form of personal technical skills. 334 00:44:31.409 --> 00:44:46.380 Skills they wanted to work in and skills that they wanted to avoid as well as any of the other parameters such as years of experience, location and salary. These input parameters would then be used to formulate a search that would be passed through to the job search. 335 00:44:46.380 --> 00:44:54.840 Using the return data specifically the link of the job posting, I would then kick off multiple scraping jobs. 336 00:44:54.840 --> 00:45:03.030 Scraped valuable information from all of the search results as well as following any links that were contained in the descriptions or on that page. 337 00:45:03.030 --> 00:45:12.750 And in order to escape from all of them as well, with these return sets of data, I would then apply user preferences of applied skills and skills that they wanted to avoid. 338 00:45:13.135 --> 00:45:21.594 In order to filter out some of the jobs, and then return the remaining ones to the user and then call the get job. If the user selects to view the specific position. 339 00:45:22.284 --> 00:45:32.635 I then store the ending job ID index and a temporary file, which is searched for when a new searches kicked off. And if the new search matches the parameters of the previous 1. 340 00:45:32.940 --> 00:45:38.159 Only, the new jobs are returned, so, as to avoid processing the same positions time and time again. 341 00:45:38.159 --> 00:45:51.030 I'd love to show you guys as an example of this in action, but my code is currently a mass. I kind of messed it up earlier today, as I was working through some bugs with the scrappy return data. 342 00:45:51.030 --> 00:46:02.155 Um, the problem is that I'm getting a lot of garbage data and relevant data that I really don't want, and I'm working to clean it up so that I only get the information I want and don't have to. It doesn't get messy. 343 00:46:02.905 --> 00:46:14.514 So, please just see the flow chart to the right for visualization of how it should work. I didn't actually get blocked from any of the websites as a result of running the code, which was a little surprising to me. 344 00:46:14.820 --> 00:46:22.469 Although I did get curious at 1 point and intentionally got myself blocked from indeed for creeping, which was interesting to see. 345 00:46:22.469 --> 00:46:27.539 I think that the reason that I'm not getting blocked is because. 346 00:46:27.539 --> 00:46:37.019 I'm making a lot of API calls um, and that's the that's most of my interaction with the actual indeed dot com website. 347 00:46:37.019 --> 00:46:46.170 And then there are no, uh, company site specifically that I'm doing it enough work on are visiting enough times that it raises any flags. 348 00:46:46.170 --> 00:46:50.550 So that's pretty much the overview. Or are there any questions I can answer? 349 00:46:50.550 --> 00:46:59.250 Yeah, thank you. So this would work for other stuff besides jobs, I guess like apartments or something maybe. 350 00:46:59.250 --> 00:47:05.219 Yeah, without a doubt, it could definitely be easily applied to any sort of, uh, um. 351 00:47:05.219 --> 00:47:12.900 You know, posting site like that, you would just have to change up some of the scraping stuff again to match the. 352 00:47:12.900 --> 00:47:22.949 To match the new style of website and new outline of the website and then see if they have any, for instance, I think that Zillow has an API that you can use in conjunction with everything. 353 00:47:22.949 --> 00:47:30.300 Cool. Okay great. No other questions. Let us see, Dan. 354 00:47:30.300 --> 00:47:34.530 Would you like to tell us what you're up? Do? Hello? 355 00:47:34.530 --> 00:47:43.500 I don't know if you can hear me can hear you. All right awesome. Okay. Screen share. 356 00:47:45.000 --> 00:47:51.090 I can see you. 357 00:47:51.090 --> 00:47:54.690 So. 358 00:47:54.690 --> 00:48:02.699 I did my present, or I do my project in conjunction with my graphics. 359 00:48:02.699 --> 00:48:06.780 Project, so I chose to do it on. 360 00:48:07.284 --> 00:48:15.505 Trying to accurately render Opal so the stone, if you're all familiar with it, so kind of also related to material science in a way. 361 00:48:16.255 --> 00:48:22.675 So, taking what we learned about Ray tracing, and then applying it to or applying parallel computing. 362 00:48:23.039 --> 00:48:26.429 To hopefully get a nice speed up. 363 00:48:26.429 --> 00:48:31.349 So kind of the implementation for retracing. So. 364 00:48:31.349 --> 00:48:42.025 I used our kind of a backbone event. We used open GL, and I put in C. plus plus. So we kind of had a backbone program that I started off with. 365 00:48:42.025 --> 00:48:47.905 So, I had to look into a lot of the ways, the drawing loops and all that were set up to. 366 00:48:48.570 --> 00:48:56.699 Uh, actually do the speed up, but the general rate tracing algorithms. So there's a animation loop that. 367 00:48:56.699 --> 00:49:07.199 Originally went 100 pixels at a time, and it did a refinement. So it would divide up the size of the pixels. Originally the size. The pixels were not actually. 368 00:49:07.199 --> 00:49:13.260 Screen pixel sizes, but larger so I have changed that so that it would actually just be. 369 00:49:13.260 --> 00:49:23.489 Pixel on the screen, so it will call that animation loop and using the camera projection matrix. 370 00:49:23.489 --> 00:49:32.789 Shoot array from the camera coordinates through that respective pixel on the screen and recursively. 371 00:49:34.465 --> 00:49:48.835 Trace the pass of the Ray as it bounces through the scene. So, depending on the material properties that it collides with, here's a nice kind of representation. So this is a, you can think of it as a glass cube. So all the. 372 00:49:49.170 --> 00:49:52.530 The gray rays, the initial. 373 00:49:52.530 --> 00:50:01.559 Camera Ray, and here's a rotated view from the back where their faces open. So, as it intersects, you have the normal. 374 00:50:01.559 --> 00:50:10.079 Being this short red factor, blue rays are all refracted raised. So bending through the class. 375 00:50:10.079 --> 00:50:23.760 All red rays are reflected rays, so the inside will also have a reflected portion of the rate. And the Max bounce limit here is 5. so, after 5 intersections with the boundary of the cube, you'll see that. 376 00:50:23.760 --> 00:50:30.090 Just pass it straight through the wall and then green rays are to test if the. 377 00:50:30.090 --> 00:50:37.500 Position is in shadow, so innately this program is very dependent on recursion, which. 378 00:50:37.500 --> 00:50:42.599 It's of course, not easily translatable to a graphics card. Even though some people. 379 00:50:42.599 --> 00:50:48.090 Nvidia have implemented it on graphics cards, which I find amazing. 380 00:50:48.090 --> 00:50:53.250 So, I decided to do this on the CPU. So. 381 00:50:53.250 --> 00:51:02.130 I split up the trying loop to trace a whole line so it scans an entire line and once the line is done. 382 00:51:02.130 --> 00:51:12.659 Then it has dropped the screen kind of a big problem with also paralyzing tracing algorithm. Like this is that most. 383 00:51:12.659 --> 00:51:17.219 Basically, all the time, you cannot. 384 00:51:17.219 --> 00:51:28.230 Right. To the screen buffer in parallel it has to be a sequential Operation just the way pixels work. So kind of a way that this was. 385 00:51:28.230 --> 00:51:32.369 Oh, did it stop sharing? That's weird. 386 00:51:35.010 --> 00:51:38.369 I don't know if it's still sharing now. 387 00:51:38.369 --> 00:51:43.289 Sorry, that might have been something that may I do. 388 00:51:43.289 --> 00:51:48.570 Oh, is that all good visible again? Okay. Okay cool. 389 00:51:48.570 --> 00:52:00.659 Yeah, so drawing to the screen cannot really be done in parallel. It's always a sequential operation. So kind of to get around this. 390 00:52:00.659 --> 00:52:06.389 The tracing gets that pixel color, it pushes it back to a vector. 391 00:52:06.389 --> 00:52:10.110 So that's the main thing we have to be careful of. So, having a. 392 00:52:10.110 --> 00:52:13.619 The main thing was just adding a critical I don't. 393 00:52:13.619 --> 00:52:17.460 Think you can do pushbacks anatomically. 394 00:52:17.460 --> 00:52:23.670 I believe from what I've research, so kind of inefficient, but I'll get to that later. 395 00:52:23.670 --> 00:52:27.030 So that was the main thing for that. So, as a. 396 00:52:27.030 --> 00:52:30.630 As the vector is filled with the entire line. 397 00:52:30.630 --> 00:52:37.980 Then pixels are then taken from that and written to the screens functionally. So the group, the brunt of the. 398 00:52:37.980 --> 00:52:42.539 Computation are done and pushed it to the vector and then the copy is just a. 399 00:52:42.539 --> 00:52:55.014 Quick operation, so the 2nd part was a thing called photon mapping, which is kind of obscure so retracing itself. 400 00:52:55.135 --> 00:53:00.144 It's kind of weird how it's done from the camera, but that's done to not waste time. 401 00:53:00.659 --> 00:53:07.440 Tracing rays from the light source. A lot of them won't actually go into the camera so. 402 00:53:07.675 --> 00:53:17.125 From a lot of research, we realize that you can do it the other way. So tracing from the camera but of course, the results aren't as accurate as they could be. 403 00:53:18.715 --> 00:53:26.215 1 thing that both of these methods don't really account for is global elimination. So, like, when light. 404 00:53:26.519 --> 00:53:29.550 Comes out of, or goes through. 405 00:53:29.550 --> 00:53:35.369 Like, a glass sphere, or a magnifying glass, you'll get a kind of. 406 00:53:35.369 --> 00:53:40.769 Condensed point of bright light, so if you could imagine, that's. 407 00:53:40.769 --> 00:53:51.539 If you're reading from a texture that there's no reason that a spot should be that bright. If you're just looking at the texture color. So, at this method aims to do is. 408 00:53:51.539 --> 00:53:59.010 Kind of imitate those bright spots that you'd get from, like, bending and. 409 00:54:00.119 --> 00:54:08.940 Accumulating in certain points on your textures so it's done in the other direction. So from your light source, a bunch of photons. 410 00:54:08.940 --> 00:54:18.210 Defined by the user are shot across the screen and depending on the material properties, usually diffuse materials will. 411 00:54:18.210 --> 00:54:26.730 Accumulate these photons and then during the Ray tracing every rate intersection with a surface. 412 00:54:26.730 --> 00:54:41.429 Will collect a certain number of photons, which is a limits also by the user. So an area we'll expand to accumulate, let's say 50 photons and then, depending on the size of the area. 413 00:54:41.429 --> 00:54:46.860 And how many photons were collected you can infer a brightness. So. 414 00:54:46.860 --> 00:54:57.360 To make this more efficient Katie tree was used so spatial data structure, which you can. This is the 3 dimensional version, and the 2 dimensional version where. 415 00:54:57.360 --> 00:55:00.869 Uh, you're splitting your space in half. 416 00:55:00.869 --> 00:55:04.139 Not necessarily in for half of the. 417 00:55:04.139 --> 00:55:09.599 Access, but, uh, half of the dimension of where. 418 00:55:09.599 --> 00:55:17.219 Points are even on either side. So here we see there's 7 on the left of this golden line and 7 on them. Right? And any. 419 00:55:17.219 --> 00:55:22.500 Level down, you can see the same thing. So, 3 above the screen 3 below. 420 00:55:22.500 --> 00:55:31.110 And so forth, so, in this example, a lot, mainly all of the photons are on this point. So paralyzing this. 421 00:55:31.110 --> 00:55:35.190 It's also a recursive thing, because those photons, of course, have to bounce and. 422 00:55:35.190 --> 00:55:39.780 Do whatever interacting with the materials that I need to. 423 00:55:40.045 --> 00:55:52.554 But it's a lot simpler since you don't have to collect any of the photons with the race. They just stick and are placed into the KD tree. So, again, the Katy tree is built with factors. 424 00:55:52.554 --> 00:55:56.664 So each leaf has a vector associated with it. So being careful to. 425 00:55:58.320 --> 00:56:01.469 But those pushbacks in a critical. 426 00:56:01.469 --> 00:56:06.329 Here's some of the results I had so that would be nice to show. 427 00:56:06.329 --> 00:56:12.719 There was a paper from 2003 that I was basing this algorithm off of which. 428 00:56:12.719 --> 00:56:16.800 You know, 17 years ago, the results weren't too good, but I think. 429 00:56:16.800 --> 00:56:21.510 These definitely built on their methods. 430 00:56:21.510 --> 00:56:29.550 So some of the timing results, so I have a 3.6 gigahertz 16 threads processor. 431 00:56:29.550 --> 00:56:32.789 Um, all of these were done with my processor. 432 00:56:32.789 --> 00:56:37.320 I also don't have the video and I was using make. 433 00:56:37.320 --> 00:56:40.469 On Windows, so that really. 434 00:56:40.469 --> 00:56:48.150 Our deal and get open and Peter work. So I didn't want to bother with doing PGI doing with the graphic card but. 435 00:56:48.150 --> 00:57:00.989 It worked decently, so for the Ray tracing, it was this image, the scene. So it's a plane with a texture applied and a glass ball with like a red apply. 436 00:57:00.989 --> 00:57:05.909 And I slowly increase the screen size or the. 437 00:57:05.909 --> 00:57:18.300 Friend or scene size sequentially we see both linear increase relative to the screen size. So the area's increasing by 4 times and we see that kind of 4 times. 438 00:57:18.300 --> 00:57:27.480 Increase with the render time and in parallel same thing, it's only roughly about a 40% speed up with the rate tracing. 439 00:57:27.480 --> 00:57:31.619 And I'll get into the details of kind of why. 440 00:57:31.619 --> 00:57:43.494 It's not back also, so photon mapping was way better. So simpler operations and increasing the number of photons shot into the scene. 441 00:57:43.525 --> 00:57:46.675 So the, the scene for this 1 was the same as this. 442 00:57:48.719 --> 00:57:54.150 So, we go from half a 1Million increasing to 10Million also. 443 00:57:54.150 --> 00:58:00.570 Linear time increase, but this time we get a nice 6 time speed up. So. 444 00:58:00.570 --> 00:58:06.750 You know, pressing, he was the bind waiting quite a long time. 445 00:58:06.750 --> 00:58:11.820 If it's done sequentially, so. 446 00:58:11.820 --> 00:58:16.050 The main problem I saw was that since I was using this kind of. 447 00:58:16.050 --> 00:58:20.670 Pre written drawing loop I didn't have much. 448 00:58:20.670 --> 00:58:23.880 I felt like you could have been done way more efficiently. 449 00:58:23.880 --> 00:58:33.000 Rather than writing to effector, and then copying over, and actually, instead of drawing pixels, it was kind of done a different way where. 450 00:58:33.000 --> 00:58:46.380 Flat were drawn to the screen is geometry so it wasn't directly to the screen. I feel like that was taking away from a lot. Also the complexity of the drawing. 451 00:58:46.380 --> 00:58:57.960 Or the trace function was not to optimize for parallelization. So, you know, increasing that size of the circle, I feel like that could have also been paralyzed. 452 00:58:57.960 --> 00:59:03.179 Maybe even on the GPU since that's not the recursive at all. 453 00:59:03.179 --> 00:59:07.800 And then just the logic in general for drawing was a. 454 00:59:09.059 --> 00:59:13.230 Not optimal copying over data a bunch of times and. 455 00:59:13.230 --> 00:59:21.630 Maybe even doing it and I, I feel like since 1 scan line was only 200 pixels, 16 cores. 456 00:59:21.630 --> 00:59:25.800 Uh, you're not really optimizing the time use of those course. 457 00:59:25.800 --> 00:59:33.360 So, it may be doing it as the entire screen, but you don't get a progressive rendering of the screen then you might. 458 00:59:33.360 --> 00:59:43.019 Get some time benefits from not having to restart those threats over and over and this kind of proof of, uh. 459 00:59:43.019 --> 00:59:56.130 Where I was doing this, so here's the animation where the original 1 that was doing 100 pixels at a time here. We have our pregnant 4, and it calls the re, trace function. 460 00:59:56.130 --> 01:00:04.619 So, here we draw pixel and those will coordinate and gets our colors putting the push back in a critical to ensure. 461 01:00:04.619 --> 01:00:07.619 You can't write. 462 01:00:07.619 --> 01:00:20.670 Effectors aren't thread safe, sadly, so doing that and then this really big trace Ray function with all these recursive. Sorry? For the comment code. Yeah. So all this recursion. 463 01:00:20.670 --> 01:00:30.000 And similarly, with photon mapping, we have our recursive photon thing. Each of the pushbacks since the KD tree. 464 01:00:30.000 --> 01:00:44.639 Are in their own critical block, not starting a critical of course, would be way faster if it could be done atomic instead it doesn't have to set up the whole environment for the and the loop for shooting all the photons done in parallel for. 465 01:00:44.639 --> 01:00:49.380 I think that's it. There's any questions. 466 01:00:49.380 --> 01:00:59.010 Thank you so your promo speed up it's about equal to the number of core is actually not the number of hyper threads with the number. Of course. Yeah. 467 01:00:59.010 --> 01:01:07.800 Which is good. I was I was pleasantly surprised that it was of almost exact thing. I was linear. I'm sure if I did, like. 468 01:01:07.800 --> 01:01:15.090 With the photon mapping would be anything more obvious, but if I did like a drastic we large number, like, 100. 469 01:01:15.090 --> 01:01:21.179 You know, a 1Billion maybe photons. Maybe I'd start to see kind of a drop off, but. 470 01:01:21.179 --> 01:01:25.769 I was even surprised that even with that amount of recursion, I was still doing. 471 01:01:25.769 --> 01:01:29.789 Relatively well. 472 01:01:29.789 --> 01:01:34.079 What is Cole, I guess embarrassing me parallel or something? Yes. 473 01:01:34.079 --> 01:01:39.510 I'm still I'm, I'm curious how even with the recursion. 474 01:01:39.510 --> 01:01:44.340 They made it so fast with the I mean, now the, all the. 475 01:01:44.340 --> 01:01:47.940 Getting better at doing all this stuff, but yeah. 476 01:01:47.940 --> 01:01:55.289 It's, it's really cool to me. Yeah. I don't know how the invidia rate racers engines are implemented, but. 477 01:01:55.289 --> 01:01:58.679 Yeah, somehow they it, I guess yeah. 478 01:01:58.679 --> 01:02:03.269 Okay, anything else. 479 01:02:03.269 --> 01:02:07.199 Finally, Randy, you're on the stage now. 480 01:02:08.670 --> 01:02:19.019 Yeah, so, um, let me share this screen. Okay you screen. 481 01:02:19.019 --> 01:02:27.744 In here you can see you. Yeah, sure. So, um, yeah, so my project is real time processing was could an open CV. 482 01:02:28.195 --> 01:02:35.094 Um, so the 1st data image was the algorithm I choose is a gas in blurry so it's a mechanism delta's algorithm. 483 01:02:35.094 --> 01:02:44.965 Is yourself a 55 filter, uh, which follows a gassing distribution uh, and you use that filter to slice through image a pixel that picks up. 484 01:02:45.539 --> 01:02:52.650 And each pixel's value is up at based on the filter value in the position, and for us round and pixels. 485 01:02:53.784 --> 01:03:06.445 And so, the tourism platform, it shows is a CUDA and opens in Python. So imagine are in a proposal I was going to use PICA, that, which is a direct could for Python. 486 01:03:06.684 --> 01:03:17.184 So, in Pi, could I let you write a, could essay function as a string and, um, we'll throw it into a cecum pillar and a Python model. 487 01:03:17.730 --> 01:03:23.849 Hence, the program will automatically cause a module, a, as a imported function into a Python program. 488 01:03:24.144 --> 01:03:24.565 However, 489 01:03:24.594 --> 01:03:26.574 I set up to work, 490 01:03:26.605 --> 01:03:26.965 uh, 491 01:03:27.175 --> 01:03:27.355 to, 492 01:03:27.414 --> 01:03:27.505 uh, 493 01:03:27.534 --> 01:03:28.974 Petco to work with some, 494 01:03:28.974 --> 01:03:29.215 um, 495 01:03:29.244 --> 01:03:29.755 simple, 496 01:03:30.025 --> 01:03:30.445 um, 497 01:03:30.474 --> 01:03:32.905 Matrix calculation and I thought it's working and, 498 01:03:33.175 --> 01:03:33.355 uh, 499 01:03:33.355 --> 01:03:34.195 when I moved to the image, 500 01:03:34.195 --> 01:03:37.255 versus I think I stopped working because awesome competitor issue with, 501 01:03:37.525 --> 01:03:37.945 um, 502 01:03:37.974 --> 01:03:40.554 Microsoft studio and Windows. 503 01:03:41.010 --> 01:03:55.170 So, I have to go to another tool, which is a library card number. So it's a Python package for hyper computing and it has a lot of beauty functions for, and also could have function. 504 01:03:55.644 --> 01:04:06.534 And the coding style for number is exactly the same as we're learning lectures of the. But the only difference is is, um, syntax Python. 505 01:04:06.715 --> 01:04:17.155 So also let you, um, to allocate memory and, uh, assign how many, like like the size of each, each block and upgrade manually in, in number. 506 01:04:17.610 --> 01:04:31.380 So, the 1st thing I do is a offline image processing. So there's a demo of my board programs on the left is our new image on down to a left image and on a right it's a version. 507 01:04:31.380 --> 01:04:44.130 And so our insights was a 2000 by 1006 are tried to run on CPU for lights take me about, like, 20 minutes to process. So I have to. 508 01:04:44.130 --> 01:04:55.829 Skill by 20%, so which means adding more image and see 0 time for processing says a smart image is about how seconds. 509 01:04:56.244 --> 01:05:09.534 And when I moved to, um, couldn't respond in time, is about, like, 300 minutes. 2nd, and this is including, uh, copying data choosy and coming back to the, uh, host. 510 01:05:11.335 --> 01:05:11.664 And, 511 01:05:11.695 --> 01:05:11.994 uh, 512 01:05:12.264 --> 01:05:14.664 the device time I measure is 260 may 2nd, 513 01:05:14.664 --> 01:05:15.144 but, 514 01:05:15.445 --> 01:05:15.625 uh, 515 01:05:15.625 --> 01:05:16.195 in the, 516 01:05:16.224 --> 01:05:16.434 uh, 517 01:05:16.434 --> 01:05:18.505 in the video processing example, 518 01:05:18.505 --> 01:05:23.844 I found his process might also include some utilization time of the, 519 01:05:23.844 --> 01:05:24.264 and actually, 520 01:05:24.264 --> 01:05:27.954 as actual accommodation time could be much more shorter. 521 01:05:30.389 --> 01:05:43.019 Yeah, so for the data processing, I couldn't have some issue as far as that. So, uh, firstly, uh, they tend to not allow me to use a lot of grades for a calculation where I assigned, um, more and, um. 522 01:05:43.465 --> 01:05:56.454 64 creates a progress start to crash and so I have to scale the video by also about 20%. So if I said video too large, it's a video only runs for a few frames before a crash. 523 01:05:56.485 --> 01:06:02.454 So, it's really where to account a run for, like, 10 frames and parts and arrow for. 524 01:06:04.795 --> 01:06:19.135 And so I said, for this reason, um, so some, some on the Internet proposed, that might be because I'm using the same GPU for both display and the calculations. So it has some limitation on display timeouts a limit. 525 01:06:19.590 --> 01:06:31.590 So, that might be a prompt. So, uh, 1 solution I'm trying to, uh, to solve this problem is to the IRA into a, a 1 Sierra because. 526 01:06:31.590 --> 01:06:44.159 I think most of the example of doing major calculation is by flirting the matrix into a wanting area and pass it to kudos. So, I think I'm trying to use it's a message to solve that issue. 527 01:06:44.159 --> 01:06:48.329 So, now, I think I can show a demo off my. 528 01:06:48.329 --> 01:06:52.920 Video processing, let me. 529 01:06:53.940 --> 01:07:06.144 So, we know is a renasant because I had to scale it by only 20%. So, on the last 1 is the original, uh, video output from a webcam and on the right is the product version. 530 01:07:06.144 --> 01:07:09.744 So it's working but it's just have to be a really small. 531 01:07:12.960 --> 01:07:27.599 Yes, I think that's it. So here, uh, also, uh, um, processing time. So I can see each frame is processing a time is only about 1 to 2 minutes seconds. So it's a pretty fast. 532 01:07:27.599 --> 01:07:31.679 Uh, West yeah, yeah, I think that's it. 533 01:07:31.679 --> 01:07:34.769 Any question well, thank you. 534 01:07:34.769 --> 01:07:37.829 So, what type of were you using. 535 01:07:37.829 --> 01:07:42.449 I have a G force 30. okay. 536 01:07:43.469 --> 01:07:50.400 So, how would you extend this into the future? Maybe. 537 01:07:51.780 --> 01:07:56.489 Um, so I think on. 538 01:07:56.489 --> 01:08:11.369 So, limited program is limited to like, any processing but, uh, the 1st job I need to do is to fix the limitation of see a great I can use all my. So. 539 01:08:13.769 --> 01:08:16.859 Okay, beautiful. Yeah. 540 01:08:17.909 --> 01:08:22.020 So, it's a faster could do a larger image than. 541 01:08:22.020 --> 01:08:30.539 Maybe, yeah, maybe plug 2 onto your computer 1 for process 1 for display or something. Yeah. Could be. 542 01:08:30.539 --> 01:08:34.920 Okay. 543 01:08:34.920 --> 01:08:42.060 So this is basically the end of the course if anyone has any questions. 544 01:08:42.060 --> 01:08:51.869 Any issues you'd like to raise if you want to take a break while you're finishing your projects, you can read about the underhanded C code contest. Perhaps. 545 01:08:51.869 --> 01:09:00.359 That I've got a link to the international called contest see all the ways that you should not. 546 01:09:00.359 --> 01:09:05.189 Be programming your term projects, but you can have some fun there. 547 01:09:07.409 --> 01:09:17.850 Other than that, if there's no questions again, I'm available for questions and any legal ethical topic, even after you leave RPI. 548 01:09:17.850 --> 01:09:21.090 And I'll look forward to seeing your. 549 01:09:21.090 --> 01:09:32.760 Projects I would like to get them on the due date because the registrar wants grades from me something like 36 hours after the post due date for the projects or something because. 550 01:09:32.760 --> 01:09:44.189 Some people think they're graduating and to the senior course. So we're just starting the messy special cases taken after human being to process. And that takes time. 551 01:09:46.050 --> 01:09:50.520 Other than that, I have a good summer. 552 01:09:50.520 --> 01:09:53.729 So, quick question, professor. 553 01:09:53.729 --> 01:10:01.949 Is there anything we need to submit for the presentation? There's I see the. 554 01:10:01.949 --> 01:10:07.229 The submission slot on grade slip, but it does that allow us to attach anything. 555 01:10:07.229 --> 01:10:10.979 No, I was just going to give you points for the presentation on that. 556 01:10:10.979 --> 01:10:14.220 Okay, okay, that's what I figured but thank you. 557 01:10:14.220 --> 01:10:23.789 Oh, 1 thing I thought if anyone would like to have a shout out on my course website I'd be glad to do that. 558 01:10:23.789 --> 01:10:27.029 You know, this is optional, but if you'd like to. 559 01:10:27.029 --> 01:10:36.779 Need to post a link to your resume or something, or a link to your project, or whatever. It's totally voluntary on your part, but I'll be glad to do it. So. 560 01:10:37.920 --> 01:10:41.489 You can email me at any time and I'll link stuff in. 561 01:10:43.619 --> 01:10:49.859 Other than that, I actually also a question so. 562 01:10:49.859 --> 01:10:54.060 For since I did a conjunction project, I had to write a. 563 01:10:54.060 --> 01:11:02.039 Report for that. Is it? All right? I included a pretty detailed section on the parallel implement. That's good enough. Right? Is that. 564 01:11:02.039 --> 01:11:11.369 Okay, I'll just submit that. Yes cool. Thank you. No, we just put that paragraph and because sometimes, okay somebody submitted an identical project to do courses. 565 01:11:11.369 --> 01:11:14.880 That's fair. I got it. Cool. 566 01:11:14.880 --> 01:11:26.520 No, there are any requirements and expectations you have for this report. I wasn't able to find any specific specs on the website. 567 01:11:26.520 --> 01:11:33.869 Well, 1st, physical format. I've got something I put on today's blog that I copied out of the syllabus. 568 01:11:33.869 --> 01:11:41.939 Um, it'd be nice to make it look like a professional conference on paper actually. So I suggest the I triple E conference format. 569 01:11:41.939 --> 01:11:53.460 Would be 1, if you prefer ACM or something else that's okay. They I believe, for example, they've got outlines for both tech and Microsoft word. 570 01:11:53.460 --> 01:11:57.119 And, you know, for what the format should be. 571 01:11:58.560 --> 01:12:01.590 Something 4 to 8 pages and. 572 01:12:01.590 --> 01:12:05.399 And also upload. 573 01:12:05.399 --> 01:12:10.020 Apart from the paper, you want to upload something. 574 01:12:10.020 --> 01:12:16.170 More details of what how your program works and maybe even the source code sample images, stuff like that. 575 01:12:16.170 --> 01:12:22.140 If it will fit on degrade scope fine if it's more convenient, put it somewhere else and send me a. 576 01:12:24.090 --> 01:12:30.449 Awesome Thank you. Make it something. It'd be proud to show to a potential employer perhaps. 577 01:12:31.859 --> 01:12:37.739 And also from this course, you've got lots of key words to put on your resumes. 578 01:12:37.739 --> 01:12:43.319 You know, so when corner scrapes here or something well, he'll get. 579 01:12:43.319 --> 01:12:47.520 Yeah, scraping for jobs, not resumes they get selected, so. 580 01:12:49.170 --> 01:12:56.430 Other than that, I encourage you to browse around things like the Super computing conference website. 581 01:12:56.430 --> 01:13:00.600 And maybe Jack on camera, or brows look for his latest talk. 582 01:13:00.600 --> 01:13:05.340 He, he's a leader and Super computing so it's fun to look at. 583 01:13:05.340 --> 01:13:15.239 Is talks on, you know, what the state of the art it is, and what's happening and so on and Super computing again. 584 01:13:15.239 --> 01:13:18.810 Browsing around and video for the last NVIDIA. 585 01:13:18.810 --> 01:13:23.789 Conference is just last, like, a month or 2 ago and browse around. 586 01:13:23.789 --> 01:13:27.359 Some of the leading talks there. 587 01:13:27.359 --> 01:13:36.869 It can be fun to see what they think is important. And latest thing in the news in video, what they're trying to buy are my guess that hasn't been fully approved yet. 588 01:13:36.869 --> 01:13:43.020 They are trying to eat into intel's customer base because. 589 01:13:43.020 --> 01:13:48.479 They're trying to go for they're trying to see how they can make the GP use, do more general purpose computing. 590 01:13:48.479 --> 01:13:54.119 So, I guess they're figuring that the Intel architecture. 591 01:13:54.119 --> 01:13:59.010 Maybe, it's sort of gotten as complex as it can and. 592 01:13:59.010 --> 01:14:02.729 You know, the next generation into general computing might be. 593 01:14:02.729 --> 01:14:07.560 Or using and video sell, they're trying to put stuff in them to. 594 01:14:07.560 --> 01:14:14.789 Make them use, reduce that also the software latest additions to C. plus plus just the standards. 595 01:14:14.789 --> 01:14:28.560 To try and have you put a few directors in saying what can be parallelized and if your algorithm is parallelizable, that's always the hard part. So they're trying to make it easier on the programmer and they're trying to make the hardware more flexible. So. 596 01:14:28.560 --> 01:14:35.579 If I'm to see what happens, anyone have any opinions on that. 597 01:14:37.319 --> 01:14:44.399 I'd like to see the competition and in 10 years in video might not be around anymore. I've seen companies. 598 01:14:44.399 --> 01:14:48.510 Go up up up up up and then click down very fast faster. Then they went up. 599 01:14:48.510 --> 01:14:51.600 Hope it doesn't happen on video, but if it. 600 01:14:51.600 --> 01:14:57.989 Overconfident America and it can happen. So you have no Intel, but they're actually pretty good. 601 01:14:57.989 --> 01:15:10.050 Sitting around, so what can happen is invidia been there from the start and when he finally leaves and the question is, can they survive that? 602 01:15:10.050 --> 01:15:14.729 That's always a critical part because, you know, companies, what 25 years old give retain. 603 01:15:16.140 --> 01:15:19.170 What's your opinion on that? Do you think they'll survive if he does? 604 01:15:19.170 --> 01:15:23.039 It's hard to predict the future depends on who replaces him. 605 01:15:23.039 --> 01:15:26.939 And I've also seen companies. 606 01:15:26.939 --> 01:15:38.550 Where a grad student has come to the digital equipment Corp and they, every university computer science department, every leading 1 use deck computers, they're open architecture. 607 01:15:38.550 --> 01:15:50.399 Company was shepherded by a guy called Ken Olson, he built the company up at 1 point. It was number 2, the number 2 computer company in the United States, and they held there. They rented a notion line or the Q2 or something for their annual. 608 01:15:50.399 --> 01:15:57.930 Conference in Boston, and then also he after doing everything, right? For decades he did everything wrong all at once. 609 01:15:57.930 --> 01:16:02.189 And killed the company, it crashed early fast. 610 01:16:02.189 --> 01:16:09.569 So, that has happened when i1st is at our is a company called sun, micro computers. Um. 611 01:16:09.569 --> 01:16:13.109 Came out of the Stanford project open standards for workstations. 612 01:16:13.109 --> 01:16:22.170 And I bought a 50,000 dollar workstation in the eighty's that had like a 1 MIP synergy, only Micro. 613 01:16:22.170 --> 01:16:31.260 Motorola, black and white display. Like, I think it was a couple of megabytes of main memory company went up and up and up and then. 614 01:16:32.340 --> 01:16:40.470 Started screwing up, I guess, and then Oracle bought them. That's where Jabber came from. Of course. So companies. 615 01:16:40.470 --> 01:16:47.640 You know, it's a lesson there you got to keep working at it to be continue to be successful. 616 01:16:47.640 --> 01:16:53.579 Actually met, who was 1 of the CO, founders of Sun Microsystems. 617 01:16:53.579 --> 01:17:02.789 It's a really cool guy. What's he like you said, he's awesome. My uncle actually started a start up with his son and Valley. 618 01:17:02.789 --> 01:17:14.069 He's not, he's not what you typically expect from 1 of the VC people. He's not super ignorant. They're stuck up. Really? 619 01:17:14.069 --> 01:17:19.380 Down to earth guy, what's he doing? Now? He just I actually don't know. 620 01:17:19.380 --> 01:17:32.640 There's a whole parallel universe of people that's a very active, but they're not visible on the public Internet into venture capitalists and so on, for example, I've known some people as they go into that universe and they're. 621 01:17:32.640 --> 01:17:38.069 Working hard productive people, but the public doesn't see what they're doing. I guess. 622 01:17:38.069 --> 01:17:41.159 Yeah, I think my understanding at this point is he's just. 623 01:17:41.159 --> 01:17:44.279 Dumping money into tech startups. 624 01:17:44.279 --> 01:17:48.989 Okay, where things to do. 625 01:17:48.989 --> 01:17:52.739 Yeah, I can think of lots of them. 626 01:17:54.149 --> 01:18:08.159 I met Bill Joy once who did various things he did parts of Unix back before Linux and when he is at Berkeley, and then he was 1 of the people involved in sign at the start also. 627 01:18:08.159 --> 01:18:13.739 And then, I don't know what he ended up doing. You made some people just buy a yacht and retire. 628 01:18:15.805 --> 01:18:30.564 And there are some people do repeated things. There was a profit Stanford called Jim Clark that he was involved in pounding graphic stuff. Then he's involved in funding Netscape and funding some medical records company. 629 01:18:30.840 --> 01:18:38.670 And then, well, then he ended up getting divorced a couple of times and buying a yacht that was 1 of the larger yachts in the world. So. 630 01:18:38.670 --> 01:18:42.390 To patterns. 631 01:18:42.390 --> 01:18:45.960 Different 1st weights to retire. Yes. 632 01:18:45.960 --> 01:18:49.770 Well, you could work hard on your yacht maybe. 633 01:18:49.770 --> 01:18:53.039 Is, and you get a virus comes in, you can't take the God anywhere. 634 01:18:53.039 --> 01:19:00.659 So, yeah, that's a theme. Now, people you got a past Internet, you could work and unusual places. It could be very productive. 635 01:19:02.729 --> 01:19:07.590 I would hope to be out in San Diego for 2 months and. 636 01:19:07.590 --> 01:19:12.449 Starting in 3 weeks actually, so I'm going to be working Internet. 637 01:19:14.520 --> 01:19:18.149 At the moment, I'm 10 miles from our. 638 01:19:18.149 --> 01:19:24.270 What are you what are people's plans here all you all graduating now or going to grad school or getting jobs? What. 639 01:19:26.010 --> 01:19:32.189 I'm graduating okay. Getting a job. I'm working for a contractor in DC. 640 01:19:32.189 --> 01:19:37.979 Okay, most of graduating be working as a software engineer in Boston. 641 01:19:37.979 --> 01:19:42.930 Good I'll probably go for a. 642 01:19:42.930 --> 01:19:46.079 Okay, and what topic. 643 01:19:46.079 --> 01:19:49.170 Aerospace engineering. Okay. 644 01:19:49.170 --> 01:19:53.640 I need super computing there. Yep, definitely. 645 01:19:53.640 --> 01:19:57.329 Continuing my masters. Okay. 646 01:20:00.090 --> 01:20:05.819 Anything else that most crowd? Anything I'm thinking about taking up yesterday degree. 647 01:20:05.819 --> 01:20:11.609 I'm sorry, you're doing what, Randy I'm going to pursue a pH. D degree. 648 01:20:11.609 --> 01:20:17.069 Okay, what in in the action and machine learning. Okay. 649 01:20:18.869 --> 01:20:25.319 Anything else? No well, then good. He said goodbye. Good luck. 650 01:20:25.319 --> 01:20:33.449 Lots of success and and you get really rich then send some money back to our maybe, but we don't need another art center. So. 651 01:20:33.449 --> 01:20:38.489 So, signing up. 652 01:20:38.489 --> 01:20:41.670 Okay, great Thank you. Yeah. 653 01:20:41.670 --> 01:20:44.939 For surveys, thank you. 654 01:20:44.939 --> 01:20:46.500 Okay, bye.