osharko (Normal User)
Pro
Messaggi: 124
Iscritto: 16/04/2011
|
Salve, sto sviluppando una libreria in cui tengo alcuni algoritmi matematici.
Il primo algoritmo che ho sviluppato è quello per il calcolo dei numeri primi, direi che funziona abbastanza bene visto che in 6s calcola fino al 1000000esimo numero primo su un i7 e in poco più di un ora il primo miliardo di numeri primi.
Quel che non sono riuscito a fare è stato trovare una soluzione per sfruttare i multicore, infatti ora sfrutta solo un core.
Qualcuno sa come potrei fare per sfruttare il multicore?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
osharko (Normal User)
Pro
Messaggi: 124
Iscritto: 16/04/2011
|
mmm stavo usando mingw e non visual per poter creare codice portabile da win a linux..
comunque intendevo come implementarlo dal punto di vista algoritmico, so come farlo col c.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Non hai parlato di mingw né di portabilità e ti ho dato le mie indicazioni ...
Non c'entra l'algoritmo ma è l'implementazione in codice assembly che è importante e ti consiglio di affidarti al compilatore per questa fattispecie.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Se vuoi qualcosa di portabile fra piattaforme ti consiglio di seguire uno standard (es. C++11) e di scegliere compilatori che implementano maggiormente quello standard.
Per quanto riguarda la parte algoritmica.... Puoi usare i thread C++11: fanno parte delllo standard, supportati sia su win che su altri sistemi operativi. Oppure pThread: POSIX thread, per cui c'è un porting della routine su windows.
Poi.... mentre lanci i thread ti consiglio di fare in modo che ogni thread possa cercare i numeri primi fra due numeri dati. Nel programma principale, invece di cercare i numeri primi dovresti gestire i processi lanciati e da lanciare.
|
|
osharko (Normal User)
Pro
Messaggi: 124
Iscritto: 16/04/2011
|
Postato originariamente da nessuno:
Non hai parlato di mingw né di portabilità e ti ho dato le mie indicazioni ...
Non c'entra l'algoritmo ma è l'implementazione in codice assembly che è importante e ti consiglio di affidarti al compilatore per questa fattispecie. |
Tranquillo, non mi stavo lamentando. Specificavo soltanto questa cosa
Postato originariamente da TheDarkJuster:
Se vuoi qualcosa di portabile fra piattaforme ti consiglio di seguire uno standard (es. C++11) e di scegliere compilatori che implementano maggiormente quello standard.
Per quanto riguarda la parte algoritmica.... Puoi usare i thread C++11: fanno parte delllo standard, supportati sia su win che su altri sistemi operativi. Oppure pThread: POSIX thread, per cui c'è un porting della routine su windows.
Poi.... mentre lanci i thread ti consiglio di fare in modo che ogni thread possa cercare i numeri primi fra due numeri dati. Nel programma principale, invece di cercare i numeri primi dovresti gestire i processi lanciati e da lanciare. |
cercherò allora di usare il posix sperando vada bene su windows, visto che ho usato il posix per fare alcuni progetti universitari.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Tranquillo, non mi stavo lamentando. |
Ma io sono tranquillo, chi ha detto che ti stavi lamentando?
Thread e core sono cose diverse ...
Se vuoi usare i thread, non ci sono particolari accorgimenti sull'algoritmo (tranne, ovviamente, fare in modo che ogni thread faccia i calcoli per un insieme di valori non gestiti da altri thread ...).
Se invece vuoi usare i core, fermo restando l'indicazione sulla separazione degli insiemi su cui calcolare, devi anche gestire l' "affinity" per ogni thread (con Windows, tramite la API SetThreadAffinityMask).
Addirittura potresti pensare anche di lanciare un processo per ogni range, su core diversi (con la API SetProcessAffinityMask), implementando un protocollo di comunicazione con il processo principale che raccoglie i risultati. Ultima modifica effettuata da nessuno il 29/09/2015 alle 16:05
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Dovrebbe essere il SO a prendersi la briga di deceidere se parallelizzare i thread su più core o meno, in quando in C il concetto "core" non esiste. La soluzione proposta da nessuno non va bene, perchè quelle sono api di windows e su linux NON sono disponibili. Ti ritroveresti a scrivere una versione del programma per ogni SO.
Inoltre: con pthread_setaffinity_np() fai ciò che vuoi.
Ultima modifica effettuata da TheDarkJuster il 29/09/2015 alle 16:29 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Postato originariamente da TheDarkJuster:
Dovrebbe essere il SO a prendersi la briga di deceidere se parallelizzare i thread su più core o meno |
Ni ... si può fare la richiesta al sistema operativo di allocare thread/processi su core diversi esplicitamente. Il sistema operativo, ovviamente, poi decide in autonomia su cosa fare ...
in quando in C il concetto "core" non esiste. |
Infatti ti ho detto che la faccenda è gestibile da API del sistema operativo, non dal C.
La soluzione proposta da nessuno non va bene, perchè quelle sono api di windows e su linux NON sono disponibili. |
Su Linux userai
sched_setaffinity()
specifica per Linux.
Ti ritroveresti a scrivere una versione del programma per ogni SO |
Quando si parla di queste caratteristiche, si imposta il codice in modo da utilizzare la compilazione condizionale ...
#if defined(WIN32) ....
Inoltre: con pthread_setaffinity_np() fai ciò che vuoi. |
Sai cosa vuol dire np alla fine del nome di questa funzione?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|