<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/'>
<channel>
  <title>Benoît Jacob</title>
  <link>http://bjacob.livejournal.com/</link>
  <description>Benoît Jacob - LiveJournal.com</description>
  <lastBuildDate>Tue, 14 Apr 2009 15:56:58 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>bjacob</lj:journal>
  <lj:journalid>11408496</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/9978.html</guid>
  <pubDate>Tue, 14 Apr 2009 15:56:58 GMT</pubDate>
  <title>Eigen 2.0.1, Step, and Mandelbrot Plasma plugin</title>
  <link>http://bjacob.livejournal.com/9978.html</link>
  <description>Today we released &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen 2.0.1&lt;/a&gt; with a nice amount of fixes. Speaking of which, Eigen will see much more usage in KDE 4.3.&lt;br /&gt;&lt;br /&gt;First, &lt;a href=&quot;http://www.labri.fr/perso/guenneba/&quot;&gt;Gael&lt;/a&gt; ported &lt;a href=&quot;http://edu.kde.org/step/&quot;&gt;Step&lt;/a&gt; to use &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen&lt;/a&gt;, making it easier to build by removing the dependency on &lt;a href=&quot;http://home.gna.org/getfem/gmm_intro&quot;&gt;GMM++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then, I just submitted the Mandelbrot Plasma Wallpaper plugin to &lt;a href=&quot;http://websvn.kde.org/trunk/kdereview/plasma/wallpapers/mandelbrot/&quot;&gt;kdereview&lt;/a&gt;. This allows you to navigate through the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mandelbrot_set&quot;&gt;Mandelbrot set&lt;/a&gt; as a &apos;live&apos; wallpaper, and you can also &apos;lock&apos; the view so it behaves like a plain wallpaper. It uses Eigen to emit SIMD instructions in a portable way -- or none at all if they are not available. On the x86 platform where SSE2 may or may not be available, we compile both paths and choose between them at runtime using the excellent &lt;a href=&quot;http://solid.kde.org/&quot;&gt;Solid library&lt;/a&gt;. Perhaps the best part is that the source code is only 840 lines of C++, and the stripped binary size is only 68 kB on x86, all inclusive, with the 2 paths compiled in.&lt;br /&gt;&lt;br /&gt;Screenshot (click for full size):&lt;br /&gt;&lt;a href=&quot;http://imagebin.ca/view/fix5ufx.html&quot;&gt; &lt;img src=&quot;http://imagebin.ca/img/uuRB4FSF.jpg&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is shown at &quot;Highest&quot; quality level, which is not very fast, but at Medium level it really flies and in any case the rendering is completely non-blocking and is tiled starting with the tiles you&apos;re most interested in, so it gives a good speed impression.</description>
  <comments>http://bjacob.livejournal.com/9978.html</comments>
  <category>kde eigen plasma mandelbrot wallpaper st</category>
  <lj:security>public</lj:security>
  <lj:reply-count>19</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/9510.html</guid>
  <pubDate>Mon, 02 Feb 2009 18:47:31 GMT</pubDate>
  <title>Eigen 2.0 released !</title>
  <link>http://bjacob.livejournal.com/9510.html</link>
  <description>&lt;img src=&quot;http://eigen.tuxfamily.org/images/Eigen_Silly_Professor_135x135.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;We just released &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen 2.0&lt;/a&gt; !&lt;br /&gt;&lt;br /&gt;Our mailing list is bubbling with activity right now and we&apos;re scheduling the 2.1 release for July.&lt;br /&gt;&lt;br /&gt;That&apos;s all :)</description>
  <comments>http://bjacob.livejournal.com/9510.html</comments>
  <category>eigen2</category>
  <category>library</category>
  <category>matrix</category>
  <category>eigen</category>
  <category>template</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/9369.html</guid>
  <pubDate>Fri, 30 Jan 2009 13:34:12 GMT</pubDate>
  <title>Eigen 2.0 release on Monday after all</title>
  <link>http://bjacob.livejournal.com/9369.html</link>
  <description>I had to change the release date that I announced in &lt;a href=&quot;http://bjacob.livejournal.com/9133.html&quot;&gt;this blog entry&lt;/a&gt;: the Eigen 2.0 release is happening on &lt;b&gt;Monday&lt;/b&gt; after all! Sorry about the confusion.</description>
  <comments>http://bjacob.livejournal.com/9369.html</comments>
  <category>release</category>
  <category>eigen2</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/9133.html</guid>
  <pubDate>Thu, 29 Jan 2009 17:38:53 GMT</pubDate>
  <title>Eigen 2.0 coming this Monday!</title>
  <link>http://bjacob.livejournal.com/9133.html</link>
  <description>&lt;img src=&quot;http://eigen.tuxfamily.org/images/Eigen_Silly_Professor_135x135.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;The release of &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen 2.0&lt;/a&gt; will happen this &lt;strike&gt;Sunday&lt;/strike&gt; &lt;b&gt;Monday&lt;/b&gt;!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT&lt;/b&gt;: The release will happen on &lt;b&gt;Monday&lt;/b&gt; after all!&lt;br /&gt;&lt;br /&gt;Just in case you want to join our IRC channel (#eigen on irc.freenode.net) and celebrate, here&apos;s roughly the timespan in which we expect to make the release, depending on your timezone:&lt;br /&gt;&lt;br /&gt;Los Angeles: between 9:00 AM and 10:00.&lt;br /&gt;Toronto/New York: between 12:00 (noon) and 13:00.&lt;br /&gt;London: between 17:00 and 18:00.&lt;br /&gt;Paris/Berlin/Rome/Madrid: between 18:00 and 19:00.&lt;br /&gt;Helsinki: between 19:00 and 20:00.&lt;br /&gt;Moscow: between 20:00 and 21:00.</description>
  <comments>http://bjacob.livejournal.com/9133.html</comments>
  <category>release</category>
  <category>eigen2</category>
  <category>eigen</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/8742.html</guid>
  <pubDate>Tue, 27 Jan 2009 22:35:21 GMT</pubDate>
  <title>Eigen 2.0 Release Candidate !</title>
  <link>http://bjacob.livejournal.com/8742.html</link>
  <description>&lt;img src=&quot;http://eigen.tuxfamily.org/images/Eigen_Silly_Professor_135x135.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;We now have a release candidate for &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen 2&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Also, &lt;a href=&quot;http://geoffhutchison.net/about/&quot;&gt;Geoff Hutchison&lt;/a&gt; and &lt;a href=&quot;http://www.behindkde.org/people/niehaus/&quot;&gt;Carsten Niehaus&lt;/a&gt; interviewed us, and Geoff already posted a version of this &lt;a href=&quot;http://www.macresearch.org/interview-eigen-matrix-library&quot;&gt;interview on Macresearch&lt;/a&gt;. Thanks a lot!&lt;br /&gt;&lt;br /&gt;Testing is more than welcome, as Eigen is quite a stress-test for compilers. Areas where we are desperately looking for testers include:&lt;br /&gt;* The BSDs. Some BSDs do have packages of recent betas, which is a good sign, though.&lt;br /&gt;* Solaris. We haven&apos;t heard any report so far.&lt;br /&gt;* AltiVec hardware. This isn&apos;t getting tested frequently enough.&lt;br /&gt;&lt;br /&gt;We also sometimes hit internal compiler errors in MSVC and ICC, so help working around these compiler bugs is much appreciated.&lt;br /&gt;&lt;br /&gt;We have started &lt;a href=&quot;http://my.cdash.org/index.php?project=Eigen&quot;&gt;using CDash&lt;/a&gt; and Gael is able to run tests on an amazing number of systems thanks to the INRIA&apos;s PIPOL.&lt;br /&gt;&lt;br /&gt;The number of projects who are interested in Eigen keeps growing, for example in the past few days there has been discussion at &lt;a href=&quot;http://www.blender.org/&quot;&gt;Blender&lt;/a&gt; and there have been some &lt;a href=&quot;http://lists.blender.org/pipermail/bf-committers/2009-January/022555.html&quot;&gt;very&lt;/a&gt; &lt;a href=&quot;http://lists.blender.org/pipermail/bf-committers/2009-January/022553.html&quot;&gt;positive&lt;/a&gt; &lt;a href=&quot;http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2009/01/msg00234.html&quot;&gt;messages&lt;/a&gt; about Eigen.</description>
  <comments>http://bjacob.livejournal.com/8742.html</comments>
  <category>eigen2</category>
  <category>library</category>
  <category>matrix</category>
  <category>linear algebra</category>
  <category>eigen</category>
  <category>template</category>
  <category>vector</category>
  <category>release candidate</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/8538.html</guid>
  <pubDate>Mon, 05 Jan 2009 20:20:05 GMT</pubDate>
  <title>Eigen 2.0 beta5</title>
  <link>http://bjacob.livejournal.com/8538.html</link>
  <description>&lt;img src=&quot;http://eigen.tuxfamily.org/images/Eigen_Silly_Professor_135x135.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Yet another beta for &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen 2&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Yesterday I released a beta4 but so many issues got fixed since that it&apos;s worth making this new beta. I&apos;m starting to be really confident about this being used to build and package KDE 4.2 and KOffice 2.0, not only on Linux but also on Windows and Mac OSX. Just today we&apos;ve been fixing a Mac OSX issue, several Windows issues, and a couple more generic problems. It&apos;s really good to have many users and I must say that in Eigen we&apos;re rather spoiled, our users are very active in helping tracking the bugs down -- probably that&apos;s the upside of a project being technical in nature.&lt;br /&gt;&lt;br /&gt;The API should be 100% stable now -- except of course for the parts of Eigen that we&apos;re calling experimental. For the 2.0 release we&apos;ll just remove the deprecated stuff (so check your warnings NOW!).&lt;br /&gt;&lt;br /&gt;In other news, the &lt;a href=&quot;http://forum.kde.org/eigen-f-74.html&quot;&gt;forum&lt;/a&gt; is very active already so I&apos;m optimistic that we&apos;ll reach pretty soon the point where users start helping each other -- something I&apos;m eagerly looking forward to! Like I expected, we&apos;re seeing a new group of users on this forum whom we didn&apos;t see on the mailing list. So it&apos;s great to reach new people. On the other hand there&apos;s the risk of balkanization if instead of one we get two disjoint Eigen communities -- that would be pretty bad! We&apos;ll see.</description>
  <comments>http://bjacob.livejournal.com/8538.html</comments>
  <category>eigen2</category>
  <category>library</category>
  <category>linear algebra</category>
  <category>c++</category>
  <category>eigen</category>
  <category>matrix</category>
  <category>template</category>
  <category>vector</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/8258.html</guid>
  <pubDate>Sat, 03 Jan 2009 14:43:55 GMT</pubDate>
  <title>Carrots</title>
  <link>http://bjacob.livejournal.com/8258.html</link>
  <description>I don&apos;t normally post non-coding stuff there but today I feel like it....&lt;br /&gt;&lt;br /&gt;WHY is it impossible to find good carrots in Toronto??? There are at least 3 or 4 different varieties of carrots available here, some small, some big, but none makes for good grated carrots. I mean, grated carrots should be very juicy, with a sharp taste. Here in Toronto, they are dry and bland (doesn&apos;t make much of a difference when you cook them, but the difference is huge with raw grated carrots). I tried at least 3 varieties, organic/farmer&apos;s markets, etc, so I&apos;m quite desperate. Anyone knows if one can find the same kinds of carrots here as we have in France? I don&apos;t even know the name of the variety I was used to in France... (see &lt;a href=&quot;http://www.carrotmuseum.co.uk/varietyphotos.html&quot;&gt;here&lt;/a&gt; a list of varieties)&lt;br /&gt;&lt;br /&gt;Otherwise I guess I should get used to the idea that different continents have to mean different plants but still I thought that fresh grated carrots was a kind of universal simple pleasure, turns out it&apos;s not.</description>
  <comments>http://bjacob.livejournal.com/8258.html</comments>
  <category>carrots</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/7950.html</guid>
  <pubDate>Wed, 24 Dec 2008 08:07:28 GMT</pubDate>
  <title>Eigen 2.0 beta3 released!</title>
  <link>http://bjacob.livejournal.com/7950.html</link>
  <description>&lt;img src=&quot;http://eigen.tuxfamily.org/images/Eigen_Silly_Professor_135x135.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;We just released the third beta of &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen 2&lt;/a&gt;. Like the rest of the KDE community we are in heavy bug-fixing and polishing mode and this new beta gets us quite close to what we&apos;ll soon be calling a release candidate. This is really a result of Eigen&apos;s increasing number of users: useful bug reports have been flowing in continuously in the past 3 weeks.&lt;br /&gt;&lt;br /&gt;Documentation-wise, &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=FAQ#Vectorization&quot;&gt;here&lt;/a&gt; is a FAQ section on vectorization.&lt;br /&gt;&lt;br /&gt;Also, we now have a &lt;a href=&quot;http://forum.kde.org/eigen-f-74.html&quot;&gt;Eigen users forum&lt;/a&gt; and I must say that the guys at &lt;a href=&quot;http://forum.kde.org&quot;&gt;forum.kde.org&lt;/a&gt;, especially &lt;a href=&quot;http://forum.kde.org/neverendingo-u-3.html&quot;&gt;Neverendingo&lt;/a&gt;, are very helpful.</description>
  <comments>http://bjacob.livejournal.com/7950.html</comments>
  <category>eigen2</category>
  <category>matrix</category>
  <category>linear algebra</category>
  <category>eigen</category>
  <category>vector</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/7707.html</guid>
  <pubDate>Mon, 08 Dec 2008 03:01:46 GMT</pubDate>
  <title>Eigen 2.0 beta2</title>
  <link>http://bjacob.livejournal.com/7707.html</link>
  <description>&lt;img src=&quot;http://eigen.tuxfamily.org/images/Eigen_Silly_Professor_135x135.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;We just released the second beta of &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen 2&lt;/a&gt;, the new C++ math library that is being used at various places in KDE 4.2 and KOffice 2.0.&lt;br /&gt;&lt;br /&gt;It&apos;s exciting times for Eigen 2 as &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=Main_Page#Projects_using_Eigen_2&quot;&gt;many projects&lt;/a&gt; are starting to use it. For now, outside of KDE, it&apos;s mostly robotics and computer graphics, but there&apos;s also a couple of chemistry projects.&lt;br /&gt;&lt;br /&gt;People seem to appreciate particularly our &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=API_Showcase&quot;&gt;very nice API&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Before somebody asks again the &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=FAQ&quot;&gt;usual questions&lt;/a&gt; &quot;why does Eigen exist&quot; and &quot;how does it compare to BLAS&quot; let me link to the &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=FAQ&quot;&gt;FAQ&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;There are actually more and more open &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=Todo&quot;&gt;TODO&lt;/a&gt; items, with a lot of open jobs, and we now have some &lt;a href=&quot;http://eigen.tuxfamily.org/api/InsideEigenExample.html&quot;&gt;introduction to Eigen internals&lt;/a&gt; aimed specifically at newcomers. So if you know C++ and some math, consider joining this exciting project!</description>
  <comments>http://bjacob.livejournal.com/7707.html</comments>
  <category>eigen2</category>
  <category>matrix</category>
  <category>linear algebra</category>
  <category>c++</category>
  <category>eigen</category>
  <category>vector</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/7638.html</guid>
  <pubDate>Fri, 05 Dec 2008 15:12:22 GMT</pubDate>
  <title>What happens inside Eigen</title>
  <link>http://bjacob.livejournal.com/7638.html</link>
  <description>Anybody here interested in understanding how &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen&lt;/a&gt; works? Or interested in learning about C++ techniques such as expression templates? Or interested in SSE2 vectorization?&lt;br /&gt;&lt;br /&gt;I just wrote a &lt;a href=&quot;http://eigen.tuxfamily.org/api/InsideEigenExample.html&quot;&gt;documentation page&lt;/a&gt; where we look at this very simple example program:&lt;br /&gt;&lt;pre&gt;
&lt;span style=&quot;color: #141312&quot;&gt;#include&amp;lt;Eigen/Core&amp;gt;&lt;/span&gt;

&lt;span style=&quot;color: #141312&quot;&gt;int main()&lt;/span&gt;
&lt;span style=&quot;color: #141312&quot;&gt;{&lt;/span&gt;
&lt;span style=&quot;color: #141312&quot;&gt;  int size = 50;&lt;/span&gt;
&lt;span style=&quot;color: #141312&quot;&gt;  // VectorXf is a vector of floats, with dynamic size.&lt;/span&gt;
&lt;span style=&quot;color: #141312&quot;&gt;  Eigen::VectorXf u(size), v(size), w(size);&lt;/span&gt;
&lt;span style=&quot;color: #141312&quot;&gt;  u = v + w;&lt;/span&gt;
&lt;span style=&quot;color: #141312&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://eigen.tuxfamily.org/api/InsideEigenExample.html&quot;&gt;Read on&lt;/a&gt; to discover why coding a Vector class making this compile to efficient assembly was a nontrivial problem, and to understand how &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen&lt;/a&gt; does it!&lt;br /&gt;&lt;br /&gt;PS. Eigen 2.0-beta2 is only a few days away, so the whole online dox will see a massive update very soon.&lt;br /&gt;&lt;br /&gt;PPS. We now have &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=Main_Page#Projects_using_Eigen_2&quot;&gt;many users&lt;/a&gt;! Even before our actual release! Seems like we&apos;re really filling a big gap.&lt;br /&gt;&lt;br /&gt;PPPS. Did I mention that C++ is a wonderful language? I think that the above-mentioned &lt;a href=&quot;http://eigen.tuxfamily.org/api/InsideEigenExample.html&quot;&gt;example&lt;/a&gt; is a good illustration of that. Incidentally, there recently was a &lt;a href=&quot;http://www.reddit.com/r/programming/comments/7cl9f/why_c_doesnt_suck/&quot;&gt;discussion at Reddit&lt;/a&gt; about &quot;why C++ doesn&apos;t suck&quot; and one commenter &lt;a href=&quot;http://www.reddit.com/r/programming/comments/7cl9f/why_c_doesnt_suck/c06arpo&quot;&gt;mentioned&lt;/a&gt; Eigen!</description>
  <comments>http://bjacob.livejournal.com/7638.html</comments>
  <category>sse</category>
  <category>eigen2</category>
  <category>c++</category>
  <category>expression templates</category>
  <category>eigen</category>
  <category>vectorization</category>
  <lj:security>public</lj:security>
  <lj:reply-count>9</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/7264.html</guid>
  <pubDate>Mon, 22 Sep 2008 17:11:07 GMT</pubDate>
  <title>Eigen 2.0 beta1 released</title>
  <link>http://bjacob.livejournal.com/7264.html</link>
  <description>We just released the beta version of &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen 2.0&lt;/a&gt;. It has matured a lot over recent weeks as quite a number of apps have been ported to it: &lt;a href=&quot;http://avogadro.openmolecules.net&quot;&gt;Avogadro&lt;/a&gt;, &lt;a href=&quot;http://koffice.kde.org&quot;&gt;KOffice (mainly Krita and a little KSpread)&lt;/a&gt;, KGLLib, SolidKreator, KGLEngine. I have started working on a Mandelbrot fractal wallpaper-plugin for Plasma, using Eigen 2.0 for portable vectorization. We also have people on the mailing list doing very interesting things with Eigen 2.0: one is an engineer using it to design airplane engines, a few others use it for advanced computer graphics/vision. We plan to release 2.0 later this fall, in time for KOffice 2.0 and KDE 4.2.&lt;br /&gt;&lt;br /&gt;There is now a quite decent &lt;a href=&quot;http://eigen.tuxfamily.org/api/TutorialCore.html&quot;&gt;Tutorial&lt;/a&gt; which is a good starting point if you&apos;re interested in Eigen.&lt;br /&gt;&lt;br /&gt;Besides polishing for the upcoming 2.0 release, we are already making big plans for the future. Version 2.1 will have a complete Sparse module, which will be very useful for &lt;a href=&quot;http://koffice.kde.org/krita&quot;&gt;Krita&lt;/a&gt; and &lt;a href=&quot;http://edu.kde.org/step&quot;&gt;Step&lt;/a&gt;. Gael has been doing the ground work for this module, and recently Daniel Gomez joined us and contributed several improvements.&lt;br /&gt;&lt;br /&gt;We still are very few developers -- Daniel is basically the 3rd one, with Gael and me, although a few guys have been helping occasionnally in the past. We definitely can use more help (hint, hint). For that reason we try to polish the documentation a lot, and we can mentor any prospective contributor. &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=Todo&quot;&gt;Here is a TODO&lt;/a&gt; listing many available jobs, all you need is C++ and some math background.</description>
  <comments>http://bjacob.livejournal.com/7264.html</comments>
  <category>eigen2</category>
  <category>matrix</category>
  <category>c++</category>
  <category>eigen</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/7094.html</guid>
  <pubDate>Tue, 26 Aug 2008 22:35:32 GMT</pubDate>
  <title>(off-topic): Dimensions</title>
  <link>http://bjacob.livejournal.com/7094.html</link>
  <description>Here&apos;s something unrelated to KDE or Free Software, but which I still allow myself to blog about because every nerd here will agree it&apos;d insanely cool.&lt;br /&gt;&lt;br /&gt;A team led by famous mathematician &lt;a href=&quot;http://en.wikipedia.org/wiki/Étienne_Ghys&quot;&gt;Etienne Ghys&lt;/a&gt; has produced a series of 9 short videos explaining some very cool geometry and topology. If you ever wanted to get a feel of what 4D geometry is like, this is what you&apos;ve been looking for. The project is called &lt;a href=&quot;http://www.dimensions-math.org/&quot;&gt;Dimensions&lt;/a&gt; and is translated into several languages already.&lt;br /&gt;&lt;br /&gt;The videos are Creative Commons licensed and can be &lt;a href=&quot;http://www.dimensions-math.org/Dim_regarder_E_E.htm&quot;&gt;watched online&lt;/a&gt; or downloaded. If you have some math background you might want to start directly at Chapter 3 or 4.&lt;br /&gt;&lt;br /&gt;You can have a &lt;a href=&quot;http://www.dimensions-math.org/Dim_tour_E.htm&quot;&gt;quick tour of screenshots here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is one of these pics... (yes, pics are the only way to attract your attention...)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dimensions-math.org/4A_6.jpg&quot; alt=&quot;4d regular solid&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; For the laziest who might not bother to browse the videos... here is chapter 6 explaining all you ever wanted to know about Fractals (Julia and Mandelbrot sets). It requires familiarity with complex numbers which are very well explained in the previous chapter 5 -- which I let you browse for.&lt;br /&gt;&lt;br /&gt;&lt;lj-embed id=&quot;1&quot; /&gt;</description>
  <comments>http://bjacob.livejournal.com/7094.html</comments>
  <category>dimensions</category>
  <category>geometry</category>
  <category>video</category>
  <category>math</category>
  <category>4d</category>
  <category>maths</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/6723.html</guid>
  <pubDate>Tue, 12 Aug 2008 14:03:41 GMT</pubDate>
  <title>Eigen2 alpha6</title>
  <link>http://bjacob.livejournal.com/6723.html</link>
  <description>It&apos;s been some time since I last updated you on &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen2&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;We just released &lt;a href=&quot;http://download.tuxfamily.org/eigen/eigen-2.0-alpha6.tar.bz2&quot;&gt;alpha6&lt;/a&gt;. At this point, Eigen2 can do all what &lt;a href=&quot;http://eigen.tuxfamily.org/1&quot;&gt;Eigen1&lt;/a&gt; did (and much, much more) so everyone is encouraged to use it for new code, and to port existing code to it.&lt;br /&gt;&lt;br /&gt;We plan to release Eigen 2.0 during this fall, in time for the releases of the software projects which plan to use it (tentatively: KDE 4.2, Avogadro 1.0, KOffice 2.0, OpenBabel 3.0).&lt;br /&gt;&lt;br /&gt;Eigen2 is a c++ pure-template-library (all the code in headers) for matrix/vector math (linear algebra) developed by &lt;a href=&quot;http://g.gael.free.fr/&quot;&gt;Gael Guennebaud&lt;/a&gt; and myself.&lt;br /&gt;&lt;br /&gt;Usually I get questions about &quot;how is it different from other libraries&quot; and &quot;you&apos;ll never have the resources to compete against $OTHER_LIBRARY which is developed by a huge team&quot;. So let me answer them here...&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&quot;how is it different from other libraries?&quot;&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Other libraries tend to each be specialized on a particular aspect of linear algebra. The first specialization is between fixed-size and dynamic-size: most libraries handle only dynamic-size objects (&quot;vector = new float[n]&quot;), a few others do only fixed-size (&quot;float vector[N]&quot;). Another specialization is between dense and sparse objects. Yet another specialization is between libraries which focus on storage and basic algorithms, libraries which provide advanced algorithms, and libraries which provide convenience features which are not exactly part of linear algebra but very useful to applications.&lt;br /&gt;&lt;br /&gt;Eigen2 does &lt;i&gt;all&lt;/i&gt;; of that -- though the sparse part is still experimental and not planned for the 2.0 release. For advanced sparse algorithms we plan to let the user choose a backend, be for the rest Eigen2 is entirely self-contained.&lt;br /&gt;&lt;br /&gt;Thus, one of Eigen2&apos;s main distinguishing features is to be &lt;i&gt;versatile&lt;/i&gt;. This was commanded by KDE&apos;s needs: KDE is a huge metaproject with very very diverse needs, and Eigen &lt;a href=&quot;http://markmail.org/message/eqjznnrplhth67fn&quot;&gt;started as an attempt to fulfill them&lt;/a&gt; (at that time we wrongly believed that KDE had only simple needs!)&lt;br /&gt;&lt;br /&gt;Another distinguishing feature of Eigen2 is that is it thoroughly based on &lt;a href=&quot;http://ubiety.uwaterloo.ca/~tveldhui/papers/Expression-Templates/exprtmpl.html&quot;&gt;expression templates&lt;/a&gt;. Roughly, this means that when you do &quot;v3 = v1 + v2;&quot;, instead of computing the sum v1+v2 and then copying it to v3, Eigen first constructs a &quot;sum expression&quot; object representing v1+v2, storing some &quot;metadata&quot; on this algebraic expression. In the &quot;v3=v1+v2&quot; example this allows to avoid the unneccessary temporary returned by &quot;v1+v2&quot;. In more complex expressions, it becomes nontrivial to know which temporaries to remove and which to keep; Eigen has a lot of compile-time logic to determine that intelligently. We believe that we are the only library around to do that; other expression templates libraries tend to always remove temporaries, even when evalutating the temporary is actually a good thing. Non-expression-templates libraries have no choice but to always evaluate, and thus miss huge optimization opportunities.&lt;br /&gt;&lt;br /&gt;Expression templates don&apos;t stop here -- at least not in Eigen2! First, the compile-time metadata which they convey is used to perform more optimizations: generic vectorization (SSE2 to SSSE3, and experimental AltiVec support), and generic loop unrolling. Second, expression templates allow zero-cost method chaining and allows return values to be lvalues. This means that you can write &quot;matrix.row(i) += something&quot; or &quot;matrix.diagonal().start(n).setZero()&quot; and when you look at the generated asm, it is really like handwritten, vectorized, minimal assembly -- nothing remains of the syntactic sugar.&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&quot;you&apos;ll never have the resources !&quot;&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Eigen2 is mostly a 2-persons project and currently&lt;span style=&quot;font-weight: bold;&quot;&gt; has only 11000 LOC&lt;/span&gt;, and that includes some experimental code that i&apos;m not even discussing here (Sparse matrices...). By contrast the other libraries (BLAS/LAPACK implementations) are typically developed by large academic teams or, in the case of MKL, by Intel&apos;s own engineers, and they are huge:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the &lt;a href=&quot;http://www.intel.com/cd/software/products/asmo-na/eng/307757.htm&quot;&gt;Intel MKL&lt;/a&gt; linux/x86 package weighs 250 MB (can&apos;t tell how many LOC, it&apos;s closed-source).&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.tacc.utexas.edu/resources/software/#blas&quot;&gt;GOTO&lt;/a&gt; has 750,000 LOC (and it&apos;s barely &quot;open source&quot; as its license does not even allow redistribution! makes me wish the term &quot;open source&quot; had not been coined, it&apos;s too easily abused)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://math-atlas.sourceforge.net/&quot;&gt;ATLAS&lt;/a&gt;, the best of the existing truly free libraries, has 400,000 LOC.&lt;/li&gt;&lt;/ul&gt;So, we can&apos;t stand a chance against them, can we?&lt;br /&gt;&lt;br /&gt;Well, the first thing to be said is that none of these libs handles &lt;span style=&quot;font-weight: bold;&quot;&gt;fixed-size&lt;/span&gt; objects. Yet, this is the majority of use cases for a non-scientific project like KDE. So the above libraries can&apos;t be used for these use cases (they are then 20x slower than a library optimized for fixed-size objects like Eigen).&lt;br /&gt;&lt;br /&gt;Ok ok, you&apos;ll tell me, but what about &lt;span style=&quot;font-weight: bold;&quot;&gt;dynamic-size&lt;/span&gt; objects, which is the area in which the above big libraries specialize? A tiny library like Eigen can&apos;t compete against them on their own ground, right?&lt;br /&gt;&lt;br /&gt;Well, since we have such a generic framework for matrix computations, with a great c++ API and generic optimizations, implementing and optimizing all the usual linear algebra algorithms doesn&apos;t take us as long as it takes other projects, nor does it take as many lines of code. In some cases, special care is needed to be cache-friendly (a crucial aspect with very large objects), and fortunately, Gael is extremely good at that.&lt;br /&gt;&lt;br /&gt;Here are some benchmark results (&lt;span style=&quot;font-weight: bold;&quot;&gt;dynamic-size&lt;/span&gt;, higher is better), &lt;a href=&quot;http://eigen.tuxfamily.org/index.php?title=Benchmark&quot;&gt;details and more results here&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;
&lt;img src=&quot;http://download.tuxfamily.org/eigen/btl-results/axpy.png&quot; /&gt;

&lt;img src=&quot;http://download.tuxfamily.org/eigen/btl-results/matrix_vector.png&quot; /&gt;

&lt;img src=&quot;http://download.tuxfamily.org/eigen/btl-results/matrix_matrix.png&quot; /&gt;

&lt;img src=&quot;http://download.tuxfamily.org/eigen/btl-results/trisolve.png&quot; /&gt;

&lt;br /&gt;&lt;br /&gt;I should say that the benchmarking effort and subsequent optimizations was entirely by Gael. Also, 3 of the 4 benchmarks presented above (matrix-vector, matrix-matrix and triangular solver) are benchmarking solely code written by him (just so you know that eigen is not at all anymore the one-person project it used to be until 6-7 monthes ago).</description>
  <comments>http://bjacob.livejournal.com/6723.html</comments>
  <category>goto</category>
  <category>library</category>
  <category>atlas</category>
  <category>c++</category>
  <category>eigen</category>
  <category>mkl</category>
  <category>matrix</category>
  <category>template</category>
  <category>vector</category>
  <lj:security>public</lj:security>
  <lj:reply-count>11</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/6600.html</guid>
  <pubDate>Tue, 01 Jul 2008 16:17:38 GMT</pubDate>
  <title>Eigen2 as a vectorization library</title>
  <link>http://bjacob.livejournal.com/6600.html</link>
  <description>A big issue for any math-oriented software is vectorization i.e. how to make use of instruction sets such as SSE or AltiVec. Unfortunately this seems to be very hard for the compiler to do automatically, and even with Intel&apos;s own compiler, with complicated C++ code such as ours, the benefits were small (like +25% with ICC and +5% with GCC).&lt;br /&gt;&lt;br /&gt;Yet, the theoretical benefit of vectorization is huge: with SSE, computations of floats can become 4x faster, and more in certain cases. So what math libraries tend to do, is to write their own explicitly vectorized paths for each architecture (SSE, AltiVec...) they support.&lt;br /&gt;&lt;br /&gt;This is what &lt;a href=&quot;http://g.gael.free.fr/&quot;&gt;Gael Guennebaud&lt;/a&gt; did a few monthes ago in &lt;a href=&quot;http://websvn.kde.org/branches/work/eigen2&quot;&gt;Eigen2&lt;/a&gt;. We now have &lt;a href=&quot;http://websvn.kde.org/branches/work/eigen2/Eigen/src/Core/DummyPacketMath.h?view=markup&quot;&gt;generic wrappers&lt;/a&gt; for vectorized operations: they abstract the underlying architecture and packet format, and are template in the numeric type. They got specialized by Gael for &lt;a href=&quot;http://websvn.kde.org/branches/work/eigen2/Eigen/src/Core/arch/SSE/PacketMath.h?view=markup&quot;&gt;SSE2 and SSE3&lt;/a&gt; and by &lt;a href=&quot;http://www.freevec.org&quot;&gt;Konstantinos Margaritis&lt;/a&gt; for &lt;a href=&quot;http://websvn.kde.org/branches/work/eigen2/Eigen/src/Core/arch/AltiVec/PacketMath.h?view=markup&quot;&gt;AltiVec&lt;/a&gt;. Gael went on and made many parts of Eigen2 use these when applicable, so the end result is that Eigen can draw a large benefit form vectorization instructions when they are available (SSE or AltiVec), in a way that&apos;s completely transparent to the user, with graceful fallback to non-vectorized paths.&lt;br /&gt;&lt;br /&gt;So we are now getting nice speedups like 4.7x for dot products of large vectors of floats, and 4x for the sum of coefficients of a vector. Gael also wrote a &lt;a href=&quot;http://eigen.tuxfamily.org/wiki/index.php?title=EigenInternals&quot;&gt;super optimized&lt;/a&gt; &lt;a href=&quot;http://websvn.kde.org/branches/work/eigen2/Eigen/src/Core/CacheFriendlyProduct.h?view=markup&quot;&gt;cache-friendly matrix product&lt;/a&gt; also taking full advantage of vectorization (3.5x for large matrices).&lt;br /&gt;&lt;br /&gt;But what if Eigen2&apos;s vectorization could be used for more than just vector/matrix computations? Its expression templates allow it to be used even for very small computations without any overhead, which makes it an ideal candidate for being used as a generic vectorization framework. Calling &apos;Real&apos; the type of the numbers we&apos;re dealing with, one can proceed as follows:&lt;br /&gt;&lt;pre&gt;
&lt;span style=&quot;color: #141312&quot;&gt;  enum { packetSize = Eigen::ei_packet_traits&amp;lt;Real&amp;gt;::size }; // number of reals in a Packet&lt;/span&gt;
&lt;span style=&quot;color: #141312&quot;&gt;  typedef Eigen::Matrix&amp;lt;Real, packetSize, 1&amp;gt; Packet; // wrap a Packet as a vector&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;And one can then use this Packet type to abstract the packets of the vectorization architecture. If there is no vectorization, a Packet will contain just one number.&lt;br /&gt;&lt;br /&gt;So what I did was to start from here and do &lt;a href=&quot;http://websvn.kde.org/branches/work/eigen2/demos/mandelbrot/&quot;&gt;a little demo&lt;/a&gt;: a &lt;a href=&quot;http://en.wikipedia.org/wiki/Mandelbrot_set&quot;&gt;Mandelbrot Set&lt;/a&gt; viewer. It is up to 2.3x faster thanks to vectorization. It switches automatically between single and double precision. Normally that would have required one to write the vectorized paths twice for each architecture, but not so thanks to Eigen2, all that is abstracted.&lt;br /&gt;&lt;br /&gt;If you&apos;re interested in checking it out:&lt;br /&gt;&lt;pre&gt;
svn co svn://anonsvn.kde.org/home/kde/branches/work/eigen2
mkdir eigen2-build
cd eigen2-build
cmake -DTEST_SSE2=ON -DBUILD_DEMOS=ON ../eigen2
make
demos/mandelbrot/mandelbrot
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Some notes... it uses Qt&apos;s great threading framework to use as many threads as necessary to take advantage of your multi-core CPU; nevertheless the code is so small -- about 200 lines of code all in all, of which about 50 lines for the actual rendering -- that I am thinking that it could be a nice little plasma background-painter (or whatever plasma gurus call that!) for the KDE 4.2 timeframe! I for one would like my fractal wallpaper to come to life. Something&apos;s badly needed though: to make the rendering not block the user interaction. If you wish to help with that you&apos;re welcome! Another note: if you&apos;re serious about fractals be sure to check out &lt;a href=&quot;http://fraqtive.mimec.org/&quot;&gt;Fraqtive&lt;/a&gt;! Of course the little toy program I&apos;m presenting here is no match for Fraqtive.&lt;br /&gt;&lt;br /&gt;Mandatory screenshot:&lt;br /&gt;&lt;img src=&quot;http://download.tuxfamily.org/eigen/mandelbrot.png&quot;&gt;</description>
  <comments>http://bjacob.livejournal.com/6600.html</comments>
  <category>eigen vectorization mandelbrot fractal</category>
  <lj:security>public</lj:security>
  <lj:reply-count>14</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/6283.html</guid>
  <pubDate>Fri, 20 Jun 2008 17:14:47 GMT</pubDate>
  <title>benchmarking virtual function calls in c++</title>
  <link>http://bjacob.livejournal.com/6283.html</link>
  <description>This is a followup to my two previous blog entries...&lt;br /&gt;&lt;br /&gt;In order to measure the speed overhead of virtual function calls, I wrote a simple 3-float vector class with a dot-product method. One version is done without virtual functions, all in a single Vector class. The other version uses a pure virtual base class VectorBase implementing the dot product, and the vector coordinates accessors are virtual. Aside from that, there is no difference in the code.&lt;br /&gt;&lt;br /&gt;The benchmark is &lt;a href=&quot;http://math.jussieu.fr/~jacob/virtual/&quot;&gt;here&lt;/a&gt;, and archive is &lt;a href=&quot;http://math.jussieu.fr/~jacob/virtual.tar.gz&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://math.jussieu.fr/~jacob/virtual/README&quot;&gt;results&lt;/a&gt; are impressive: the virtual version runs &lt;b&gt;3x slower&lt;/b&gt; than the no-virtual version.&lt;br /&gt;&lt;br /&gt;Cool, now I&apos;ll have firm numbers to back up my design choices in Eigen :)&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://bjacob.livejournal.com/5800.html?thread=73896#t73896&quot;&gt;Simon&lt;/a&gt;, I hope that answers your request :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;Gael found out that the big speed difference is in fact explained by the fact that the non-virtual function gets inlined. That also explains why more people get the same result with -O3 than with -O2. So that benchmark is not really measuring virtual function calls, instead it&apos;s more measuring the fact that virtual functions are less often inlined (and inlinable at all) than non-virtual functions, which is also a good reason not to use them in certain cases, like in the Eigen library for example where inlining of trivial functions is crucial.</description>
  <comments>http://bjacob.livejournal.com/6283.html</comments>
  <category>c++ virtual</category>
  <lj:security>public</lj:security>
  <lj:reply-count>28</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/6110.html</guid>
  <pubDate>Fri, 20 Jun 2008 08:44:11 GMT</pubDate>
  <title>virtual c++ classes and performance</title>
  <link>http://bjacob.livejournal.com/6110.html</link>
  <description>My &lt;a href=&quot;http://bjacob.livejournal.com/5800.html&quot;&gt;previous blog entry&lt;/a&gt; started a debate on the overhead of virtual classes in c++.&lt;br /&gt;&lt;br /&gt;First of all let&apos;s recall some facts, which I already recalled in my previous blog entry:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In most cases, the overhead of virtual classes in c++ is negligible. In most cases, there is no reason not to use virtual.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There. So if you&apos;re coding a GUI application or even many kinds of libraries, there is nothing to see here, move along and keep using the wonderful c++ feature that is virtual classes.&lt;br /&gt;&lt;br /&gt;Now let&apos;s state the reasons why one might want in certain special cases to avoid &apos;virtual&apos;.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;1.&lt;/b&gt; It increases the &quot;sizeof&quot; of your class by the &quot;sizeof&quot; of a pointer, which is 4 or 8 bytes depending on your arch. In most cases you don&apos;t care. But if your classes have a small &quot;sizeof&quot; and you are going to create whole arrays of objects of it, then it suddenly becomes a big deal. In Eigen, the Vector2f (vector of two floats) has sizeof==8. If it were implemented as a virtual class, its sizeof becomes 12 (on x86 architecture) or even 16 (on x86_64). This means that an application storing large arrays of such vectors could see its memory usage double.&lt;br /&gt;&lt;br /&gt;Note: I am not a c++ expert, so I checked before posting, and the sizeof of virtual classes indeed did increase by the sizeof of a pointer.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;2.&lt;/b&gt; &quot;Virtual inline&quot; makes no sense, so if the compiler decides to inline a virtual function, it has to strip away its virtualness. There are circumstances under which it just can&apos;t allow itself to do that. If you rely heavily on inlining of trivial functions (like Eigen does) and are coding a library or template library (which is the case where inlining a virtual function might be problematic) then just be aware that sometimes the compiler won&apos;t inline your virtual functions.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;3. (Updated several times -- will blog again to clarify)&lt;/b&gt; Even leaving aside inlining considerations, a virtual function call is slower because it requires first a lookup in the class&apos;s vtable; Here is a  &lt;a href=&quot;http://math.jussieu.fr/~jacob/virtual/&quot;&gt;benchmark&lt;/a&gt; for that, &lt;a href=&quot;http://math.jussieu.fr/~jacob/virtual.tar.gz&quot;&gt;here&lt;/a&gt; is an archive; I first believedthat it was showing the virtual version running &lt;b&gt;more than 3x slower&lt;/b&gt; than the non-virtual version, but it turns out to just be that the non-virtual version gets inlined (which supports point 2 above). It seems hard and perhaps pointless to measure the raw cost of virtual calls.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;4.&lt;/b&gt; Virtual function calls are indirect calls to locations computed at runtime. This may or may not cause trouble to the CPU&apos;s branch prediction mechanism. What I heard is that it used to, but modern CPUs don&apos;t have much trouble anymore with that. Anyway, this is very hard to quantify in a simple benchmark; if the issue exists at all on modern CPUs then it will probably show up only in involved examples.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion :&lt;/b&gt; There is absolutely no problem about &quot;virtual&quot; for non-computation-intensive code, like e.g. GUI code. In computation-intensive code, like e.g. in the back-end of an OpenGL application, things may be different.&lt;br /&gt;&lt;br /&gt;That&apos;s all :)</description>
  <comments>http://bjacob.livejournal.com/6110.html</comments>
  <category>c++ virtual</category>
  <lj:security>public</lj:security>
  <lj:reply-count>19</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/5800.html</guid>
  <pubDate>Wed, 18 Jun 2008 22:54:01 GMT</pubDate>
  <title>C++ techniques: part 1: curiously recurring template pattern</title>
  <link>http://bjacob.livejournal.com/5800.html</link>
  <description>I&apos;ve been thinking for a while that I should be blogging about some c++ metaprogramming techniques that I learned while coding &lt;a href=&quot;http://eigen.tuxfamily.org/wiki&quot;&gt;Eigen&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; 1. the curiously recurring template pattern&lt;/li&gt;&lt;br /&gt;&lt;li&gt; 2. &quot;meta&quot; versions of &quot;if&quot;, &quot;==&quot;, and other things&lt;/li&gt;&lt;br /&gt;&lt;li&gt; 3. expression templates &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Of course these techniques have been &quot;known&quot; for a long time, since they were discovered in the 90&apos;s. Some of them are already used in KDE; I saw some use of 1. in KHTML/KJS (&lt;b&gt;edit:&lt;/b&gt; although not used for the same thing as discussed in this post), and 2 is quite commonplace anyway. Perhaps 3 is the least-known one, and the only one in which I&apos;d have anything original to say.&lt;br /&gt;&lt;br /&gt;Today let&apos;s talk about the &lt;b&gt;curiously recurring template pattern&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Executive summary: this technique allows you, in certain cases, to get rid of &quot;virtual&quot; keywords, thus avoiding the overhead of a vtable and indirect function calls (&lt;b&gt;edit:&lt;/b&gt; note that this is only one use of this technique, there are other uses which I don&apos;t discuss).&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;Let&apos;s look at the classical example below, which shows an abstract base class with a method to returning some data determined by the derived class -- something typically implemented using the &quot;virtual&quot; keyword.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 110, 40);&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;&lt;b&gt;class&lt;/b&gt; Animal&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  &lt;b&gt;protected&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; age_in_years;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  &lt;b&gt;public&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    Animal(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; i) : age_in_years(i) {}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    &lt;b&gt;virtual&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; actual_age() &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: rgb(176, 128, 0);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;&lt;b&gt;class&lt;/b&gt; Dog : &lt;b&gt;public&lt;/b&gt; Animal&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  &lt;b&gt;public&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    Dog(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; i) : Animal(i) {}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    &lt;b&gt;virtual&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; actual_age() &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;const&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;color: rgb(136, 135, 134);&quot;&gt;&lt;i&gt;// one year is 7 dog-years&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;      &lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(176, 128, 0);&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; * age_in_years;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; msg(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; Animal&amp;amp; a)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  std::cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color: rgb(191, 3, 3);&quot;&gt;&quot;This animal feels &quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; &amp;lt;&amp;lt; a.actual_age()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;            &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color: rgb(191, 3, 3);&quot;&gt;&quot; years old.&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; &amp;lt;&amp;lt; std::endl;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; main(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;*[])&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  Dog d(&lt;/span&gt;&lt;span style=&quot;color: rgb(176, 128, 0);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  msg(d);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  &lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(176, 128, 0);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The crucial point in the above program is that the msg() function takes an Animal, and the Animal class itself does not know how to compute actual_age(), so the virtual keyword tells the compiler to add complicated machinery (known as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Virtual_table&quot;&gt;vtable&lt;/a&gt;) to class Animal allowing to resolve the actual_age() call depending on the derived class. That machinery has a cost. Most C++ features, including OOP concepts, come at zero cost: that is the beauty of C++, something Stroustrup refers to as the &quot;zero-overhead principle&quot;. This particular feature however (virtual functions), has a cost, so you don&apos;t want to pay it unless it&apos;s negligible. In many settings (like coding a GUI with Qt) this cost is negligible, but in other cases (like the above example) it is not.&lt;br /&gt;&lt;br /&gt;Can you avoid paying that cost? The &quot;virtual&quot; keyword is in fact a very powerful tool, as the call to actual_age() is resolved at run-time. Sometimes you just need that: then there is no way to avoid using &quot;virtual&quot;, and that cost is justified. Some other times however, you don&apos;t need that as the call to actual_age() can be resolved at compile-time.&lt;br /&gt;&lt;br /&gt;Here enters the &lt;b&gt;curiously recurring template pattern&lt;/b&gt;: it consists in using C++ templates to resolve the actual_age() call at compile-time. Here&apos;s how our program can be rewritten using that technique:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 110, 40);&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;&lt;b&gt;template&lt;/b&gt;&amp;lt;&lt;b&gt;typename&lt;/b&gt; Derived&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;&lt;b&gt;class&lt;/b&gt; Animal&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  &lt;b&gt;protected&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; age_in_years;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  &lt;b&gt;public&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    Animal(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; i) : age_in_years(i) {}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; actual_age() &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;const&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;      &lt;b&gt;return&lt;/b&gt; &lt;b&gt;static_cast&lt;/b&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; Derived*&amp;gt;(&lt;b&gt;this&lt;/b&gt;)-&amp;gt;_actual_age();&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;&lt;b&gt;class&lt;/b&gt; Dog : &lt;b&gt;public&lt;/b&gt; Animal&amp;lt;Dog&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    &lt;b&gt;friend&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; Animal&amp;lt;Dog&amp;gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; _actual_age() &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;const&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;color: rgb(136, 135, 134);&quot;&gt;&lt;i&gt;// one year is 7 dog-years&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;      &lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(176, 128, 0);&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; * age_in_years;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  &lt;b&gt;public&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;    Dog(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; i) : Animal&amp;lt;Dog&amp;gt;(i) {}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;&lt;b&gt;template&lt;/b&gt;&amp;lt;&lt;b&gt;typename&lt;/b&gt; Derived&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; msg(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; Animal&amp;lt;Derived&amp;gt;&amp;amp; a)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  std::cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color: rgb(191, 3, 3);&quot;&gt;&quot;This animal feels &quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; &amp;lt;&amp;lt; a.actual_age()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;            &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color: rgb(191, 3, 3);&quot;&gt;&quot; years old.&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; &amp;lt;&amp;lt; std::endl;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt; main(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 87, 174);&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;*[])&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  Dog d(&lt;/span&gt;&lt;span style=&quot;color: rgb(176, 128, 0);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  msg(d);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;  &lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(176, 128, 0);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(20, 19, 18);&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So the fun thing is that we have a circular &quot;inheritance&quot; (&lt;b&gt;edit:&lt;/b&gt; note the quotation marks) diagram,&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Dog ---&amp;gt; Animal&lt;dog&gt;&amp;lt;Dog&amp;gt; ---&amp;gt; Dog&lt;br /&gt;&lt;/dog&gt;&lt;/pre&gt;&lt;br /&gt;and this is in fact perfectly legal c++, has been handled correctly by c++ compilers for a long time, and as I said, is already being used in KHTML/KJS, in Eigen, and probably in many places I never looked at.&lt;br /&gt;&lt;br /&gt;Of course I&apos;m not saying that virtual keywords should be replaced by that technique whenever possible: there are other considerations to balance. For example, this technique, making the base class a template taking the derived class as template parameter, will lead to duplication of the code of any function in the base class for every derived class calling it. So it may or may not be worth it... depending on the particular case it may be a life-saver (like it is in Eigen) or a very bad idea.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update:&lt;/b&gt; as some nitpickers at reddit pointed out, there is a good Wikipedia page on this technique &lt;a href=&quot;http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern&quot;&gt;here&lt;/a&gt;.</description>
  <comments>http://bjacob.livejournal.com/5800.html</comments>
  <category>c++ curious crt crtp</category>
  <lj:security>public</lj:security>
  <lj:reply-count>54</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/5447.html</guid>
  <pubDate>Mon, 09 Jun 2008 16:29:11 GMT</pubDate>
  <title>c++ template libraries and debugging info size</title>
  <link>http://bjacob.livejournal.com/5447.html</link>
  <description>Dear Lazyweb,&lt;br /&gt;&lt;br /&gt;Short version: do you know any way to limit the size of debugging info generated by g++ when compiling code that uses a c++ template library?&lt;br /&gt;&lt;br /&gt;Long version: currently, with simple example programs using Eigen2 (a c++ pure template lib) the code generated by g++ at -g2 debugging level is 10x-30x bigger than the code generated at -g1 level, which itself is up to 1.3x-2x bigger than the code generated at -g0 level (no debugging).&lt;br /&gt;&lt;br /&gt;The problem is that g++ -g2 emits line number and local variable info not only for the application, but also for the template library itself. Which is not really needed.&lt;br /&gt;&lt;br /&gt;What would be cool would be to have g++ suddenly downgrade to -g1 when compiling code from the template library. So ideally, something like a set of #pragmas for controlling debugging levels, would be cool. Unfortunately that doesn&apos;t seem to exist. The closest thing that I have found, is the -femit-struct-debug-detailed option, which allows per-file tuning and in some case halves the executable size. However that still leaves the line number info and part of local variables info.&lt;br /&gt;&lt;br /&gt;An overkill solution at least to the line-number-info problem would be to install preprocessed versions of our template lib&apos;s headers, removing as many linebreaks as possible. Of course that&apos;s not optimal, and that wouldn&apos;t remove the local variables info.&lt;br /&gt;&lt;br /&gt;Any idea?&lt;br /&gt;&lt;br /&gt;P.S. Eigen 2.0 is going to rock extremely hard now that Gael Guennebaud has been hugely contributing for monthes now, and Konstantinos Margaritis lent a helping hand. Some teasers -- explicit SSE2/SSE3/AltiVec vectorization ; compile-time intelligent determination of which temporaries to remove and of which loops to unroll ; the list goes on very very long. Gael is already heavily using Eigen 2 in his own 90,000 SLOC project, and I aim to make sure &lt;a href=&quot;http://avogadro.openmolecules.net&quot;&gt;Avogadro&lt;/a&gt; can port to Eigen 2 in about one month. From KDE&apos;s point of view, this should be 4.2 stuff.</description>
  <comments>http://bjacob.livejournal.com/5447.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/5246.html</guid>
  <pubDate>Wed, 09 Apr 2008 08:16:26 GMT</pubDate>
  <title>Eigen Mascot!</title>
  <link>http://bjacob.livejournal.com/5246.html</link>
  <description>A while ago I &lt;a href=&quot;http://bjacob.livejournal.com/4609.html&quot;&gt;asked&lt;/a&gt; for proposals for &lt;a href=&quot;http://eigen.tuxfamily.org/2/&quot;&gt;Eigen&lt;/a&gt;&apos;s mascot owl. We got excellent proposals from 5 artists and exchanged many e-mails on Eigen&apos;s mailing list. Finally I uploaded the &lt;a href=&quot;http://download.tuxfamily.org/eigen/owls/&quot;&gt;best pics from each artist&lt;/a&gt; and we voted. The vote occurred on the mailing list in order to ensure that mostly people with a true interest in Eigen, and who &lt;a href=&quot;http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2008/03/threads.html&quot;&gt;followed&lt;/a&gt; the &lt;a href=&quot;http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2008/04/threads.html&quot;&gt;discussions&lt;/a&gt;, participate. Other than that it was open to anyone. 9 people voted.&lt;br /&gt;&lt;br /&gt;Note that the drawings below are &apos;only&apos; sketches (!)&lt;br /&gt;&lt;br /&gt;drumroll...dzing! The winner, and personally my favorite, is the &quot;Silly Professor&quot; in the top-right of this pic (Copyright 2008 David Benjamin, licensed under CC-BY-SA):&lt;br /&gt;&lt;img src=&quot;http://download.tuxfamily.org/eigen/owls/David_four_owls.jpg&quot;&gt;&lt;br /&gt;We&apos;ll be sure make use of the &apos;todo&apos; and &apos;bugs&apos; owl sketches. The &apos;engineer&apos; is also very nice for a documentation section on internals.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;very close&lt;/b&gt; second (only 1 voice behind out of 9) is this one (Copyright 2008 &lt;a href=&quot;http://ronnietucker.co.uk&quot;&gt;Ronnie Tucker&lt;/a&gt;):&lt;br /&gt;&lt;img src=&quot;http://download.tuxfamily.org/eigen/owls/Ronnie_professor_1.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Again, you can see &lt;a href=&quot;http://download.tuxfamily.org/eigen/owls/&quot;&gt;here&lt;/a&gt; the other candidates.</description>
  <comments>http://bjacob.livejournal.com/5246.html</comments>
  <category>eigen owl mascot david benjamin ronnie t</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/5086.html</guid>
  <pubDate>Wed, 02 Apr 2008 06:45:43 GMT</pubDate>
  <title>The extinction of standardization dinosaurs on the software planet</title>
  <link>http://bjacob.livejournal.com/5086.html</link>
  <description>According to &lt;a href=&quot;http://www.reuters.com/article/technologyNews/idUSL0179716920080401?sp=true&quot;&gt;this&lt;/a&gt;, the ISO are now calling a &quot;standard&quot; the Microsoft Office format (which is cynically called &quot;Office Open XML&quot;). I won&apos;t elaborate on the reasons why this thing is the opposite of what a standard should be, as this is clear to anybody not influenced by Microsoft.&lt;br /&gt;&lt;br /&gt;What is interesting is that TeX, LaTeX, OGG/Vorbis, OGG/Theora, Perl, Python, PHP, Ruby, OCaml, are &lt;b&gt;not&lt;/b&gt; standardized by any organization. Yet everybody knows that they are &quot;self-standardized&quot; by the free availability of extensive documentation and/or a by free-as-in-freedom unobfuscated reference implementation.&lt;br /&gt;&lt;br /&gt;This shows that standardization organizations are no longer relevant in the software field. What really matters is free full documentation, free full implementation source code, and of course the absence of any patent risk. In other words, coming back to the fundamentals of what a standards is, what matters is evidence that any independent third-party can create and distribute a fully-conforming implementation. When this is the case, nobody needs an organization to certify that it is a standard.&lt;br /&gt;&lt;br /&gt;That the ISO just proved itself open to the influence of special interests, is the consequence, not the cause, of its present irrelevance (again, in the software field). Since it is not needed anymore, nobody knows exactly what its mission is, what role it should play. Which allowed Microsoft to redefine that to its own advantage.&lt;br /&gt;&lt;br /&gt;I think that the best move the ISO could now make is to acknowledge the limits of its own domain of application, which is the traditional industry, and to acknowledge that the software area is no longer such a traditional industry. In other words, ISO (and other standards organizations) should leave the whole software area, where they are not needed anymore.&lt;br /&gt;&lt;br /&gt;Thinking further about this, here is perhaps the deep reason why in the end, software is beyond the field of application of standards organizations. This reason is that software is actually &quot;just&quot; mathematics. That was not obvious in the first decades of the computer industry, but it is becoming a concrete reality. Publishing the source code of a program is the equivalent of publishing the proof of a theorem. This is why the free software movement is changing the rules regarding standardization of software. In mathematics, once the proof of a theorem is published, there is no need for any authority to certify that the theorem is true. Everybody can independently look at the proof and realize that it is. And everybody can use the theorem without consulting its author. Likewise, once a free format specification is published with a free software implementation, there is no need for any authority (i.e. any standards organization) to certify that it can be used independently by any third-party (i.e. that it can be considered a standard). Thus, in the 21st century, a &quot;standard&quot; is just anything that has a full, free software implementation.</description>
  <comments>http://bjacob.livejournal.com/5086.html</comments>
  <category>standards ooxml iso</category>
  <lj:security>public</lj:security>
  <lj:reply-count>22</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/4609.html</guid>
  <pubDate>Sat, 29 Mar 2008 20:42:14 GMT</pubDate>
  <title>Eigen mascot owl:  we need an artist!</title>
  <link>http://bjacob.livejournal.com/4609.html</link>
  <description>Today I&apos;m looking for an artist who would be willing to draw &lt;a href=&quot;http://eigen.tuxfamily.org/2&quot;&gt;Eigen&lt;/a&gt;&apos;s mascot. Eigen is a small but very powerful math library (linear algebra, i.e. matrices/vectors), and now&apos;s a good time for us to get a mascot as we are well on our way to releasing Eigen 2.0 in a few monthes, and are exceedingly proud of it :) Note that Eigen is getting more and more used in KDE (KGLLib, KTankBattle are two recent new users) and that the release of Eigen 2.0 will only accelerate that trend. It&apos;s also getting more and more users outside of KDE, some of whom have started contributing actively which is great.&lt;br /&gt;&lt;br /&gt;The idea for our mascot would be an &lt;b&gt;owl&lt;/b&gt;, and more specifically one &quot;with ears&quot; (i.e. a &quot;duc&quot;). I would like it to marry two aspects: it should be cute/cuddly, and it should still evocate the wisdom that owls are emblematic of (or at least an endearing and desperate attempt to look wise, from a little owl). A good approximation to what I have in mind is Archimedes, Merlin&apos;s pet owl in the Disney movie:&lt;br /&gt;&lt;br&gt;&lt;img src=&quot;http://download.tuxfamily.org/eigen/sword015.jpg&quot;&gt;&lt;br&gt;&lt;br /&gt;(see &lt;a href=&quot;http://enchantedchateau2.tripod.com/sword2.html&quot;&gt;here&lt;/a&gt; for more). However, I would like it to be a bit more chubby/round and younger-looking. I would also like it to less serious. A good idea of the roundedness and of the attitude that I have in mind is found in the tux icons at &lt;a href=&quot;http://tux.crystalxp.net&quot;&gt;TuxFactory&lt;/a&gt;, like this famous one:&lt;br /&gt;&lt;br&gt;&lt;img src=&quot;http://tux.crystalxp.net/png/batux-tux-g1-hd-9667.png&quot;&gt;&lt;br&gt;&lt;br /&gt;However here I don&apos;t want the glassy aspect. I would like it with a lot of feathers and a fluffy aspect. Also note that in the above Tux icon, I like very much the silly eyes. I see very much our owl like that, and the attempt at wisdom could then be represented by a small wing raised like a teacher lecturing... or whatever idea you come up with.&lt;br /&gt;&lt;br /&gt;In any case, if you&apos;d like to contribute the Eigen mascot, please send your proposals to: eigen (at) lists tuxfamily org. It would be much appreciated! After we hopefully get a few proposals, we&apos;ll see which one is the most popular. Do not hesitate to write to us with only a sketch, so you can ensure early that people like what you&apos;re doing.</description>
  <comments>http://bjacob.livejournal.com/4609.html</comments>
  <category>eigen mascot</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/4559.html</guid>
  <pubDate>Tue, 18 Mar 2008 14:12:36 GMT</pubDate>
  <title>Tuxfamily</title>
  <link>http://bjacob.livejournal.com/4559.html</link>
  <description>This blog entry is plainly advertising for a little French nonprofit forge, &lt;a href=&quot;http://tuxfamily.org&quot;&gt;TuxFamily&lt;/a&gt;. Well I hope it&apos;s OK to advertise them since they&apos;re working in their freetime and offer their services without charge. They do not even use ads to make money.&lt;br /&gt;&lt;br /&gt;If you&apos;ve been looking for hosting for your Free Software project, look no further, for this is the best forge that I know:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It itself is entirely &lt;a href=&quot;http://www.vhffs.org/wiki/index.php&quot;&gt;Free Software&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The server is &lt;b&gt;damn fast&lt;/b&gt;. Check how &lt;a href=&quot;http://eigen.tuxfamily.org&quot;&gt;Eigen&apos;s website&lt;/a&gt; loads fast.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It runs PHP4 and PHP5 so you can easily put a wiki online. They even have a &lt;a href=&quot;http://faq.tuxfamily.org/InstallMediawiki/Fr&quot;&gt;tutorial&lt;/a&gt; (French wiki; apparently it&apos;s not yet translated). They also have other features like SQL server, download area for large files (up to a gigabyte or more)...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Not only the web server is fast, but SVN is also the fastest I&apos;ve seen: &quot;svn up&quot; and &quot;svn ci&quot; take only a fraction of a second. They also support CVS... and &lt;a href=&quot;http://en.wikipedia.org/wiki/Git_%28software%29&quot;&gt;Git&lt;/a&gt; !&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Likewise, the mailing lists are the fastest and most reliable I&apos;ve seen. I rely on tuxfamily for Eigen&apos;s mailing lists, and the mail is consistently delivered within a few seconds.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It does not use any ads. No ads on your project website, no ads on their website, no ads in the mailing lists...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The crew is awesome and very low-latency... all my requests have been handled within hours at most, and often within minutes.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That&apos;s what I&apos;ve known for a long time and made me think of Tuxfamily as &apos;great&apos;. But recently something made it move to my &apos;awesome&apos; category. I&apos;m a mathematician and my work consists partly in editing &lt;a href=&quot;http://en.wikipedia.org/wiki/LaTeX&quot;&gt;LaTeX&lt;/a&gt; files with colleagues. I&apos;ve been looking for a forge to host collaborative math projects, i.e. doing math research in the same way as Free Software is done, just replacing C++ by LaTeX. &lt;a href=&quot;http://sourceforge.net&quot;&gt;SourceForge&lt;/a&gt; refused, but Tuxfamily accepted.&lt;br /&gt;&lt;br /&gt;Lastly, Tuxfamily is running a &lt;a href=&quot;http://donation.tuxfamily.org&quot;&gt;donation campaign&lt;/a&gt;. It&apos;s their first one in 5 years of existence, and all the more justified since they don&apos;t use ads.</description>
  <comments>http://bjacob.livejournal.com/4559.html</comments>
  <category>tuxfamily</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/4321.html</guid>
  <pubDate>Mon, 07 Jan 2008 11:05:21 GMT</pubDate>
  <title>Eigen 2.0-alpha2; help wanted!</title>
  <link>http://bjacob.livejournal.com/4321.html</link>
  <description>Now that KDE 4.0.0 is tagged I guess it&apos;s OK to divert developers attention to KDE 4.1 stuff :)&lt;br /&gt;&lt;br /&gt;So I just released &lt;a href=&quot;http://eigen.tuxfamily.org/2&quot;&gt;Eigen 2.0-alpha2&lt;/a&gt;. &lt;a href=&quot;http://download.tuxfamily.org/eigen/eigen-2.0-alpha2.tar.gz&quot;&gt;Source tarball&lt;/a&gt;, &lt;a href=&quot;http://websvn.kde.org/branches/work/eigen2/&quot;&gt;Browse SVN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Besides a ton of improvements over alpha1, the main novelty is that there is now quite complete &lt;a href=&quot;http://eigen.tuxfamily.org/2/annotated.html&quot;&gt;API documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;New features since alpha1 include: ICC compiler support thanks to Gael Guennebaud, full enforcement of constness, support for row-major matrix storage (column-major remains default), and tons of API improvements and new methods.&lt;br /&gt;&lt;br /&gt;Now&apos;s the time where you can really start using Eigen2 in your own project, if the current feature set is enough for you. I&apos;m very happy with the architecture, and benchmarks show that it&apos;s very fast. According to &lt;a href=&quot;http://www.dwheeler.com/sloccount/&quot;&gt;sloccount&lt;/a&gt; there are 2,234 lines of code. Which is very, very little for what it does.&lt;br /&gt;&lt;br /&gt;In fact, there are not so many &lt;a href=&quot;http://ubiety.uwaterloo.ca/~tveldhui/papers/Expression-Templates/exprtmpl.html&quot;&gt;expression-templates&lt;/a&gt;-enabled libraries out there:&lt;br /&gt;- &lt;a href=&quot;http://www.oonumerics.org/blitz/&quot;&gt;Blitz++&lt;/a&gt; is of course great but is not a linear algebra library, so Eigen2 does not compete with it. Blitz++ is a general array library, and focuses on dynamic size while I want fixed size to be treated on an equal footing.&lt;br /&gt;- &lt;a href=&quot;http://tvmet.sourceforge.net/&quot;&gt;TVMET&lt;/a&gt; only does fixed-size, does not allow expressions to be lvalues, etc., while having 5x more lines of code than Eigen2 (granted, it has some functionality not yet present in eigen2 such as applying a function to each coefficient). That said I have a huge respect for TVMET as it is by reading its source code that I learnt expression templates.&lt;br /&gt;- &lt;a href=&quot;http://www.boost.org/libs/numeric/ublas/doc/index.htm&quot;&gt;Boost::uBLAS&lt;/a&gt; does not fully take advantage of expression templates. It treats them as a mere optimization that can be enabled/disabled at compilation. While expression templates are a great optimization, I believe that the most interesting thing about them is what they allow in terms of API design. Operating on the rows of a matrix should be as simple as &lt;pre&gt;matrix.row(i) += factor * matrix.row(j);&lt;/pre&gt;This is what Eigen2 allows. This way one can write C++ code that really looks like pseudocode, and at the same time that&apos;s optimized. This is the real beauty of expression templates, and I regret that Boost::uBLAS doesn&apos;t take advantage of it. Another thing is that, like any BLAS, Boost::uBLAS only provides very basic functionality and one then needs to use another library for more functionality (such as inverting a matrix). By contrast, Eigen aims to be self-contained to cover all the usual needs of applications.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;I just found &lt;a href=&quot;http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Frequently_Asked_Questions_Using_UBLAS&quot;&gt;this&lt;/a&gt;: apparently fixed-size matrices and vectors are slow in uBLAS and for fixed-size they recommend to use TVMET instead! It&apos;s a small world.&lt;br /&gt;&lt;br /&gt;I hope to have convinced you that by contributing to Eigen, you would be contributing to a very exciting project! For this is the motivation of this post: &lt;b&gt;I need help&lt;/b&gt;!&lt;br /&gt;&lt;br /&gt;While the Core module is quite complete, there are at least 6 more modules that we want to have for Eigen 2.0. I don&apos;t have time to write them all! &lt;b&gt;So here is a &lt;a href=&quot;http://techbase.kde.org/index.php?title=Projects/Eigen/TODO&quot;&gt;TODO&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;I would like very much to find volunteers quickly as the KDE 4.1 feature freeze is probably not too far away (though at least 3 monthes away) and if Eigen2 is good enough soon enough, it might be useful for several very exciting things in KDE 4.1, such as &lt;a href=&quot;http://edu.kde.org/step/&quot;&gt;Step&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then, a major user of Eigen2 will quite probably be &lt;a href=&quot;http://koffice.kde.org&quot;&gt;KOffice&lt;/a&gt; 2.1, but this leaves us more time. Interestingly, the most advanced feature that &lt;a href=&quot;http://www.koffice.org/krita/&quot;&gt;KOffice/Krita&lt;/a&gt; requires, namely sparse matrix support, is also what &lt;a href=&quot;http://edu.kde.org/step/&quot;&gt;Step&lt;/a&gt; requires. So, to any potential volunteer: by doing that, you will be a hero to both &lt;a href=&quot;http://koffice.kde.org&quot;&gt;KOffice&lt;/a&gt; and &lt;a href=&quot;http://edu.kde.org&quot;&gt;KDE-Edu&lt;/a&gt;!</description>
  <comments>http://bjacob.livejournal.com/4321.html</comments>
  <category>eigen eigen2 4.1 step krita</category>
  <lj:security>public</lj:security>
  <lj:reply-count>10</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/3934.html</guid>
  <pubDate>Tue, 18 Dec 2007 10:04:48 GMT</pubDate>
  <title>Eigen 2.0-alpha1</title>
  <link>http://bjacob.livejournal.com/3934.html</link>
  <description>Just a quick notice: I&apos;ve released a first alpha of Eigen2; very preliminary website &lt;a href=&quot;http://eigen.tuxfamily.org/2/&quot;&gt;here&lt;/a&gt; (no documentation for now), source tarball &lt;a href=&quot;http://download.tuxfamily.org/eigen/eigen-2.0-alpha1.tar.gz&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It&apos;s very far from being feature-complete. Only the Core module is there, while several others are planned.&lt;br /&gt;&lt;br /&gt;That&apos;s all for now, I don&apos;t want to distract the KDE community too much from the upcoming 4.0 release :)</description>
  <comments>http://bjacob.livejournal.com/3934.html</comments>
  <category>eigen</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bjacob.livejournal.com/3655.html</guid>
  <pubDate>Sat, 20 Oct 2007 15:58:25 GMT</pubDate>
  <title>kde4 perfectly usable</title>
  <link>http://bjacob.livejournal.com/3655.html</link>
  <description>I am now running a full KDE4 session, from a svn checkout from yesterday. That&apos;s 10+ days after the tagging of beta3, and at the current pace of bugfixing, this means a lot of improvements.&lt;br /&gt;&lt;br /&gt;So what&apos;s it like? &lt;a href=&quot;http://download.tuxfamily.org/eigen/snapshot1.png&quot;&gt;Here&apos;s the obligatory screenshot.&lt;/a&gt; You can see Okular annotating a .djvu file (of course it also works with .pdf files) and Marble, which is a bit like Google Earth except that it can be embedded in any KDE4 app, which opens endless possibilities. You can also see the Battery plasmoid, which reacts instantly when you plug/unplug your laptop, and the Pager plasmoid, which works just as in KDE3. KWin defaulted to using OpenGL for compositing, and it works great here. Slamming the mouse to the top-right corner triggers the very useful Present Windows effect.&lt;br /&gt;&lt;br /&gt;For me it&apos;s all perfectly usable, so I&apos;m staying under KDE4 full-time. Not only to help with beta-testing (I already filed &lt;a href=&quot;http://bugs.kde.org/show_bug.cgi?id=151083&quot;&gt;this bug report&lt;/a&gt;), but really because it already is stable and complete enough for me to use as my main desktop. I&apos;m still using some KDE3 apps in my KDE4 session, but that&apos;s not a problem at all -- though of course it would be nice to use only KDE4 apps eventually.&lt;br /&gt;&lt;br /&gt;On another note, Eigen2 development has been very fast recently, but more on this later -- for now the top priority for us all should be to help as we can to get 4.0 in shape, and Eigen2 will only be used in KDE 4.1 and KOffice 2.1. So I try to compensate for my current non-contribution to the 4.0 effort by doing some beta-testing, bug-reporting, and encouraging you all to do so :)</description>
  <comments>http://bjacob.livejournal.com/3655.html</comments>
  <category>kde kde4</category>
  <lj:security>public</lj:security>
  <lj:reply-count>14</lj:reply-count>
</item>
</channel>
</rss>
