2013-02-25 7 views
10

Sto pensando alla possibilità di insegnare l'uso della memoria transazionale del software attraverso 1 o 2 laboratori guidati per un corso universitario. So solo dell'SM di Haskell, ma probabilmente gli studenti del corso non ne hanno mai sentito parlare.Memoria transazionale software non giocattolo per C o Java

Ho già trovato alcuni elenchi di tali librerie online o in altre domande (ad esempio, http://en.wikipedia.org/wiki/Software_transactional_memory#C.2FC.2B.2B). Li sto verificando mentre leggi questo, ma molti di loro non sembrano avere una documentazione molto bella (la maggior parte sono prototipi di ricerca solo vagamente descritti nei documenti, e preferirei insegnare qualcosa di più usato e ben documentato). Inoltre, molti dei link forniti da wikipedia pendono.

Per riassumere, ci sono implementazioni STM finalizzati a progetti industriali (o almeno quelli non-giocattolo, al fine di garantire un certo livello di qualità) e ben documentato (per dare alcune buone indicazioni per gli studenti)?

EDIT: Io non sono l'insegnante del corso, lo aiuto solo con i laboratori. Naturalmente agli studenti verranno insegnate le basi della concorrenza e degli algoritmi distribuiti prima. Questa era solo un'idea per proporre qualcosa di diverso verso la fine del corso.

+3

Va bene, si prega di commentare su come migliorare la domanda invece di downvoting e proponendo la chiusura. Il punto è abbastanza semplice: ho bisogno di un'implementazione semplice e ben documentata. –

+6

Accetto. Niente di peggio degli anonimi downvoters e closer. – Joe

+0

Non ho votato meno, ma posso solo supporre che il voto basso/vicino fosse perché la domanda suggerisce una mancanza di ricerca. Il primo link restituito da googling "software transactional memory" è una pagina di Wikipedia che si collega alle implementazioni in C, Java e in molti altri linguaggi. – simonc

risposta

5

Le librerie STM di qualità di produzione non sono intese come strumento didattico , nemmeno come "best practice". Ciò che vale la pena di imparare per qualsiasi corso universitario/universitario è forse 1% del codice; il restante 99% è casi angolari intrinsecamente dipendenti dalla piattaforma. L'1% che è interessante non è evidenziato in alcun modo, quindi non hai modo di trovarlo.

Quello che consiglio per un corso universitario/universitario (non importa se introduttivo o avanzato) è quello di implementare blocchi STM da soli (e solo per 1 piattaforma).

Inizia introducendo i problemi di concorrenza: cache ...

Poi introdurre gli aiutanti atomiche che abbiamo: cas/cmpxchg recinzione.

Quindi crea esempi insieme ai tuoi studenti, in primo luogo facile, poi più difficile e più complesso.

+1

Ero alla ricerca di implementazioni di qualità produttiva per avere qualcosa con una vasta community e documentazione, ma non intendevo dare loro un'ampia comprensione di tale framework, solo l'1% per vedere i meccanismi di base di STM in azione. La tua proposta tuttavia è MOLTO meglio della mia idea. Penso che proporrò di andare da questo all'insegnante, e vedere se sta bene dedicando alcuni laboratori per far sì che gli studenti implementino i meccanismi di base della STM. Grazie mille. –

3

Inizia introducendo i problemi di concorrenza: cache ...

leader sul da eznme, alcune buone problemi che ho ricoperto, mentre presso l'Università per concurrency.

  • Dining philosophers problem

    In informatica, il problema dei filosofi a cena è un problema di esempio spesso usato nella progettazione di algoritmi concorrente per illustrare problemi di sincronizzazione e le tecniche per risolverli.

    dining phil

Utilizzando la stessa applicazione da here, da Je Magee e Je Kramer, e risolvere il problema utilizzando i monitor.

La maggior parte delle applicazioni di memoria condivisa sono più efficienti con Integers di Stringhe (a causa della classe AtomicInteger per Java). Quindi il modo migliore per dimostrare shared memory a mio avviso è di indurre gli studenti a scrivere un'applicazione che utilizza uno threadpool per calcolare i numeri primi, o per calcolare alcuni integral.

Oppure un buon esempio di thread e memoria condivisa è lo Producer-consumer problem.

Il problema produttore-consumatore (noto anche come problema del buffer limitato) è un classico esempio di un problema di sincronizzazione multi-processo.

producer http://cse.csusb.edu/tong/courses/cs460/images/producer-consumer.gif

Attuazione trovato here, v'è anche un'implementazione da Massey dal professore in Software Eng Jenz Dietrich.

Per gli algoritmi distribuiti MapReduce e Hadoop sono strutture di dati distribuite altamente documentate. E per le librerie di programmazione distribuite consultare MPI (Message Passing Interface) e OpenMP (o Pragma per C++). Esistono anche implementazioni di Dijkstra shortest path algorithm in parallel.

+0

Grazie, ho modificato la domanda per chiarire il contesto. Il corso riguarda la programmazione e gli algoritmi concomitanti e distribuiti e io non sono l'insegnante. Ci sarà molto background sull'argomento, sia durante le lezioni che nei laboratori. Questo sulle transazioni sarebbe solo un extra: non sto cercando altri esempi di cui parlare, quindi penso che la proposta di eznme potrebbe essere la soluzione migliore. –

+0

@Riccardo ok, va bene. Basta condividere gli esempi che mi sono stati mostrati quando ho imparato la concorrenza e le transazioni atomiche. – Killrawr

+0

@Riccardo Aggiornamento della risposta per collegamenti ad algoritmi/strutture dati e librerie distribuiti. – Killrawr

1

Ci sono tre buoni modi per fare STM oggi.

Il primo modo è utilizzare gcc e fare TM in C o C++. A partire da gcc 4.7, la memoria transazionale è supportata tramite il flag -fgnu-tm. I manutentori di gcc hanno lavorato molto e, a partire dal ramo 4.9 (trunk), è possibile utilizzare anche l'hardware TM (ad es. Intel Haswell TSX). Esiste una bozza di specifica per l'interfaccia della TM allo http://justingottschlich.com/tm-specification-for-c-v-1-1/, che non è troppo doloroso. È inoltre possibile trovare i casi di utilizzo di gcc's TM dalla comunità TM (vedere, ad esempio, i documenti di tracciamento dell'applicazione di Transact 2014: http://transact2014.cse.lehigh.edu).

L'implementazione di per sé è un po 'complessa, ma è quello che serve per essere corretto. C'è molta letteratura sulle cose che possono andare storte, specialmente in un linguaggio non sicuro come C o C++. GCC ottiene tutte queste cose bene. Veramente.

Il secondo modo è utilizzare Java. Puoi usare DeuceSTM, che è molto facile da estendere (la sicurezza del tipo rende l'implementazione della TM molto più semplice!), O usa la libreria Akka di Scala per STM. Preferisco Deuce, perché è più facile da estendere e più facile da usare (basta annotare un metodo come @Atomic, e gli agenti java di Deuce fanno il resto).

Il terzo modo è utilizzare Scala. Non ho fatto molto in questo spazio, ma i ricercatori sembrano amare Akka. Se sei affiliato con una classe parallela/distribuita, potresti addirittura utilizzare già Scala.

Problemi correlati