Atom N450 |
Architecture: i686
CPU op-mode(s): 32-bit, 64-bit
CPU(s): 2
Thread(s) per core: 2
Core(s) per socket: 1
CPU socket(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 28
Stepping: 10
CPU MHz: 1662.438
L1d cache: 24K
L1i cache: 32K
L2 cache: 512K
P4 640 3.2 GHz |
Incuriosito mi sono chiesto se anche l'HP DC5100 SFF dotato di Pentium 4 Processor 640 with HT Technology 2.8 GHz poteva fare calcolo parallelo
Digitando lscpu e' apparso uno sconfortante
Architecture: i686
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 1
Vendor ID: GenuineIntel
CPU family: 15
Model: 4
Stepping: 9
CPU MHz: 2793.347
BogoMIPS: 5586.69
L1d cache: 16K
L2 cache: 1024K
In un solo core con un solo thread?? Il problema e' stato risolto entrando nel BIOS ed abilitando lo switch dell'Hyperthreading. Una volta riavviata la macchina il risultato e' stato
Architecture: i686
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 2
Core(s) per socket: 1
Socket(s): 1
Per testare l'effettivo utilizzo di HyperThreading ho usato il programma sotto riportato utilizzando OpenMP, una libreria per distribuire il calcolo
Il programma inizializza con il valore del seno un array molto grande, prima senza l'utilizzo di Hyperthreading e poi con
La prima prova, in modalita' standard, deve essere compilato con g++ -Wall -O3 test_no.cpp -o test_no
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
const int size = 100000;
double tabella[size];
for (int n=0; n<size;++n)
{
tabella[n] = sin(2*M_PI*n/size);
}
return 0;
}
---------------------------------------
La seconda, che utilizza invece OpenMP si compila con g++ -Wall -O3 test.cpp -o test -fopenmp
#include <cmath>
#include <omp.h>
#include <iostream>
using namespace std;
int main()
{
const int size = 100000;
double tabella[size];
int id;
int proc0,proc1;
#pragma omp parallel for
for (int n=0; n<size;++n)
{
id = omp_get_thread_num();
tabella[n] = sin(2*M_PI*n/size);
if (id == 1) proc1++;
else
proc0++;
}
cout << "0: "<< proc0 << " | 1: "<<proc1;
return 0;
}
---------------------------------------
come si vede dall'output il carico di lavoro e' stato equamente diviso tra il thread 0 ed il thread 1 che hanno ciascuno effettutao 50000 cicli dei 100000 previsti0: 50000 | 1: 50000
Tempo con utilizzo dei thread
real 0m0.021s
user 0m0.020s
sys 0m0.012s
Tempo senza utilizzo dei thread
user 0m0.000s
sys 0m0.004s
L'altra cosa divertente che ho scoperto e' che il mio Samsung N150 Plus esegue correttamente anche Debian a 64 Bit anche se,l leggendo qua e la', non ci sono particolari motivi di utilizzare 64 bit su una macchina con un solo Gb di Ram
Debian Live 64 Bit su N450 |