Výsledky hlasování: ?

Hlasující
92. Nemůžete hlasovat
  • Mam core 2 duo a jsem spokojeny, i pres vynalozene penize

    31 33,70%
  • Mam core 2 duo a jsem spokojeny, ale za ty penize to nestalo

    0 0%
  • Nemam core 2 duo, ale koupim si ho

    30 32,61%
  • Nemam core 2 duo a nechci ho

    31 33,70%
Výsledky 1 až 25 z 959

Téma: Vyznam dual core

Hybrid View

Předcházející příspěvek Předcházející příspěvek   Další příspěvek Další příspěvek
  1. #1

    Standardní Re: Vyznam dual core

    Citace Původně odeslal Eagle Zobrazit příspěvek
    Uff, mám pocit, že jedině Fox!MURDER tady ví, o co kráčí.
    Zas me prilis neprecenuj. S threadama mam zkusenosti jen minimalni (v C a par skriptovacich jazycich - napr. perl) a hru jsem taky zadnou nenapsal. Spis se na to snazim koukat 'selskym rozumem' a vnest do toho trochu vlastni invence.
    Zrovna ted mi vrta hlavou jak by byly realizovatelny ty transakce (hlavne transakcni izolace) na pametovy urovni.


    THX: vis ten problem s tema zamkama je trosku jinej. ono totiz nepotrebujes zamky jen pri zapisu. pokud mas scenar takovej ze mas napr. dva thready, ktery posouvaj bod po obrazovce, muze nastat nasledujici situace
    Kód:
    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.h>
    int a=0;
    int b=0;
    pthread_mutex_t mut_a = PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_t mut_b = PTHREAD_MUTEX_INITIALIZER;
    
    void *f_thread1(void *);
    void *f_thread2(void *);
    int main(void)
    {
         pthread_t thread1, thread2;
         int  iret1, iret2;
         int  i1=1,i2=2;
         iret1 = pthread_create( &thread1, NULL, f_thread1, (void*) i1 );
         iret2 = pthread_create( &thread2, NULL, f_thread2, (void*) i2 ) ;
         pthread_join( thread1, NULL);
         pthread_join( thread2, NULL);
    
         printf("a = %d\n",a);
         printf("b = %d\n",b);
         exit(0);
    }
    
    
    void *f_thread1(void *q){
     int x=0;
     for(x=0;x<65535;x++)
     {
            int temp1, temp2;
            {
    #ifdef WHOLELOCK
                    pthread_mutex_lock(&mut_a);
                    pthread_mutex_lock(&mut_b);
    #endif
                    temp1=a+1;
                    temp2=b+1;
    #ifndef WHOLELOCK
                    pthread_mutex_lock( &mut_b);
    #endif
                    b=temp2;
    #ifndef WHOLELOCK
                    pthread_mutex_unlock(&mut_b);
                    pthread_mutex_lock(&mut_a);
    #endif
                    a=temp1;
    #ifndef WHOLELOCK
                    pthread_mutex_unlock(&mut_a);
    #endif
    #ifdef WHOLELOCK
                    pthread_mutex_unlock(&mut_a);
                    pthread_mutex_unlock(&mut_b);
    #endif
            }
     }
    }
    void *f_thread2(void *q){
     int x=0;
     for(x=0;x<65535;x++)
     {
            int temp1, temp2;
            {
    #ifdef WHOLELOCK
                    pthread_mutex_lock(&mut_a);
                    pthread_mutex_lock(&mut_b);
    #endif
                    temp1=a-1;
                    temp2=b-1;
    #ifndef WHOLELOCK
                    pthread_mutex_lock( &mut_b);
    #endif
                    b=temp2;
    #ifndef WHOLELOCK
                    pthread_mutex_unlock(&mut_b);
                    pthread_mutex_lock(&mut_a);
    #endif
                    a=temp1;
    #ifndef WHOLELOCK
                    pthread_mutex_unlock(&mut_a);
    #endif
    #ifdef WHOLELOCK
                    pthread_mutex_unlock(&mut_a);
                    pthread_mutex_unlock(&mut_b);
    #endif
             }
     }
    }
    Kód:
    livecd ~ # gcc -pthread threadtest.c -DWHOLELOCK -o tt-wholelock
    livecd ~ # gcc -pthread threadtest.c -o tt-nowholelock
    livecd ~ # ./tt-nowholelock
    a = 429
    b = 702
    livecd ~ # ./tt-wholelock
    a = 0
    b = 0
    livecd ~ # ./tt-wholelock
    a = 0
    b = 0
    livecd ~ # ./tt-wholelock
    a = 0
    b = 0
    livecd ~ # ./tt-wholelock
    a = 0
    b = 0
    livecd ~ # ./tt-wholelock
    a = 0
    b = 0
    livecd ~ # ./tt-nowholelock
    a = 181
    b = 73
    livecd ~ # ./tt-nowholelock
    a = 340
    b = -61
    livecd ~ # ./tt-nowholelock
    a = -4862
    b = 333
    livecd ~ # ./tt-nowholelock
    a = 588
    b = 257
    livecd ~ #
    tj. jeden thread posouva ten bod (klidne to muze bejt v pripade 3D treba kvadr, nebo neco jinyho) o 1 doprava a o 1 nahoru, druhej posouva bod o 1 doleva a o 1 dolu. kazdej z nich to udela 65536krat. tj. bod by mel ve vysledku skoncit na miste, kde zacal (pravej dolni roh napr.) jenze, kdyz zamykam jen pri zapisu, ejhle ... ono to skonci na uplne nepredvidanym miste.


    a jeste dodam, ze to samozrejme dosti podobne kravi i na singlecore
    (testuju na C2D E6300 a CeleronuD 325, oboje Gentoo s nptl a gcc 4.1)


    kdyby nekdo mel problem s pochopenim toho C kodu, tak dejte vedet, ja to vysvetlim...

    jooo a vim ze by to asi slo napsat jednodusejs a prehlednejs, ale a) jsem prase, b) nemam cas si s tim tak moc hrat
    Naposledy upravil Fox!MURDER; 04.11.2006 v 14:23.
    Hrrrr, will you stop using people as human driven search engines? Google.com has all the answers you need.

  2. #2
    Terorista karabínový mince Avatar uživatele PiT
    Založen
    13.09.2002
    Bydliště
    Bratislava
    Příspěvky
    4 550
    Vliv
    300

    Standardní Re: Vyznam dual core

    Fox!MURDER:

    Teraz som zvedavy ako by pomohlo to optimalizovanie kompileru, ktore THX navrhoval par stran dozadu
    And down we go again, under the relentless wawes, into the arms of calm breakers, into bayou of forgotten dreams
    Like sand slipping through my fingers, nothing ever lasts, ever will

  3. #3

    Standardní Re: Vyznam dual core

    Citace Původně odeslal PiT Zobrazit příspěvek
    Fox!MURDER:

    Teraz som zvedavy ako by pomohlo to optimalizovanie kompileru, ktore THX navrhoval par stran dozadu
    no, v tomhle ohledu si pockame, s cim intel prijde treba vytahnou neco, ze nam vsem padne celist, treba ne ...
    Hrrrr, will you stop using people as human driven search engines? Google.com has all the answers you need.

  4. #4
    Senior Member
    Založen
    23.06.2003
    Bydliště
    Amstelveen
    Příspěvky
    1 061
    Vliv
    284

    Standardní Re: Vyznam dual core

    pit - ten kompiler ma optimalizovat iba rychlost, teda ma hladat v kode "paralelizovatelne" casti a tie sa snazit pustat naraz - neopravuje chyby v programe

    Fox: vsetky locky/unlocky mas v ifndef, teda ked nedas WHOLELOCK, tak nezamykas vobec - ani pri zapise. Navyse - niekedy zamykas/odomykas znova uz zamknutu/odomknutu vec (snad to nevadi, ale nemalo by sa )
    3570K, 16G, x25-m, itx
    xj40

  5. #5

    Standardní Re: Vyznam dual core

    Citace Původně odeslal THX Zobrazit příspěvek
    pit - ten kompiler ma optimalizovat iba rychlost, teda ma hladat v kode "paralelizovatelne" casti a tie sa snazit pustat naraz - neopravuje chyby v programe

    Fox: vsetky locky/unlocky mas v ifndef, teda ked nedas WHOLELOCK, tak nezamykas vobec - ani pri zapise. Navyse - niekedy zamykas/odomykas znova uz zamknutu/odomknutu vec (snad to nevadi, ale nemalo by sa )
    jsou tam ifdef a ifndef ... zcela spravne a zcela umyslne ...
    Hrrrr, will you stop using people as human driven search engines? Google.com has all the answers you need.

  6. #6
    Senior Member
    Založen
    23.06.2003
    Bydliště
    Amstelveen
    Příspěvky
    1 061
    Vliv
    284

    Standardní Re: Vyznam dual core

    Citace Původně odeslal Fox!MURDER Zobrazit příspěvek
    jsou tam ifdef a ifndef ... zcela spravne a zcela umyslne ...
    ok, to ifdef a ifndef som vsetko pokladal za ifndef

    - problem je iny - citas zamknute data
    3570K, 16G, x25-m, itx
    xj40

  7. #7

    Standardní Re: Vyznam dual core

    Citace Původně odeslal THX Zobrazit příspěvek
    ok, to ifdef a ifndef som vsetko pokladal za ifndef

    - problem je iny - citas zamknute data
    ok. tak sec, opravim to ...

    Kód:
    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.h>
    int a = 0;
    int b = 0;
    pthread_mutex_t mut_a = PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_t mut_b = PTHREAD_MUTEX_INITIALIZER;
    
    void *f_thread1 ();
    void *f_thread2 ();
    int
    main (void)
    {
      pthread_t thread1, thread2;
      int iret1, iret2;
    
      iret1 = pthread_create (&thread1, NULL, f_thread1, NULL);
      iret2 = pthread_create (&thread2, NULL, f_thread2, NULL);
      pthread_join (thread1, NULL);
      pthread_join (thread2, NULL);
    
      printf ("a = %d\n", a);
      printf ("b = %d\n", b);
      exit (0);
    }
    
    
    void *
    f_thread1 ()
    {
      int x = 0;
      for (x = 0; x < 65535; x++)
        {
          int temp1, temp2;
          {
    #ifdef WHOLELOCK
            pthread_mutex_lock (&mut_a);
            pthread_mutex_lock (&mut_b);
    #endif
    #ifndef WHOLELOCK
            pthread_mutex_lock (&mut_a);
    #endif
            temp1 = a + 1;
    #ifndef WHOLELOCK
            pthread_mutex_unlock (&mut_a);
            pthread_mutex_lock (&mut_b);
    #endif
            temp2 = b + 1;
    #ifndef WHOLELOCK
            pthread_mutex_unlock (&mut_b);
            pthread_mutex_lock (&mut_b);
    #endif
            b = temp2;
    #ifndef WHOLELOCK
            pthread_mutex_unlock (&mut_b);
            pthread_mutex_lock (&mut_a);
    #endif
            a = temp1;
    #ifndef WHOLELOCK
            pthread_mutex_unlock (&mut_a);
    #endif
    #ifdef WHOLELOCK
            pthread_mutex_unlock (&mut_a);
            pthread_mutex_unlock (&mut_b);
    #endif
          }
        }
    }
    void *
    f_thread2 ()
    {
      int x = 0;
      for (x = 0; x < 65535; x++)
        {
          int temp1, temp2;
          {
    #ifdef WHOLELOCK
              pthread_mutex_lock (&mut_a);
              pthread_mutex_lock (&mut_b);
    #endif
    #ifndef WHOLELOCK
              pthread_mutex_lock (&mut_a);
    #endif
              temp1 = a - 1;
    #ifndef WHOLELOCK
              pthread_mutex_unlock (&mut_a);
              pthread_mutex_lock (&mut_b);
    #endif
              temp2 = b - 1;
    #ifndef WHOLELOCK
              pthread_mutex_unlock (&mut_b);
              pthread_mutex_lock (&mut_b);
    #endif
              b = temp2;
    #ifndef WHOLELOCK
              pthread_mutex_unlock (&mut_b);
              pthread_mutex_lock (&mut_a);
    #endif
              a = temp1;
    #ifndef WHOLELOCK
              pthread_mutex_unlock (&mut_a);
    #endif
    #ifdef WHOLELOCK
              pthread_mutex_unlock (&mut_a);
              pthread_mutex_unlock (&mut_b);
    #endif
            }
          }
        }
    Kód:
    localhost ~ # gcc -pthread -o tt-nowholelock threadtest.c
    localhost ~ # ./tt-nowholelock
    a = 11691
    b = -538
    sice to neni presne to, co ma implementovany valve, protoze pri cteni zamykam jak pro cteni, tak pro zapis ... ale stejne ...
    Naposledy upravil Fox!MURDER; 04.11.2006 v 15:38.
    Hrrrr, will you stop using people as human driven search engines? Google.com has all the answers you need.

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Podobná témata

  1. dual core notas s grafickou buducnostou
    Založil Lord Skullhead v sekci fóra Nákupní poradna
    Odpovědí: 3
    Poslední příspěvek: 10.04.2006, 17:48
  2. jak je to s tim dual channelem?
    Založil vaga v sekci fóra Intel čipové sady
    Odpovědí: 26
    Poslední příspěvek: 06.08.2005, 18:43
  3. P4 2.8GHz vykonnejsi nez dual opteron 240 na linuxu?
    Založil Petrik v sekci fóra AMD procesory
    Odpovědí: 6
    Poslední příspěvek: 20.09.2004, 07:56
  4. Ma vubec Dual chanel u AMD vyznam?
    Založil Uncle Fucker v sekci fóra NVIDIA čipové sady
    Odpovědí: 25
    Poslední příspěvek: 18.02.2003, 23:02
  5. Jake pameti pro dual channel?
    Založil Evils v sekci fóra Paměti
    Odpovědí: 6
    Poslední příspěvek: 02.02.2003, 01:22

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •