Slashdot Mirror


MIT Randomizes Tasks To Speed Massive Multicore Processors

itwbennett writes Researchers at the Massachusetts Institute of Technology have created a data structure that they claim can help large multicore processors churn through their workloads more effectively. Their trick? Do away with the traditional first-come, first-served work queue and assign tasks more randomly. The SprayList algorithm allows processors with many cores to spread out their work so they don't stumble over one another, creating bottlenecks that hamper performance.

63 comments

  1. I don't know enough about this stuff by Pikoro · · Score: 2

    It always seemed wrong that out of order execution was more efficient than in order. I'll have to read up on it more. You'd think that the results coming in out of order would mess things up.

    --
    "Freedom in the USA is not the ability to do what you want. It is the ability to stop others from doing what THEY want"
    1. Re:I don't know enough about this stuff by Anonymous Coward · · Score: 0

      when the cput hits an instruction that invalidates or makes useless the out of order instructions that were processes in the past it throws out the work that it did in hope of saving time and does it again with the new information. in addition there are race conditions and thread locking issues that can happen with out of order execution if the programmer isnt both imaginative and careful.

    2. Re:I don't know enough about this stuff by drinkypoo · · Score: 1

      It always seemed wrong that out of order execution was more efficient than in order.

      The CPU is otherwise just sitting around waiting for stuff to happen. Sometimes the stuff it was waiting for means that what it did out-of-order has to be thrown away and done again, which means that it used that energy (and thus dissipated that heat) for nothing.

      --
      "You're right," Fisheye says. "I should have set it on 'whip' or 'chop.'"
    3. Re:I don't know enough about this stuff by mwvdlee · · Score: 3, Insightful

      Results don't come in out-of-order. Imagine two variables, A and B, each undergoes a number of calculation steps which don't refer to the other variable. I.e. A=A+5/2*13-29 and B=B*B*3+12/N, then finally adding them together as Z=A+B. Normal execution would first do all the calculations for A then all the calculations for B, then finally Z. Out-of-order execution would calculate both A and B simultaneously, wait for both to finish, then calculate Z. Out-of-order execution involves a lot of this type of waiting, but since it's waiting for just the slowest calculation instead of the sum of both the slowest and fastest calculation it ends up being done sooner. If things cannot be calculated like this, an out-of-order capable processor will simply do things in-order.

      At least that's how I understand it at a very abstract level.

      --
      Slashdot social media options: AIM, ICQ, Yahoo, Jabber and Mobile Text. Why no MySpace?
    4. Re:I don't know enough about this stuff by fey000 · · Score: 3, Informative

      If I'm not mistaken, you are thinking about branch prediction, not out-of-order-executions in an otherwise serial pipe.

      To elaborate, OOE deals with computing as much as possible without having to wait for a result first.
      Branch prediction is a cache separate from the execution tray that attempts to predict the outcome of an if/switch or other branching evaluation and then load the pipelines to the execution tray with the computations following that branching, since the time it takes to evaluate an if/switch can be long, and without a prediction the cpu would have to stall until the evaluation is complete.

    5. Re:I don't know enough about this stuff by Anonymous Coward · · Score: 0

      thats right, thank you for correcting me. I now remember that OOE basically follows the path of execution as far as possible until there is an instruction for a necessary calculation or change that requires the result to be available and then waits for the execution that is a prerequisite for the result to finish before proceeding, with some optimization/prioritization magic baked in

    6. Re:I don't know enough about this stuff by anarcobra · · Score: 2

      What you say is pretty much correct.
      The reason out of order execution is faster, is because in most cases the compiler doesn't know the full pipeline delay of each instruction.
      This helps with making binaries compatible with different processors implementing the same instruction set.
      For instance, the compiler might assume that +, -, *, and / all take the same amount of cycles to calculate, when in reality of course some of those will be faster than others.

      A calculation like A = B*C; B = A+D; C= C+1 could then be reordered to A=B*C C=C+1 B=A+D. (assuming that multiplication takes longer than addition.)
      In this case the B=A+D calculation waits for the A=B*C calculation, but the C=C+1 calculation doesn't have to wait.
      If the compiler was fully aware of pipeline delays of each instruction, then it could have scheduled the instructions like that in the first place.
      But then you code would only run optimally on processors with those exact pipeline delays. It also makes scheduling more complicated.

    7. Re:I don't know enough about this stuff by gnupun · · Score: 3, Interesting

      It always seemed wrong that out of order execution was more efficient than in order.

      Dependency between instructions can temporarily delay execution of some instructions. This can be easily explained with an example:


      1) A = A + 1
      2) B = A + 2
      3) C = D + 3

      Above is pseudo code of 3 instructions being executed by a CPU. While instr #1 is being executed, the CPU will also try to execute instr #2, but since instr #2 needs the current value of register A, the CPU waits until instr #1 is complete and value of A can be used to calculate B. This is why in-order CPUs can be simpler to create, but be slightly slow.

      Out-of-order CPUs work around this problem by deferring instr #2. Instead, the CPU executes instr #3 which has no dependency to instr #1 or #2. Therefore an OOO CPU can execute two instructions in parallel in this case, whereas the in-order CPU may not be able to execute multiple instructions in some cases.

    8. Re:I don't know enough about this stuff by userw014 · · Score: 2

      The article is about scheduling access to thread prioritization lists implemented as linked lists, not scheduling individual instructions. The issue involves multiple CPUs contending for the root (start) of a linked list, which causes cache-invalidation in the CPUs, thereby causing systemic inefficiencies.

      A very dumbed-down description of their solution is to have multiple "root" lists in order to reduce the frequency of cache-contention/invalidation.

    9. Re: I don't know enough about this stuff by Anonymous Coward · · Score: 0

      Branch prediction sounds similar to dreaming....

    10. Re:I don't know enough about this stuff by kernel_user · · Score: 0

      For those who have not studied microprocessor architecture, this is called a "bubble" in the "instruction pipeline". See wikipedia for a short explanation.

  2. Oooh I have an idea by Anonymous Coward · · Score: 5, Funny

    3D print it too, that always helps!

  3. Prevents optimization by Iamthecheese · · Score: 1

    For tasks that need low level code optimization I can't see how this wouldn't hurt processing speed. Maybe it's time to add a tiny brain to each CPU capable of learning, in a primitive way, which execute orders work best?

    --
    If video games influenced behavior the Pac Man generation would be eating pills and running away from their problems.
    1. Re:Prevents optimization by Bengie · · Score: 1

      Now you just need to define what a "task" is. This is normally an OS or framework construct.

  4. It never ceases to amaze me how .... by OneSmartFellow · · Score: 2

    ...many computing algorithms rely upon randomization for efficiency.

    1. Re:It never ceases to amaze me how .... by Anonymous Coward · · Score: 0

      Randomization helps us probe in and out of local minima without having to understand the system as whole. You can save a lot of time if you don't need to look an exact answer.

    2. Re:It never ceases to amaze me how .... by sysrammer · · Score: 1

      Interesting thought. It reminds me of quantum mechanics and probabilities. Perhaps teh Big Bang was just another iteration of rnd(God).

      --
      His ignorance covered the whole earth like a blanket, and there was hardly a hole in it anywhere. - Mark Twain
  5. Avoiding bottlenecks by Zorpheus · · Score: 3, Interesting
    The article says that the SprayList algorithm is faster for many cores than a traditional priority queue, since there are collisions when several cores ask for the top priority task at once.
    Couldn't you just distribute the tasks ahead of time, giving every core a new task before its current task is finished?
    Also, the article syas:

    Random assignment has traditionally been frowned upon by those who think a lot about computer processors, the researchers noted in a paper explaining the work. A random scheduling algorithm takes longer to jump around the queue than a conventional one does. Caches can't be used to store upcoming work items. And if a set of tasks needed to perform one job are executed out of order, then the computer needs additional time to reassemble the final results.

    I would think these problems are the same for the priority queue that they compare performance to. And I guess there are other ways which avoid these problems, which might produce faster results.

    1. Re:Avoiding bottlenecks by Bengie · · Score: 2

      They're not pushing or keeping a back-log of work to be done. Each core only accesses the task list once it's done with its current task, but it grabs a task random from a range of tasks at the beginning of the queue instead of just the first task.

      "Distributing" requires something to push. You don't want to push because you might send a task to an already overloaded core. You could keep track of which core has the least amount of work remaining, assuming that's even possible to know, but then you're back to keeping a central data structure up to date with core information, and you've gained nothing.

      You could break up cores into groups and have groups of cores share a common task pool, then have a central distribution logic monitor those pools. Everything comes with a trade off and random just works very well. Fewer corner cases and typically graceful degradation, compared to catastrophic performance lost due to an unforeseen interaction of task run-time patterns and the pool and the distribution algorithm.

    2. Re:Avoiding bottlenecks by Dixie_Flatline · · Score: 1

      Keeping in mind that I'm NOT a programmer that has spent a lot of time thinking about this...

      But pre-distributing tasks just sounds like a queue becoming many little queues without any particular advantage. Moreover, if you're not sure when a processor is going to be done its work, pre-assigning work may lead to bigger bottlenecks and starvation. If you try to pre-analyse the tasks so you know how much work is needed, you're effectively wasting cycles on a problem that doesn't need to be solved--it's almost pure overhead, since the analysis could be part of the solution.

      I'd have to read the paper to see exactly how they're getting such a huge speedup here. The graph is nice (and I believe it) but the explanation in the article isn't very satisfying.

    3. Re:Avoiding bottlenecks by Kjella · · Score: 1

      But assuming you have a known number of worker threads you could predistribute tasks in a round-robin fashion so that when thread #3 asks for a tasks it gets nextTask[3], off you go and we'll repopulate nextTask lazily once we've got lock on the main queue again, I assume if it's acceptable to pick from a range any one task will finish within an acceptable delay so that next task still gets done in time too. I wouldn't want to put a call to rand() anywhere in there.

      --
      Live today, because you never know what tomorrow brings
    4. Re:Avoiding bottlenecks by Anonymous Coward · · Score: 0

      There's a an issue with "those who think a lot about computer processors"

      They tend to only think in terms of optimal or ideal workloads.

      Thats the thing. When you're talking about general purpose processors you workloads are anything but optimal. Most programs are, frankly, written like shit.

      The best general purpose processor, in practice, is the one that is best at running bad code.

      It's the real reason x86 won over RISC and EPIC(Itanium) - Both of those technologies rely, for high performance, on tightly optimized code or some sort of magic optimizing compiler that we now know is pretty much impossible to write. (Does anyone remember Intel talking about Itanium's compilers and thinking that they were trying really hard not to say that they were trying to write a program for an NP-hard task?)

    5. Re:Avoiding bottlenecks by PolygamousRanchKid+ · · Score: 1

      Yes . . . avoid bottlenecks . . . but do you really know what they are . . . ?

      Is the workload I/O bound? Are multiple processors hanging in spin locks? Can you detect lock contention on your system? How about local cache invalidation on memory addresses, because all the processors want to update the same memory address. Can you split this global address into several local per-processor addresses? Re-align variables so they are not in the same cache line . . . ?

      You really need to know your enemy, if you want to fight him effectively.

      Rule number one about computer performance . . . know your workload!

      --
      Schroedinger's Brexit: The UK is both in and out of the EU at the same time!
    6. Re:Avoiding bottlenecks by Bengie · · Score: 1

      Round Robbin is bad because it can have synchronization issues. What if a task takes hours or day to complete? Pre-populating a task can cause a task to never complete because you assigned a task to the "wrong" core.

    7. Re:Avoiding bottlenecks by Half-pint+HAL · · Score: 2

      But assuming you have a known number of worker threads you could predistribute tasks in a round-robin fashion so that when thread #3 asks for a tasks it gets nextTask[3], off you go and we'll repopulate nextTask lazily once we've got lock on the main queue again, I assume if it's acceptable to pick from a range any one task will finish within an acceptable delay so that next task still gets done in time too. I wouldn't want to put a call to rand() anywhere in there.

      It's not about assigning tasks to threads, though, it's about assigning threads to cores. There is no authority above the core, and so the cores have to manage their own scheduling. If you assign each core an index, then you no longer have a true queue, and if core 1 hangs, the head of the list will just sit there indefinitely as core 2 continues to take task 2, etc. And what about dynamic systems that power down cores. Do you reassign core indexes ever time a core shuts down? Now suddenly you're introducing more intercore coordination.

      The thing to remember is that "random" isn't always "truly random". Think instead of it as "stochastic" in this case. The results are not exactly predictable, but give a predictable distribution of results. That those results include fewer resource clashes is a Very Good Thing.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    8. Re:Avoiding bottlenecks by Half-pint+HAL · · Score: 2

      Rule number one about computer performance . . . know your workload!

      I think of the algorithm in TFA as "Socratic computing performance" -- the only true knowledge about your workload is knowing that you know nothing about your workload. The more the computer has to introspect about individual tasks on the fly, the higher the computational load. Eventually you end up with the cost of optimisation being higher than the cost of the inefficiencies in the scheduling.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
  6. Too Many Cooks in the scheduler by rwa2 · · Score: 1

    RTFA, it was just an elaborate troll to get this surrealist theme song parody stuck in your head:
    https://www.youtube.com/watch?...

    Good for CPUs numbering up into the 80's. Sheesh.

  7. SprayList paper by Anonymous Coward · · Score: 1

    SprayList explained here.

  8. This is a 1980's solution by Anonymous Coward · · Score: 1

    The 68000 had one approach to memory management that was to randomly delete a cell, and repeat. It was more efficient than all the "top-down" solutions of the day. Statisticians compare against a "random" approach when trying to determine if an effect is statistically meaningful. They ask "does the data support that approach x yields more than would be done by chance". It would be nice if computer science of this century could catch up to or surpass the basic statistical ideas developed in the late 1800's.

    1. Re: This is a 1980's solution by Lije+Baley · · Score: 1

      Yep, I had a feeling if deja vu from computer science textbooks fine past when I saw this. First we're applauding the invention of the swamp cooker, and now this great breakthrough!

      --
      Strange things are afoot at the Circle-K.
    2. Re: This is a 1980's solution by Anonymous Coward · · Score: 0

      Dear aunt, are you whispering to Siri or typing with mittens?

    3. Re: This is a 1980's solution by Lije+Baley · · Score: 1

      I love to type in portrait but my thumbs are too fat!

      --
      Strange things are afoot at the Circle-K.
  9. Sounds familiar... by bluegutang · · Score: 1

    Like a hash table?

  10. If random selection is bad... by phizi0n · · Score: 1

    Then why did it still beat SprayList at 32+ cores? The only time SprayList beats the competition is at 16 cores.

    1. Re:If random selection is bad... by Anonymous Coward · · Score: 0

      To quote TFA:

      If it pans out in day-to-day operation, something like SprayList might pave the way for more effective use of new, many-core processors coming our way, such as Intel's new 18-core server chip,the E5 2600v3.

    2. Re:If random selection is bad... by itzly · · Score: 1

      If it pans out in day-to-day operation, something like SprayList might pave the way for more effective use of new, many-core processors coming our way, such as Intel's new 18-core server chip,the E5 2600v3.

      That's silly. SprayList only optimizes the case where the workload can be divided in independent jobs that can be executed out of order. Most real-life problems don't work that way.

    3. Re:If random selection is bad... by wonkey_monkey · · Score: 1

      Most real-life problems don't work that way.

      [Morbo] Goodnight!

      --
      systemd is Roko's Basilisk.
    4. Re:If random selection is bad... by Bengie · · Score: 1

      Spray List optimizes multi-tasking and thread scheduling. The jobs that have to be executing in order are what are being randomly selected.

    5. Re:If random selection is bad... by Half-pint+HAL · · Score: 1

      Then why did it still beat SprayList at 32+ cores? The only time SprayList beats the competition is at 16 cores.

      The graph shows total throughput, but that isn't a perfect measure, because it ignores the delay to high priority tasks. If you used random scheduling on a games console, you would risk rockets freezing in midair, erratic screen refresh rates, sound-effects that were out of sync with the action, server lag, etc etc etc.

      The researchers claim that SprayList is almost as good as non-prioritised scheduling, but that it respects priority enough that the worst side-effects of truly random scheduling are mitigated.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    6. Re:If random selection is bad... by Half-pint+HAL · · Score: 1

      That's silly. SprayList only optimizes the case where the workload can be divided in independent jobs that can be executed out of order. Most real-life problems don't work that way.

      Playing MP3, drawing the desktop, listening for new mail on POP, loading Slashdot, polling the keyboard... there's lots of things that my computer does at one time that are genuinely independent of each other. This is even more true of a multi-user cloud system. But more to the point, it's generally considered bad programming style to parallelise code that is inherently serial. If B relies on A, do A, then do B. Simple. If you need to thread them, then the threads should be self-syncronising, and if B needs data from A, it will give up the processor.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    7. Re:If random selection is bad... by Bengie · · Score: 1

      Given enough throughput, you can statistically reduce your jitter to some low number. The transition could be painful.

    8. Re:If random selection is bad... by Half-pint+HAL · · Score: 1

      Yes, but that would mean using a much more powerful processor. The researchers have basically loaded their dice to roll snake-eyes often enough to win big, but not so often as to get chucked out of the casino.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    9. Re:If random selection is bad... by Bengie · · Score: 2

      We're reaching a point where we have more transistors than we can turn on without melting the chip. You can have a lot of spare cores that are turned off and can be turned back on for the occasion jitter inducing burst of work. The extra cores act as a buffer to absorb unexpected work, while allowing your target core utilization as your average.

      Traffic shapers already have this notion of "real time" traffic, where the packet scheduler can pretty much guarantee that latency sensitive traffic can get scheduled up to 80% of the link speed. Non latency sensitive traffic can use the other 20%, but that 20% cannot be used by real time traffic because it's too close to saturation to guarantee that the packet can get scheduled in time.

    10. Re:If random selection is bad... by Half-pint+HAL · · Score: 1

      Still, if the front of the queue doesn't have priority, you can't guarantee that a given task will ever be performed - you can play roulette 1000 times and still never see the ball land on number 1....

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    11. Re:If random selection is bad... by Anonymous Coward · · Score: 0

      can be divided in independent jobs that can be executed out of order. Most real-life problems don't work that way.

      Non-determinism. Learn it, love it, crash the machine with it, hate it.

  11. Sounds like ethernet by cant_get_a_good_nick · · Score: 1

    if you bump into another packet you back off a random wait time. The other sender will back off, also a random wait time. Less likely to bump again.

    1. Re:Sounds like ethernet by Anonymous Coward · · Score: 0

      So this was the Ethernet on a chip they once were talking about. ;)

    2. Re:Sounds like ethernet by Bengie · · Score: 1

      Collisions with Ethernet are because more than one thing are trying to send at the same time, which means there is too much going on. The issue with blocking and the whole back-off things is the problem they're trying to solve is keeping these cores from having to back-off in the first place. The backing off is making them sit idle for way too long.

  12. IBM patents on multiple run queues by PolygamousRanchKid+ · · Score: 1

    If you want to read up on this stuff, google on "ibm patent multiple run queues" . . . they have done a lot of work in this area.

    --
    Schroedinger's Brexit: The UK is both in and out of the EU at the same time!
  13. Throughput versus Latency ... Again ... by Wrath0fb0b · · Score: 2

    This is old hat in the CS world that gets re-discovered fairly often: you can increase throughput at the cost of ravaging your latency. For some tasks, this is an acceptable tradeoff -- for others (especially anything interactive) it's completely unacceptable. Moreover, any synchronization point in the program converts the worst-case latency of the previous tasks into limits on throughput, e.g. the time it takes to join a set of N threads is equal to the maximum latency of any single thread in the list.

    The best analogy is an elevator (sorry car folks): you can optimize your elevator for throughput by having it always select the closest floor with an active call. The cost, obviously, is that if people are shuffling between floors 1 & 5 a lot, then the poor guy up on 30 might wait a really long time. The throughput is still maximized though, since the elevator can do more operations per unit time by avoiding the long trip to and from floor 30.

    In some cases this is fine, in the vast majority of cases you want to ensure that all tasks complete in a more bounded amount of time, even if that reduces the total number of tasks completed per unit time.

    1. Re:Throughput versus Latency ... Again ... by Bengie · · Score: 1

      I agree, the classic throughput vs latency. In the case of a high throughput 80 core CPU, I assume the trade-off is worth it, but for the quad-core desktop CPU, they might care more about not having their game stuttering.

      They might be able to do a hybrid design where the break up latency sensitive tasks into smaller groups, where each group has a max number of shared cores to reduce contention, and the cores can be close to each other, because physical distance becomes an issue with large many core CPUs. Essentially two different schedulers to monitor.

    2. Re:Throughput versus Latency ... Again ... by Half-pint+HAL · · Score: 1

      The whole point is that they're claiming they can get throughput that is approaching best-case while keeping latency acceptable. It's just a matter of setting the probabilities such that one of the processors is likely to hit the head of the list in an acceptably short timeframe, which getting the probability of two trying to hit the head simultaneously as near to zero as possible.

      As I've pointed out a few times -- this is a stochastic system, not a truly random one.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
  14. Meanwhile, inside AMD daily meeting... by Eloking · · Score: 1

    I guess the headlines of AMD strategic meeting is gonna me something in the like of "MOAR CORESSS!!!!!"

    --
    Elok
  15. State of the art reality check by Anonymous Coward · · Score: 0

    If random works better than their best 'smart' allocation algorithm,
    then getting a bunch of processors to work nicely together
    is going to take a while to sort out.

  16. rnd sort? by pooh666 · · Score: 1

    I have never really 100% understood why it is better for sorting, than say bubble, is there any relation to this approach re core usage?

  17. Is this news? by LostMyBeaver · · Score: 2

    I have been workong directly and indirectly with massive scale computing for decades:

    1) break single threaded tasks into smaller jobs that can be distributed.
    2) test that they still work
    3) establish a chain of dependencies so that tasks which must be performed in order will.
    4) establish pipeline cost and cache coherency cost for each job.
    5) distribute tasks who share common data sets to cores which have the lowest latency between them
    6) take jobs which depend on output of other jobs and offset their start time so the input data from the other job is available befor it is need in the current job decreasing the cost or synchronization.
    8) optimize job distribution so that tasks running in parallel with dependencies will be distributed to cores nearest to one another in the coherency ring.

    This is old school thinking. Randomizing should not offer better performance than properly scheduled tasks.

    1. Re: Is this news? by LostMyBeaver · · Score: 1

      Oh... And 7 is not lucky :)

    2. Re:Is this news? by iggymanz · · Score: 1

      but the typical workload of general purpose system is missing a few of those requirements, kind of like in the movie Sneakers where a character says of organized crime "it ain't that well organized". Our devices get more and more cores each year....

  18. Speaking of prioritizing algorithms by Anonymous Coward · · Score: 1

    When I eat my dinner I leave the good stuff until last; that way I end the meal with a pleasant taste in my mouth.

  19. It never ceases to amaze me how .... by Anonymous Coward · · Score: 0

    Efficiency, certainly. But for every randomized algorithm, there is an unrandomized one which would perform better. Randomization can sometimes lower the upper bound on error in machine learning algorithms, for instance, but this is only because adding noise to the algorithm helps in the case where the environment is smarter than you (and therefore can present to you exactly that data which makes you draw an incorrect conclusion), which is after all the literal worst case and therefore what the 'error upper bound' is about. So, theoretically, if you are developing a machine learning algorithm to play Rock, Paper, Scissors against God, then you may want a source of true quantum random noise, not because 'randomness' or 'chaos' can be used to improve upon some algorithm but because it can act as a poison to a competing smarter algorithm.

    There are also cases where adding a source of noise to an algorithm improves the algorithm because some piece of the algorithm is performing worse than random. For instance, a combination lock opening algorithm which repeatedly tries the combination "0-0-0" is doing worse than random; it would be better if it tried a random combination each time. But the best algorithm would be one which learned from past experience, and didn't try combinations already shown not to work; the randomized algorithm is an improvement on the stupid algorithm, but that doesn't mean you're getting useful information out of it.

    In fact, there are general proofs that one cannot get work out of randomness, for the same reason you cannot turn ice cubes into water and electricity. The laws of thermodynamics are just as sound when we're talking about information-theoretical entropy. Random noise is maximum entropy, the most expensive information to transmit, because truly random noise is necessarily incompressible. This lack of compressibility has consequences. What it comes down to is, if you're trying to write an algorithm to find the shortest path through a maze, then if you think the sum of all of the digits in your phone number, modulo 3, is too disconnected a factoid to have any useful correlation with the maze you're working on, then why would you expect random noise, which is literally maximum uncorrelation to do any better?