Newsgroup: it.comp.os.linux.development
Titolo: thread e biprocessore

ciao,
ho a disposizione un computer dual xeon (P4 con HT), per poter
sfruttare entrambi i processori ho scritto un piccolo programma in C
che usa i thread.
Eseguito ( compilato con gcc -o out prog.c -lpthread), questo risulta
piu' lento di una sua versione senza thread (time ./a>/dev/null).
Il programma e' il seguente:
#include <stdio.h>
#include<pthread.h>
void *thread_func1(void *arg);
void *thread_func2(void *arg);
int main(void)
{
        int res1,res2,i;
        pthread_t IDthread1;
        pthread_t IDthread2;
        res1=pthread_create(&IDthread1, NULL, thread_func1, NULL);
        res2=pthread_create(&IDthread1, NULL, thread_func1, NULL);
        if (res1 !=0)
        {
                printf("Creazione thread1 fallita!");
                return -1;
        }
        if (res2 !=0)
        {
                printf("Creazione thread2 fallita!");
                return -1;
        }
pthread_join(IDthread1,NULL);
pthread_join(IDthread2,NULL);
}
void *thread_func1(void *arg)
{
        int i;
        for (i=0;i<=200000;i++)
        printf("thread1 %d\n", i);
        pthread_exit(0);
}
void *thread_func2(void *arg)
{
        int i;
        for (i=200000;i<=400000;i++)
        printf("thread2 %d\n", i);
        pthread_exit(0);
}
Potete dirmi dove sbaglio o dove posso trovare degli esempi?
grazie 
federico

 che usa i thread.
Il fatto che il programma crei due thread non implica che essi sfruttino
entrambi i processori.
-- 
Gaetano Sferra

 entrambi i processori.
non solo, considera che hai l'overhead della creazione dei thread. quindi
non è assolutamente detto che per operazioni così elementari si abbia un
vantaggio col multithreading.

 Il programma e' il seguente:
...
Così stressi l'IO a terminale. Fai del number crunching.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Drink To Your Brothers Who Are Never To Fall, We Are Brothers Of Metal
  		Here In The Hall! !>- Manowar - Brothers Of Metal PT1

ok, quindi per programmi semplici e con tempo di calcolo minimo, non
conviene usare i thread.
grazie a tutti per le risposte
federico

 conviene usare i thread.
il problema è che il truo programma non fa conti, ma scrive sul
terminale. e quello introduce un rallentamento mostruoso.

 federico
Ciao a te.
Lo scheduler non ti assicura che i due threads in esecuzione siano inviati a
processori diversi, anzi finchè può li tiene sullo stesso processore. La
stessa cosa fa con i programmi generati con fork(). I motivi sono diversi,
ma soprattutto il fatto è che non c'è nessun beneficio immediato e reale
nell'inviare subito un processo child o un thread ad un altro processore.
Tieni conto ad esempio che le due/tre cache del processore dove gira il
programma padre hanno probabilmente già in memoria i dati che servono anche
al figlio, quindi sul nuovo processore si avrebbe sicuramente una cache
fault che impiega parecchio overhead per essere eliminata.
Devi anche considerare che in un ambiente linux ci sono parecchi programmi
in esecuzione contemporanea . Lo scheduler sposta uno o più processi da una
run-queue di un processore all'altra solo se si verificano sbilanciamenti
sensibili di carico su queste ultime. Per tale compito il kernel usa proprio
una funzione di load-balancing molto sofisticata. Se ti interessa trovi il
codice dello scheduler su /usr/src/linux/kernel/sched.c e
/usr/src/linux/include/linux/sched.h ( ammesso che i sorgenti del kernel
siano in /usr/src/src/linux*).
Potrai avere i diversi threads in esecuzione su più processori quando il
numero di essi diventa alto per il tuo sistema e le risorse della CPU di
origine sono così tanto utilizzate da richiedere un ribilanciamento del
carico. Questa cosa avviene ad esempio nelle macchine server che hanno
parecchi threads di esecuzione dello stesso programma (decine o migliaia) e
quindi il kernel valuta che è meglio caricarsi dell' over-head di
CPU-switching piuttosto che far lavorare le CPU con quantità di carico
sbilanciato.
Spero di essere stato utile.
Buon divertimento,
FabioMDF
 
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Spero di essere stato utile.
Si, grazie per la risposta
ciao
federico