Gli algoritmi dipendono dalle architetture del computer?


22

Ho letto da qualche parte (ho dimenticato di che libro si tratta) che gli algoritmi sono indipendenti dalle architetture dei computer. Alcuni addirittura dicono che gli algoritmi sono essi stessi calcolo (macchine?)?

D'altra parte, i libri sulla programmazione parallela hanno capitoli sugli algoritmi paralleli. Sembra che gli algoritmi paralleli dipendano da architetture parallele?

Penso che mi manchi qualche foto grande? Grazie.


Quicksort è meglio quindi unire l'ordinamento?
AK_13

Gli algoritmi paralleli possono essere eseguiti su architetture a thread singolo. La suddivisione del tempo è supportata dalla maggior parte di tali architetture e chi afferma che le attività parallele devono essere eseguite contemporaneamente? Se A e B sono paralleli, perché non è possibile eseguire A quindi B? Oppure interlacciali se uno si basa sull'altro (ma questa è generalmente una cattiva idea).

3
Gli algoritmi sono specificati rispetto a una macchina astratta . Un tipico esempio di idealizzazione dei personal computer multi-core di oggi è chiamato PRAM (Parallel Random Access Machine , a volte classificato ulteriormente in EREW (lettura / scrittura di memoria esclusiva) o CRCW (lettura / scrittura di memoria concorrente).
rwong

@rwong: allora le macchine astratte sono totalmente indipendenti dalle architetture dei computer, se gli algoritmi lo sono?
Tim

2
Gli algoritmi (e le strutture di dati) possono essere ottimizzati per architetture particolari - ad es. Un albero B + è una struttura di dati associativa ottimizzata per architetture in cui la lettura di un grande blocco di dati è più economica della lettura di più blocchi di piccole dimensioni.
user253751

Risposte:


20

Gli algoritmi sono la serie di passaggi adottati per risolvere un problema specifico. La ricetta per risolvere il problema, se vuoi. I "programmi" fanno le stesse cose, ovviamente; usiamo "algoritmo" per suggerire le ricette "generalizzate" o "generalmente applicabili" che sono indipendenti da specifici design di macchine, linguaggi di programmazione e simili.

Gli algoritmi sono pensati per essere generali, ma possono comunque dipendere da alcune funzionalità presenti. Gli "algoritmi simultanei", ad esempio, potrebbero dipendere dal fatto che tu abbia un meccanismo per l'esecuzione simultanea di programmi diversi. Gli "algoritmi distribuiti" possono dipendere dal fatto che tu abbia più di un sistema in un gruppo cooperante e una rete o un altro schema di comunicazione tra di loro. Allo stesso modo, gli "algoritmi paralleli" sono spesso quelli progettati per essere eseguiti quando si hanno più unità di elaborazione - potenzialmente molte, molte unità di elaborazione e il tipo di strutture di comunicazione comuni quando si hanno grandi matrici di unità di elaborazione. Potresti essere in grado di eseguire un "algoritmo parallelo" anche quando hai solo un computer o una CPU - ma non è terribilmente interessante nel modo in cui non hanno gli ingegneri del traffico


13

Gli algoritmi sono indipendenti dall'architettura del computer. Questo perché gli algoritmi definiscono una serie di processi che risolvono un problema. Indipendentemente dalle architetture, gli algoritmi di ordinamento saranno sempre ordinati. Non renderebbe improvvisamente disegni 3D su alcune architetture.

Se ci pensate, questo è in realtà intuitivo. Google Chrome (che è semplicemente una raccolta di algoritmi) è un browser web quando compilato per qualsiasi architettura. Improvvisamente non diventerebbe un driver di dispositivo su alcune architetture.

Ma la velocità con cui vengono eseguiti gli algoritmi dipende dalle architetture. E alcuni algoritmi funzionano più velocemente di altri a seconda delle architetture.

Se ci pensate, anche questo è in realtà intuitivo. Dato un algoritmo, è sempre possibile per il progettista hardware progettare un'architettura che acceleri specificamente tale algoritmo. Questo è uno dei motivi per cui ci sono cose come schede grafiche accelerate 3D e acceleratori di bitcoin miner.

Quando le persone parlano di algoritmi paralleli, parlano di una famiglia di algoritmi che possono lavorare più velocemente su architetture parallele. Esistono molti algoritmi che non sono stati migliorati dalle architetture parallele. Quindi identificare nuovi algoritmi per lo stesso problema che funzionano bene in parallelo è un'area attiva di ricerca.

Ma quegli algoritmi fanno ancora le stesse cose. Le architetture non cambiano ciò che fanno.


"Ma la velocità con cui funzionano gli algoritmi dipende dalle architetture. E alcuni algoritmi funzionano più velocemente di altri a seconda delle architetture." Penso che questa sia una risposta preziosa.
Rıdvan Nuri Göçmen,

4

"Sembra che gli algoritmi paralleli dipendano da architetture parallele?"

Secondo me la risposta è semplicemente: no. Generale Ottengo solo le proprietà

  • parallelismo
  • dimensione delle parole (limiti di risorse implicite)

quando si pensa all'architettura hardware.

Facendo riferimento al parallelismo, è possibile far calcolare in batch qualsiasi algoritmo parallelo e qualsiasi arco parallelo per funzionare in serie, quindi l'algoritmo non dipende da questo. Le dimensioni delle parole potrebbero essere un problema per la stabilità numerica ma non per l'algoritmo stesso. Limiti di risorse come 64 bit possono descrivere solo 2 ^ 64 numeri diversi potrebbero essere un problema, ma comunque gli elementi sono limitati.

Naturalmente potrebbero esserci alcuni algoritmi che dipendono da alcuni set di istruzioni estese, ma almeno tutto può essere descritto con la matematica di base.

Ad esempio con il calcolo quantistico alcuni valori di Big-O possono cambiare e quindi direi che

"gli algoritmi sono indipendenti dalle architetture informatiche"

non è più vero.


4

Gli algoritmi non dipendono dall'architettura del computer, tuttavia l'efficienza dell'esecuzione di un particolare algoritmo dipende dall'architettura. Qualsiasi macchina Turing Complete può emulare qualsiasi altra macchina Turing Complete, sebbene alcune macchine sarebbero migliori in una cosa rispetto ad altre.

Ciò che intendiamo con algoritmi simultanei è che l'algoritmo funziona bene o può sfruttare la concorrenza nella macchina, forse perché richiede meno blocchi che altrimenti sarebbero stati richiesti da algoritmi non specificamente progettati per la macchina concorrente o forse perché il l'algoritmo sfrutta efficacemente la divisione e la conquista per sfruttare tutta la potenza della macchina. L'esecuzione dell'algoritmo in una macchina non simultanea sarebbe ancora possibile ma potrebbe non essere altrettanto efficiente o potrebbe richiedere un blocco aggiuntivo per funzionare correttamente.

Esistono anche algoritmi progettati per sfruttare la stranezza di una particolare architettura, come algoritmi compatibili con la cache, che ottimizzano la memorizzazione nella cache. Questi algoritmi potrebbero essere meno efficienti nelle macchine che non memorizzano nella cache il modo in cui l'algoritmo assume.


3

In teoria, gli algoritmi sono completamente indipendenti dall'architettura. È sempre possibile emulare un'architettura parallela su un sistema a tempo singolo a problema singolo. Puoi ragionare sugli algoritmi senza un'architettura. Il libro di Knuth utilizza un'architettura immaginaria.

In pratica ci sono algoritmi che tentano di ottenere un runtime migliore per la stessa complessità "O" ottimizzando l'uso dell'hardware della cache e delle primitive di sincronizzazione.


3

Sì e no. Dipende dai vincoli che si desidera soddisfare e dalle condizioni preliminari necessarie per eseguire l'algoritmo.

Idealmente, un algoritmo è una ricetta astratta che definisce passo per passo come fare qualcosa. Gli algoritmi sono stati definiti in questo modo con l'obiettivo di riproducibilità e successiva automazione. Gli algoritmi provengono da lambda-calcul, quindi puoi facilmente capire perché sono fatti in questo modo. Questa definizione è la solita, ma i moderni algoritmi possono essere non sequenziali (non graduali, come algoritmi concorrenti, o logici come quelli che usano l'unificazione), non lineari (algoritmi stocastici) o semplicemente stranamente (quantici algoritmi), ma lo passerò.

Pertanto, idealmente, un algoritmo dovrebbe essere il più astratto possibile senza tenere conto di alcun hardware.

Ma, come con qualsiasi sistema, è necessario definire alcuni assiomi , non solo per ottenere un sistema coerente, ma anche per guadagnare tempo. Ad esempio, la maggior parte degli algoritmi presume, almeno implicitamente, che siano definiti su una macchina Von-Neumann. Se così non fosse, avrebbero bisogno di definire esplicitamente ogni parte del sistema su cui devono essere eseguiti (poiché ciò è necessario per riprodurre la ricetta, questo è una specie di precondizione). Inoltre, spesso gli algoritmi si basano su comandi comuni come write () senza definirli completamente.

Un altro motivo per cui gli algoritmi non sono così astratti dall'architettura hardware, è quando è necessario soddisfare alcuni vincoli .

Supponiamo che tu stia lavorando su sistemi embedded, quindi probabilmente non puoi fare affidamento sulla stessa quantità di risorse che hai sulle workstation. Una delle risorse più contenute è probabilmente la memoria. Tuttavia, la maggior parte degli algoritmi tende a ottimizzare la complessità temporale (velocità di esecuzione sulla CPU), non la complessità della memoria (quantità di memoria necessaria per lavorare sui dati). Per questi sistemi, sono stati ideati algoritmi ottimizzati per la memoria in cui algoritmi non ottimizzati per la memoria fallirebbero o funzionerebbero molto più lentamente. In effetti, i sistemi integrati non sono il solo obiettivo di algoritmi efficienti in termini di memoria: ad esempio, esistono algoritmi ignari della cache che adattano il loro processo per utilizzare in modo efficiente la cache della CPU. Un altro esempio: alcuni algoritmi di machine learning per i big data sono personalizzatiapprendimento incrementale o elaborazione fuori core per elaborare enormi quantità di dati molto più grandi della memoria disponibile su qualsiasi computer, ecc.

Esistono anche algoritmi che non ottimizzano una parte specifica del computer, ma uno standard che dipende dall'architettura hardware. Ad esempio, i dati numerici che richiedono precisione sono memorizzati all'interno di float o double, che per loro natura sono limitati a causa di limiti hardware. Il problema è che calcoli complessi possono portare all'arrotondamento e più calcoli si eseguono su numeri arrotondati, più si va alla deriva. Questo si chiama interferenza catastrofica . Alcune applicazioni richiedono una precisione critica, anche a scapito della peggiore complessità. Per questo tipo di applicazioni, sono stati realizzati algoritmi che ottimizzano il loro calcolo per ridurre o rimuovere interferenze catastrofiche.

Pertanto, la progettazione di un algoritmo può anche essere un compromesso tra astrazione e vincoli.

Alla fine, possiamo dire che un algoritmo è tanto astratto quanto lo è il suo target e le sue esigenze precondizionali (architettura) . Quanto più specifico è l'obiettivo del tuo algoritmo, tanto più probabilmente dipenderà dall'architettura hardware.

Alcune parole chiave correlate che potrebbero interessarti:


1
Perché la maggior parte degli algoritmi dovrebbe preoccuparsi se funzionano su un'architettura Von Neumann o Harvard? La maggior parte dei sistemi integrati è quest'ultima, ma non ha problemi a eseguire la maggior parte degli algoritmi. Inoltre, il link all '"architettura ignara della cache" è stato apprezzato poiché non avevo mai sentito il termine prima, ma non credo che la frase sia corretta. Da quanto ho capito, gli algoritmi ignari della cache non adattano i loro schemi di accesso per adattarli alla cache - al contrario, usano schemi di accesso che funzioneranno bene su quasi ogni cache, quindi non devono preoccuparsi di come la cache lavori.
supercat,

Forse potrebbe essere utile osservare che alcuni algoritmi accedono a grandi quantità di dati in modo essenzialmente casuale e funzioneranno male su quasi tutte le cache, alcuni usano modelli localizzati che funzioneranno bene su quasi tutte le cache e alcuni potrebbero essere personalizzati per funzionare bene con architetture cache specifiche ma funzioneranno male se utilizzate con altri.
supercat

2

Non dovresti confondere un algoritmo in generale con algoritmi matematici o di calcolo. Se intendi algoritmi di calcolo, sì, sono indipendenti dall'architettura della macchina.

Definizione di algoritmo da Wikipedia:

In matematica e informatica , un algoritmo è un insieme autonomo di operazioni passo-passo da eseguire. Esistono algoritmi che eseguono calcoli , elaborazione dei dati e ragionamento automatico.

Questa definizione viene utilizzata per fare riferimento ad alcune attività di calcolo o elaborazione dati chiuse. In altre parole, calcoli che possono essere eseguiti astrattamente su Turing Machine . Tuttavia, recentemente c'è un concetto in matematica chiamato Calcolo interattivo che prevede la comunicazione input / output con il mondo esterno durante il calcolo.

In una definizione generale, l'algoritmo è solo una ricetta (sequenza di istruzioni). Penso che non puoi pensare a un algoritmo senza conoscere il set di istruzioni o le operazioni che puoi usare; Le operazioni matematiche riguardano il calcolo, quindi un algoritmo che include un passaggio chiamato " riscalda il forno " non è un algoritmo matematico, ma puoi darlo a uno chef, perché sa come eseguirlo.

Quindi, puoi creare una macchina che può fare X, Y, Z .... ognuno di questi potrebbe essere usato nel tuo algoritmo come istruzione. Ma se si tratta solo di calcolo chiuso (in realtà, calcoli digitali deterministici non interattivi a piccoli passi), allora si può dimostrare che la tua macchina è equivalente a Turing Machine . Ma se scegli come target altri tipi di calcoli (continua i valori o il calcolo interattivo [tuttavia non sono sicuro che siano davvero un altro tipo di calcolo]) o addirittura nessuna attività di calcolo, puoi pensare a macchine in grado di eseguirli.

Questa domanda e risposta è anche interessante per avere una prospettiva più ampia sugli algoritmi.


1

In generale, gli algoritmi sono progettati per alcuni problemi particolari minimizzando al contempo alcune misure di "costo". Storicamente, molti algoritmi sono stati progettati partendo dal presupposto che i costi relativi delle operazioni comuni sarebbero relativamente simili su molte architetture, e quindi alcune macchine tipiche avrebbero eseguito un algoritmo funzionerebbero meglio di un altro, quindi su molte macchine tipiche il precedente algoritmo avrebbe, peggio, essere solo leggermente inferiore a quest'ultimo. Con il passare del tempo, un'ipotesi del genere non regge come una volta.

Ad esempio, era il numero di volte in cui un programma aveva bisogno di leggere le cose dalla memoria era considerato più importante delle posizioni delle cose da leggere. Leggere le cose che si trovavano l'una vicino all'altra in memoria era un po 'più economico della lettura di cose che erano distanti, ma non mostrano scandalosamente. Poiché le velocità della CPU principale sono aumentate a una velocità molto superiore alle velocità di memoria, tuttavia, l'importanza della sequenza di accesso è aumentata in modo significativo. È possibile che un programma esegua dieci volte il numero di istruzioni di un altro e che sia comunque ancora più veloce, se il 95% dei recuperi di memoria del programma precedente genera hit di cache L1 e la maggior parte dei recuperi di memoria di quest'ultimo programma genera mancate cache.

Inoltre, alcuni tipi di algoritmi relativi alla concorrenza fanno varie ipotesi su quando i dati scritti nella memoria da un core del processore saranno "visti" da altri core. Molti processori hanno vari modi in cui possono leggere e scrivere memoria, con costi e garanzie variabili sulla visibilità. Alcuni algoritmi funzioneranno molto bene su architetture in grado di soddisfare i requisiti di visibilità "gratuitamente", ma scarsamente su altri dove le istruzioni necessarie per tali garanzie sono costose. In effetti, su alcune architetture è possibile garantire che alcuni algoritmi relativi alla concorrenza funzionino solo limitando l'esecuzione a un singolo core della CPU condiviso nel tempo (che ovviamente vanificherebbe l'uso di un algoritmo concorrente).


1

Molte risposte mancano al fatto che un algoritmo può essere definito in termini astratti o in relazione letterale diretta con un'architettura. Un algoritmo deve essere inequivocabile, ma c'è ancora spazio per essere più o meno specifico.

Un algoritmo per convertire una stringa in maiuscolo può essere facilmente descritto in pseudocodice indipendente dall'architettura. Ma allo stesso tempo, nulla ti impedisce di descrivere un algoritmo per convertire una stringa in maiuscolo in particolare su un'architettura x86. Tutto ciò che serve è un compito dei compiti dell'Assemblea x86. (Puoi ancora farlo in pseudocodice - solo pseudocodice relativo a quell'architettura!) Il solo fatto che il problema sia specifico per farlo su un'architettura x86 non significa che non hai più un algoritmo per risolverlo.

Dipende dal problema che l'algoritmo è definito per risolvere. L'algoritmo è indipendente dall'architettura se il problema che risolve è indipendente dall'architettura (e supponendo che ciò non venga annullato dal modo in cui l'algoritmo viene descritto o messo insieme). Il problema può essere teorico, lavagna o può essere in termini di un'architettura molto specifica. In quest'ultimo caso, l'algoritmo, a sua volta, si limiterebbe a lavorare con quell'architettura.


1

Gli algoritmi sono una sequenza di passaggi. Non dipendono da ciò che li sta (o non sta eseguendo).

Tuttavia, la complessità temporale di un algoritmo può dipendere da cosa lo sta eseguendo. Ecco perché l'analisi dettagliata di un algoritmo richiede un "modello di calcolo", come una macchina ad accesso casuale .
Il fatto che la memoria sia o meno accessibile in modo casuale influisce sicuramente sul tempo impiegato per l'esecuzione dell'algoritmo e la maggior parte degli algoritmi presuppone che ciò avvenga, mentre in realtà la maggior parte delle architetture non soddisfa questa condizione.


0

Differiscono in diversi contesti dei problemi. L'algoritmo è la raccolta di passaggi per risolvere un problema. Il contesto di questo problema può teoricamente essere qualsiasi cosa. Quindi l'algoritmo per risolvere il problema può dipendere letteralmente da qualsiasi cosa sull'universo che possiamo immaginare. Vorrei chiarire con un esempio. Supponiamo che ti venga assegnato un compito,

Costruire un algoritmo che distribuirà i carichi su più core quando disponibile multicore.

Ora puoi immaginare che il tuo algoritmo dipenderà dall'architettura o no? Naturalmente .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.