Vous ne pouvez pas obtenir d'estimation de MFLOPS/GFLOPS de référence uniquement à partir des résultats de bande passante mémoire de STREAM. Vous avez besoin de connaître deux autres paramètres: pic MFLOPS/GFLOPS de votre noyau CPU (mieux que les opérations max FLOP par cycle d'horloge avec toutes les variantes d'instructions vectorielles et limites de fréquence CPU: min, mean, max) et aussi GFLOPS/GBytes (flops to octets ratio, Arithmetic Intensity) de chaque programme que vous devez estimer (chaque Benchmark NAS). Le benchmark Stream a une très faible intensité arithmétique (0 DP = FP64 flops par deux opérandes doubles = 2 * 8 octets en copie, 1 flop par 16 octets en Scale, 1 flops/24 octets en Add et 2 flops/24 octets dans Triad). Ainsi, le benchmark Stream est limité par la bande passante mémoire dans les exécutions correctes (et par la bande passante du cache dans les exécutions incorrectes). De nombreux points de référence peuvent avoir plus
Avec ces données (bande passante mémoire, max Gflops/GHz sur différents niveaux de vectorisation, normal/maximale/basse fréquence de cpu, intensité arithmétique du test), vous pouvez commencer à utiliser le modèle de performance ligne de toit https://crd.lbl.gov/departments/computer-science/PAR/research/roofline/
avec ligne de toit vous avez axe x avec flops/octet; y axe de GFlop/s (les deux sont à l'échelle logarithmique). La ligne du "toit" se compose de deux parties pour chaque CPU (ou machine).
La première partie est inclinée et correspond à une faible intensité arithmétique. Les applications de cette partie devront attendre que les données soient chargées depuis la mémoire, elles n'ont pas de données à exploiter avec la vitesse de GFlop/s du CPU; les tests sont limités par la mémoire. Cette ligne est définie par le benchmark STREAM.
La deuxième partie de la ligne est droite, elle correspond à une intensité plus élevée. Les tâches ici ne sont pas limitées par la bande passante mémoire, elles sont limitées par les FLOPS disponibles. Et pour CPU moderne, toutes les flops ne sont disponibles que avec une large instruction vectorielle (parallélisme d'instruction), et toutes les tâches ne peuvent utiliser des vecteurs les plus larges:
Et combien d'opérations sont effectuées pour chaque accès à la mémoire? OpsPerAccess * MemoryBandwidth/sec = ops/s – enhzflep
@enhzflep Comment obtenir l'OpsPerAccess? sall j'utilise un outil et utilise l'application pour le trouver? – Matrix
Aucune idée. Si vous avez seulement le nombre d'accès par seconde, c'est le seul chiffre que j'imagine que vous pouvez utiliser en combinaison avec le seul autre chiffre que vous avez - la bande passante mémoire. Selon la taille des boucles internes, je regarde simplement l'assemblage généré et le calcule grossièrement à la main. Naturellement, ce calcul ne prendra pas en compte des choses comme les erreurs de cache, etc. Malheureusement, je suppose que vous n'avez pas assez d'informations pour générer quoi que ce soit de mieux qu'une estimation vague et approximative des performances de votre application. – enhzflep