Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Numeri primi Multithread?
Forum - C/C++ - Numeri primi Multithread?

Pagine: [ 1 2 3 4 5 6 ] Precedente | Prossimo
Avatar
osharko (Normal User)
Pro


Messaggi: 124
Iscritto: 16/04/2011

Segnala al moderatore
Postato alle 11:43
Martedì, 29/09/2015
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?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:13
Martedì, 29/09/2015


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à.
PM Quote
Avatar
osharko (Normal User)
Pro


Messaggi: 124
Iscritto: 16/04/2011

Segnala al moderatore
Postato alle 13:29
Martedì, 29/09/2015
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.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:33
Martedì, 29/09/2015
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à.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 14:26
Martedì, 29/09/2015
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.

PM Quote
Avatar
osharko (Normal User)
Pro


Messaggi: 124
Iscritto: 16/04/2011

Segnala al moderatore
Postato alle 14:32
Martedì, 29/09/2015
Testo quotato

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 :)

Testo quotato

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.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:58
Martedì, 29/09/2015
Testo quotato

Tranquillo, non mi stavo lamentando.



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

Testo quotato

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 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à.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 16:27
Martedì, 29/09/2015
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
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:03
Martedì, 29/09/2015
Testo quotato

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 ...

Testo quotato

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.

Testo quotato

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.

Testo quotato

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) ....

Testo quotato

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à.
PM Quote
Pagine: [ 1 2 3 4 5 6 ] Precedente | Prossimo