Domanda

Il panorama dell'architettura della CPU è cambiato, più core è una tendenza che cambierà il modo in cui dobbiamo sviluppare il software. Ho fatto lo sviluppo multi-thread in C, C ++ e Java, ho fatto lo sviluppo multi-processo usando vari meccanismi IPC. Gli approcci tradizionali all'utilizzo dei thread non sembrano rendere facile, per lo sviluppatore, utilizzare hardware che supporti un elevato grado di concorrenza.

Quali lingue, librerie e tecniche di sviluppo conosci e che aiutano ad alleviare le sfide tradizionali della creazione di applicazioni simultanee? Sto ovviamente pensando a problemi come deadlock e condizioni di gara. Anche le tecniche di progettazione, le librerie, gli strumenti, ecc. Sono interessanti che aiutano effettivamente a trarre vantaggio e ad assicurare che vengano utilizzate le risorse disponibili - solo scrivere un'applicazione thread sicura e robusta non garantisce che stia utilizzando tutti i core disponibili.

Quello che ho visto finora è:

  • Erlang : basato sul processo, messaggio che trasmette IPC, il "modello di concorrenza dell'attore
  • Dramatis : libreria di modelli di attori per Ruby e Python
  • Scala : linguaggio di programmazione funzionale per la JVM con qualche supporto di concorrenza aggiunto
  • Clojure : linguaggio di programmazione funzionale per la JVM con una libreria di attori
  • Termite : una porta dell'approccio di processo di Erlang e il messaggio che passa allo Schema

Cos'altro sai, cosa ha funzionato per te e cosa pensi sia interessante guardare?

È stato utile?

Soluzione

Suggerirei due cambi di paradigma:

Memoria transazionale del software

Potresti dare un'occhiata al concetto di Software Transactional Memory (STM). L'idea è quella di utilizzare concorrenza ottimistica : qualsiasi operazione eseguita in parallelo ad altri tenta di completare il proprio lavoro in una transazione isolata; se a un certo punto è stata commessa un'altra transazione che invalida i dati su cui questa transazione sta funzionando, il lavoro della transazione viene eliminato e la transazione viene eseguita nuovamente.

Penso che la prima implementazione ampiamente nota dell'idea (se non la prova di concetto e la prima) è quella di Haskell: Documenti e presentazioni sulla memoria transazionale in Haskell . Molte altre implementazioni sono elencate in Articolo STM di Wikipedia .

Loop e promesse di eventi

Un altro modo molto diverso di gestire la concorrenza è implementato nel [linguaggio di programmazione E] ( http://en.wikipedia.org/wiki/E_ (programming_language% 29) .

Nota che il suo modo di gestire la concorrenza, così come altre parti del design del linguaggio, è fortemente basato sul modello Actor.

Altri suggerimenti

Hai menzionato Java, ma hai menzionato solo i thread. Hai guardato la libreria simultanea di Java? Viene fornito in bundle con Java 5 e versioni successive.

È una libreria molto carina che contiene ThreadPools, CopyOnWriteCollections per citarne alcuni. Consulta la documentazione nel Tutorial Java . O se preferisci Java docs .

Ho usato elaborazione per Python. Imita l'API del threading ed è quindi abbastanza facile da usare.

Se ti capita di usare map / imap o una comprensione del generatore / elenco, convertire il tuo codice in processing è semplice:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

può essere parallelizzato con

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

che utilizzerà tutti i processori necessari per calcolare i risultati. Esistono anche varianti pigre ( Pool.imap ) e asincrone ( Pool.map_async ).

Esiste una classe di coda che implementa Queue.Queue e i lavoratori simili ai thread.

trucchi

processing si basa su fork () , che deve essere emulato su Windows. Gli oggetti vengono trasferiti tramite pickle / unpickle , quindi devi assicurarti che funzioni. Il fork di un processo che ha già acquisito risorse potrebbe non essere quello che desideri (pensa alle connessioni al database), ma in generale funziona. Funziona così bene che è stato aggiunto a Python 2.6 sulla corsia preferenziale (cfr. PEP -317 ).

Intel Threading Building Blocks per C ++ mi sembra molto interessante. Offre un livello di astrazione molto più elevato rispetto ai fili grezzi. O'Reilly ha un bel libro se ti piace la documentazione sugli alberi morti. Vedi anche Qualche esperienza con i Threading Building Blocks di Intel? .

Direi:

Modelli: thread + stato condiviso, attori + passaggio messaggi, memoria transazionale, mappa / riduzione? Lingue: Erlang, Io, Scala, Clojure, Reia Librerie: Retlang, Jetlang, Kilim, Cilk ++, fork / join, MPI, Kamaelia, Terracotta

Mantengo un blog di collegamento di concorrenza su cose come questa (Erlang, Scala, threading Java, modello di attore, ecc.) e metto un paio di link al giorno:

http://concurrency.tumblr.com

Sto programmando contemporaneamente in Ada da quasi 20 anni.

Il linguaggio stesso (non alcuni tratti dalla libreria) supporta il threading ("operazioni"), più modelli di pianificazione e paradigmi di sincronizzazione multipli. Puoi persino creare i tuoi schemi di sincronizzazione usando le primitive integrate.

Puoi pensare al rendezvous di Ada funzione di sincronizzazione orientata alle procedure, mentre protetto gli oggetti sono più orientati agli oggetti. I rendezvous sono simili al vecchio concetto CS di monitor , ma molto più potenti. Gli oggetti protetti sono tipi speciali con primitive di sincronizzazione che ti consentono di costruire cose esattamente come blocchi del sistema operativo, semafori, eventi, ecc. Tuttavia, è abbastanza potente che puoi anche inventare e creare i tuoi tipi di oggetti di sincronizzazione, a seconda delle tue esatte esigenze .

La domanda What modello di programmazione parallela mi consiglia oggi di trarre vantaggio dai processori manycore di domani? è già stato chiesto. Ho dato la seguente risposta anche lì.

Kamaelia è un framework python per la creazione di applicazioni con molte comunicazioni processi.

  

Kamaelia - La concorrenza resa utile, divertente

     

In Kamaelia costruisci sistemi partendo da componenti semplici che dialogano tra loro . Questo accelera lo sviluppo, aiuta enormemente la manutenzione e significa anche che costruisci software naturalmente concorrente . È destinato ad essere accessibile da qualsiasi sviluppatore, inclusi i principianti. Lo rende anche divertente :)

     

Che tipo di sistemi? Server di rete, client, applicazioni desktop, giochi basati su pygame, sistemi e pipeline di transcodifica, sistemi TV digitali, eliminatori di spam, strumenti di insegnamento e molto altro ancora :)

Ecco un video di Pycon 2009. Inizia confrontando Kamaelia con Twisted e Parallel Python e poi dà una mano sulla dimostrazione di Kamaelia.

Facile concorrenza con Kamaelia - Parte 1 (59:08)
Facile concorrenza con Kamaelia - Parte 2 (18:15)

Conosco Reia - una lingua che si basa su Erlang ma sembra più come Python / Ruby.

OpenMP .

Gestisce i thread per te, quindi ti preoccupi solo di quali parti dell'applicazione C ++ vuoi eseguire in parallelo.

ad es.

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

il codice sopra eseguirà il ciclo for su tutti i thread che hai detto al runtime openmp da usare, quindi se SIZE è 100 e hai una scatola quad-core, che per loop eseguirà 25 elementi su ciascuno nucleo.

Ci sono alcune altre estensioni parallele per varie lingue, ma quelle che mi interessano di più sono quelle che girano sulla tua scheda grafica. Questa è una vera elaborazione parallela :) (esempi: GPU ++ e libSh )

C ++ 0x fornirà le funzioni std :: lock per bloccare insieme più di un mutex. Ciò contribuirà ad alleviare il deadlock a causa del blocco fuori servizio. Inoltre, la libreria thread C ++ 0x avrà promesse, future e attività impacchettate, che consentono a un thread di attendere il risultato di un'operazione eseguita su un altro thread senza blocchi a livello di utente.

multiprocessing è una libreria Python che semplifica la programmazione multi-core, come menzionato in un'altra risposta.

Il programma scritto con multiprocessing di python può essere facilmente modificato per spedire lavoro sul cloud, invece che su core locali. piCloud ne approfitta per fornire una grande potenza di elaborazione su richiesta sul cloud: è sufficiente modificare 2 righe del tuo codice.

Quindi, ecco il take-away: quando si seleziona una libreria per multi-core, si potrebbe voler chiedere se anche un approccio cloud avrebbe senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top