¿Cómo puede el paralelismo mejorar el algoritmo de fuerza bruta?

Digamos que tiene el siguiente algoritmo de fuerza bruta (muy inútil):

#include

usando el espacio de nombres estándar;

int main ()
{
para (int i = 0; i <10000; i ++)
{
si ((i% 123) == 45)
cout << i << endl;
}
devuelve 0;
}

Todo lo que hace es calcular qué números entre 0 y 10 000 divididos por 123 tienen un resto de 45 (probando cada posibilidad, que es la fuerza bruta).

Como probablemente pueda ver, este algoritmo requiere 10 000 iteraciones en un hilo (lo que llevará un tiempo ‘largo’). Ahora, si tuviéramos que implementar este algoritmo en paralelo (por ejemplo, en una tarjeta de video CUDA). Podríamos comenzar 10 000 hilos paralelos y terminar todo el algoritmo en una iteración. Esto hace que el algoritmo se ejecute ~ 10 000 veces más rápido que uno anterior.

El paralelismo no mejora el algoritmo, solo ejecuta partes de él al mismo tiempo, haciendo que se ejecute más rápido.

Hay muchos tipos de mejora sobre la fuerza bruta.

1, aislamiento y seguridad. Supongamos que tiene un servidor web multiproceso que distribuye cada conexión a un subproceso. De esta manera, los usuarios están lógicamente aislados. Tenga en cuenta que incluso si solo hay un núcleo de CPU que maneja todas las solicitudes (por lo tanto, su único paralelismo lógico en lugar de un paralelismo distribuido real), esto sigue siendo superior al hilo único solo porque la seguridad, la distribución fácil, la reutilización y la lógica de código clara.

2, rendimiento. Muchos trabajos en clúster usan Map-Reduce o marcos de cómputo similares para manejar datos grandes y distribuidos. Los trabajos en Map-Reduce tienen una estructura de programa similar que realiza muchos trabajos de forma independiente y repetida con un gran conjunto de entradas. Al usar el marco de Me gusta de Map-Reduce, el tiempo de ejecución sería aproximadamente inversamente proporcional a la fuerza bruta.

3, Modulización, escalabilidad e independencia. Cosas como MPI separarán un gran programa en varios módulos independientes y, por lo tanto, cada uno de ellos se puede implementar, implementar y portar por separado. Tenga en cuenta que MPI también mejorará el rendimiento para muchas aplicaciones.

Eso es lo que sé como las ventajas más importantes para el paralelismo. Estoy seguro de que todavía hay muchos puntos para ello.

More Interesting

¿Hay algún algoritmo que un principiante pueda adoptar para resolver un Cubo de Rubik a partir de cualquier configuración?

¿Cuál crees que es la razón por la cual las personas pueden resolver acertijos complejos? ¿Es práctica o nacen genios?

Si quiero resolver problemas del mundo real, ¿qué debo hacer, encontrar esos problemas y luego aprender las estructuras de datos y algoritmos requeridos o viceversa?

¿Cómo se realiza la agrupación en el sondeo lineal en hashing con direccionamiento abierto?

¿Debería concentrarme en dominar algoritmos y estructuras de datos o desarrollar una buena aplicación? ¿Qué es más necesario a largo plazo?

¿Hay algún patrón abstracto para medir qué tan bueno eres en algoritmos?

¿Cuál es el algoritmo más rápido para generar números primos y su complejidad?

¿Qué tipo de algoritmo es efectivo (95-100%) para detectar hasta 15 dentro de una habitación?

Suponiendo una memoria infinita, ¿siempre es posible aumentar la complejidad de cualquier programa sin introducir redundancia?

¿Puedes ser bueno en la programación pero malo en los algoritmos?

¿Qué tan valioso sería ser ubicado para aprender la estructura de datos usando C?

¿Podría alguien ayudarme con el problema del algoritmo 'Intervalo casi ordenado'?

¿Por qué el ordenamiento rápido se denomina 'rápido' incluso cuando tiene complejidad O (n2) en el peor de los casos?

¿Qué es un algoritmo para generar todos los gráficos?

Cómo verificar si un árbol no binario está equilibrado en altura