I work with Ruby. I work with JavaScript as a web developer. And at night, I tinker with electronics, trying to connect the web and electronics. But today's project is going to be something very generic. It is about Ruby. It is about the developer community of Ruby and developer community at large in Singapore. So how many of you are here in the Ruby Meetup for the first time today? That's awesome. Winston, Kuo Siang. That's about 50%. And bring new people with you. And bring new people with you. How many of you have attended other developer Meetups in Singapore? Great. That's quite a high percentage. So for all of you here, I wanted to share with you about a little side project of mine, which is called data.webuild.sg. But before I explain this, I want to bring in some context. So about four years ago, December 2012, I wanted to pick up web development. I traditionally come from electrical engineering, and web development sounded pretty daunting to me. So I was like, OK, so where are the developer events in Singapore? So what I did, I was learning HTML and CSS. I created static page, which basically listed out the events with static data in Singapore. So the page looked a lot like this. So every day, I would literally go and edit the HTML and CSS and put down events there. And it was possible in 2013, 2012, because there were hardly 10 events per month. I think Winston and Mike will know. It was barely 10 events. But throughout the years, the design has remained exactly the same. But internally, the back end has changed. So let me give you a little bit more information about how the back end has changed. Today, it is obviously automated because the open source community has decided to help. And we basically query event APIs from Facebook, meetup.com, Eventbrite, and even ICS URL. This happens via a scheduler hourly. And we only query developer or technology events. And then we list it chronologically. It happens every hour. No manual intervention and editing of HTML and CSS is required. On the right-hand side, we also go to GitHub and query the GitHub API. So if your location in GitHub contains Singapore, and if you have a repository that has at least 50 stars updated in the last three months, it will also come up here chronologically, according to the updated date. And I thought this was a great way to kind of connect to the developer community in terms of open events and open source. So that was pretty going on well for about two years until in 2014, third quarter, one of our friends was like, hey, I want to do some math on the data of events and open source. Where can I get the data? Well, you know what? We never really stored the data because who cares about the past data? You only care about the future ones, right? And then we were scratching our head how best can we do it, especially since this is a side project. So how did we do it? That's when data.webuild was born. So let me briefly explain to you how we did it. We created a GitHub user, which basically acts as a bot. And every single day at 3 AM, time when Singapore, all of us are sleeping, it will basically do two snapshots, one of events and one of open source repository data. Let me show you how it looks like. So basically, we have an API endpoint. So for repositories, it looks like this. It's a JSON format. And you can see the first one is like Android package. It's basically a list of objects. So it basically kind of captures it. Similarly, we also have the same thing for events here, as you can see. And we capture it. And that's what we did for the entire of 2015. Last year, just December, I decided to bring together all the 600 over JSON files and plot some graphs. Are you curious to see the graphs? Because it will kind of visualize our community. So in the graphs, you'll see a very, very young developer community. But you will also see a growing one. My point of fear coming and speaking to you is to kind of call to action to all of you to come and join in this growing story. Come and join the organizers like Kuo Xiang of the Next Generation or Winston, or even contribute to open source repository. So let me start with some of the 10 graphs that we plotted.  But I'm going to show you some of them plus some Ruby related data. So here's the first one. By the way, Monday to Sunday is one week. So obviously it went down because I queried today. So Monday is the first. But you can clearly see that even at the start of last year, there were barely single digit repositories above 50 stars being updated. Over the course of year, look at how we have grown. In fact, January this year, we had the highest number of repositories, 28 repositories. But I'm sure all of you are thinking that this is not enough, right? I am sure there are lots of talent in the Ruby community and beyond. And we can take this 28 number to a lot higher, maybe a few hundred or thousands. Once we have data, I think we can do something about it. The next graph that I want to show you is update activities per programming language. And I think this is where Ruby deserves a round of applause because it is definitely one of the active ones in the course of past 52 weeks. It had about 67, one of the active ones. Next, this one might be interesting to you, active user groups. Now because we query API data, none of the data that you see here is stale. If the user group has held at least five events over the course of last year or 52 weeks, the user group will appear here. Shall we search with Ruby keyword and then see what happens? Guess what? Ruby has not one, but two user groups. So I think it really, and Ruby Tea Party and Ruby User Group. And I have Ferrero Rocher here to give it out to the people responsible for this or other championing this. Definitely one goes to Winston. Thank you. Thank you. And to the new generation, Koshia, is the organizer of Ruby Tea Party here? You'll get a Ferrero Rocher. All right, if not, well done. Well done. Really, and for those of you who are looking to learn other, by the way, this is only related to developer and design events. I'm not even including startups. So if you include that, that's even more than this. So if you are looking to join in, say, hardware or Haskell or Python, go and look at these events and go and join and attend them as well. Next up, repositories per programming language. So this is where we query the API and we list out the exact repositories. So why don't we look at Ruby? All right, so these are the ones. So let me call out the authors. Is Jugend here? J-U-G-E-N, no. Gone. No. It's not from Singapore. Oh, okay. But he put location at Singapore. Love, you love saying. He's a Russian developer in Bali. But he put Singapore as his location. Singapore. You know, this is what I don't get. The data comes up here and then I'm like, but the developer is not in Singapore. Then I'm like, yeah, the developer is putting location at Singapore. I'm sorry, man. I'm just querying the API. It's all in code. I didn't come in. All right, Google Visualizer Winston, one more for you. Thank you, thank you. Thank you. Thank you. Thank you. All right. Yeah, Tio, who you mean? Chunket, are you here? I know Chunket sometimes will attend the meet-ups. All right. Emoji, this is E-Hung-Ho. No. So more than that, yeah, go ahead and look at the repositories that are done by developers living in this very city. Look at other programming language. And over the course of years, of course these will change a little bit because this is done every week. And if there's somebody new, bring that person to the meet-up and let him or her speak. And finally, this is also like an event location that you have. So if you are thinking of organizing events, sometimes the common question is where should I hold my event? Like Winston was like, here? Well, yeah, why not? But maybe other events also have pizza. It's worth trying maybe. I will be banned from PayPal. I love PayPal Lawrence. I love PayPal is the best. All right. So yeah, but yeah, free free to go to data.webuild.sg and raise some requests.  So next year you'll see more graphs being plotted. And finally, I want to show you this number. So if you scroll down right at the bottom, you'll see this number. So this number is in 2015, this is where the clock kind of start stopped. And I restarted these numbers this year. And I think if you're a young community, it's a healthy goal to beat it. And let me just go through it briefly. Last year there were 129 open source repositories above 50 stars. This year is already 51. So let's see how much more we can go. And this is once again a call to action for all of us to get together, help one another to create genuinely good open source repositories that not only developers from around the region but around the world uses it. Please don't go on doing some star fest to star each other's repo. No, that doesn't work. The next one is updates made to repositories. So these are the amount of git pushes. So that's about 200. I think we are quite catching up this year. This one is open events held. Like every single event, there were 800. It's already 41, but because of the holiday period and Chinese New Year, there'll be a dip, but it will rise again. And lastly, these are the number of user groups, 181. So far, 30 has already held their events in the month of January. Who knows there are more? Maybe one of you won't like to create the third or the fourth Ruby related user group. They're already two, right? So that's it about my project. So once again, go and subscribe to the calendar here. It's all automated. Everything is open source. If you see a bug, raise a pull request or just raise an issue, subscribe to the calendar right here. A big thanks to Michael Cheng here. We have kind of invaded his talk videos. Everything is really open. So check out webuild.sg and check out data.webuild.sg.  Thank you so much. Thank you so much. Yeah, yeah, question, question. Yes. There was a bug with the numbers, right? Bug. It didn't pull in the organizations. User groups? No, no, no, the... Oh, yes, yes. I know it should pull in Jolly Good Code. I have yet to look at that. I'm so sorry. No, the point is there are also other startups in Singapore that might have... I agree with you. So the thing is the GitHub API only looks through user API endpoints and not... I mean, Jolly Good Code has one repository. Jolly Good Code, yes. Could you talk about the great talk by the way? Thank you. Could you talk a bit about getting the events from Facebook? Yes. So last time they used to have FQL and you created a lot of very cool things from the events table now with the new Graph API and sort of do you have any thoughts on that? Is something you can add? So we're actually not using the Facebook API directly. So the thing is this, with Facebook it's a little bit difficult because you cannot directly pull the group. So you have to log in as a user and get the user's groups. So what we do if you look here is if you go to WeBuild very quickly, we actually have a JSON file of... static JSON file of groups to query form. And that's where we go inside the group and then individually we go. So if you go to config, here you go. It's like all the groups. This is how we query it. But I agree with you. What we did, if I show you the API endpoints, if you look at a Facebook one which is right here, we basically started collecting things like RSVP count, which is a very brand new thing. But if you feel that there are API endpoints where we can collect more info, please tell us. Yeah. It's quite challenging to combine all the APIs, Eventbrite, Meetup.com, Facebook. Sometimes things break. Sometimes things doesn't.  Somebody will raise an alert, hey, it's not working and then we'll go and fix it. Once again, it's hosted free on OpenShift. Yeah. Thank you so much. Great question. Any other last question? Yes. So again on the... No, no, no, no, no. Yes, yes. I think it's good, right? Would you consider doing a GitHub trending repo for Singapore? Because, for example, the numbers that we showed earlier, the other repos, right? Yes. Most of them were created like three, four years ago. In the course of... No, no, no, they were created maybe a long time ago, but updated in the course of the last 52 weeks. Oh, 52 weeks. Yes. But if you want a shorter time, also, we can consider drawing another graph for a shorter time. Yeah, I'm not sure whether it's like GitHub trending, you know, for Singapore. Ah, GitHub trending, that means for this week. Yeah, yeah, something like that. So that it's easier to discover new... So the trending one in your case will be just these top ones, actually. Right? This is updated 18 minutes ago and hour ago. This is the trending. Okay, okay. Yeah. So yeah, go and check out these repositories and star it if you find it useful. No, we also do not want fake stars. You know, it should be genuinely valuable. But I think we are doing good. In fact, over the course of last year, I realized that a lot of students are in GitHub because I'm like, hey, I haven't seen this girl. I haven't seen this guy. Like, where are they coming from? Then I kind of stalk and then I'm like, uh-huh, SUTD student, NUS student.  You know, you're doing a good job. Yes, I think I shall not take up much time, but I'll be here. Please come and talk to me. And let's make these numbers even bigger and it's not the job of just Quasiang, Mike, or Winston. It's all of us coming together that we can make these numbers go much higher. Thank you so much. Thank you. Thank you. Thank you.


Welcome to today's lecture on case studies, we shall continue our discussion on evolution of Intel processors. In the last couple of lectures, we have discussed about primarily the Pentium series of processors starting with Pentium II, then Pentium III and Pentium IV. We have seen that these processors are essentially superscalar and deeply pipelined. As you know in superscalar architecture, the instruction scheduling is done that instruction issue is done with the help of hardware and because of that the hardware complexity keeps on increasing in superscalar architecture as the complexity of instruction scheduling increases. Similarly, as you use deeply pipelined processor, then the clock frequency becomes higher, so it leads to higher clock frequency. Similarly, the superscalar processor leads to higher silicon real estate. So both these things, I mean this higher silicon real estate as well as higher clock frequency leads to more power consumption. So power consumption becomes high and question naturally arises, how we can reduce the power dissipation? So to reduce power dissipation, one approach is to use VLIW. We have already seen VLIW is essentially very large instruction ward where the instruction scheduling is done with the help of compiler. Instead of doing it by hardware, it is done by software and as a consequence, the chip area reduces power dissipation of the chip reduces. That is one approach that we have already discussed and we know that there are some processors based on this VLIW approach like transmitter's Crusoe processor and another approach to reduce power dissipation is to use multi-core. So later on, we shall discuss about multi-core instead of using a single processor within a chip and continuously increasing the frequency to get higher and higher performance. You can use parallelism in terms of processors. So we have to move from instruction level parallelism to thread level parallelism to get higher performance. So we shall discuss about this in my next lecture but today we shall focus on VLIW style approach and that has been implemented in that itanium processor. So this itanium processor essentially is based on epic approach. This epic approach was known as explicit parallel instruction computing. This explicit parallel instruction computing was developed by Hewlett-Packard, HP and Intel and this name was given to distinguish it from superscalar and VLIW. That means as we shall see although it will inherit many features of VLIW but there are many novel concepts which have been incorporated in this epic architecture. So essentially to distinguish it from superscalar or VLIW a new approach was suggested and that new approach is known as epic and which is radically different from superscalar architecture. Then IS-64 essentially is the architecture developed based on this epic approach and it has many inherent features and these inherent features are listed here. Number one is it is risk style, register, register, ISA. We know that that instruction set architecture can be of two types, one is your risk, another is your SISC. In SISC architecture that ALU can perform operation with the content of register and also with the content of memory. So the instructions are available where you can perform say an ADD operation with the content of a register with that of the content of a memory location and which is not done, which is not allowed in risk, risk processors are based on that reduce instruction set computers are based on that register-register operations. That means all the ALU operations are performed between the contents of registers and result is stored is also stored in register and to load the registers explicitly you have got load and store instruction that is why it is also called load store architecture risk processors. So this is one of the features, there are many other features that in risk processors because they should have large number of registers and so on. Let us not discuss going to that details, but main feature is that epic framework that epic architecture is based on risk style with register-register instruction set architecture and with many novel features designed to support compiler-based ILP. So another important feature is compiler-based ILP instruction level parallelism. We know that both in superscalar processor and VLIW processor we exploit instruction level parallelism and in case of superscalar processor that instruction level parallelism is identified with the help of hardware. So over a set of instructions that has been that is available that has been fetched into the processor and on that within that set of prefetched instruction parallelism is detected with the help of hardware in case of superscalar. On the other hand that ILP is detected with the help of compiler or software in case of VLIW architecture. So a compiler whenever this instruction level parallelism is detected with the help of compiler it has much more scope than that it can be done by hardware as it is done in superscalar processor. And in fact in this approach that epic approach this has been extended more that means it shares many features of VLIW that means it is done with the help of compiler but extends it. How it is extends it we have already discussed about VLIW architecture we have seen that they have a rigid instruction format. In a single instruction format few instructions can be accommodated and those are fixed the number of instructions that can be accommodated and so on any parallelism are not available instruction level parallelism is not available some of the fields in the instruction format may remain on empty and but in case of your epic architecture in case of epic approach it is much more flexible and it incorporates I mean greater flexibility in indicating parallelism among instructions and in instruction format both in identifying instruction level parallelism and also in scheduling instructions I mean in formatting the instructions that more flexibility is provided and as a consequence it can reduce the increase in code size caused by the typically inflexible VLIW instruction format. That means that ultimate outcome is that whenever if it is done using simple VLIW whatever size of the code is possible using this approach epic approach you can achieve much better that means instruction code size will be smaller and epic has more extensive support of the software speculation. So the software speculation it is done in a very limited way in VLIW architecture and as we shall see little later epic uses much more extensive support of software speculation like predication and so on we shall discuss it in more detail little later. And based on this approach that IS-64 architecture and the processor has been developed that is known as itanium. So itanium is the first commercial processor that implements the IS-64 that is based on IS-64 architecture and later on we shall see that itanium architecture has been extended also leading to itanium 2 architecture essentially these are upgradation of the basic itanium architecture. So with this background now let us focus on the main ideas of epic. As I have already mentioned in case of epic the instruction scheduling is done with the help of compiler and whenever we do it using the compiler it has been found that it is easier to find instruction level parallelism using software algorithm rather than hardware. So whenever it is done with the help of hardware it is very restrictive you cannot use a sophisticated algorithm and the instruction level parallelism is identified over a very small or limited number of instructions but whenever you do it with the help of compiler you can develop sophisticated algorithm because it is done in software the overhead is not much there whenever it is done in software and then it can identify more I mean that instruction level parallelism can be more whenever it is done in with the help of the compiler. So whenever you do it with the help of compiler it does not consume cheap real estate as I have already mentioned in super scalar architecture it is done by hardware obviously it will consume silicon real estate. So instead of consuming silicon real estate for scheduling instruction it can be devoted for other purposes like you can have more number of general purpose registers more number of floating point registers and other special type of registers. So that can be done and so hard the compiler can search entire sub program to find independent instructions across the entire sub program and that is another advantage of this compiler based approach and as I have already mentioned hardware based solutions can find only a small prefetch window and other novel techniques like register windows and rotating floating point register stack have been used in this epic architecture I shall discuss about that later. And whenever you use this compiler based approach with these enhancement or innovations there is much greater chance of finding ILP at much lower cost. So the cost is cost of implementation is lower and you will get much better ILP. And it will lead to implementing that long or very long instruction words that is the basic approach of PLIW and as we shall see that epic will use branch prediction. So earlier we have discussed about the technique of branch prediction where I mean whether a branch will be taken or not taken is predicted based on past history. So here we shall see we shall be using a novel concept known as predication which is different for prediction I shall explain about it in little later. And also to reduce the latency of memory fetch some technique known as speculative loading is used I shall discuss about this speculative loading in details. So these are the main ideas that has been used in epic architecture and here is the comparison between superscalar and IAW IA64 approach. As we have already seen superscalar approach is based on risk like instructions and one per word. So one instruction per word is available in superscalar architecture. On the other hand in then you have to schedule multiple instructions to keep multiple execution units or processing units busy. So that is done by hardware you will fetch instructions one instruction at a time but issue more than one operations instructions to keep the more functional units busy. On the other hand in risk like in case of IA64 risk like instructions are bundled into groups of three we have seen in VLIW architecture in a single instruction you can bundle more than one instructions. As I have already told this is the basic approach you can this is one instruction this is another instruction this is another instruction this is another instruction though this is a bundle. So you can form a bundle of several instructions in case of IA64 three instructions are bundled together to form a single instruction. And in superscalar approach we use multiple parallel execution units that is also done in IA64 multiple parallel execution units. And reordering and instruction optimization is done at run time with the help of hardware. On the other hand in case of IA64 reordering and instruction optimization is done at compile time with the help of software which is the compiler. And in case of superscalar architecture branch prediction with speculative execution is done on one path. So we have already discussed about it in detail earlier and in case of IA64 we shall see that speculative execution is done along both paths of a branch which is known as prediction I shall discuss about it in more details. Then loads data from memory only when they are needed that means in case of superscalar architecture that instructions are loaded that data is loaded from memory only when they are noted I mean needed need based loading. On the other hand in IA64 speculative loading is done that means speculatively loads data before they are needed of course there is a possibility that the data which have been loaded may not be used that possibility is there but when they are used it is beneficial. So this is the key differences between superscalar and IA64 architecture. Now we shall focus on the details of IA64 architecture first we shall look at the register model and as I have already mentioned IA64 uses a large number of registers compared to superscalar or other VLAW architecture processor based architecture processors. So it uses 128 64 bit general purpose registers which as we shall see shortly are actually 64 bits there is one additional bit that is the additional bit is used that predicate bit we shall discuss about it later. And then 128 82 bit floating point registers which provide to extra exponent bit over the standard 80 bit IEEE format. In the standard 8 IEEE format that instruction format uses 80 bit and in case of IA64 it has been extended to 80 bit with two additional bit for in the exponent field. And there is 64 1 bit predicate register. So predicate register concept is new in IA64 I shall explain the operation of this predicate register in details and there are 8 64 bit branch registers. So you can see a variety of registers are used this branch registers are used for indirect branches and apart from these registers we have a variety of registers are also used for system control, memory mapping, performance counters and communication with the operating system and all of them may not be visible to the programmer. And it uses the concept of register windows I mentioned that a new concept known as register windows is used in IA64. What is this register window concept? It has got 128 fixed point registers out of which 32 registers are I mean registers 0 to 31 are always accessible and are addressed as 0 to 31. The remaining registers that is 32 to 128 are used as a register stack and each procedure is allocated a set of registers. That means we know that whenever we are dealing with procedures, procedure calls we use stack and in the stack we store the information whenever we do the context switching. So when the context switching is done a stack is used normally a stack pointer is available as part of the processor and then stack is available in the memory. So whenever a context switching occurs you have to store the content I mean the status of the current context and then you will reload from the stack to where the jump is taking place. So when the context switching is occur this restoring and storing of processor status is time consuming particularly if it is done through memory. So instead of that here it is done with the help of registers. So just like a stack pointer we have we know that a stack pointer is used. So instead of using a stack pointer a special register called current frame pointer Cfm points to the set of register to be used by a given procedure. So the frame consists of two parts the local area and the output area. So local area is used for local storage and while the output area is used to pass values to any call procedure that means we are using that output area for parameter passing. So you have to pass parameter that caller will pass parameter to the callee. So whenever caller passes parameter to callee that means this output area can be used to pass the parameter to the callee and vice versa. So the local area is used to for local storage and while the output area is used to pass values to any call procedure. So on a procedure called the Cfm pointer is updated so that R32 is called the procedure called procedure points to the first register of the output area of the call procedure. So that means you are using this register R32 for this purpose to pointing to the area I mean that is that register window. Then it also uses rotating floating point register stack. So the floating point registers are used for floating point data the branch registers are used to hold branch destination addresses for indirect branches and the predication register holds predicates which controls the execution of predicated instructions. And both integer and floating point registers support register rotation for the registers 32 to 128. So those registers the register renaming is done and by using the concept of register renaming that rotation of registers is done for from register 32 to 128 for the purpose of this subroutine calls and other things procedure calls. So register rotation is designed to is the task of allocating the registers in software pipeline groups. So these are the this is the novel concept that is also used. Now let us focus on the different types of instruction types and execution units that is available in the IA 64 micro architecture. So since it is a superscalar processor I mean VLIW processor there are a number of execution units or functional units and different types of execution units are available. First one is I unit I stands for integer unit which we can perform operate on A type and I type instructions A type instructions are essentially integer, ALU type instructions like integer type addition, subtraction and or compare and so on. And I type instructions are not ALU integers like integer and multimedia ships bit test moves and so on. And M unit performs that M unit stands for load and store used for the purpose of load and store and it can perform the A type instructions or M type instructions. So integer ALU add, subtract and or compare so which can be done with the help of M unit and also for memory access like load and store for integer and floating point register that is M type instructions can be performed with the help of M unit. Then you have got F unit floating point unit floating point instructions can be executed with the help of this F unit and then B unit is you exclusively exclusively used for the purpose of branches like conditional branches, calls, loop branches and so on. Then you have got L plus X type of instructions of course there is no separate execution units available for them, but I believe that I type and B type units can be used to for the purpose of that L plus X type of instructions which can be used for extended immediate 64 bit extended immediate and stops and knobs instructions. And here is the general organization of the I 64 architectures and it has got a large number of execution units. We have seen the number of execution units is 8 or more parallel units are available. So here those execute units are shown both for fixed point and floating point you have got several execution units. Then 128 general purpose registers or integer registers are shown and 128 floating point registers are available and the 64 bit predicate registers are available I shall discuss its use little later. So you have got predicate registers in addition to general purpose registers and floating point registers. So then let us look at the instruction format of the I 64 instructions. Here it exploits explicit parallelism implicit parallelism and ease of instruction decode. Actually by using the compiler to do it that implicit parallelism available in the large number of instruction is exploited and instruction decoding is ease of instruction decoding is done with the help of those template part and nearly every instruction of I 64 is called C levels. So here sometimes instead of instructions they are called C levels and can be predicated. Predicated means the lower six bits specifies the lower order six bit of every instruction specifies the predicate register that guards the instruction. So here you can see there is a predicate register six bit predicate register available in each and every instruction and so each instruction is of 41 bit. So 41 bit is divided in this way major of code is 4 bit and it has got 10 modifying bits and there are three fields which can specify the general purpose registers, general purpose register three, general purpose register two and general purpose register one. Since you have got 128 registers you require seven bit for each of these fields and then you have got predicate registers PR. One bundle you can see these instructions these three instructions together is called a bundle. So one bundle executes per cycle that means whenever the instruction execution is done one bundle will be fetched from the memory and it will be executed in a single cycle. So if it is stored then all the entire all the instructions in a single bundle will be stored so any stalls cause the entire bundle to be stored. So now let us focus on that template field I mentioned about that there is a template field present here so 41 into 3 so out of 128 41 into 3 those bits goes for specifying the three instructions and you have got 5 bit template field. This template field specifies the types of execution units each instruction in the bundle requires so we have seen each instruction comprises three instructions in a single bundle and you will require different types of execution units for executing those instructions in the bundle and this template field specifies what type of execution is needed by different instructions of that bundle. And this field specifies the presence of stops stop is another novel concept that is being used you know there is a concept called instruction group. These instruction groups should not have any dependency register type of dependency that means these instructions within a instruction group can be executed in parallel. So since they do not have that dependency because of registers one is writing into a register in subsequent instructions reading it like that that kind of dependency is not present and also it avoids the memory based dependencies then those instructions are can be form a group. Now the field specifies the presence of stops that means you can have several instructions and say suppose up to this they form a instruction group however this instruction and this instruction does not fall in this group that means they cannot be executed in parallel because of the dependencies. Then the stop bit specifies that there is a stop bit here that means these instructions and these instructions cannot be executed in parallel because of this dependency. So a stop indicates to the hardware that one or more instructions before stop may have certain kinds of resource dependencies with one or more instructions after the stop. So that is how it separates the instruction groups in a single bundle. And however whenever you forming a bundle for execution by a processor you will see that in I-64 it is possible to bundle instructions not belonging to the same instruction group that means dependent and independent instructions may be mixed in a single bundle. And compiler set template bits to inform hardware which instructions are independent and template can identify independent instruction across bundles and instruction in bundles do not have to be in the original program textual order that means the way the instructions are applicable in your original text they may not be in the same order in your instruction bundle that you prepare. And let me illustrate this with the help of an example. So here as you can see you have got a number of bundles and this template field specifies the type of execution units they require I mean required by different instructions in a bundle. As I have already mentioned a single bundle will have three instructions. So this template 0 specifies that the three instructions will require three execution units one is m type slot 0 slot 1 will require will I type and slot 2 will require I type. So since you have got multiple execution units you can execute these instructions simultaneously. Similarly you have got another instruction m i i that template 1 specifies that second bundle and here you can see there is a stop. That means they form a single bundle single instruction group here you see after the first bundle there was no stop but you can see here there is a stop that means these instructions and these instructions form a single instruction group although they are bundled in two separate I mean they form two separate bundles for execution purpose by IA 64. But here you can see the stop is present in between in a single bundle. So m i and i so here you have got a stop. So the compiler specifies must explicitly indicate the boundary between one instruction group and another stops may indicated by heavy lines and may appear within and or end of the bundle. So you can see conventionally it is present at the end of the bundle but in some cases it is present in the middle also in the middle of the bundle. So the compiler will specify that and this facilitates decoding and execution of instructions. Now coming to the branch prediction we know that the earlier superscalars processors branch prediction. So here is a sequence of instructions I1 to I10 shown here. Now here you have got a branch instruction I3 is a branch instruction. Now whenever we reach this branch instruction some prediction is required whether these instructions will be fetched I4 I5 and I6 will be fetched or I7 I8 and I9 are to be fetched that is decided based on branch prediction. That means if a branch is taken prediction is taken then you will fetch I7 I8 and I9 on the other hand if the branch is not taken then you will fetch I4 I5 and I6. So that is based on branch prediction that is done in traditional processors. So in your Pentium 3, Pentium 4 in all these processors that is how it is being done. But in case of this IA64 processor it goes beyond it introducing a concept known as branch prediction. So this problem that which one to be prefetched whether you will prefetch those instructions in the I mean when the branch is taken or branch is not taken that problem is overcome that problem of prediction is overcome with the help of this concept of prediction. So the compiler tags each side of a branch with a predicate. So instructions are tagged with the help of predicate field and bundled tagged instructions and set template bits to allow parallel execution of predicated instruction. So here because we have got large number of execution units instead of executing only one side of the branch taken side or not taken side the execution is carried out for both the sides. However, you have to keep track of which instructions belong to which side. So when the outcome of the branch is known the effect of correct side is committed while the effects of the wrong side is discarded that means the execution is carried out for both sides, but only when it is known that branch will be taken or not taken only results of one side is committed by committed we mean that writing into the registers and all these things will take place. But other side will be completely discarded I shall explain with the help of an example little later and it has the advantage that there is no need to unroll earlier we have seen if the prediction is wrong then you have to do you have to unroll it. So you have to discard some instructions then you have to fetch a new set of instructions and you have to execute that. So this kind of unrolling is completely avoided in this predication concept. So the time taken to execute the wrong side are at least partially amortized by execution of the correct side assuming sufficient functional units are available. As I mentioned time taken to execute the wrong side is also there, but since we have got sufficient number of functional units you can execute them parallel you can execute them parallel because they are independent they can be independently executed. So there is no dependency between the right side correct side or wrong side. So they can be executed in parallel I shall illustrate that with the help of an example. Here for example you have got a sequence of instructions i3 i1 i2 i3 in i3 is a branch instruction and there are two directions. So i4 i5 i6 i4 i5 i6 form one path and i7 i8 and i9 it forms another path. So these are tagged with the help of you know that there is a predicate register. So for this instruction 4 instruction 5 and instruction 6 in the predicate register write P1 that path 1 is written here P1 P1 and P1 on the other hand for instructions 7 8 8 9 in the predicate register P2 is written. So each instruction is predicated so you are predicating the instructions and as a consequence when the outcome of the branch is known whether I mean that r1 is 0 or not because that may take little time that comparison of instruction may take time when it is known you can discard either the P1 instructions I mean the instructions predicated by P1 or you can discard instructions predicated by P2. However, the beauty of this is that these instructions that 4 5 6 and 7 8 9 they can be executed in executed parallel because they are independent. So this is the basic concept of branch predication. Now coming to another important aspect of I64 that is the solution to memory latency. So we have already seen that memory you have to fetch instructions from the memory. So what I64 does it does speculative fetching of instructions actually the technique is known as wasting. So move all load instructions to the start of the program this is called wasting that means you are loading load instructions which may be present in the later part of an instruction they are moved to the beginning of the beginning part. So they are fetched on the assumption that they will be needed in future but they may not be needed but I mean hopefully data will be ready in the register when it is read that means when it will be needed and loads may belong to decision paths that are never executed as I mentioned that some of the loads I mean where you load the data from the memory to the register that path may not be executed and wasting effectively causes these loads to be executed anyway even if their contents are never required. So loads are therefore speculative and assuming that they may be needed later. So you are doing speculative loading of instructions.  So whenever you are doing the committing then that it has got some effect on the loading into the target register. So this is the speculative loading that is being done and here is the example of speculative loading. Here for example you have got the instruction sequence this is the original code where you have got a load instruction here instruction 7 is the load instruction. So what is done that instruction 7 is shifted before the branch. So before the branch takes place that means I3 is your branch before the branch this instruction 7 is shifted in this modified code as you can see this is the instruction 3 is now this load instruction load R4 0 R6. So you are doing speculative loading and then you are going to the branch instruction. So and however whenever you do that here you can see you are performing load check. So after executing this you are doing speculative check. So this is how the instruction sequence are executed. So compiler scans the source code and identifies the upcoming load instructions, identifies the load instructions and at run time these instructions load the data from the memory before it is needed and if load would trigger an exception this if you postpones reporting that exception. So it may lead to some exception and that is not being informed. So it is not reported to the processor. And as I mentioned the compiler replaces the load with the help of speculative load above and here you have got speculative check. So the instruction checks the validity of the data if it is okay this if you does not report an exception otherwise an exception is reported. So this is how you do speculative loading and you can see how the code is modified. And here are some other nice features of IA64. So it transferring ILP discovery to compiler, freeze of the cheap real estate as I have already told since it is done by software, silicon real estate is available which can be used for more beneficial purposes like it can be dedicated used for implementing large and number of general purpose registers, floating point register files and we have already seen each of them is 128 bit registers files available in IA64 and also it can be used for large cache memories with more read write and also with more move read write ports and this greatly reduces memory latency. That means instead of using single ported memory you can have read write ports and this will reduce the memory latency and you can have more functional units which makes predicated execution feasible. We have seen whenever you do predicated execution of instructions you require large number of functional units because you have to execute both the paths. So this approach of identifying the instruction level parallelism by software has got many benefits because the real estate that is being saved can be used for these beneficial purposes. Then I have already mentioned about the nice features of IA64 predication instead of prediction and that definitely enhances the efficiency of program execution. Then the control speculation and that speculative loading that is being done of data and data speculation load is moved before the store that might alter the memory location. So this data speculation is done and it facilitates software pipelining. Earlier we have discussed about software pipelining and whenever these features are used we have seen in case of software pipelining we have in addition to those loop portion we have got some post and there are some codes in the beginning and at the end. So those codes can be reduced or completely overcome with the help of these features I am not going into the details of that and this leads to maximum utilization of the available functional units. According to the itenium processor the pipelining and let us look at the pipelining that is used in itenium processor in the front end it has got it does the prefetching of instructions. So the prefetching of instruction is done up to 32 bytes per clock. So you can see so up to 32 bytes per clock prefetching is done by the front end of the processor and it can handle up to 8 bundles. So each bundle as we have seen comprises 128 bits and those bundles can be that means 8 bundles means each bundle has got 3 instructions so 24 instructions. So front end will do that then the instruction delivery is performed by the in a pipeline way it distributes up to 6 instructions to 9 functional units. So it uses 9 functional units and up to 6 instructions can be distributed to the 9 functional units and it uses register renaming I have already discussed about that register renaming is used particularly for that when for procedure calls we are using with the help of registers instead of memory for stack. Then operand delivery is performed it accesses register file updates score board and the score board is used to detect when individual instruction can proceed. We have discussed in detail about the score boarding approach and the score boarding approach is used here used to detect when individual instruction can proceed and this is why this is the way to avoid lock step operations in the instructions in a bundle. So this is how the execution of an operand delivery is done to perform to get better efficiency and then execution of instruction is done. So these are the pipelining front end performs this then instruction delivery then operand delivery then execution of the instructions. And this is the example itanium is 64 implementation by Intel. So this was done back in 2001 itanium it was code named as Merced. So this was the first implementation of I 64 architecture and it used 64 bit wide bus using 800 megahertz core and 2.1 gigabits per second data transfer through the system bus and the width of the bus was 2 bundles per cycle and 4 it used 4 integer units to load and store per clock 4 integer units and to load and store per clock and 9 instructions per issue clock and 6 issue per clock and 10 stage pipeline using 800 megahertz on 0.18 micron process and subsequently it was enhanced. So these are the 9 functional units 2 integer, 2 memory, 3 branch and 2 floating point and all these functional units are pipelined using 10 stage pipeline and divided into 4 main parts which I have already mentioned. Then it uses 3 different types of cases L1 2 into 64 that is instruction and data it has got 2 separate cases and the L2 case is unified case 96 kilobyte using having the latency of 2 clocks and your L1 case has latency of 2 clocks. Then L3 case memory has 4 megabyte which is external in case of itanium and 20 clock latency and using 11.6 gigabits per second bandwidth and itanium 2 which was nicknamed as McKinlay which has the feature of 128 bit wide bus. So the width of the bus is increased core of 1.0 gigahertz and 6.4 gigabits per second transfer and this is the width 2 bundles per cycle 6 integer units 2 load and stores per cycle and 11 instructions per issue clock and so far as the case memory is concerned the L1 case is again separate for data instruction 2 into 64 kilobyte with 1 clock latency instead of 2 that was in the earlier processor and L2 case has got 256 kilobyte larger and it has got the latency of 5 clock cycles and L3 is now on die 3 megabyte and 12 clock latency and 32 gigabits per second bandwidth. So and then itanium 2 that was introduced in 2003 and these are the features little bit enhanced compared to the earlier and these are the latencies of some of the typical instructions I have already mentioned about integer load 1 floating point 5 to 9 cycles and that correctly predicted taken branch 0 to 3 and mispredicted branch 6 cycles integer ALU operation does not require any latency because it is available in the registers and floating point arithmetic require 4 cycles and these are the you know that core processor die that it looks like this is the layout view. So with this we have come to the end of a lecture on itanium and particularly on various types of processor based on instruction level parallelism. In my next lecture we shall start our discussion on another type of parallelism that is your thread level parallelism. Thank you.


فشرف بل اشتغالي بالعلم ولا تبغي به ما عشت يا دادا دلا وياله من شراف عظيمي الحمد لله رب العالمين والصلاة والسلام على أشرف الأنبياء والمرسلين سيدنا ونبينا محمد وعلى آله وأصحابه والتابعين لهم بإحسان إلى يوم الدين أما بعد إن شاء الله وطعاله هذا المفترض سيكون لأن الشيطان يمتلك الإنسان لأن الشيطان يمتلك الإنسان شيخ الإسلامي بلوتايم يا رحمه الله عندما ترى أن السيطان يمتلك الإنسان فهذا is one of these three reasons نبوان تارة يكون الجميو يحب المصروع فيصراعه ليتمتع به وهذا الصرع يكون أرفق من غيره وأسهل the first one is the jinn is in love of the one who is possessed or the one whose body he is in the jinn loves this individual and he is doing this so he can enjoy him his whole purpose is to enjoy this person that's why he is doing this to them this type of possession he said it's easier it's more simple than other than it and it's more lighter than the other types of possession there are number two the second reason why the jinn will possess a person is because the human being has harmed the jinn they have caused some harm to the jinn إذا بالا عليهم for example if he is urinated on them أو سب عليهم ما أن حارن أو if he pours hot water over them أو يكون قتل بعضهم أو he killed some of them أو غير ذلك من أنواع الأداء or other than that in terms of harm may have caused any other harm that's just an example of the harm that he could cause them when the person does this to them the possession the jinn puts him through this time is the worst إبن تيمي says and a lot of the time they kill the person who they are possessing the second one is the most dangerous one he will kill the person number three and sometimes the jinn will possess the person because he's just joking he's playing around just like the dim-witted human beings they play around with their travellers so this type is that the jinn is actually playing with the person and the same concludes that these are the three reasons why the jinn will possess a person this is from his كتاب مجموع الفتاوى رحمه الله the thirtieth volume page 82 I hope you will benefit it from that benefit I will conclude there إن شاء الله تعالى سبحانك اللهم وبحمدك أشهد أن لا إله إلا الله أستغفرك وأتوب إلي


That title is not clickbait. I hate The Giver for a variety of reasons. Yeah, it's a classic and many people have fond memories of reading it as a kid and they all agree that the movie was a bad adaptation and yada yada. I don't care.  And frankly, listening to everyone else in the world talk about it as if it's a masterpiece feels like gaslighting. The Giver is awful, horrendous, substandard, deficient, poor, inadequate, terrible, and dreadful.  It was tailor-made to give to board school children so that teachers could lecture them on how deep and meaningful it is, yet it fails to even do that. If I were a worse video essayist, I would spend the next 15 minutes going over the entire life of the book's author, Lois Lowry, and what inspired her to write it in the first place, as well as some niche philosophical concept that won't make sense until the end of the video. But I like getting to the point, so I'll do that. The Giver is a dystopian novel that follows a boy named Jonas who lives in a community where there is no pain and everyone is the same except for a few small differences in personality. The people of the community, which doesn't get a name because confusion, are all assigned a job that best fits them. When his turn to get chosen for a job comes up, Jonas is passed over. Later, the elders of his community tell him he is to become the next receiver of memory. The receiver is the only person who is allowed to seek out knowledge beyond what people are taught and they hold memories from the time before this community was created. They're the only people that understand things like pain and so they function as advisors for the elders. Due to his training, Jonas becomes more isolated from his friends and family. He also becomes disillusioned by the community and its rules both because he now understands how the world used to work and because he sees the darker side of his community. Eventually, he learns that an infant named Gabriel was set to be killed for not fitting into the strict confines set out for him and realizes he needs to take action. With the help of the receiver, Jonas takes Gabriel into the night and runs off. Him leaving means all his memories will be absorbed by the community and everyone will have the knowledge he does. The receiver stays behind to help the people deal with all of it since getting all that knowledge and pain at once will be very difficult. They leave the community and wind up in the middle of a snowstorm. The book ends with Jonas crawling towards a possible human habitation. His ultimate fate is left ambiguous.  Go be productive and secure in the knowledge that you didn't waste your time on this. If not, if you insist that the giver isn't as bad as I'm making it out to be, let's point out everything wrong with it from beginning to end. The start of the book has Jonas getting his new job with everyone else. When he's skipped over, he's very nervous and then he gets told that he gets to have the coolest, most specialist job in the whole community.  For a supposed dystopia, this is a weirdly positive plot point. The start of this is a lot like the start of Ranger's Apprentice, but worse in every way. It doesn't add much to Jonas' character or display what makes him different from everybody else. As far as we know, he's a completely normal kid at this stage, and he only begins acting differently after his training starts. His behavior changes seem to be due to experiencing new memories and learning more about his society, not anything inherent to his personality or growing up. What about Jonas makes him special enough to be the receiver of memory? I don't know. Will was naturally skilled in sneaking and climbing, which made him a great pick to be a Ranger. Haltz even arranged a secret test to make sure he had the necessary talent. He tricked him into breaking into a tower without getting caught, and he would have succeeded if Haltz hadn't already known that he was coming. After that, his training is grueling and takes up most of the remainder of the series. Jonas' training isn't even training, it's just him staying still and relieving other people's experiences. There's no effort on his part. There's some anguish and suffering, sure, just no real effort. Why should I care about him gaining all this new knowledge and experience if he didn't work for it? There's nothing inherent to him that allowed him to do this, and he didn't have to work for any of it, so why is Jonas the protagonist at all? That's a question I find myself asking a lot. The protagonist is ideally the character who drives the plot more than anyone else, and they ideally do it by being unique or special in some way. It might be some special powers they have, or their intelligence, or even their determination to do the right thing that makes them continue after others have given up. It could be a million different things, and yet many protagonists, including Jonas, have nothing that sets them apart from anyone else. They're just the hero because the author declares them to be the hero. The story just happens around them, and we're supposed to be impressed. Jonas's only distinguishing trait is that he has light blue eyes. That's how the receiver is chosen. They find people with different colored eyes. It's one thing for the community to be that shallow when it comes to making important decisions.  They even say at one point that Jonas's friend Fiona has red hair and that frustrates scientists because they want to get rid of it, but can't. So some physical differences are good and others are bad? What kind of sense does that make? None. Jonas passively receives all the memories. Then he just learns about all the terrible parts of his society. He doesn't really do anything until the end. And even then, he gets to save the day and change his entire society just by running off and saving his friend, if you can consider an infant your friend. That's a selfish goal, if a completely understandable one, and it should only help the two of them.  There's no effort on his part to make the community better, it just happens incidentally. There's a subplot about how Jonas is getting old enough to be horny now and has to take pills to suppress his sexual urges. Everyone in the community does because... This subplot isn't that weird or dumb, all things considered, I just need to mention that it starts off with Jonas having a sex dream about his friend Fiona, in the dream he tries to get her into a bathtub so he can wash her. That's it. When he tells his parents about this, that's when he starts taking the pills. But in this community, the kids bathe their elders all the time.  There are real world cultures where nudity is not inherently sexual, and the community appears to be one of them, so this is a strange detail. When I first read this, it took me a while to even realize that Jonas was having sexual urges because bathing others is a completely normal thing to them. A better way of showing off his urges would be to have him fantasizing about kissing Fiona. It's still G-rated while being more consistent. Beyond that, there isn't a lot to many of the characters or the story itself. That's not inherently bad, this is a dystopia, and those are more about the setting than anything else. So story and characters that are paper thin are fine sometimes. The giver could still be a good book if it had an interesting take on society or the human condition, however, you know this video wouldn't exist if that were the case. And that brings me to the message of the story. Some of you might be saying, James, it's about individuality and the meaning of what it is to be human. It's deep and mean stuff.  The whole point of this story is that enforced sameness is bad, which is the same message that Ayn Rand sent an anthem almost 60 years earlier, but it does a much worse job sending that message. Almost everyone is happy and cared for in this world. There's no hunger or pain at all. Everyone has a loving family, they're all given a job that they're happy with and excel at, and none of them know about the world before, so they don't miss anything. There aren't even any natural disasters or crimes to worry about. On the surface it sounds great, because on the surface it is great. They've eliminated most of the problems modern society has to deal with. Awesome. Obviously this is deliberate. This world seems like a nice place to live at first before the curtain gets slowly pulled back to reveal that it's awful actually. The problem with this is that the world isn't nearly as awful as it's made out to be. If you asked people who live in obscure poverty and more if they'd give up individuality in exchange for survival, many of them would say yes.  Anthem gets around this problem by showing how enforcing such strict roles on everyone saps their will to live and makes society stagnant. Everyone is forced to retire at the age of 40 and then they just sit around without any hobbies until they keel over. Technology has also regressed until the most advanced thing they have access to is candles. Then the main character comes along, sees that this is wrong, and tries to change things. First he invents a battery and tries to get his leaders to use it but they fear change too much and refuse to do so. Then he realizes one person can't bring change to a society this resistant to it so he takes his girlfriend and runs off to start a new life in the wilderness. It's similar to The Giver but there's no instant world saving. It's made clear that any changes that may come will take time and that the individualistic people just need to look out for themselves and their families while they wait for their old society to collapse on its own. It's a bit silly but it gets the point across, which is why it's Rand's one decent book. The Giver just ignores this and expects us to side against this world by default.  It's a well-off American telling people that having a stable food source, medical care, and comfortable living space is pointless and just a thin veneer placed over how awful things actually are. The book tries to show a dark side to things by revealing how those who don't fit in are killed and that's obviously terrible. That said, it doesn't make much sense.  What is considered sameness here? Would they be allowed to live if one of them had a birthmark and the other didn't? This is referred to as releasing people and they do it to a lot of others, such as the elderly who are too old to work anymore.  Does that mean everyone never makes a single mistake in this world?  And then we learn that people can volunteer to be released. In other words, assisted suicide is legal here. Uh, okay. It's not that suicide is a good thing, just that it's quite a bit different than being executed by the state for not fitting into narrow confines of what is considered socially acceptable. Rosemary committing suicide is treated with as much horror as the revelation that Jonas's father euthanizes infants, and they're both bad, but they're very different things. In the end, the twist that those who are released are really killed is just a cheap tactic the author threw out there to tug on our heartstrings and reassure us that this world is bad. I'd call it a straw man, but this community doesn't exist, so that term seems odd. It's not that I think this society would be a great place to live. I don't. It's that the book does a piss-poor job of showing what a horrible dystopia this place is and accidentally makes the positives outweigh the negatives. At the end, Jonas escapes, I think, it's ambiguous, which allows them to lead into the sequels that I refuse to read. I'm sure they're all just as poorly thought out, though. One other odd thing to mention is that no one can see color except for the receiver and their apprentice. They were genetically engineered to be colorblind to maintain sameness. They don't want people to see each other as different. So no one can see color because it might distinguish them, but they still have different faces, heights, and hair, so they're already distinguished. That's why black and white movies were a thing and everyone didn't look the exact same. The movie is even worse in this regard. Since it's visual, we can see that everything is in black and white. It doesn't function as a twist or any sort of revelation about the nature of this world. We just see everything in black and white, and then Jonas, and the audience by proxy, starts seeing color. Then he sees more. This is my segue into complaining about the film. Somehow the film takes this terrible book and makes it into an equally terrible yet vacuous adaptation. Big Joel made a video on this a few months ago, and while I think it's a good video, it's predicated on the idea that the book is good and the movie is bad primarily because it doesn't follow the book, so I need to talk about it still.  The fact that this is rated PG-13 is either a sign of how the MPAA has turned into a society of pussies, or a sign of how desperately the filmmakers wanted to be seen as adult. Problem is that these days PG-13 just means PG. Show a drop of blood? That's only for 17 and up, bucko. There's no violence or sexual content in the film at all. The most child-unfriendly bit is when they mention all the baby killing. That's a very quiet process, though. No violence or anything. It's solidly PG. Deal with it. The opening narration just straight up says that the world ended and then everyone decided to embrace these communities. In the book, it's left ambiguous how things got to this point, since that's not important. All that matters is how things are now, similar to how the Revolution in 1984 is left as a big background detail. Of course, if it came out today, Disney would buy the rights and make eight exclusive streaming shows covering the events of the Revolution and the life of Winston's third cousin because every aspect of the lore needs its own money-making entry in the franchise. This is just a way in which the giver tried to market itself as an adventure rather than a calmer, more subdued story. The book had no action scenes save the climax, sort of, no romance subplot, and no simplified good versus evil morality.  Everyone wanted to show an evil future government get overthrown through the power of love triangles, even though the Hunger Games was more intelligent than that. That was the only type of movie allowed for several years until several big flops, like this one, meant the genre sank.  This is especially annoying because there were 45 trillion crappy books in that genre they could have adapted that would have fit into this mold quite a bit better. Hell, it might have even made better movies. Instead, they went for the small amount of name recognition this IP offered.  This kid on foot and on a bike outruns a hovercraft? How slow is that thing? Jonas is older in the movie. Rather than being 12, he's in his mid to late teens and played by an actor in his 20s. This sort of change is common since minors have restrictions on how much they can work, so it's easier to use adult actors. Some changes in an adaptation are fine.  Being older makes Jonas seem less vulnerable though. That's all. I don't have anything else to add on the topic.  That's one change we should all get behind. The movie is still a blatant cash grab with no thought put into it though.  Meryl Streep deserved better. Okay, maybe she didn't. In the book, the villain was Society. The machine that Jonas lived in and the many cogs that kept it going. There was no one person that he could pin all these problems and flaws on. In the film, the high elder is the villain. Everything is pinned on her. It's all her fault. She personally orders many of the awful actions people undertake. She sends that sci-fi hovercraft after Jonas in the climax. He can't struggle in the wilderness against the elements in a desperate attempt to find civilization. That's too boring. He needs to run away from government agents while the evil leader looks on, evil-y. But his friend is also piloting the ship and lets him go so he was never in any real danger. If Streep had chosen literally any other pilot, he would have been captured and killed. Dumbass. This is a product not just of wanting Meryl Streep to have more screen time, but this idea of societal problems being blamed on individuals that Americans so love. Many people genuinely think that everything from economic troubles to drug abuse epidemics to their children having political disagreements with them can be blamed on a single person or small group.  Because the people in charge tell them to. Why did I lose my job? Clearly it's because the Jews are trying to keep me down. Why are more kids identifying as LGBT? It's because their teachers are brainwashing them because obviously everyone is straight by default. How do we solve all these problems? By putting a single person in charge and giving them all the authority they need to get rid of everyone who is doing the bad things. After that we will have no more problems and we will never need to find a new target to attack, nor will I have to worry about finding myself in the crosshairs one day. This obviously isn't exclusive to Americans, it's just common here, and it misses the point of all decent dystopias. The issue here was not the leaders of this society, that's why they barely feature in the book. The issue was the system that had been created. Many people were fine with sameness, either because they'd never considered an alternative or because they felt it was the best way to live. They grew up living here and it worked out okay for them, therefore it's good. They aren't evil people, they're just cold and disconnected. Sameness is made up of thousands of individual parts all performing their assigned tasks. If one of those parts stops, the others will continue. There is no single lever that can operate things and no one part to blame for the crimes of society. Things like 1984 or even the Hunger Games have must-ash twirling villains while still acknowledging that they're not the problem, they're just the representation of the problem. Big Brother may not even exist, he might just be a propaganda tool for the party to keep control. Changing the world requires more than getting rid of one person, and rant. I admit I liked Jeff Bridges' performance here. You can tell that he's a tired man who wants to do good and help the people around him, but he also knows he's near the end of his life. On top of that, he has the memories of so many other people and so many horrible experiences that he feels a hundred years older than he is. He seems to almost be looking forward to dying, like he can't wait for the burden to be lifted at last, yet he knows the burden isn't disappearing, it's just being transferred to someone else, someone who did nothing wrong, and he feels guilty about this. That's not even counting how he already got his daughter killed because she couldn't handle it. I also like the tension between him and Streep, where she views him as a threat to her power, but she still needs him around to help with governing. It's only when he becomes a threat to the system itself that she's able to act against him. This is the sort of thing Jonas wouldn't have been privy to in the book, and so the film taking time to focus on other characters works to its advantage here. This makes him a deeper character than simply being a wise old mentor with a tragic past, an archetype I've seen a lot before. But that's about the only positive thing I have to say. At the very least of the book attempted to say something. The film took that and turned it into a shitty action-adventure story with very little action or adventure. Some might say that makes it better, since the book did such a bad job at sending its message.  There was an opportunity to improve upon the messaging and make this story into something worth watching. Maybe iron out the details in the setting, make Jonas a more interesting character who has real reason to be chosen, and follow the general themes from the book. It wouldn't be great, but it would be a perfectly acceptable pile of blandness that everyone forgot about an hour after they left the theaters. So that's it.  Goodbye. Yes, I was forced to read this book for school. How could you tell? Huge thank you to everyone who watched this far. I'm sure everyone who's leaving a comment telling me to kill myself definitely made sure to watch the whole video. So thanks to them as well. And all the names you see on screen right now, these are my patrons. So thanks, especially to my super ultra great patrons who are Oppo Savilainen, Olivia Rayan, Brother Santotis, Buffy Valentine, Carolina Clay, Dan Anceliovic, Dark King, Dio, Echo, Eevee, Flax, Great Griebo, Carcat Kitsune, Liza Rudikova, Lord Tiebreaker, Madison Lewis Bennett, Matthew Bodro, Microphone, Peep the Toad, Return of Cardamom, Robbie Reviews, Sad Martigan, Celia the Vixen, Tesla Shark, VaVixus, VaVictus, and Wesley. I'm not, I'm not redoing that. I don't even care. If you want to get your name on here, be sure to join my Patreon page. If you can't do that, then please just write this video and comment on it, subscribe, all the things I'm supposed to say here. Thank you, goodbye.