2010-08-27 11 views
5

La domanda è come?

Devo andare al livello del kernel per fare questo, o c'è un modo più semplice? Per essere più concreti, cosa serve per implementare un ordinamento dual-core-merge?

+0

LOL, ho letto che come paralisi :-( – SQLMenace

+2

Penso che questa sia una domanda molto reale con alcune risposte eccellenti! – Lazer

risposta

3

A giudicare dalle tue domande precedenti, direi che stai cercando di implementare in C/C++, ma credo che la risposta sia più o meno la stessa indipendentemente dal linguaggio.

Se si desidera parallelizzare qualsiasi operazione, renderla multithread. Puoi avere tanti thread paralleli simultanei come i tuoi core.

Ecco una domanda corrispondenti How to implement divide and conquer algorithms in C# using multithreading?

quanto mi risulta, vincolante un filo particolare ad un core o è chiamato processor affinity. Generalmente non è una buona idea, perché lo scopo del sistema operativo è quello di manipolare i thread tra i processori. È improbabile che tu faccia un lavoro migliore di questo rispetto al sistema operativo.

+0

Per il parallelismo a grana fine, si desidera utilizzare una sorta di pool di thread e non pagare il costo di avvio di nuovi thread per ogni attività parallela –

+0

Ho lavorato un po 'con l'affinità del processore e credetemi, potete sicuramente fare un lavoro migliore del sistema operativo, purché analizziate correttamente il vostro problema, ma lo stesso vale per il threading. – NomadAlien

1

Spero che stiate cercando di assegnare i thread a ciascuno dei core .. Questa è una descrizione dettagliata di cosa può essere fatto e come farlo.

Processor affinity

Spero che questo aiuti.

3

Per implementare un algoritmo che si avvantaggia di più core, prendere in considerazione OpenMP.

Ovviamente, gli algoritmi con forti dipendenze dei dati potrebbero non essere in parallelo.

+0

Prenderò in considerazione pthreads e fork() prima ... – polemon

+0

@polemon: C'è qualche eason per questo considerando che OpenMP è generalmente più semplice da usare (almeno per problemi parallelizzabili facili, ma poiché questo argomento sembra essere orientato verso i principianti, questo (si spera) di cosa stiamo parlando) – Grizzly

+0

OpenMP è più adatto f o parallelismo a grana fine, pthreads per il parallelismo meno fine, forcella per un parallelismo a grana grossa e sistemi distribuiti (cluster) per un parallelismo estremamente grossolano. Questa domanda è abbastanza dettagliata e quindi penso che sarebbe pazzesco usare la forcella per risolverlo. –

0

Dipende dal linguaggio di programmazione che si desidera ottenere. Ad esempio per:

Basta scegliere la lingua e cercare le capacità di elaborazione parallele in quella lingua.

Buona fortuna!

0

Mentre i thread POSIX (pthreads) sono probabilmente una buona idea per iniziare, questo non è esclusivo.

Il multithreading in C non è in realtà banale, quindi consiglierei fork().

avvia una fork di lavoro per ogni CPU con una sottosezione dell'algoritmo del fusore, quindi le riassembla nel fork del gestore.

Quando si lavora verso una soluzione parallela, considero le forcelle prima dei fili, poiché sono più facili da implementare e si ottiene un rapido risultato preliminare. Una volta che funziona, potresti volerci un po 'di tempo e lavorare con i pthread.