An Introduction to Cache-Oblivious Data Structures
rcoh.me
rcoh.me
https://www.youtube.com/playlist?list=PLUl4u3cNGP61Oq3tWYp6V...
There are two things that make the lectures difficult to follow, IMO:
The first thing is that you need to be comfortable with the names that are given to things, understand well the simpler data structures like different kinds of trees, linked lists, graphs and so on, with their corresponding operation running times. Go watch Algorithms and you'll be fine :)
The second is that the subject is really hard. During the course, most of the time we're learning about (close to) state of the art data structures, so don't expect to understand everything in one go.
If you want to understand it in depth, you'll probably have to more time studying each lecture. Try thinking about how you'd solve the problem, try to understand the proposed solution and go through the video very slowly making sure you understand the details, try to implement at least some of them.
I used these lectures as a way to get comfortable with the field and get a broad overview of the kind of solutions that usually work, so I still have to go through most of Step 2.
The paper that coined the term is here: http://cacs.usc.edu/education/cs653/Frigo-CacheOblivious-FOC...
Basically, there were first cache-aware algorithms that assumed certain cache sizes and other properties. "Cache-oblivious" algorithms were a refinement that worked well for many cache sizes.
All in all it's silly that the "cache-oblivious" term was the one that survived, because now cache-unaware and cache-oblivious algorithms mean the opposite things - contradicting the dictionary definition of oblivious.
"cache sizes oblivious" algorithms.
No matter how you prefix it, 'oblivious' means you are missing something you are expected to be responsible for. It is a word expressing negative sentiment.
There are these classes of algorithms:
1. Cache aware algos are tailored to specific environmental-cache behavior. They may perform poorly in other environments.
2. Cache unaware algos do not consider any cache behavior.
3. Cache oblivious algos take maximum advantage of cache behavior, regardless of what that behavior is.
4. ???? algos, when given cache behavior as input, behave as cache aware algos; are unaware otherwise.
This talk[2] from Herb Sutter(starting at 22:30) is one of my favorite talks and does a great job of explaining why this is so important(and why dense arrays are still king in many areas).
I have been investigating cache-oblivious data structures for a while. They're impressive, complex and a bit difficult to fathom (for a cache-oblivious tree, you have to consider both relational structure created by pointers and the layout of all the pointer in memory - the article seems like it gives a nice overview compared to academic articles I've looked at).
The thing is, in most of the large applications I've tried to optimize, you could squeeze several speed doublings out of fairly easy inner-loop rewrites as soon as you started profiling the app. After that, you got more marginal results from optimizing this and that. Consider; if 25% of the time is spent retrieving data, a halving of time to do this results in a 12.5% increase in performance. Is that 12.5% worth the complexity of implementing a cache oblivious structure? Even if you application is a full database, I'm not sure if the trade-offs are worth it.
Dig up some of posts around "Data oriented design" from the gamedev space if you want to see it done proper.
The thing is a self-balancing binary tree is so much faster than the alternatives for large chunks of data that you really have to use it. Here, I'm not so sure.
Anyway, thinking about this lead me to this discussion about fractal trees and LSM trees.
https://www.quora.com/What-are-the-major-differences-between...
Another question here is how will this play out if the high-performance DB is going to be moving to a GPU where cache levels and scans would be quite different.
A 50% improvement could be massively significant if processing a huge data-set on thousands of nodes and it is still taking days/weeks/more of wall-clock time. Given the choice between waiting longer, buying more computer power, or using a more complex algorithm, the best of those choices will depend a lot on the circumstances of the project. If it is a one-off then waiting or paying for power will likely win out. Of course in some circumstances paying for more power won't help: you can only get so much out of each node and for some processes factors like interconnect throughput & latency might eat into the ROI significantly as the number of nodes grow.
In some cases a 10% or less boost might be worth the extra complexity. And if the algorithm can be generalised and packages as a library, you aren't actually having to deal with that complexity each time the method is useful.
I'm not sure if I really understood how the cache-oblivious solution works though in this case, I can't get an intuition for how the code linked in the github relates to the description in the article.
The rough idea is that we layout the top chunk, then the bottom chunks, and then wire them together
EDIT: Also, are fractal tree indexes roughly like COW b-trees?
https://github.com/Tokutek/ft-index/blob/master/PATENTS
Disclaimer: IANAL. Consult proper legal professionals etc.
Probably open sourcing and including a patent grant signal that the owner is benevolent and isn't likely to sue you for re-implementing their algorithm, but I don't think that's spelled out anywhere.