Leí en alguna parte (olvidé de qué libro es) que los algoritmos son independientes de las arquitecturas informáticas. Algunos incluso dicen que los algoritmos son en sí mismos computación (¿máquinas?)?
Por otro lado, los libros sobre programación paralela tienen capítulos sobre algoritmos paralelos. ¿Parece que los algoritmos paralelos dependen de arquitecturas paralelas?
Creo que extraño algunas fotos grandes? Gracias.
Respuestas:
Los algoritmos son la serie de pasos tomados para resolver un problema particular. La receta para resolver el problema, si quieres. Los "programas" hacen lo mismo, por supuesto; Usamos "algoritmo" para sugerir las recetas "generalizadas" o "generalmente aplicables" que son independientes de los diseños específicos de las máquinas, los lenguajes de programación y demás.
Los algoritmos están destinados a ser generales, pero aún pueden depender de que algunas características estén presentes. Los "algoritmos concurrentes", por ejemplo, pueden depender de que tenga algún mecanismo para que diferentes programas se ejecuten simultáneamente. Los "algoritmos distribuidos" pueden depender de que usted tenga más de un sistema en un grupo cooperante y una red u otro esquema de comunicación entre ellos. De manera similar, los "algoritmos paralelos" a menudo son aquellos diseñados para ejecutarse cuando tiene múltiples unidades de procesamiento, potencialmente muchas, muchas unidades de procesamiento y el tipo de facilidades de comunicación que son comunes cuando tiene grandes conjuntos de unidades de procesamiento. Es posible que pueda ejecutar un "algoritmo paralelo" incluso cuando solo tiene una computadora o una CPU, pero no es terriblemente interesante en la forma en que no hay ingenieros de tráfico
fuente
Los algoritmos son independientes de la arquitectura de la computadora. Esto se debe a que los algoritmos definen una serie de procesos que resuelven un problema. Independientemente de las arquitecturas, los algoritmos de clasificación siempre se clasificarán. No representaría de repente dibujos en 3D en algunas arquitecturas.
Si lo piensas, esto es realmente intuitivo. Google Chrome (que es simplemente una colección de algoritmos) es un navegador web cuando se compila para cualquier arquitectura. De repente no se convertiría en un controlador de dispositivo en algunas arquitecturas.
Pero la velocidad con la que se ejecutan los algoritmos depende de las arquitecturas. Y algunos algoritmos funcionan más rápido que otros dependiendo de las arquitecturas.
Si lo piensas, esto también es realmente intuitivo. Dado un algoritmo, siempre es posible que el diseñador de hardware diseñe una arquitectura que acelere específicamente ese algoritmo. Esa es una de las razones por las que hay cosas como tarjetas gráficas aceleradas en 3D y aceleradores de bitcoin miner.
Cuando las personas hablan de algoritmos paralelos, hablan de una familia de algoritmos que pueden funcionar más rápido en arquitecturas paralelas. Hay muchos algoritmos que las arquitecturas paralelas no mejoran. Por lo tanto, identificar nuevos algoritmos para el mismo problema que funcionan bien en paralelo es un área activa de investigación.
Pero esos algoritmos todavía hacen lo mismo. Las arquitecturas no cambian lo que hacen.
fuente
En mi opinión, la respuesta es simplemente: no. General solo obtengo las propiedades
cuando se piensa en arquitectura de hardware.
Refiriéndose al paralelismo, puede hacer que cualquier algoritmo paralelo se calcule por lotes y que cualquier arco paralelo funcione en serie para que el algoritmo no dependa de eso. El tamaño de la palabra puede ser un problema para la estabilidad numérica, pero no para el algoritmo en sí. Los límites de recursos como 64 bits solo pueden describir 2 ^ 64 números diferentes podrían ser un problema, pero de todos modos los elementos son limitados.
Por supuesto, puede haber algunos algoritmos que dependen de algunos conjuntos de instrucciones extendidos, pero al menos todo se puede describir con matemáticas básicas.
Por ejemplo, con la computación cuántica, algunos valores de Big-O pueden cambiar y luego diría que
ya no es verdad
fuente
Los algoritmos no dependen de la arquitectura de la computadora, sin embargo, la eficiencia de ejecutar un algoritmo particular depende de la arquitectura. Cualquier máquina Turing Complete puede emular cualquier otra máquina Turing Complete, aunque algunas máquinas serían mejores en una cosa que otras.
Lo que queremos decir con algoritmos concurrentes es que el algoritmo funciona bien o puede aprovechar la concurrencia en la máquina, tal vez porque requiere menos bloqueo que de lo contrario habría sido requerido por algoritmos que no están específicamente diseñados para la máquina concurrente o tal vez porque El algoritmo hace uso de divide y vencerás eficazmente para usar toda la potencia de la máquina. Aún sería posible ejecutar el algoritmo en una máquina no concurrente, pero puede no ser tan eficiente o puede requerir un bloqueo adicional para funcionar correctamente.
También hay algoritmos que están diseñados para aprovechar la peculiaridad de una arquitectura particular, como los algoritmos compatibles con la caché, que optimizan el almacenamiento en caché. Estos algoritmos pueden ser menos eficientes en máquinas que no almacenan en caché la forma en que asume el algoritmo.
fuente
En teoría, los algoritmos son completamente independientes de la arquitectura. Siempre puede emular una arquitectura paralela en un sistema de división temporal de un solo problema. Puede razonar sobre algoritmos sin una arquitectura en absoluto. El libro de Knuth usa una arquitectura ficticia.
En la práctica, existen algoritmos que intentan lograr un mejor tiempo de ejecución para la misma complejidad "O" mediante la optimización del uso de hardware de caché y primitivas de sincronización.
fuente
Si y no. Depende de las restricciones que desea cumplir y las condiciones previas necesarias para ejecutar su algoritmo.
Idealmente, un algoritmo es una receta abstracta que define paso a paso cómo hacer algo. Los algoritmos se definieron así con el objetivo de reproducibilidad y posterior automatización. Los algoritmos se originan del cálculo lambda, por lo que puede ver fácilmente por qué están hechos de esa manera. Esta definición es la habitual, pero los algoritmos modernos pueden ser no secuenciales (no paso a paso, como los algoritmos concurrentes, o lógicos como los que usan la unificación), no lineales (algoritmos estocásticos) o simplemente extraños (cuánticos algoritmos), pero lo pasaré.
Por lo tanto, idealmente, un algoritmo debe ser lo más abstracto posible sin tener en cuenta ningún hardware.
Pero, como con cualquier sistema, debe definir algunos axiomas , no solo para obtener un sistema coherente, sino también para ganar tiempo. Por ejemplo, la mayoría de los algoritmos suponen, al menos implícitamente, que están definidos en una máquina de Von-Neumann. Si ese no fuera el caso, tendrían que definir explícitamente cada parte del sistema en el que deben ejecutarse (ya que esto es necesario para reproducir la receta, esta es una especie de condición previa). Además, a menudo los algoritmos se basan en comandos comunes como write () sin definirlos completamente.
Otra razón por la cual los algoritmos no son tan abstractos de la arquitectura de hardware, es cuando necesita cumplir algunas restricciones .
Digamos que está trabajando en sistemas integrados, entonces probablemente no puede confiar en la misma cantidad de recursos que tiene en las estaciones de trabajo. Uno de los recursos más restringidos es probablemente la memoria. Sin embargo, la mayoría de los algoritmos tienden a optimizar la complejidad del tiempo (velocidad de ejecución en la CPU), no la complejidad de la memoria (cantidad de memoria necesaria para trabajar en los datos). Para estos sistemas, se han ideado algoritmos de memoria optimizada donde los algoritmos sin memoria optimizados simplemente fallarían o funcionarían mucho más lentamente. De hecho, los sistemas embebidos no son el único objetivo de los algoritmos de memoria eficiente: por ejemplo, existen algoritmos ajenos a la caché que adaptan su procesamiento para usar eficientemente la caché de la CPU. Otro ejemplo: algunos algoritmos de aprendizaje automático para big data están diseñados paraaprendizaje incremental o computación fuera del núcleo para procesar una gran cantidad de datos mucho más grande que la memoria disponible en cualquier computadora, etc.
También hay algoritmos que no optimizan una parte específica de la computadora, sino un estándar que depende de la arquitectura del hardware. Por ejemplo, los datos numéricos que necesitan precisión se almacenan dentro de flotante o doble, que por naturaleza están limitados debido a los límites de hardware. El problema es que los cálculos complejos pueden conducir al redondeo, y cuantos más cálculos haga sobre números redondeados, más se desviará. Esto se llama una interferencia catastrófica . Algunas aplicaciones necesitan una precisión crítica, incluso a costa de la peor complejidad. Para este tipo de aplicaciones, se realizaron algoritmos que optimizan sus cálculos para reducir o eliminar interferencias catastróficas.
Por lo tanto, diseñar un algoritmo también puede ser una compensación entre la abstracción y las restricciones.
Al final, podemos decir que un algoritmo es tan abstracto como su objetivo y según sus necesidades precondicionales (arquitectura) . Cuanto más específico sea el objetivo de su algoritmo, más probablemente dependerá de la arquitectura del hardware.
Algunas palabras clave relacionadas que pueden interesarle:
fuente
No debe confundir un algoritmo en general con algoritmos matemáticos o informáticos. Si te refieres a algoritmos informáticos, sí, son independientes de la arquitectura de la máquina.
Definición de algoritmo de Wikipedia:
Esta definición se utiliza para referirse a algunas tareas cerradas de procesamiento de datos o computación. En otras palabras, cálculos que se pueden ejecutar de forma abstracta en Turing Machine . Sin embargo, recientemente hay un concepto en matemáticas llamado Computación interactiva que involucra comunicación de entrada / salida con el mundo externo durante la computación.
En una definición general, el algoritmo es solo una receta (secuencia de instrucciones). Creo que no puede pensar en un algoritmo sin conocer el conjunto de instrucciones u operaciones que puede usar; Las operaciones matemáticas tienen que ver con el cálculo, entonces un algoritmo que incluye un paso llamado ' calentar el horno ' no es un algoritmo matemático, pero puede dárselo a un chef, porque él sabe cómo ejecutarlo.
Luego, puede crear una máquina que pueda hacer X, Y, Z ... cada una de estas podría usarse en su algoritmo como una instrucción. Pero si se trata de cómputo cerrado (de hecho, cómputos digitales pequeños deterministas no interactivos), entonces uno puede probar que su máquina es equivalente a Turing Machine . Pero si se dirige a otro tipo de cómputos (valores continuos o cómputo interactivo [sin embargo, no estoy seguro de si realmente son otro tipo de cómputo]) o incluso tareas que no son de cómputo, puede pensar en máquinas que puedan realizarlas.
Esta pregunta y respuesta también es interesante para obtener una perspectiva más amplia sobre los algoritmos.
fuente
En general, los algoritmos están diseñados para algunos problemas particulares al tiempo que minimizan alguna medida de "costo". Históricamente, muchos algoritmos se diseñaron suponiendo que los costos relativos de las operaciones comunes serían relativamente similares en muchas arquitecturas, y por lo tanto algunas máquinas típicas ejecutarían un algoritmo funcionaría mejor que otro, luego, en la mayoría de las máquinas típicas, el algoritmo anterior sería, en peor, ser solo ligeramente inferior a este último. Con el paso del tiempo, tal suposición ya no es tan buena como solía ser.
Por ejemplo, solía ser que la cantidad de veces que un programa necesitaba leer cosas de la memoria se consideraba más importante que la ubicación de las cosas que se leían. Leer cosas que se encontraban cerca una de la otra en la memoria era algo más barato que leer cosas que estaban muy separadas, pero que no se mostraban escandalosamente. Como las velocidades de la CPU principal han aumentado a una velocidad muy superior a las velocidades de memoria, sin embargo, la importancia de la secuencia de acceso ha aumentado significativamente. Es posible que un programa ejecute diez veces más instrucciones que otro y aún así se ejecute más rápido, si el 95% de las recuperaciones de memoria del programa anterior generan aciertos de caché L1 y la mayoría de las recuperaciones de memoria del último programa generan fallas de caché.
Además, ciertos tipos de algoritmos relacionados con la concurrencia hacen varias suposiciones acerca de cuándo los núcleos del procesador "verán" los datos escritos en la memoria por un núcleo del procesador. Muchos procesadores tienen varias formas de leer y escribir memoria, con diferentes costos y garantías sobre la visibilidad. Algunos algoritmos funcionarán muy bien en arquitecturas que puedan satisfacer los requisitos de visibilidad "de forma gratuita", pero de manera deficiente en otros donde las instrucciones necesarias para esas garantías son caras. De hecho, en algunas arquitecturas, ciertos algoritmos relacionados con la concurrencia solo podrían garantizarse al funcionar limitando la ejecución a un solo núcleo de CPU compartido en el tiempo (lo que, por supuesto, anularía el punto de usar un algoritmo concurrente).
fuente
Faltan muchas respuestas el hecho de que un algoritmo se puede definir en términos abstractos o en relación directa y literal con una arquitectura. Un algoritmo tiene que ser inequívoco, pero todavía hay espacio para que sea más o menos específico.
Un algoritmo para convertir una cadena a mayúsculas se puede describir fácilmente en un pseudocódigo que es independiente de la arquitectura. Pero, al mismo tiempo, nada le impide describir un algoritmo para convertir una cadena a mayúsculas específicamente en una arquitectura x86. Todo lo que se necesita es una tarea de ensamblaje x86. (Todavía puede hacer esto en pseudocódigo, ¡solo pseudocódigo relacionado con esa arquitectura!) El hecho de que el problema sea específicamente para hacer esto en una arquitectura x86 no significa que ya no tenga un algoritmo para resolverlo.
Depende del problema que el algoritmo esté definido para resolver. El algoritmo es independiente de la arquitectura si el problema que resuelve es independiente de la arquitectura (y suponiendo que esto no se deshaga por la forma en que se describe o se combina el algoritmo). El problema puede ser teórico, de pizarra, o puede ser en términos de una arquitectura muy específica. En el último caso, el algoritmo, a su vez, se limitaría a trabajar con esa arquitectura.
fuente
Los algoritmos son una secuencia de pasos. No dependen de lo que (o no) los está ejecutando.
Sin embargo, la complejidad temporal de un algoritmo puede depender de lo que lo esté ejecutando. Es por eso que el análisis detallado de un algoritmo requiere un "modelo de cálculo", como una máquina de acceso aleatorio .
Si la memoria es aleatoriamente accesible o no, ciertamente afecta cuánto tiempo tarda su algoritmo en ejecutarse, y la mayoría de los algoritmos asumen que este es el caso, mientras que en realidad la mayoría de las arquitecturas no satisfacen esta condición.
fuente
Difieren en diferentes contextos de los problemas. Algoritmo es la colección de pasos para resolver un problema. El contexto de este problema puede ser teóricamente cualquier cosa. Por lo tanto, el algoritmo para resolver el problema puede depender literalmente de cualquier cosa en el universo que podamos imaginar. Déjame aclarar con un ejemplo. Digamos que se le asigna una tarea para,
Ahora, ¿te imaginas que tu algoritmo dependerá de la arquitectura o no? Por supuesto que si .
fuente