 C'est un peu... Oui, oui. Donc, la première fois que ça commence, il y a une minute. Et la première fois que ça commence, il y a 10 minutes plus tard. Ok. Ok. Je suis heureux. Je suis heureux de ça. Ok, c'est cool. Vous sortez du micro, c'est ça? Oui. Mais c'est juste ça. Allez, mettez le micro. Voilà. Regardez. On est gens. On est gens. On est gens. On est gens. On est gens. On est gens. Ok, les amis. Je vais commencer. Allez. Ok, donc salut, tout le monde. Je suis Juan. C'est il. Je vais présenter 2 présentations après ça. Aujourd'hui, je vais vous présenter un projet qu'on appelle EZJIT, un livre qui s'essaie de projeter les compilations de Shusten pour les codes plus en plus. codes. So, as I said, it's a, actually it's a compiler assisted library, so it's not only a library for random consideration. So it's not a virtual machine, a magical virtual machine that optimizes your code and looks at it and monitors it and does a lot of tricks. And it's also not the building blocks for a just-in-them compiler, like the LLVM or like the LiveJet is. So, to figure out more or less what it is, I'm going to show you a quick example. So here, trust me, this is a convolution kernel, we are playing a convolution kernel over a video stream and, for example, if you look at the mask, the mask size and the mask area, that may be changed by the user at any time during the execution. We also have, okay, the input frame and the output frame and we also have the dimensions of the image and the number of channels of the image. This may change depending on the video input, it's not the same for a webcam that may be for a HD video or something else. We can make some assumptions up early, but we don't know the exact value at compile time that these variables will take. So it could be profitable to generate a specialized version for the kernel function for the values that are taking actually at one time for all these variables. So, how do we do this? We use the easyshell library and how do we do that? We change the code like that. So we have only one header and one function called in the entire library. I don't know here if you are familiar with ST-Divind, anybody, have ever heard of it. So it's a standard C++ construct, it's really all, I think, and it allows you to get a function object by binding the parameters of the function that is passed as parameter. We try to respect the same semantics as ST-Divind. Because it's practical to not have to learn a new interface. So here what this function code is doing is, it's specializing, it's generating at random a new version of the kernel function, it's going to pass mask, max size, and mask area as the first, second, and third parameters of the new function of the code to kernel, and it's going to put the actual value of these variables in the new version. So for example on some optimizations like constant propagation, loop and rolling, can do some extra work now, now that they have this new information available. We are going to take the first and the second parameter of the newly created function, and we're going to forward it to kernel as the input frame and output frame, and then we're going to also fix the image dimensions and the number of channels to the values taken here, and this is going to give us a function object that we can call, a semi-function object, like we do here, and it's going to compute the same function as, it's going to compute the same as the code that we seen before. What's cool about this is that we're doing everything in C++, so everything is a C++ object, we can do everything that we do with our typical C++ object, so we can store it on a vector, move it around, store it on an STD map, for example to create a code cache, and we actually provide, so we have a second thing that we provide with the library, that it's a simple code cache that allows us to not to have to recompile the entire code, if we already compiled it before. So the syntax, it's the same as before, and the only thing that it changes is that it will return a constant reference because the code cache, it's owned by the cache, and not by us. How does this work? Okay, I said it was a compiler assisted library, it's because it actually needs some compiler help. So we have one LLVM plugin that is loaded, that is going to pass the codes to our library, now it's going to embed the code associated to our library.