What Blacken's been saying. All of it.
We're talking about getting a single thread of instructions, and splitting it in two (or some other number) such that different instructions are being executed independent of each other.
There are certainly some things DF does that could be parallelized, but the program simply isn't designed to do it. A lot of restructuring of the code would probably be necessary.
Let me put it this way. You have the instructions for doing something. Let's say, baking something.
- Preheat the oven to 350 degrees.
- Grease a pan.
- In a large bowl, beat the eggs.
- In another large bowl, mix the sugar, flour, and baking powder.
- Add the other liquid ingredients to the eggs and mix thoroughly.
- Add the egg mixture to the flour mixture and mix them together.
- Pour this into the pan.
- Stick the pan in the oven for 40 minutes.
Now, if you think about this, you can separate this into different instruction paths that are effectively independent; you can have one person mixing the dry ingredients while another mixes the wet ingredients, while other people set the oven and grease the pan.
You can do this using intuition in real life just fine, but it's actually an extremely complicated process. You need to know which instructions rely on the results from which others, and in which order. For instance, you know not to start mixing the eggs with the milk before you've even cracked them open, or to put the pan in the oven before anything's in it, to start preheating it right before you put the pan in, or to pour the batter in the pan before it's greased, nor can you mix what's in the bowls together before the both of them have what they need individually.
To that end, you can't make a program that just figures it out for you; nothing can look at even the source code of a program and determine what you
meant by it, or what the results
should be, never mind a compiled executable. You know that a cake is supposed to be fluffy and delicious, with a certain taste and consistency. A computer doesn't have that going for it.
Basically, in order to multithread DF, you'd have to look at the source code, figure out which parts can run in parallel with which other parts, and how to interface them so that they interact in a reasonable fashion.
Asking a program to look at the compiled program (or even the source code) and do this for you relies on the same lack of understanding as asking someone "Why won't the computer do what I want?" - the computer never does what you want, only what you tell it to. Even the different parts of DF's code that could be run in parallel currently are not and will interface in ways that no program can magically figure out for you.