Multi-processoren, parallel programmeren, taken en draden (threads and threading)
Voordelen en Nadelen

Dit document gaat hoofdzakelijk over: Meerdere-processoren, parallel programmeren, taken en draden
Daarnaast worden de volgende artikelen in Wikipedia besproken:
  1. Parallel Berekenen
  2. Virtuele Processoren (Hyper-threading)
  3. Gelijktijdige meerdere draden (Simultaneous multithreading)
  4. Meerdere draden (computer architectuur)
  5. Meerdere kernen processoren


Inleiding

Om de begrippen Meerdere-Processoren, draden (threads) en hyper-draden (treading en Hyper-threads) te begrijpen zijn de volgende hardware en software componenten belangrijk:
Harde schijf (disc), Langzaam geheugen, Snel geheugen, Taken, Taak Beheer, Registers en Rekenkundige eenheid.
In een enkelvoudig uitgevoerde PC zijn al deze componenten tenminste eenmalig aanwezig.
In een dubbel uitgevoerde PC (dual PC) zouden al deze onderdelen tenminste tweemaal beschikbaar moeten zijn. Dat wil zeggen ten minste twee Rekenkundige eenheden, maar ook twee Vaste schijven. In een dergelijke PC is de prestatie van een en het zelfde programma precies hetzelfde of je het nu een of twee keer uitvoert, in de veronderstelling dat elk programma gelijktijdig parallel van alle componenten gebruik kan maken. Dit geldt zowel wanneer de toepassing sterk CVE gebonden is, als vergeleken met sterk IO gebonden. Het eerste wil zeggen dat het veel rekenkundig berekeningen vergt en veel gebruik maakt van de rekenkundig eenheid, het tweede wil zeggen dat het programma veel gebruik maakt van de harde schijf.
Dit is niet noodzakelijk het geval wanneer de vaste schijf niet dubbel is geīnstalleerd. De prestaties van de twee CVE gebonden programma's zal niet veranderen als je het programma een maal of twee maal uitvoert. Aan de andere kant de prestatie van twee IO gebonden programma's verminderd. De reden is omdat gedurende het uitvoeren beide programma's van de zelfde bron (de vaste schijf) gebruik willen maken, en dat is niet mogelijk van daar dat de prestatatie van zowel beide verminderd.


Detail

We gaan nu ieder van de componenten meer in detail bestuderen. Dit beschrijft min of meer alle eenheden van een CVE (CPU).


Meerdere Processors, Parallel programmeren en Hyper-draden (Hyper-Threading)

In een enkelvoudige CVE (CPU) is er tenminste sprake van snel geheugen, een set van de alle registers en een Rekenkundige Eenheid. Dit heet ook wel: een pijplijn. De maximum prestatie is 100%. We spreken hier ook van een CVE met een kern (one core CPU). De kern slaat op Rekenkundige Eenheid.
In een dubbel uitgevoerde CVE heb je twee afzonderlijk pijplijnen nodig. We spreken hier ook van een twee kernen CVE omdat er sprake is van twee Rekenkundige Eenheden. De maximum prestatie van iedere pijplijn is 50%. De belangrijkste eis is twee afzonderlijke Programma Registers. Als je over twee aparte Programma Registers beschikt dan kun je in principe twee programma's gelijktijdig uitvoeren om twee verschillende problemen optelossen. Je kunt ook gebruik maken van multiprogrammeren om een probleem optelossen. Multiprogrammeren geeft de mogelijkheid om het ene programma in twee taken (threads) op te splitsen en ieder van die taken (threads) in parallel uit te voeren. Multiprogrammeren vereist synchronisatie binnen de individuele taken (threads) van het programma.
In een viervoudige (Quad) uitgevoerde CVE moet er sprake zijn van vier complete aparte pijnlijnen. We spreken hier ook van een vier kernen CVE omdat er sprake is van vier Rekenkundige eenheden. The maximum prestatie van iedere pijplijn is 25%. Dat wil zeggen je kunt tegelijktijd 4 onafhankelijke programma's hebben om 4 verschillende problemen op te lossen of een programma die dan weer bestaat uit 4 taken of draden(threads) om een probleem op te lossen. Dit laatste vereist multiprogrammeren en synchronisatie.

In een "1 core" / "2 thread" CVE de "2 thread" slaat op Hyper-Draden (Hyper-Threading). Hyper-draden in dit geval betekend dat alleen de registers tweevoudig zijn uitgevoerd, maar niet de Rekenkundige Eenheid. Dit betekent van uit het oogpunt van de gebruiker (besturingssysteem) dat dit een dubbel-processor-systeem is en de eerste indruk is dat een dergelijke configuratie twee keer zo krachtig is. Maar dit is niet noodzakelijk waar, want er is slechts een Rekenkundige Eenheid. Intern is dit een processor met een kern.

In de bovenstaande tekst wordt het woord Hyper-Threading gebruikt met het doel om een CPU architectuur te beschrijven die uit het oogpunt van de gebruiker lijkt op twee processoren dat wil zeggen twee rekenkundig eenheden, maar fysiek is dit niet het geval. Een veel betere naam is Virtuele Processor.

Met een CPU i5, die een 2 Core / 4 Thread architectuur heeft, kun je bij het laden van het programma PlanetS, dat geschreven is in Visual Basic 2010 en dat niet gebruik maken van de BackGroundworker (hyper-threads) direct aflezen dat het aantal threads dat taak-beheer gebruikt 5 is. Dit komt overeen met het aantal Gebeurtenis Handelaars (Event handlers) Dit is het geval voor alle Visual Basic 2010-programma's na het laden en is onafhankelijk van het aantal gebruikte BackGroundworkers. Het aantal processen dat elk programma vertegenwoordigt is 1.
Met dat zelfde CPU als ik het programma PlanetPP plotseling beindig (Ook Visual Basic 2010) met 5 BackGroundworkers actief dan daalt het totale aantal threads met 10.
Dit vertelt me dat een thread (draad) (in het kader van de taak-beheer) veel meer een taak (programma) is en dat het de taak van de taak-beheer is om taken toe te wijzen (of te verwijderen) aan een van de (in het geval van een i5) 4 virtuele processoren. Dat betekent i5 2 Processors en 4 Virtuele Processors heeft.

            Core 1             

 Virt Proc 1       Virt Proc 2 
 ----------        ----------- 
Snel Pr Geh 1     Snel Pr Geh 2
     |                  |      
   P Reg 1           P Reg 2   
     |                  |      
  Ins Reg 1         Ins reg 2  
     |                  |      
      ------------------       
              |                 
    I1 I2 I3  |  O1 O2 O3       
              |                 
    Rekenkundige Eenheid 1        
  Add 1  Sub 1  Mul 1  Div 1    
           Move 1               
            Core 2              

 Virt Proc 3       Virt Proc 4  
 -----------       -----------  
Snel Pr Geh 3     Snel Pr Geh  4
     |                  |       
  P Reg 3            P Reg 4    
     |                  |       
 Ins reg 3          Ins Reg  4  
     |                  |       
      ------------------        
              |                 
    I1 I2 I3  |  O1 O2 O3       
              |                 
    Rekenkundige Eenheid 1        
  Add 2  Sub 2  Mul 2  Div 2    
            Move 2              



   ***********************
   * Gemeenschappelijk   *
   *             geheugen*  
   *   M1  M2   M3  M4   *
   ***********************
              ^           
              |           
              |           
              |           
<-------------            




Figure 1:   2 Core / 4 Thread  CPU
Figure 1 Shows a 2 Core / 4 Thread. Dat wil zeggen: Als we het hebben over een 2 Core / 2 Draden (Threads) CVE, dan zijn er geen virtuele processoren 2 en 4.

Er is een Gemeenschappelijke-Geheugen. Beide Rekenkundige Eenheden hebben direct toegang tot dit geheugen door middel van het Verplaats bewerking (of iets vergelijkbaars) Dor middel van de Verplaats bewerking kan men gegevens lezen en schrijven van Gemeenschappelijk-Geheugen data naar en van hun input en output registers.

In het geval van parallel programmeren reserveert elk programma een klein gedeelte van dit Gemeenschappelijke-Geheugen, geīdentificeerd als M1, M2, M3 of M4, voor gegevens opslag. Een voorbeeld terverduidelijken is om deze gegevens op te vatten als een opdracht. De programma's PlanetPP en FibonacciPP doen dit met behulp van de getallenrij STATE(i). Om het parallel programmeren goed te laten werken met Visual Basic:

  1. Moet je jouw toepassing opdelen in onafhankelijke takken. Elk tak wordt dan geimplementeerd als een Backgroundworker. Elke BackGrounworker werkt als een draad (thread) in een verschillende Virtuele Processor.
  2. Een BackGroundworker is de meester (baas). De anderen BackGroundworkers zijn slaven.
  3. De meester Backgroundworker zet alle opdrachten naar een specifieke waarde en om alle slaven aan te duiden wat ze moeten doen. Ieder slaaf onderzoekt zijn eigen Opdracht om te weten wat te doen met behulp van M2, M3 of M4. Bijvoorbeeld Backgrounworker 2 gebruikt STATE(2).
  4. Ieder slaaf zet zodra men klaar is de opdracht terug naar nul.
  5. De master gebruikt dit als een indicatie dat een iteratie is voltooid en dat de volgende kan beginnen.
Als je deze strategie volgt dan is er geen kans van race condities.


Wikipedia

In Wikipedia the subjects: Multi Processors, Parallel Programming, Threads and Threading are discussed in different documents.

Parallel programming requires:

  1. First that each branch uses it own set of data.
  2. Secondly you need some form of synchronization between the branches.
Please read the following documnent Visual Basic 2010 Parallel Programming to study how parallel programming is implemented using Visual Basic 2010

1. Wikipedia Parallel computing

In the paragragph: Race conditions, mutual exclusion, synchronization, and parallel slowdown
is written:
Threads will often need to update some variable that is shared between them.
Why do you want to do that? One example could be that both are updating the same counter. That means you have two branches and in each branch you want to perform the statement: COUNT = COUNT + 1. The problem is here that you do want to perform both programs simultaneous but one after each other. Next is written:
This is known as a race condition.
The race condition arises because the macro statement COUNT = COUNT + 1 in reality are three micro statements.
Next is written
The programmer must use a lock to provide mutual exclusion. A lock is a programming language construct that allows one thread to take control of a variable and prevent other threads from reading or writing it, until that variable is unlocked.
That maybe true but the text does not explain how this is done. How do you communicate between processors ?
In the next line is explained that program A performs the statement "1A Lock variable V" and program B the statement: "1B Lock variable V"
How do you know that both programs don't try to execute the same statements at the same time ?. You don't know or it is not obvious that this does not happen. Next is written:
One thread will successfully lock variable V (1), while the other thread will be locked out—unable to proceed until V is unlocked again. This guarantees correct execution of the program.(2)
(1) Of course that is what you hope, but this is not that simple. Any sucessfull strategy requires that the two programs are not identical. One strategy is different priorities. A different strategy is a master slave concept which is used in the VB 2010 document.
(2) is correct if (1) is correct, but how do you guarantee (1) ?
IMO the whole concept of locking variables is not very practical and should not be used.
Next is written:
Many parallel programs require that their subtasks act in synchrony. This requires the use of a barrier. Barriers are typically implemented using a software lock. One class of algorithms, known as lock-free and wait-free algorithms, altogether avoids the use of locks and barriers. However, this approach is generally difficult to implement and requires correctly designed data structures.
Synchronisation is a very important issue if you want to use parellel programming in order to solve one application. When you follow the approach outlined in the VB 2010 document you will see that this is not difficult to implement using Visual Basic 2010 and the BackGroundworker

2. Wikipedia Virtuele Processors (Hyper-threading)

In the first paragragh is written:
For each processor core that is physically present, the operating system addresses two virtual processors, and shares the workload between them when possible.
That is correct. In a 1 Core/2 Thread CPU the "2 Threads" mean two virtual processors.
Next is written:
Intel recommends disabling HTT when using operating systems that have not been optimized for this chip feature. [1]
It is interesting that Intel mentions this. I want that. But if I ask to Microsoft how to do that there is no response. See: What is the reason that a pentium 4 3.0 behaves as a 1Core/2Thread

In the paragragh called: 3 Performance
is written:

The advantages of hyper-threading are listed as: (1) improved support for multi-threaded code, (2) allowing multiple threads to run simultaneously, (3) improved reaction and response time.
(1) This is only an advantage if the use of multi-threaded code has an advantage. What exactly is multi-threaded code ?
(2) This is only an advantage if "multiple threads to run simultaneous" have an advantage. That this is allowed is not directly an advantage.
(3) Reaction time is only an issue if your application requires a lot of man machine interaction. Response time has to do with duration and that is most often a function of the clock speed.
Next is written.
Intel claims up to a 30% performance improvement compared with an otherwise identical, non-simultaneous multithreading Pentium 4.
My test do not support this claim: CPU performance P4 2.8 versus P4 3.0 Next:
Tomshardware.com states "In Some Cases a P4 running at 3.0 GHz with HT on can even beat a P4 running at 3.6 GHz without HT turned on".
Same comment. This is maybe only true if the duration of the test is less than 1 minute. Next:
The performance improvement seen is very application-dependent, however when running two programs that require full attention of the processor it can actually seem like one or both of the programs slows down slightly when Hyper Threading Technology is turned on.
I do not call a 50% decrease in performance slightly.

3. Wikipedia Simultaneous multithreading

In the first paragraph is written:
SMT permits multiple independent threads of execution to better utilize the resources provided by modern processor architectures.
That is maybe true, but this is no guarantee for better overall performance, compared with a single core / one thread CPU with the same clock speed.

In the paragraph: 2.5 Disadvantage is written:

Simultaneous multithreading cannot improve performance if any of the shared resources are limiting bottlenecks for the performance. In fact, some applications run slower when simultaneous multithreading is enabled.
This is typical true in a 1C/2T versus a 1C/1T, but the text does not explain that. See also reflection.

4. Wikipedia Multithreading (computer architecture)

This document contains a paragraph: 1.1 Advantages
The question is if those advantages are applicable related to Visual Basic 2010. I doubt this. It should be remembered that you should compare a 1C/2T with a 1C/1T or a 2C/4T with a 2C/2T and explain the advantages strictly based on an increase in Virtual Processors (threads) not on Physical Processors (cores).

In the paragraph: 1.2 Disadvantages is written:

Hardware support for multithreading is more visible to software, thus requiring more changes to both application programs and operating systems than Multiprocessing.
This gives the wrong impression particular because of the comparison with Multiprocessing. Both require in order to solve one physical application parallel programming and synchronization. The claim is only true in the case of a single core.
In the next sentence we read:
Intel claims etc while a program performing a loop of non-optimized dependent floating-point operations actually gains a 100 percent speed improvement when run in parallel.
I doubt that. The question is also here do they compare a 1C/1T with a 1C/2T.
I have done a similar test with the program VStest1. See CPU Performance and CPU Performance Pentium 4. What those tests show on a i5, which is an 2C/4T, that the total performance increase with a factor 2 strictly comes because this is a 2 Core and not because this is a 4 Thread.

5. Wikipedia Multi-core processor

In the paragragh called: 2 Development
is written:
Many applications are better suited to thread level parallelism (TLP) methods,
I doubt if that is true, specific in the sense of Virtual Processors. What is true that certain applications could benefit from multi core processors specific if they do not require parallel programming, that means if they can be divided into two parts which are independent.

In the paragraph: 2.3 Advantage is written:

The largest boost in performance will likely be noticed in improved response-time while running CPU-intensive processes, like antivirus scans, ripping/burning media (requiring file conversion), or file searching.
This is not true. Antivirus scans and file searching are both applications which are highly IO bound. If you excute them in parallel each will heavily influence the performance of the other because they have to wait. The most benefit could come from applications which use the Arithmatic Unit for 100%.

In the paragraph: 2.4 Disadvantage is written:

Also, the ability of multi-core processors to increase application performance depends on the use of multiple threads within applications.
In stead of threads they should have written: independent branches

Overpeinzingen

IMO the general message about the advantage of threading i.e. virtual processors is much too optimistic.
All documents do not make a clear distinction between parallel computing on a CPU which the same number of cores and threads versus an architecture where the number of threads is twice the number of cores. Simpler is to say: a CPU which does not versus which supports the virtual processor concept. For mathematical applications the virtual processor concept is clearly a disadvantage.
Microsoft and Intel together should supply the tools to disable virtual processors. If it is possible to produce the same CPU's without virtual processors but with higher clock speeds than that is even much better.


Als u commentaar wilt geven dan kunt U dat het beste doen via het reactie-formulier: Reactie formulier
Gemaakt op: 22 februari 2011

Terug naar mijn home page inhoud van dit document