[visualc++] recuperer nom du CPU ?!

recuperer nom du CPU ?! [visualc++] - C++ - Programmation

Marsh Posté le 25-08-2003 à 10:15:47    

voila, j'ai des pb pour recuperer le nom du cpu, sous win XP aucun pb ac la base de registre mais sous 2000 pro ca chie, une idée..?

Reply

Marsh Posté le 25-08-2003 à 10:15:47   

Reply

Marsh Posté le 25-08-2003 à 10:20:35    

Poste le code que tu utilises, parce que là, hein.... :sarcastic:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-08-2003 à 10:45:37    

asm + cpuid :O

Reply

Marsh Posté le 25-08-2003 à 10:47:09    

chrisbk a écrit :

asm + cpuid :O


j'ai failli la faire, mais je me suis retenu [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-08-2003 à 11:39:05    

:lol:
 
et RDTSC entre deux coups de timers :D

Reply

Marsh Posté le 25-08-2003 à 11:39:40    

enfin pour CPUID/RDTSC fo faire un .SYS....

Reply

Marsh Posté le 25-08-2003 à 11:41:53    

d'ailleurs j'ai un doute pour RDTSC ! l'autre jour je m'en suis servi pour calculer le nombre de cycles d'une routine, et il ne me sort jamais le même résultat ! :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-08-2003 à 11:51:41    

Harkonnen a écrit :

d'ailleurs j'ai un doute pour RDTSC ! l'autre jour je m'en suis servi pour calculer le nombre de cycles d'une routine, et il ne me sort jamais le même résultat ! :heink:


 
etonnant [:meganne]
 
t'as mis ta routine en priorité run time ? [:dawa]


Message édité par chrisbk le 25-08-2003 à 11:52:06
Reply

Marsh Posté le 25-08-2003 à 11:51:57    

BJOne a écrit :

enfin pour CPUID/RDTSC fo faire un .SYS....


pardon ??

Reply

Marsh Posté le 25-08-2003 à 11:56:55    

chrisbk a écrit :


 
etonnant [:meganne]
 
t'as mis ta routine en priorité run time ? [:dawa]


bah non, c'était meme pas sous Win, mais sous DOS !
j'aurais parfaitement compris si la différence était faible (de l'ordre de quelques milliers de cycles), mais j'avais quand même une différence à chaque fois de plusieurs millions de cycles (je passe de 8000000 à 10000000 d'un lancement à l'autre)
et c'est sous DOS, donc le multitache n'y est pour rien [:meganne]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-08-2003 à 11:56:55   

Reply

Marsh Posté le 25-08-2003 à 11:58:59    

meme pas un vieux TSR dans un coin ? [:ddr555]
note, finalement, vu que le tps que met une instruction depend des conditions memoire (en cache ou pas...) ptet que ca joue la dessus ? :??:

Reply

Marsh Posté le 25-08-2003 à 12:06:14    

chrisbk a écrit :

meme pas un vieux TSR dans un coin ? [:ddr555]


non, mais y'a une portion de code auto généré [:dawa]
 

chrisbk a écrit :


note, finalement, vu que le tps que met une instruction depend des conditions memoire (en cache ou pas...) ptet que ca joue la dessus ? :??:


bah dans ce cas, le nombre de cycles baisserait d'un lancement à l'autre, mais là il augmente à chaque lancement ! [:gratgrat]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-08-2003 à 13:29:33    


 
bin sous un noyau NT, fo être en ring 0 pour utiliser RDTSC (pour CPUID ptet pas) il me semble....

Reply

Marsh Posté le 25-08-2003 à 13:48:30    

moi pas connaitre RDTSC, je fais du C/UNIX habituellement, la je suis en stage....et.....visual C++ sous windows, alors c un ptit peu different qd mm :-p!
 
pas d'asm svp :'(! lol
 
vous pouvez m'expliquer pour CPUID, c un soft ca non?!!!!!
 
merci pour votre aide!

Reply

Marsh Posté le 25-08-2003 à 13:52:06    

Tient si ca peut t aider (sous Windows ce qui semble etre ton cas), ca reprend ce que te disais chrishbk/harko et bjone, et ca vient de la msdn
 
CPUID.c

Code :
  1. #include <windows.h>
  2. #include "cpuid.h"
  3. // These are the bit flags that get set on calling cpuid  
  4. // with register eax set to 1  
  5. #define _MMX_FEATURE_BIT 0x00800000
  6. #define _SSE_FEATURE_BIT 0x02000000
  7. #define _SSE2_FEATURE_BIT 0x04000000
  8. // This bit is set when cpuid is called with  
  9. // register set to 80000001h (only applicable to AMD)  
  10. #define _3DNOW_FEATURE_BIT 0x80000000
  11. int IsCPUID()
  12. {
  13. __try {
  14.  _asm {
  15.   xor eax, eax
  16.    cpuid
  17.  }
  18. }
  19. __except (EXCEPTION_EXECUTE_HANDLER) {
  20.  return 0;
  21. }
  22. return 1;
  23. }
  24. /***  
  25. * int _os_support(int feature)  
  26. * - Checks if OS Supports the capablity or not  
  27. *  
  28. * Entry:  
  29. * feature: the feature we want to check if OS supports it.  
  30. *  
  31. * Exit:  
  32. * Returns 1 if OS support exist and 0 when OS doesn't support it.  
  33. *  
  34. ****************************************************************/
  35. int _os_support(int feature)
  36. {
  37. __try {
  38.  switch (feature) {
  39. case _CPU_FEATURE_SSE:
  40. __asm {
  41.  xorps xmm0, xmm0 // executing SSE instruction  
  42. }
  43. break;
  44. case _CPU_FEATURE_SSE2:
  45. __asm {
  46.  xorpd xmm0, xmm0 // executing SSE2 instruction  
  47. }
  48. break;
  49. case _CPU_FEATURE_3DNOW:
  50. __asm {
  51.  pfrcp mm0, mm0 // executing 3DNow! instruction  
  52.   emms
  53. }
  54. break;
  55. case _CPU_FEATURE_MMX:
  56. __asm {
  57.  pxor mm0, mm0 // executing MMX instruction  
  58.   emms
  59. }
  60. break;
  61.  }
  62. }
  63. __except (EXCEPTION_EXECUTE_HANDLER) {
  64.  if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) {
  65.   return 0;
  66.  }
  67.  return 0;
  68. }
  69. return 1;
  70. }
  71. /***  
  72. *  
  73. * void map_mname(int, int, const char *, char *)  
  74. * - Maps family and model to processor name  
  75. *  
  76. ****************************************************/
  77. void map_mname(int family, int model, const char *v_name, char *m_name)
  78. {
  79. // Default to name not known  
  80. m_name[0] = '\0';
  81. if (!strncmp("AuthenticAMD", v_name, 12)) {
  82.  switch (family) { // extract family code  
  83. case 4: // Am486/AM5x86  
  84. strcpy (m_name, "AMD Am486" );
  85. break;
  86. case 5: // K6  
  87. switch (model) { // extract model code  
  88. case 0:
  89. case 1:
  90. case 2:
  91. case 3:
  92. strcpy (m_name, "AMD K5" );
  93. break;
  94. case 6:
  95. case 7:
  96. strcpy (m_name, "AMD K6" );
  97. break;
  98. case 8:
  99. strcpy (m_name, "AMD K6-2" );
  100. break;
  101. case 9:
  102. case 10:
  103. case 11:
  104. case 12:
  105. case 13:
  106. case 14:
  107. case 15:
  108. strcpy (m_name, "AMD K6-3" );
  109. break;
  110. }
  111. break;
  112. case 6: // Athlon  
  113. // No model numbers are currently defined  
  114. strcpy (m_name, "AMD ATHLON" );
  115. break;
  116.  }
  117. }
  118. else if (!strncmp("GenuineIntel", v_name, 12)) {
  119.  switch (family) { // extract family code  
  120. case 4:
  121. switch (model) { // extract model code  
  122. case 0:
  123. case 1:
  124. strcpy (m_name, "INTEL 486DX" );
  125. break;
  126. case 2:
  127. strcpy (m_name, "INTEL 486SX" );
  128. break;
  129. case 3:
  130. strcpy (m_name, "INTEL 486DX2" );
  131. break;
  132. case 4:
  133. strcpy (m_name, "INTEL 486SL" );
  134. break;
  135. case 5:
  136. strcpy (m_name, "INTEL 486SX2" );
  137. break;
  138. case 7:
  139. strcpy (m_name, "INTEL 486DX2E" );
  140. break;
  141. case 8:
  142. strcpy (m_name, "INTEL 486DX4" );
  143. break;
  144. }
  145. break;
  146. case 5:
  147. switch (model) { // extract model code  
  148. case 1:
  149. case 2:
  150. case 3:
  151. strcpy (m_name, "INTEL Pentium" );
  152. break;
  153. case 4:
  154. strcpy (m_name, "INTEL Pentium-MMX" );
  155. break;
  156. }
  157. break;
  158. case 6:
  159. switch (model) { // extract model code  
  160. case 1:
  161. strcpy (m_name, "INTEL Pentium-Pro" );
  162. break;
  163. case 3:
  164. case 5:
  165. strcpy (m_name, "INTEL Pentium-II" );
  166. break; // actual differentiation depends on cache settings  
  167. case 6:
  168. strcpy (m_name, "INTEL Celeron" );
  169. break;
  170. case 7:
  171. case 8:
  172. case 10:
  173. strcpy (m_name, "INTEL Pentium-III" );
  174. break; // actual differentiation depends on cache settings  
  175. }
  176. break;
  177. case 15 | (0x00 << 4): // family 15, extended family 0x00  
  178. switch (model) {
  179. case 0:
  180. strcpy (m_name, "INTEL Pentium-4" );
  181. break;
  182. }
  183. break;
  184.  }
  185. }
  186. else if (!strncmp("CyrixInstead", v_name, 12)) {
  187.  strcpy (m_name, "Cyrix" );
  188. }
  189. else if (!strncmp("CentaurHauls", v_name, 12)) {
  190.  strcpy (m_name, "Centaur" );
  191. }
  192. if (!m_name[0]) {
  193.  strcpy (m_name, "Unknown" );
  194. }
  195. }
  196. /***  
  197. *  
  198. * int _cpuid (_p_info *pinfo)  
  199. *  
  200. * Entry:  
  201. *  
  202. * pinfo: pointer to _p_info.  
  203. *  
  204. * Exit:  
  205. *  
  206. * Returns int with capablity bit set even if pinfo = NULL  
  207. *  
  208. ****************************************************/
  209. int _cpuid (_p_info *pinfo)
  210. {
  211. DWORD dwStandard = 0;
  212. DWORD dwFeature = 0;
  213. DWORD dwMax = 0;
  214. DWORD dwExt = 0;
  215. int feature = 0;
  216. int os_support = 0;
  217. union {
  218.  char cBuf[12+1];
  219.  struct {
  220.   DWORD dw0;
  221.   DWORD dw1;
  222.   DWORD dw2;
  223.  } s;
  224. } Ident;
  225. if (!IsCPUID()) {
  226.  return 0;
  227. }
  228. _asm {
  229.  push ebx
  230.   push ecx
  231.   push edx
  232.   // get the vendor string  
  233.   xor eax, eax
  234.   cpuid
  235.   mov dwMax, eax
  236.   mov Ident.s.dw0, ebx
  237.   mov Ident.s.dw1, edx
  238.   mov Ident.s.dw2, ecx
  239.   // get the Standard bits  
  240.   mov eax, 1
  241.   cpuid
  242.   mov dwStandard, eax
  243.   mov dwFeature, edx
  244.   // get AMD-specials  
  245.   mov eax, 80000000h
  246.   cpuid
  247.   cmp eax, 80000000h
  248.   jc notamd
  249.   mov eax, 80000001h
  250.   cpuid
  251.   mov dwExt, edx
  252. notamd:
  253.  pop ecx
  254.   pop ebx
  255.   pop edx
  256. }
  257. if (dwFeature & _MMX_FEATURE_BIT) {
  258.  feature |= _CPU_FEATURE_MMX;
  259.  if (_os_support(_CPU_FEATURE_MMX))
  260.   os_support |= _CPU_FEATURE_MMX;
  261. }
  262. if (dwExt & _3DNOW_FEATURE_BIT) {
  263.  feature |= _CPU_FEATURE_3DNOW;
  264.  if (_os_support(_CPU_FEATURE_3DNOW))
  265.   os_support |= _CPU_FEATURE_3DNOW;
  266. }
  267. if (dwFeature & _SSE_FEATURE_BIT) {
  268.  feature |= _CPU_FEATURE_SSE;
  269.  if (_os_support(_CPU_FEATURE_SSE))
  270.   os_support |= _CPU_FEATURE_SSE;
  271. }
  272. if (dwFeature & _SSE2_FEATURE_BIT) {
  273.  feature |= _CPU_FEATURE_SSE2;
  274.  if (_os_support(_CPU_FEATURE_SSE2))
  275.   os_support |= _CPU_FEATURE_SSE2;
  276. }
  277. if (pinfo) {
  278.  memset(pinfo, 0, sizeof(_p_info));
  279.  pinfo->os_support = os_support;
  280.  pinfo->feature = feature;
  281.  pinfo->family = (dwStandard >> 8) & 0xF; // retrieve family  
  282.  if (pinfo->family == 15) { // retrieve extended family  
  283.   pinfo->family |= (dwStandard >> 16) & 0xFF0;
  284.  }
  285.  pinfo->model = (dwStandard >> 4) & 0xF; // retrieve model  
  286.  if (pinfo->model == 15) { // retrieve extended model  
  287.   pinfo->model |= (dwStandard >> 12) & 0xF;
  288.  }
  289.  pinfo->stepping = (dwStandard) & 0xF; // retrieve stepping  
  290.  Ident.cBuf[12] = 0;
  291.  strcpy(pinfo->v_name, Ident.cBuf);
  292.  map_mname(pinfo->family,
  293.   pinfo->model,
  294.   pinfo->v_name,
  295.   pinfo->model_name);
  296.  pinfo->checks = _CPU_FEATURE_MMX |
  297.   _CPU_FEATURE_SSE |
  298.   _CPU_FEATURE_SSE2 |
  299.   _CPU_FEATURE_3DNOW;
  300. }
  301. return feature;
  302. }


 
CPUID.h

Code :
  1. #ifndef _INC_CPUID
  2. #define _INC_CPUID
  3. #define _CPU_FEATURE_MMX 0x0001
  4. #define _CPU_FEATURE_SSE 0x0002
  5. #define _CPU_FEATURE_SSE2 0x0004
  6. #define _CPU_FEATURE_3DNOW 0x0008
  7. #define _MAX_VNAME_LEN 13
  8. #define _MAX_MNAME_LEN 30
  9. typedef struct _processor_info {
  10. char v_name[_MAX_VNAME_LEN]; // vendor name  
  11. char model_name[_MAX_MNAME_LEN]; // name of model  
  12. // e.g. Intel Pentium-Pro  
  13. int family; // family of the processor  
  14. // e.g. 6 = Pentium-Pro architecture  
  15. int model; // model of processor  
  16. // e.g. 1 = Pentium-Pro for family = 6  
  17. int stepping; // processor revision number  
  18. int feature; // processor feature  
  19. // (same as return value from _cpuid)  
  20. int os_support; // does OS Support the feature?  
  21. int checks; // mask of checked bits in feature  
  22. // and os_support fields  
  23. } _p_info;
  24. #ifdef __cplusplus
  25. extern "C"
  26. #endif
  27. int _cpuid (_p_info *);
  28. #endif


 
Exemple d'utilisation

Code :
  1. #include <stdio.h>
  2. #include "cpuid.h"
  3. void expand(int avail, int mask)
  4. {
  5. if (mask & _CPU_FEATURE_MMX) {
  6.  printf("\t%s\t_CPU_FEATURE_MMX\n",
  7.   avail & _CPU_FEATURE_MMX ? "yes" : "no" );
  8. }
  9. if (mask & _CPU_FEATURE_SSE) {
  10.  printf("\t%s\t_CPU_FEATURE_SSE\n",
  11.   avail & _CPU_FEATURE_SSE ? "yes" : "no" );
  12. }
  13. if (mask & _CPU_FEATURE_SSE2) {
  14.  printf("\t%s\t_CPU_FEATURE_SSE2\n",
  15.   avail & _CPU_FEATURE_SSE2 ? "yes" : "no" );
  16. }
  17. if (mask & _CPU_FEATURE_3DNOW) {
  18.  printf("\t%s\t_CPU_FEATURE_3DNOW\n",
  19.   avail & _CPU_FEATURE_3DNOW ? "yes" : "no" );
  20. }
  21. }
  22. void main(void)
  23. {
  24. _p_info info;
  25. _cpuid(&info);
  26. printf("v_name:\t\t%s\n", info.v_name);
  27. printf("model:\t\t%s\n", info.model_name);
  28. printf("family:\t\t%d\n", info.family);
  29. printf("model:\t\t%d\n", info.model);
  30. printf("stepping:\t%d\n", info.stepping);
  31. printf("feature:\t%08x\n", info.feature);
  32. expand(info.feature, info.checks);
  33. printf("os_support:\t%08x\n", info.os_support);
  34. expand(info.os_support, info.checks);
  35. printf("checks:\t\t%08x\n", info.checks);
  36. }

Reply

Marsh Posté le 25-08-2003 à 13:57:31    

husiana a écrit :

moi pas connaitre RDTSC


RDTSC est HS dans ce topic, c'est pour calculer le nombre de cycles qui se sont écoulés entre le moment ou le processeur a été lancé et le moment de l'appel à cette instruction (c'est de l'assembleur)
 

husiana a écrit :


pas d'asm svp :'(! lol


Ce serait pourtant le moyen le plus fiable d'obtenir ce que tu souhaites
 

husiana a écrit :


vous pouvez m'expliquer pour CPUID, c un soft ca non?!!!!!


Non, c'est une instruction assembleur qui te renvoie le CPUID du CPU.
Regarde le code de VisualC++, il est nickel et très explicite


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-08-2003 à 14:05:46    

Z:\Staff\cedric\pcany\codagemacro\newcpu\cpuid.cpp(51) : error C2400: inline assembler syntax error in 'opcode'; found 'xmm0'
Z:\Staff\cedric\pcany\codagemacro\newcpu\cpuid.cpp(56) : error C2400: inline assembler syntax error in 'opcode'; found 'xmm0'
Z:\Staff\cedric\pcany\codagemacro\newcpu\cpuid.cpp(61) : warning C4405: 'mm0' : identifier is reserved word
Z:\Staff\cedric\pcany\codagemacro\newcpu\cpuid.cpp(61) : error C2400: inline assembler syntax error in 'opcode'; found 'mm0'
Error executing cl.exe.
 
triste, c de l'asm j'suis incapable de debugger ca, vous avez une idée ?
 
et merci vous m'aider trop :-)!!!

Reply

Marsh Posté le 25-08-2003 à 14:11:10    

bon, je viens de commenter le contenu de _os_support, et ca marche presque bien, il m'affiche des choses en fait, mais le pb c qu'il me dis que j'ai un p3 alors qu'au boulot c bel et bien un celeron, est-ce parce que c le mm noyau?
 
sinon, j'ai un pb pour acceder au sujet!!! il me mets une vieille erreur, je peux seulement repondre sans pouvoir lire ?! ca etre normal un fois?

Reply

Marsh Posté le 25-08-2003 à 14:16:11    

J ai le mm pb concenrant le forum la sur ce sujet, j ai desactive ds mon profile compression zlib et html ca remarche.

Reply

Marsh Posté le 25-08-2003 à 14:20:52    

non moi ca fais tjs pareil, je dois faire "afficher le sujet en integralité" pour pouvoir le lire...!
 
sinon j'ai pensé, un celeron est un P3 d'une famille differente, dc ca dois fonctionner?
 
merci encore pour tt :-p!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed