Dreamwolf_81
30-12-2011, 16:09
Salve a tutti, pongo la seguente questione, disponendo dei seguenti compilatori:
- MinGW e MinGW-w64, ultima versione disponibile su sourceforge
- Visual C++ 2010 SP1
- .NET Framework 4.0 su Visual Studio 2010 SP1
- Mono ultima versione (2.10.8)
del seguente Hardware:
CPU Core i7 (4 core fisici, 8 logici)
8GB Ram
Windows 7 x64
e del seguente codice "C":
----------------------------------------------------------
#include <omp.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int ii;
#pragma omp parallel for
for(ii = 0; ii<100000; ii++)
printf("%d\n", ii);
return 0;
}
----------------------------------------------------------
e del seguente codice C#:
----------------------------------------------------------
using System;
using System.Threading.Tasks;
static void Main()
{
Parallel.For(0, 100000, ii =>
{
Console.WriteLine(ii.ToString());
});
}
----------------------------------------------------------
I codici sono praticamente identici, compilati ottimizzando al massimo il codice per velocità e abilitando naturalmente l'opzione OpenMP (in C, visto che in C# provvede il compilatore automaticamente) compilati tutti sia a 32 che 64 bit e stampano semplicemente tutti i numeri da 0 a 100000 usando la parallelizzazione. Bene, quindi vado per curiosità a vedere come si comportano sui vari compilatori (e naturalmente sullo stesso sistema operativo operante sullo stesso hardware) e ottengo risultati assolutamente poco chiari...
Tralasciando quale sia il codice compilato più o meno veloce ottengo ciò:
- Visual C++ 2010 SP1 (x86/x64) -> Occupazione al 100% di tutti e 8 i Core, ottime prestazioni;
- MinGW (x86/x64) -> Occupazione di soli 4 Core fra il 25% e il 45%, prestazioni decisamente più scarse;
- .NET Framework 4 (x86/x64) -> Identico alla controparte C++ (tutti i core occupati e prestazioni addirittura lievemente superiori)
- Mono (x86/x64) -> Come la controparte MinGW, ma addirittura molto più lento con 4 core occupati al massimo al 20%;
Ora quello che mi chiedo io, al di là di quale compilatore sia meglio ecc... ma la piattaforma OpenMP non dovrebbe consentire di sfruttare al massimo tutti i core (100%) indipendentemente dal compilatore utilizzato? Perchè con i compilatori Microsoft ho sempre tutti i core attivi mente con gli altri compilatori me ne occupano 4 e comunque non sfruttandoli mai al 100%???
Attendo illuminazioni...Grazie! :)
- MinGW e MinGW-w64, ultima versione disponibile su sourceforge
- Visual C++ 2010 SP1
- .NET Framework 4.0 su Visual Studio 2010 SP1
- Mono ultima versione (2.10.8)
del seguente Hardware:
CPU Core i7 (4 core fisici, 8 logici)
8GB Ram
Windows 7 x64
e del seguente codice "C":
----------------------------------------------------------
#include <omp.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int ii;
#pragma omp parallel for
for(ii = 0; ii<100000; ii++)
printf("%d\n", ii);
return 0;
}
----------------------------------------------------------
e del seguente codice C#:
----------------------------------------------------------
using System;
using System.Threading.Tasks;
static void Main()
{
Parallel.For(0, 100000, ii =>
{
Console.WriteLine(ii.ToString());
});
}
----------------------------------------------------------
I codici sono praticamente identici, compilati ottimizzando al massimo il codice per velocità e abilitando naturalmente l'opzione OpenMP (in C, visto che in C# provvede il compilatore automaticamente) compilati tutti sia a 32 che 64 bit e stampano semplicemente tutti i numeri da 0 a 100000 usando la parallelizzazione. Bene, quindi vado per curiosità a vedere come si comportano sui vari compilatori (e naturalmente sullo stesso sistema operativo operante sullo stesso hardware) e ottengo risultati assolutamente poco chiari...
Tralasciando quale sia il codice compilato più o meno veloce ottengo ciò:
- Visual C++ 2010 SP1 (x86/x64) -> Occupazione al 100% di tutti e 8 i Core, ottime prestazioni;
- MinGW (x86/x64) -> Occupazione di soli 4 Core fra il 25% e il 45%, prestazioni decisamente più scarse;
- .NET Framework 4 (x86/x64) -> Identico alla controparte C++ (tutti i core occupati e prestazioni addirittura lievemente superiori)
- Mono (x86/x64) -> Come la controparte MinGW, ma addirittura molto più lento con 4 core occupati al massimo al 20%;
Ora quello che mi chiedo io, al di là di quale compilatore sia meglio ecc... ma la piattaforma OpenMP non dovrebbe consentire di sfruttare al massimo tutti i core (100%) indipendentemente dal compilatore utilizzato? Perchè con i compilatori Microsoft ho sempre tutti i core attivi mente con gli altri compilatori me ne occupano 4 e comunque non sfruttandoli mai al 100%???
Attendo illuminazioni...Grazie! :)