Comment puis-je trouver par programmation la fréquence du processeur avec C
J'essaie de savoir si il est de toute façon pour avoir une idée de la fréquence du PROCESSEUR du système mon code C est en cours d'exécution sur.
De préciser, je suis à la recherche d'une solution abstraite, (qui ne sera pas lié à une architecture spécifique ou OS) qui peut me donner une idée de la fréquence de fonctionnement de l'ordinateur que mon code est en cours d'exécution sur. Je n'ai pas besoin d'être exact, mais je voudrais être dans le ballon parc (ie. J'ai un processeur 2,2 GHz, je voudrais être en mesure de dire dans mon programme que je suis dans un délai de quelques centaines de MHz)
Quelqu'un a une idée de l'utilisation standard de code C?
source d'informationauteur Mike | 2012-07-29
Vous devez vous connecter pour publier un commentaire.
Comment vous trouvez la fréquence du PROCESSEUR est à la fois l'architecture ET de l'OS à charge, et il n'y a pas de solution abstraite.
Si nous étions plus de 20 ans et ont été à l'aide d'un OS avec pas de changement de contexte et la CPU exécuté les instructions données dans l'ordre, vous pouvez écrire du code C dans une boucle et l'heure, puis, en fonction de l'assemblée il a été compilé en calculer le nombre d'instructions lors de l'exécution. C'est déjà faire l'hypothèse que chaque instruction prend 1 cycle d'horloge, ce qui est plutôt une mauvaise hypothèse depuis pipeline processeurs.
Mais tout système d'exploitation moderne vous permettra de basculer entre plusieurs processus. Même alors, vous pouvez tenter de fois qu'un tas de identique
for
boucle s'exécute (sans tenir compte du temps nécessaire pour les défauts de page et de multiples autres raisons pour lesquelles votre processeur de décrochage) et d'obtenir une valeur médiane.Et même si la solution précédente ne fonctionne, vous avez multi-problème de processeurs. Avec n'importe quel processeur moderne, c'est le jeu juste à changer l'ordre de vos instructions, numéro un tas d'entre eux dans le même cycle d'horloge, ou même de les diviser entre les cœurs.
Il est possible de trouver une solution générale qui obtient la fréquence de fonctionnement correctement pour un fil ou plusieurs fils. Cela n'a pas besoin d'admin/root, soit l'accès à un modèle spécifique registres. J'ai testé sur Linux et Windows sur des processeurs Intel, y compris, Nahalem, Ivy Bridge et Haswell avec un socket jusqu'à quatre sockets (40 sujets). Les résultats de tous s'écartent de moins de 0,5% de réponses correctes. Avant que je vous montre comment faire cela, laissez-moi vous montrer les résultats (à partir de GCC 4.9 et MSVC2013):
J'ai eu l'idée de ce à partir de ce lien
http://randomascii.wordpress.com/2013/08/06/defective-heat-sinks-causing-garbage-gaming/
Pour ce faire, vous vous faites d'abord ce que vous faites depuis 20 ans. Vous écrire un peu de code avec une boucle où vous savez que le temps de latence et le temps. Voici ce que j'ai utilisé:
Cela a un boucle de dépendance si le CPU ne peut pas réorganiser pour réduire le temps de latence. Il prend toujours 3 cycles d'horloge par itération. Le système d'exploitation ne migrent pas le thread à un autre cœur parce que nous allons lier les fils.
Ensuite, vous exécutez cette fonction sur chaque noyau physique. Je l'ai fait avec OpenMP. Le filetage doit être lié à cela. Sous linux avec GCC, vous pouvez utiliser
export OMP_PROC_BIND=true
pour lier les fils et en supposant que vous avezncores
physique core faire aussiexport OMP_NUM_THREADS=ncores
. Si vous souhaitez par programme de lier et de trouver le nombre de cœurs physiques pour les processeurs Intel voir ce par programmation-détecter-nombre-de-physique-processeurs-carottes-ou-si-hyper-threading et fil-affinity-avec-windows-msvc-et-openmp.Enfin exécuter l'échantillonneur dans une boucle et d'imprimer les résultats
Je n'ai pas testé sur des processeurs AMD. Je pense que les processeurs AMD avec les modules d'e.g Bulldozer) auront à se lier à chaque module et non pas de chaque AMD "de base". Cela pourrait être fait avec
export GOMP_CPU_AFFINITY
avec GCC. Vous pouvez trouver plein d'exemple à https://bitbucket.org/zboson/frequency qui fonctionne sur Windows et Linux sur processeurs Intel et correctement trouver le nombre de cœurs physiques pour les processeurs Intel (au moins depuis Nahalem) et les lie à chaque physiques de base (sans l'aide deOMP_PROC_BIND
qui MSVC n'a pas).Par souci d'exhaustivité, il y a déjà une solution simple, rapide, précise, en mode utilisateur de la solution avec un énorme inconvénient: il fonctionne sur Intel Skylake, Kabylake et les nouveaux processeurs. L'exigence exacte est le CPUID niveau de 16h soutien. Selon Intel Software developer's Manual 325462 libération 59, page 770:
CPUID.16h.EAX = Processeur de Base de la Fréquence (en MHz);
CPUID.16h.EBX = Maximum de la Fréquence (en MHz);
CPUID.16h.ECX = Bus (de Référence) de la Fréquence (en MHz).
Visual Studio 2015 exemple de code:
La fréquence du CPU est un matériel de chose, donc il n'y a pas de méthode générale que vous pouvez appliquer pour l'obtenir, il dépendra aussi de l'OS que vous utilisez.
Par exemple, si vous utilisez Linux, vous pouvez lire le fichier /proc/cpuinfo ou vous pouvez analyser les dmesg journal de démarrage pour obtenir cette valeur, ou si vous voulez, vous pouvez voir comment le noyau linux de gérer ce genre de choses ici et essayer de personnaliser le code pour répondre à votre besoin :
https://github.com/torvalds/linux/blob/master/arch/x86/kernel/cpu/proc.c
Ce qui concerne.
J'imagine une façon pour obtenir la fréquence de l'horloge à partir d'un logiciel est par le codage en dur des connaissances en Matériel Manuel de Référence(GRH) dans le logiciel. Vous pouvez lire l'horloge des registres de configuration du logiciel. En supposant que vous savez la source de la fréquence de l'horloge, le logiciel peut utiliser le multiplicateur et diviseur valeurs de l'horloge des registres et d'appliquer des formules appropriées comme indiqué dans la GRH pour dériver la fréquence de l'horloge.