Sa dernière progression dans ce domaine est la mise en open source de composants majeurs de Bing, son moteur de recherche. Parmi ces composants figure BitFunnel, une bibliothèque haute-performance pour des recherches de texte sur internet. BitFunnel est basé sur un algorithme probabiliste qui identifie et classe les documents en fonction de requêtes impliquant des mots-clés, des phrases et des expressions mathématiques.
Dans un billet de blog, Michael Hopcroft, un ingénieur Microsoft qui a été parmi les premiers à avoir participé au développement de BitFunnel, a partagé des moment-clés dans le développement de BiFunnel et a invité la communauté open source à rejoindre les développeurs de BitFunnel. Microsoft a décidé de commencer le projet avec un dépôt vide dans lequel seraient apportés un à un des modules BitFunnel, l’objectif étant d’évoluer progressivement avec la communauté.
Sur le dépôt GitHub de BitFunnel, trois projets majeurs sont listés. Le premier est BiFunnel, désigné comme étant un « moteur de recherche bébé ». Le système de recherche / récupération de texte a été posté « dans une disposition d’esprit de développement ouvert, mais rien ici n’a été préparé pour une consommation publique » sans compter que « la documentation n’est pas existante et le code est dans un état incomplet ». Bien entendu, à ce stade il n’est pas encore fonctionnel.
Workbench, une boîte à outils qui va servir à la préparation du texte pour une utilisation de BitFunnel, fait lui aussi partie des trois projets majeurs de BitFunnel. Il s’agit plus précisément ici de convertir les fichiers dump de base de données Wikipedia dans un format lisible par BitFunnel. Le processus de conversion implique de parser les fichiers dump Wikipedia, d'extraire chaque document, de retirer les marqueurs wiki, d'effectuer une analyse de Lucene pour la tokenisation et au final de générer et d'encoder les données au format BitFunnel.
Le dernier projet en date est NativeJIT, une bibliothèque open source multi-plateformes pour des compilations haute performance d’expressions impliquant des structures de données C. Le code généré est alors optimisé avec une attention particulière apportée à l’allocation de registre. Voici un exemple d’un code qui calcule la surface d’un cercle :
Code C++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include "NativeJIT/CodeGen/ExecutionBuffer.h" #include "NativeJIT/CodeGen/FunctionBuffer.h" #include "NativeJIT/Function.h" #include "Temporary/Allocator.h" #include <iostream> using NativeJIT::Allocator; using NativeJIT::ExecutionBuffer; using NativeJIT::Function; using NativeJIT::FunctionBuffer; int main() { // Create allocator and buffers for pre-compiled and post-compiled code. ExecutionBuffer codeAllocator(8192); Allocator allocator(8192); FunctionBuffer code(codeAllocator, 8192); // Create the factory for expression nodes. // Our area expression will take a single float parameter and return a float. Function<float, float> expression(allocator, code); // Multiply input parameter by itself to get radius squared. auto & rsquared = expression.Mul(expression.GetP1(), expression.GetP1()); // Multiply by PI. const float PI = 3.14159265358979f; auto & area = expression.Mul(rsquared, expression.Immediate(PI)); // Compile expression into a function. auto function = expression.Compile(area); // Now run our expression! float radius = 2.0; std::cout << "The area of a circle with radius " << radius << " is " << function(radius); return 0; } |
Voici le code assembleur généré sur Windows :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | PI_CONSTANT: db 0f 49 40 ; PI constant is stored in memory. ENTRY_POINT: sub rsp,8 ; Standard function prologue. mov qword ptr [rsp],rbp ; Standard function prologue. lea rbp,[rsp+8] ; Standard function prologue. mulss xmm0,xmm0 ; Multiply by radius parameter by itself. mulss xmm0,dword ptr [29E2A580000h] ; Multiply by PI. mov rbp,qword ptr [rsp] ; Standard function epilogue. add rsp,8 ; Standard function epilogue. |
Source : GitHub BitFunnel, blog BitFunnel