2009-10-16 13 views

risposta

5

Cercare un efficiente sorting network per N = il numero di byte che interessa (4 o 16). Convertilo in una sequenza di istruzioni di confronto e scambio. (Per N = 16 che sarà più di "pochi", però.)

+0

Grazie. Sto cercando una soluzione efficiente. Oh, per favore nota che ho detto un "poche istruzioni" e non un "pochi cicli";) – alecco

+0

Ah, vedo che il documento a cui ti sei collegato prende solo questo approccio, usando le istruzioni SSE2. Freddo. –

+0

Sì, non volevo essere troppo prolisso, dato che speravo in una sorta di magia di hackeraggio con asm. In effetti, stavo cercando questa lettura "Implementazione efficiente dell'ordinamento su architettura CPU SIMD multi-core" (Chhugani, .. 2008), ma mi sono frustrato con le istruzioni dell'algoritmo: 1) a) Eseguire In-Register Sort to ottenere sequenze ordinate di lunghezza K. Immagino che per i ricercatori di Intel sia una procedura "duh", ma non per me! (Non sono ancora sicuro che facciano l'intera procedura di istruzione 17-19 per ordinare un registro.) [Nota: mi dispiace, non ho votato per mancanza di karma] – alecco

1

Tutti gli algoritmi di ordinamento richiedono valori di "scambio" da un luogo a un altro. Dato che stai parlando di un registro di CPU letterale, significa che qualsiasi tipo necessiterà di un altro registro da utilizzare come luogo temporaneo per contenere i byte scambiati.

Non ho mai visto un chip con un metodo incorporato per l'ordinamento dei byte all'interno di un registro. Non dire che non è stato fatto, ma non riesco a pensare a molti usi per una tale istruzione.

+0

Intendevo come ordinare i byte in un registro, ovviamente è necessario utilizzare almeno un altro registro. Scusa per il fraintendimento. – alecco

+0

In realtà c'è un modo per ordinare in-register usando CMPXCHG usando eax register e ruotandolo, come mi ha mostrato un amico che è abbastanza esperto in x86. Poco da guadagnare, ma è possibile. Anche CMPXCHG è piuttosto lento. – alecco

+1

Tutte le architetture SIMD che ho usato hanno tali istruzioni. –

7

Trovato! È nel documento del 2007 "Usare registri SIMD e istruzioni per abilitare il parallelismo a livello di istruzione negli algoritmi di ordinamento" di Furtak, Amaral e Niewiadomski. Sezione 4.

Utilizza 4 registri SSE, ha 12 passaggi e viene eseguito in 19 istruzioni, tra cui carico e archivio.

Lo stesso documento ha un eccellente lavoro per creare dinamicamente reti di ordinamento con SIMD.

+1

Link al PDF: http://www.cs.ualberta.ca/~amaral/papers/furtak-spaa07.pdf – alecco

4

Per accelerare l'ordinamento delle stringhe, ho finito con il confezionamento di 7 byte per doppio e l'ordinamento (classifica) di un array di 16 doppi in SSE2, usando ordinamento bitonico per creare due esecuzioni di 8 e un unione binaria per unire i due piste. Puoi vedere la prima parte qui http://mischasan.wordpress.com/2011/07/29/okay-one-more-poke-at-sse2-sorting-doubles/ (asm) e qui http://mischasan.wordpress.com/2011/09/02/update-on-bitonic-sse2-sort-of-16-doubles/ (C), e il passo di unione bitonica (se vuoi andare SSE fino in fondo) qui: http://mischasan.wordpress.com/2012/11/04/sse2-odd-even-merge-the-last-step-in-sorting/. Ho sostituito il tipo di inserzione in fondo a qsort con questo tipo, ed è circa 5 volte più veloce del qsort diretto. HTH

Non avevo visto il documento UofA; la logica bitonica proviene dalla programmazione GPGPU della vecchia scuola (CTM).

Mi dispiace per le stringhe del collegamento incorporato; Non so come aggiungere link cliccabili nello stackoverflow dei commenti.

Problemi correlati