Casi he terminado con un algoritmo que procesa algunos enteros muy grandes (alrededor del orden de 2 elevado a la potencia de 100,000,000). Esto lleva un par de horas de código altamente paralelo en un servidor de 16 núcleos con memoria más que adecuada ya que el algoritmo no consume mucha memoria. Hago uso de la clase BigInteger en .NET 4.Uso de la GPU para acelerar los cálculos de BigInteger
Los detalles del algoritmo no son importantes, pero para el contexto, que sigue es una lista bastante exhaustiva de las operaciones realizadas en estos enteros y algunas características más destacadas del algoritmo:
- Adición/Resta.
- Multiplicación de números grandes por números pequeños.
- División de números grandes por números muy pequeños (por ejemplo, 2).
- Base 2 Log.
- Base 2 Potencia.
- Comparación de dos o más números grandes (Min/Max).
- Sin implicación alguna de los números primos.
- El algoritmo está específicamente diseñado para no consumir mucha memoria ya que el acceso al rendimiento de acceso a la memoria es más que el de algunos cálculos inteligentes sobre la marcha. Sin embargo, si el acceso a la memoria mejorara, el algoritmo podría beneficiarse razonablemente.
He optimizado el código tanto como sea posible y perfilado ahora muestra sólo dos cuellos de botella:
- Cálculo de base 2 del registro por un número tan grande.
- Comprobación de patrones predefinidos de dígitos binarios en estos números. Esto se debe a que la única forma de acceder a los datos subyacentes de BigInteger es primero usando ToByteArray en lugar de operaciones in situ. Además, operar en fragmentos de tamaño byte no ayuda al rendimiento.
Considerando el acceso a la memoria y las operaciones de registro, comencé a pensar en las GPU y si podría descargar parte del trabajo de manera efectiva. Sé muy poco sobre las GPU, excepto que están optimizadas para operaciones de coma flotante.
Mi pregunta es, usando una biblioteca como GPU .NET, ¿cómo puedo procesar números tan grandes en la GPU? ¿Puedo de alguna manera hacer uso de las optimizaciones de punto flotante para calcular el registro de tales números grandes?
Buscando un punto de partida para formar una estrategia.
¿Ha considerado usar CUDAfy.NET? http://cudafy.codeplex.com/ (Tenga en cuenta que esto es específico de NVIDIA, por lo que quizás no le sea útil) –