Hola, ¿han programado ustedes alguna vez algún tipo de
algoritmo paralelo? si es así, pueden compartir una explicación o algún ejemplo sencillo.
La información que he encontrado es muy confusa, pero se dice que un algoritmo que se presta a paralelismo es la regla de cramer, este método sirve para solucionar sistemas lineales mediante el cálculo de determinantes, una parte del algoritmo es realizar n determinantes, por ejemplo si el sistema tiene 3 incógnitas X,Y,Z (n=3) , se debe efectuar n+1 determinantes, Dx, Dy, Dz, Dbase, siguiendo la lógica de un
algoritmo secuencial, la única manera de aplicar la regla de cramer es efectuando los 4 determinantes uno por uno y almacenando cada resultado en una variable, el valor de cada incógnita se determina por x=Dx/Dbase, y=Dy/Dbase, z=Dz/Dbase
fuente
http://www.allmathwords.org/es/c/cramersrule.htmlmientras que siguiendo la lógica de algoritmo paralelo, cada determinante lo podría efectuar una CPU independientemente, de esta manera se calculan los 4 determinantes paralelamente, he leído sobre hilos en JAVA tiene que ver con algoritmo paralelo?
En mi caso siempre he programado con algoritmos secuenciales, pero existen algoritmos paralelos, la siguiente definición es basada en varios links ¿es correcta?, no duden en corregirme
Algoritmo Paralelo En programación un algoritmo paralelo se usa para conseguir aceleraciones en la respuesta de un problema, o para hacer viable un cómputo complejo o computación científica, requiere estrictamente de varias unidades de procesamiento (CPUs) independientes o por lo menos múltiples núcleos de procesamiento en un solo chip (procesador multi-core ), el algoritmo se codifica para que cada tarea o sub-problema se ejecute en un hilo de procesamiento (threads) y el programa de control u OS se encargue en tiempo de ejecución de seleccionar cierta cantidad de ellos, cada tarea es procesada y ejecutada paralelamente o por lotes dependiendo de la ocupación de las CPUs.
Según la lógica del algoritmo cada función por ejemplo puede ir procesando y mostrando una salida o en otro caso esperar a que todas o lotes de CPUs terminen para finalmente unir todas las partes y obtener el resultado útil, se usan este tipo de algoritmos para cálculos de ingeniería avanzados, simulación de plantas nucleares, procesos químicos complejos, predicción del tiempo atmosférico, renderizado de imágenes y procesamiento de audio, descifrado de códigos, etc.)
Aunque el modelo de los hilos de la programación en paralelo se ejecutan independientemente unos con respectos a otros, todos ellos pueden acceder al mismo espacio de memoria (MEMORIA COMPARTIDA) generado problemas de y condición de carrera y de colisión sino hay una sincronización perfecta de escritura, generando retardos de procesamiento ya que cada hilo se debe tomar un turno para poder leer y almacenar datos además, requiere la necesidad de algún tipo de comunicación o la coordinación entre las sub-tareas.
Hay una clase de problemas que no pueden ser divididos en sub-problemas independientes, podemos llamarlos problemas intrínsecamente secuenciales o en serie. Para estos tipos de problemas, el cálculo en una etapa no depende de los resultados de un cálculo en una etapa anterior, y por esta razón no es tan fácil de paralelizar a través de unidades de procesamiento independientes.
Fuente:
http://gribblelab.org/CBootcamp/A2_Parallel_Programming_in_C.htmlhttps://es.wikipedia.org/wiki/Condici%C3%B3n_de_carrerahttps://es.wikipedia.org/wiki/Algoritmo_paralelohttps://es.wikipedia.org/wiki/Computaci%C3%B3n_paralelaAlgoritmo Paralelo Virtualizado
Es un algoritmo que simula un paralelismo, es un caso típico de los sistemas operativos, similar a un programa gestionador ya que realiza un cambio de contexto entre las diferentes tareas, las n tareas no se ejecutan simultáneamente, simplemente se asigna un corto tiempo de ejecución a cada una de ellas, este barrido o salto entre tareas da la APARIENCIA de que todas se están ejecutándose simultáneamente, la multitarea en los actuales OS también hacen uso del verdadero procesamiento multi-core. El OS se encarga de ejecutar
1.2.2: Algoritmo seudoparalelo
Son algoritmos donde se realiza aparentemente el computo paralelo de lista argumentos, por lo general los argumentos están contendidos dentro de contenedores, en lenguaje LisP por ejemplo usan paréntesis curvos (), en lenguaje RPL usa llaves {}, en lenguaje HP-Prime usa llaves {} o paréntesis rectangulares [].
Similarmente a un Algoritmo Paralelo Virtualizado las instrucciones se efectúan en serie, para este caso se procesa uno a uno los argumentos (por pares) y al final cuando se termina de calcular la última operación o par se retorna la salida como un solo objeto. los lenguajes que soportan este paradigma de programación son LisP, RPL, HP-prime entre otros.
Ejemplo:
RPL:
{1,2,3} {4,5,6} * → {4,10,18}
LISP (PN):
*(1,2,3) (4,5,6) → (4,10,18)
HP-PRIME
mul1 := {1,2,3}*{4,5,6} → mul21 := {4,10,18}
mul2 := {{1,2},3,4}*{{5,6},7,8} → mul2 := {{5,12},21,32}
mul3 := [[1,2],3,4]*[[5,6],7,8] → mul3 := [[5,12],21,32]
pot1 := [[1,2],[3,4],[5,6]]^3 → pot3 := [[1,8],[27,64],[125,216]]
Muchas Gracias
Actualizado según aportes de abajo