Oppure

Loading
29/09/15 9:43
osharko
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?
aaa
29/09/15 11:13
nessuno
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à.
29/09/15 11:29
osharko
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.
aaa
29/09/15 11:33
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.
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à.
29/09/15 12:26
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.
aaa
29/09/15 12:32
osharko
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.
aaa
29/09/15 13:58
nessuno
Tranquillo, non mi stavo lamentando.


Ma io sono tranquillo, chi ha detto che ti stavi lamentando?

thread


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 29/09/15 14: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à.
29/09/15 14:27
TheDarkJuster
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 29/09/15 14:29
aaa