Li em algum lugar (esqueci que livro é esse) que os algoritmos são independentes das arquiteturas de computadores. Alguns até dizem que algoritmos são computação (máquinas?)?
Por outro lado, livros sobre programação paralela têm capítulos sobre algoritmos paralelos. Parece que algoritmos paralelos dependem de arquiteturas paralelas?
Acho que sinto falta de fotos grandes? Obrigado.
Respostas:
Algoritmos são as séries de etapas adotadas para resolver um problema específico. A receita para resolver o problema, se quiser. "Programas" fazem as mesmas coisas, é claro; usamos "algoritmo" para sugerir as receitas "generalizadas" ou "geralmente aplicáveis" que são independentes de projetos específicos de máquinas, linguagens de programação e outras.
Os algoritmos devem ser gerais, mas ainda podem depender da presença de alguns recursos. "Algoritmos simultâneos", por exemplo, podem depender de você ter algum mecanismo para a execução simultânea de programas diferentes. "Algoritmos distribuídos" podem depender de você ter mais de um sistema em um grupo colaborador e uma rede ou outro esquema de comunicação entre eles. Da mesma forma, "algoritmos paralelos" são geralmente aqueles projetados para serem executados quando você tem várias unidades de processamento - potencialmente muitas, muitas unidades de processamento e o tipo de facilidades de comunicação que são comuns quando você tem grandes matrizes de unidades de processamento. Você pode executar um "algoritmo paralelo" mesmo quando você tem apenas um computador ou uma CPU - mas não é muito interessante na maneira como os engenheiros de tráfego não são '
fonte
Os algoritmos são independentes da arquitetura do computador. Isso ocorre porque os algoritmos definem uma série de processos que resolvem um problema. Independentemente das arquiteturas, os algoritmos de classificação sempre serão classificados. De repente, não renderiza desenhos em 3D em algumas arquiteturas.
Se você pensar bem, isso é realmente intuitivo. O Google Chrome (que é apenas uma coleção de algoritmos) é um navegador da Web quando compilado para qualquer arquitetura. De repente, não se tornaria um driver de dispositivo em algumas arquiteturas.
Mas a velocidade com que os algoritmos são executados depende das arquiteturas. E alguns algoritmos funcionam mais rápido que outros, dependendo das arquiteturas.
Se você pensar sobre isso, isso também é realmente intuitivo. Dado um algoritmo, é sempre possível ao projetista de hardware projetar uma arquitetura que acelere especificamente esse algoritmo. Essa é uma razão pela qual existem coisas como placas gráficas aceleradas em 3D e aceleradores de mineração de bitcoin.
Quando as pessoas falam sobre algoritmos paralelos, estão falando sobre uma família de algoritmos que podem trabalhar mais rapidamente em arquiteturas paralelas. Existem muitos algoritmos que não são aprimorados por arquiteturas paralelas. Portanto, identificar novos algoritmos para o mesmo problema que funcionam bem em paralelo é uma área ativa de pesquisa.
Mas esses algoritmos ainda fazem as mesmas coisas. As arquiteturas não mudam o que fazem.
fonte
Na minha opinião, a resposta é simplesmente: não. Geral Eu só obtenho as propriedades
ao pensar em arquitetura de hardware.
Referindo-se ao paralelismo, você pode fazer com que qualquer algoritmo paralelo seja computado em lote e qualquer arco paralelo funcione em série, para que o algoritmo não dependa disso. O tamanho da palavra pode ser um problema para a estabilidade numérica, mas não para o próprio algoritmo. Os limites de recursos, como 64 bits, podem descrever apenas 2 ^ 64 números diferentes, pode ser um problema, mas de qualquer maneira os elementos são limitados.
É claro que pode haver alguns algoritmos que dependem de alguns conjuntos de instruções estendidos, mas pelo menos tudo pode ser descrito com a matemática básica.
Por exemplo, com a computação quântica, alguns valores de Big-O podem mudar e então eu diria que
não é mais verdade.
fonte
Os algoritmos não dependem da arquitetura do computador, no entanto, a eficiência de executar qualquer algoritmo específico depende da arquitetura. Qualquer máquina Turing Complete pode emular qualquer outra máquina Turing Complete, embora algumas sejam melhores em uma coisa do que outras.
O que queremos dizer com algoritmos simultâneos é que o algoritmo funciona bem ou pode tirar vantagem da simultaneidade na máquina, talvez porque exija menos bloqueio que de outra forma teria sido exigido por algoritmos que não foram projetados especificamente para a máquina simultânea ou talvez porque o O algoritmo utiliza dividir e conquistar de forma eficaz para usar toda a potência da máquina. A execução do algoritmo em uma máquina não simultânea ainda seria possível, mas pode não ser tão eficiente ou pode exigir bloqueio adicional para funcionar corretamente.
Também existem algoritmos projetados para aproveitar as peculiaridades de uma arquitetura específica, como algoritmos amigáveis ao cache, que otimizam o cache. Esses algoritmos podem ser menos eficientes em máquinas que não armazenam em cache a maneira como o algoritmo assume.
fonte
Em teoria, os algoritmos são totalmente independentes da arquitetura. Você sempre pode emular uma arquitetura paralela em um sistema com divisão de tempo de emissão única. Você pode raciocinar sobre algoritmos sem uma arquitetura. O livro de Knuth usa uma arquitetura fictícia.
Na prática, existem algoritmos que tentam obter melhor tempo de execução para a mesma complexidade "O" otimizando o uso de hardware de cache e primitivas de sincronização.
fonte
Sim e não. Depende das restrições que você deseja atender e das condições prévias necessárias para executar seu algoritmo.
Idealmente, um algoritmo é uma receita abstrata que define passo a passo como fazer algo. Os algoritmos foram definidos assim com o objetivo de reprodutibilidade e posterior automatização. Os algoritmos são originários do lambda-calcul, para que você possa ver facilmente por que eles são criados dessa maneira. Essa definição é a usual, mas os algoritmos modernos podem ser não seqüenciais (não passo a passo, como algoritmos simultâneos ou lógicos como os que usam unificação), não lineares (algoritmos estocásticos) ou simplesmente estranhos (quantum algoritmos), mas eu passo isso.
Assim, idealmente, um algoritmo deve ser o mais abstrato possível sem contabilizar nenhum hardware.
Mas, como em qualquer sistema, você deve definir alguns axiomas , não apenas para obter um sistema coerente, mas também para ganhar tempo. Por exemplo, a maioria dos algoritmos presume, pelo menos implicitamente, que eles são definidos em uma máquina de Von-Neumann. Se não fosse esse o caso, eles precisariam definir explicitamente cada parte do sistema em que precisam ser executados (já que isso é necessário para reproduzir a receita, é um tipo de pré-condição). Além disso, frequentemente os algoritmos dependem de comandos comuns, como write (), sem defini-los completamente.
Outra razão pela qual os algoritmos não são tão abstratos da arquitetura de hardware é quando você precisa atender a algumas restrições .
Digamos que você esteja trabalhando em sistemas embarcados, provavelmente não poderá contar com a mesma quantidade de recursos que possui nas estações de trabalho. Um dos recursos mais restritos é provavelmente a memória. No entanto, a maioria dos algoritmos tende a otimizar a complexidade do tempo (velocidade de execução na CPU), não a complexidade da memória (quantidade de memória necessária para trabalhar nos dados). Para esses sistemas, foram criados algoritmos de memória otimizada, onde algoritmos não otimizados para memória simplesmente falhariam ou seriam muito mais lentos. De fato, os sistemas embarcados não são o único alvo dos algoritmos com eficiência de memória: por exemplo, existem algoritmos que ignoram o cache que adaptam seu processamento para usar com eficiência o cache da CPU. Outro exemplo: alguns algoritmos de aprendizado de máquina para big data são adaptados paraaprendizado incremental ou computação fora do núcleo para processar uma quantidade enorme de dados muito maior que a memória disponível em qualquer computador, etc.
Também existem algoritmos que não otimizam uma parte específica do computador, mas um padrão que depende da arquitetura do hardware. Por exemplo, dados numéricos que precisam de precisão são armazenados dentro de float ou double, que são limitados por natureza devido a limites de hardware. O problema é que cálculos complexos podem levar a arredondamentos, e quanto mais cálculos você fizer sobre números arredondados, mais você se afastará. Isso é chamado de interferência catastrófica . Alguns aplicativos precisam de uma precisão crítica, mesmo ao custo da pior complexidade. Para esse tipo de aplicação, foram feitos algoritmos que otimizam seu cálculo para reduzir ou remover interferências catastróficas.
Assim, projetar um algoritmo também pode ser uma troca entre abstração e restrições.
No final, podemos dizer que um algoritmo é tão abstrato quanto seu alvo e como suas necessidades pré-condições (arquitetura) . Quanto mais específico o objetivo do seu algoritmo, mais provavelmente ele dependerá da arquitetura do hardware.
Algumas palavras-chave relacionadas que podem lhe interessar:
fonte
Você não deve confundir um algoritmo em geral com algoritmos matemáticos ou de computação. Se você quer dizer algoritmos de computação, sim, eles são independentes da arquitetura da máquina.
Definição de algoritmo da Wikipedia:
Essa definição é usada para referir algumas tarefas fechadas de computação ou processamento de dados. Em outras palavras, cálculos que podem ser abstratamente executados na Turing Machine . No entanto, recentemente, existe um conceito em matemática chamado Computação interativa que envolve comunicação de entrada / saída com o mundo externo durante a computação.
Em uma definição geral, o algoritmo é apenas uma receita (sequência de instruções). Eu acho que você não consegue pensar em um algoritmo sem conhecer o conjunto de instruções ou operações que você pode usar; As operações matemáticas são sobre cálculo e, em seguida, um algoritmo que inclui uma etapa chamada ' esquentar o forno ' não é um algoritmo matemático, mas você pode entregá-lo a um chef, porque ele sabe como executá-lo.
Em seguida, você pode criar uma máquina capaz de executar X, Y, Z .... cada uma delas pode ser usada no seu algoritmo como uma instrução. Mas se eles são sobre computação fechada (de fato, cálculos digitais determinísticos não interativos em pequenas etapas), então podemos provar que sua máquina é equivalente à Turing Machine . Mas se você direcionar outro tipo de computação (valores contínuos ou computação interativa [no entanto, não tenho certeza se eles são realmente outro tipo de computação)) ou mesmo tarefas sem computação, você pode pensar em máquinas que possam executá-las.
Esta pergunta e resposta também são interessantes para obter uma perspectiva mais ampla sobre algoritmos.
fonte
Em geral, os algoritmos são projetados para alguns problemas específicos, minimizando algumas medidas de "custo". Historicamente, muitos algoritmos foram projetados no pressuposto de que os custos relativos de operações comuns seriam relativamente semelhantes em muitas arquiteturas, e, portanto, algumas máquinas típicas executariam um algoritmo que rodaria melhor que outro, então, na maioria das máquinas típicas, o antigo algoritmo usaria pior, seja apenas ligeiramente inferior a este. Com o passar do tempo, essa suposição não se mantém tão bem quanto antes.
Por exemplo, costumava ser que o número de vezes que um programa precisava ler coisas da memória era considerado mais importante do que a localização das coisas a serem lidas. Ler coisas que estavam localizadas próximas umas das outras na memória era um pouco mais barato do que ler coisas que estavam distantes, mas que não são escandalosamente mostradas. Como as velocidades da CPU principal aumentaram a uma taxa muito superior às velocidades da memória, no entanto, a importância da sequência de acesso aumentou significativamente. É possível que um programa execute dez vezes mais instruções do que outro e ainda assim execute mais rapidamente, se os 95% das buscas de memória do programa anterior gerarem hits de cache L1 e a maioria das buscas de memória do último programa gerar erros de cache.
Além disso, certos tipos de algoritmos relacionados à simultaneidade fazem várias suposições sobre quando os dados gravados na memória por um núcleo do processador serão "vistos" por outros núcleos. Muitos processadores têm várias maneiras de ler e gravar memória, com custos e garantias variados sobre a visibilidade. Alguns algoritmos funcionam muito bem em arquiteturas que podem atender aos requisitos de visibilidade "de graça", mas mal em outros onde as instruções necessárias para essas garantias são caras. De fato, em algumas arquiteturas, certos algoritmos relacionados à simultaneidade só poderiam garantir o funcionamento, limitando a execução a um único núcleo de CPU compartilhado no tempo (o que obviamente derrotaria o ponto de usar um algoritmo simultâneo).
fonte
Muitas respostas estão faltando o fato de que um algoritmo pode ser definido em termos abstratos ou em relação direta e literal a uma arquitetura. Um algoritmo precisa ser inequívoco, mas ainda há espaço para ser mais ou menos específico.
Um algoritmo para converter uma string em maiúsculas pode ser facilmente descrito em pseudocódigo independente da arquitetura. Mas, ao mesmo tempo, nada impede que você descreva um algoritmo para converter uma string em letras maiúsculas, especificamente em uma arquitetura x86. Basta uma tarefa de tarefa de montagem do x86. (Você ainda pode fazer isso no pseudocódigo - apenas pseudocódigo relacionado a essa arquitetura!) Apenas o fato de o problema ser específico para fazer isso em uma arquitetura x86 não significa que você não tem mais um algoritmo para resolvê-lo.
Depende do problema que o algoritmo está definido para resolver. O algoritmo é independente da arquitetura se o problema resolvido for independente da arquitetura (e assumindo que isso não seja desfeito pela maneira como o algoritmo é descrito ou montado). O problema pode ser um teórico, um quadro-negro, ou pode ser em termos de uma arquitetura muito específica. No último caso, o algoritmo, por sua vez, estaria limitado a trabalhar com essa arquitetura.
fonte
Algoritmos são uma sequência de etapas. Eles não dependem do que os está (ou não) os executando.
No entanto, a complexidade do tempo de um algoritmo pode depender do que está sendo executado. É por isso que a análise detalhada de um algoritmo requer um "modelo de computação", como uma máquina de acesso aleatório .
O fato de a memória ser ou não aleatoriamente acessível certamente afeta o tempo de execução do algoritmo, e a maioria dos algoritmos assume que é esse o caso, enquanto na realidade a maioria das arquiteturas não satisfaz essa condição.
fonte
Eles diferem no contexto diferente dos problemas. Algoritmo é a coleção de etapas para resolver um problema. O contexto desse problema pode ser teoricamente qualquer coisa. Portanto, o algoritmo de resolução do problema pode depender literalmente de qualquer coisa do universo que possamos imaginar. Deixe-me esclarecer com um exemplo. Digamos que você tenha uma tarefa,
Agora você pode imaginar que seu algoritmo será dependente da arquitetura ou não? Claro que sim .
fonte