venerdì 28 settembre 2012

Intel C Compiler vs GCC in Mandelbrot

Ho provato a verificare la differenza tra Gcc ed il compilatore Intel C++ (icc) per quanto riguarda la velocita' e l'ottimizzazione dei calcoli
Per fare cio' e' stato impiegato il programma per generare l'insieme di Mandelbrot gia' presentato in un precedente post usando gli stessi switch di compilazione all'interno del file make



Makefile
------------------------------------------------------
main: mand_sdl.c
    /opt/intel/bin/icc -Wall -O3 mand_sdl.c -o mand_sdl_icc -lSDL
    gcc -Wall -O3 mand_sdl.c -o mand_sdl_gcc -lSDL

------------------------------------------------------

Il programma e' il seguente
 mand_sdl.c
------------------------------------------------------
 #include "SDL/SDL.h"
#include <stdio.h>

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define SCREEN_DEPTH 8

float re_min = -2.0;
float im_min = -1.2;

float re_max = 1.0;
float im_max = 1.2;
int iterazioni = 255;


float a,b;
float x,y,x_new,y_new;

int test;

int k,j,i;

int keypress = 0;


int main() {

SDL_Surface *screen;
Uint8       *p;

float re_factor = (re_max-re_min);
float im_factor = (im_max-im_min);
   
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_DEPTH, SDL_SWSURFACE);

for (i=0;i<SCREEN_HEIGHT;i++)
    {
    for (j=0;j<SCREEN_WIDTH;j++)
        {
        a = re_min+(j*re_factor/SCREEN_WIDTH);  
        b = im_min+(i*im_factor/SCREEN_HEIGHT);
      
        x = 0;
        y = 0;
        test = 0;
      
        for (k=0;k<iterazioni;k++)
            {
            x_new = (x*x)-(y*y)+a;
            y_new = (2*x*y)+b;
            if (((x_new*x_new)+(y_new*y_new))>4)
                {
                test = k;
                p = (Uint8 *)screen->pixels + i * screen->pitch + j * screen->format->BytesPerPixel;
                *p=(k%255);
                break;
                }
            x = x_new;
            y = y_new;
            }
          
        }

    }
SDL_Flip(screen);

printf("Finito\n\r");

SDL_Quit();

return(0);

}


------------------------------------------------------
Per calcolare il tempo di esecuzione e' stato usato il comando time che misura il tempo tra l'inizio e la fine dell'esecuzione

time  mand_sdl_gcc
time mand_sdl_icc

i risultati sono decisamente schiaccianti. Intel vince in velocita'

Intel
Totale 0.974
User   0.624
Sys    0.024

Gcc
Totale 1.325
User   0.948
Sys    0.020


Link al progetto

giovedì 27 settembre 2012

Gestione file testo in C++

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main()
{
   
ofstream file_testo;

file_testo.open("file_testo.txt",ios_base::out|ios_base::trunc);
file_testo << "Prova 1" << endl;
file_testo << "Prova 2" << endl;
file_testo.close();

ifstream file_testo_input;
string stringa;

file_testo_input.open("file_testo.txt",ios_base::in);
if (file_testo_input.is_open())
   {
   while (file_testo_input.good())
         {
         getline(file_testo_input,stringa);
         cout << stringa << endl;
         }
   }
file_testo_input.close();

return 0;
}

Esempio di Vettori STL C++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector <int> vecInt(10,1); //crea un vettore di 10 posti mettendo 1 in ogni cella


int stampa()
{
int s;

cout << "------------------" << endl;
for (s=0; s < vecInt.size(); ++s) cout << vecInt[s] << endl;
cout << "------------------" << endl;


}
int main()
{
    int t = 0;
   
   
    cout << "Dimesione del vettore " << vecInt.size() << endl;
    stampa();
    // inserisce 10 nuovi valori in coda
    for (t=1;t<=10;t++) vecInt.push_back(t);
    // e mostra la nuova dimensione
    cout << "Dimesione del vettore " << vecInt.size() << endl;
    stampa();
   
    //Modifica del valore di una posizione del vettore
    cout << "Valore alla posizione 15: " << vecInt[15] << endl;
    vecInt[15] = 0;
    cout << "Valore alla posizione 15: " << vecInt[15] << endl;
   
    //rimuove l'ultimo elemento dal vettore
    cout << "Rimuove elemento" << endl;
    vecInt.pop_back();
    // e mostra la nuova dimensione
    cout << "Dimesione del vettore " << vecInt.size() << endl;
    stampa();
   
    cout << "Inserisce elemento all'inizio ed alla fine" << endl;
    vecInt.insert(vecInt.begin(),100);
    vecInt.insert(vecInt.end(),200);
    stampa();
   
    cout << "Mette in ordine gli elementi" << endl;
    sort(vecInt.begin(),vecInt.end());
    stampa();
 
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

mercoledì 26 settembre 2012

Installare i Codec (Mp3) su Debian

Per inserire i codec proprietari in Debian si deve aggiungere al file sources.list

deb http://www.deb-multimedia.org wheezy main non-free
Attenzione : il sito e' sempre debian-multimedia.org che e' diventato deb-multimedia.org (Debian ha richiesto che fosse rimosso il nome perche' non e' coinvolta in un progetto con codec proprietari). Molte guide riportano il vecchio dominio

apt-get update 
apt-get install deb-multimedia-keyring
apt-get install libfaad2  libfaac0 alsamixergui twolame lame libmp3lame0 libdvdnav4 libdvdread4 libdvdcss2 w32codecs ffmpeg

Installazione minima per Wordpress con Lighttpd



Per avere un server su cui far lavorare Wordpress in pochi passi si puo' procedere cosi'

apt-get install mysql-server mysql-client
apt-get install lighttpd
apt-get install php5-cgi php5-curl php5-mysql

si modifica
vi /etc/php5/cgi/php.ini

aggiungendo 

cgi.fix_pathinfo = 1
 
si modifica
vi /etc/lighttpd/lighttpd.conf


aggiungendo php5 fastcgi

server.modules              = (
            "mod_access",
            "mod_alias",
            "mod_accesslog",
            "mod_fastcgi",
#           "mod_rewrite",
#           "mod_redirect",

ed aggiungendo alla fine

fastcgi.server = ( ".php" => ((
                     "bin-path" => "/usr/bin/php5-cgi",
                     "socket" => "/tmp/php.socket"
                 ))) 


infine si riavvia il server per caricare le modifiche

/etc/init.d/lighttpd restart

per la cronaca e' stato scelto lighttpd perche' pesa solo 350 Kb

martedì 25 settembre 2012

Eclipse CDT JUNO : Compilare in C++ con Autotools

Creare delle applicazione in C++ usando Eclipse CDT non e' esattamente banale... come esempio si riporta la compilazione del sorgente del precedente post sul calcolo di Pi Greco
Per prima cosa (ed  e' forse il passo che si sbaglia piu' facilmente) si deve creare un nuovo progetto e selezionando Executable dalla lista di sinistra

Successivamente si clicca destro in Project Explorer sul nome del progetto Properties
Quindi C/C++ Build/Settings e si scende fino a leggere GCC C++ Linker/Libraries


Nella finestra a destra Libraries (-l) si clicca su simbolo + verde e si inserisce la libreria che si vuole linkare (escludendo il -l iniziale) 
 alla fine deve risultare cosi
Per terminare CTRL+B per ricostruire
In alcuni casi, nonostante un Project Clean, non viene risolta la nuova libreria per cui ci saranno degli errori segnalati nel codice..si risolve chiudendo e riaprendo Eclipse
Il programma eseguito

Leggere Rss Feed in modalita' testo con NewsBeuter

Le istruzioni sono riprese da questo sito

Per leggere i Feed Rss con una interfaccia leggera si puo' utilizzare NewsBeuter che si trova gia' pacchettizzato all'interno di Debian

Per iscriversi ad un feed si puo' importare un file opml (newsbeuter -i file.opml) che si genera dall'esportazione di Google Reader (io ho fatto cosi') oppure si puo' creare ed editare il file urls che si deve mettere nella direcotory (./newsbeuter) con il formato di una url per riga di testo

Elenco dei feed in abbonamento

Elenco dei post
creando il file ./newsbeuter/config si possono definire alcuni parametri tra cui il tempo di refresh

#ricarica feed in automatico
auto-reload yes
#ogni m minuti
reload-time 15
#conserva massimo n articoli per feed
max-items 150
#nell'elenco mostra anche i feed letti
show-read-feeds yes
#pulisci la cache quando esci
cleanup-on-quit no

FigSpec FS-60CL

A lavoro mi hanno rifilato questo sensore iperspettrale cinese (pushbroom 400-1000 nm con larghezza di banda di 0.5 nm compatibile con DJI M...