Desde un punto de vista de supercomputación, es mejor no pensar en la carga de CPU / GPU en porcentaje, sino más bien determinar cuántas operaciones necesita su problema y compararlas con el rendimiento máximo del sistema.
Si obtiene un 100% de utilización de la CPU, no significa necesariamente que obtenga todo el rendimiento del sistema. Las CPU a menudo pueden hacer varias cosas diferentes al mismo tiempo, digamos una división y una adición. Si puede comenzar la división temprano, posiblemente se puede superponer con la adición. Lo más probable es que su CPU de escritorio tenga una unidad fuera de servicio que reordene las declaraciones para beneficiarse de tales solapamientos. O si tienes el siguiente programa:
if (expr1)
expr2;
else
expr3;
Una CPU reordenada intentará calcular las tres expresiones al mismo tiempo y luego descartará el resultado de una de ellas. Esto lo hace más rápido en general. Si tiene algún bloqueador en su programa y no puede reordenar, entonces está utilizando menos carriles en la CPU, pero probablemente seguirá apareciendo al 100%.
Entonces tienes funciones SIMD en las CPU que son operaciones vectoriales. Es como GPGPU-light en el sentido de que normalmente solo tiene cuatro u ocho operaciones al mismo tiempo, las GPU hacen como 32 o 64. Aún así, tiene que usar eso para arrancar los FLOPS.
Cosas como el uso compartido falso pueden llevar a un alto costo de sincronización que generalmente aparece como carga del kernel en Linux. La CPU se utiliza por completo, pero no tiene un rendimiento útil.
He hecho algo de programación en una máquina IBM Blue Gene / Q. Tiene muchos niveles de jerarquía ( esquema de Blue Gene / L obsoleto) y es por lo tanto difícil de programar eficientemente. Tendrá que usar la jerarquía completa hasta SIMD y SMT (Intel llama a este HyperThreading) para obtener el rendimiento.
Y luego la red a menudo te limita. Por lo tanto, resulta que es más rápido en el tiempo (reloj de pared) calcular las cosas en varias CPU al mismo tiempo en lugar de comunicarse a través de la red. Esto pondrá más carga en las CPU y hará que el programa se ejecute más rápido. Pero el rendimiento real del programa no es tan bueno como parece a partir de los números en bruto.
Si agrega GPU a la mezcla, será aún más difícil organizar todo esto para obtener un rendimiento. Esa será una de las cosas que comenzaré a hacer en mi Tesis de Maestría de QCD de Lattice en un par de meses.