Ce forum est maintenant fermé, seule cette archive statique reste consultable.
  FORUM Rue-Montgallet.com
  Programmation
  C - C++

  x64 probleme

Bas de page
Auteur Sujet :

x64 probleme

n°19741
cedm237
Profil : Jeune recrue
Posté le 19-02-2010 à 21:43:23  
 

bonjour, j'ai fait un petit programme en c++ et je compile avec visual studio 2008, j'ai un xp 64, et 2 choses me paraissent bizarres:
-en x32 le programme fonctionne en debug et en release
mais en x64, il ne fonctionne plus.
-second problème, je voudrais faire tourner mes 4 cores à fond, j'ai donc ajouter dans les propriétés la command line /MP4 et ca fait rien du tout, l'occupation core tourne à 25-30% sur l'ensemble des cores.
 
Merci pour vos réponses, @+  
 

Code :
  1. // VC11.cpp : définit le point d'entrée pour l'application console.
  2. // VC8b.cpp : définit le point d'entrée pour l'application console.
  3. //
  4. #include "stdafx.h"
  5. #include <fstream>
  6. #include <iomanip>
  7. #include <iostream>
  8. #include <cstring>
  9. #include "stdio.h"
  10. #include "stdlib.h"
  11. #include <vector>
  12. FILE *fp1;
  13. FILE *fp2;
  14. std::string;
  15. //Variable
  16. int i,h,nb_step_X,nb_step_Y,nb_step_Z,j,k,dd,n;
  17. long lenr,numf,numx,numy,recl;
  18. float xmin,xmax,ymin,ymax,zmin,zmax,x1,x2,y1,y2,z1,z2,xi,yi,zi,ai,bi,ci,fi;
  19. struct inf2 {
  20. float X, Y, Z ;
  21. float A, B, C, F ;
  22. }info2[10000000];
  23. struct juj2 {
  24. float X, Y, Z ;
  25. float A, B, C, F ;
  26. }juju2[10000000];
  27. struct moy {
  28. float X, Y, Z ;
  29. float A, B, C, F ;
  30. }moy2[10000000];
  31. int precision = 1; //mm
  32. float aa[10000000];
  33. float bb[10000000];
  34. float uu[10000000];
  35. float zz[10000000];
  36. int main()
  37. {
  38. errno_t err;
  39. //Read from data file
  40. if((err=fopen_s(&fp1,"C:\\Sample\\raysdetector.dis","rb" ))!=0)exit(-1);
  41. fseek(fp1,28,0);
  42. fread(&recl,sizeof(recl),1,fp1);
  43. lenr=recl/256/4;
  44. fseek(fp1,28+24,0);
  45. fread(&numf,4,1,fp1);
  46. fseek(fp1,3*28+16,0);
  47. fread(&ymin,4,1,fp1);
  48. fread(&ymax,4,1,fp1);
  49. fread(&numy,4,1,fp1);
  50. fseek(fp1,4*28+16,0);
  51. fread(&xmin,4,1,fp1);
  52. fread(&xmax,4,1,fp1);
  53. fread(&numx,4,1,fp1);
  54. FILE* fichier3 = NULL;
  55. fichier3 = fopen("C:\\Sample\\header.txt", "a+" );
  56. //fprintf(fichier3,"%i \ ", recl);
  57. //fprintf(fichier3,"%i \ ", numf);
  58.     //fprintf(fichier3,"%f \ ", ymin);
  59. //fprintf(fichier3,"%f \ ", ymax);
  60. fprintf(fichier3,"%i \ ", numy);
  61. //fprintf(fichier3,"%f \ ", xmin);
  62.     //fprintf(fichier3,"%f \ ", xmax);
  63. //fprintf(fichier3,"%i \n ", numx);
  64. fclose(fichier3);
  65. fread(&info2[0].X,4,1,fp1);
  66. xmin=info2[0].X;
  67. xmax=xmin;
  68. fread(&info2[0].Y,4,1,fp1);
  69. ymin=info2[0].Y;
  70. ymax=ymin;
  71. fread(&info2[0].Z,4,1,fp1);
  72. zmin=info2[0].Z;
  73. zmax=zmin;
  74. fread(&info2[0].A,4,1,fp1);
  75. fread(&info2[0].B,4,1,fp1);
  76. fread(&info2[0].C,4,1,fp1);
  77. fread(&info2[0].F,4,1,fp1);
  78. numx=-numy;
  79. //numx=100;
  80. for (long i=1;i<numx;i++)
  81. {
  82. fread(&info2[i].X,4,1,fp1);
  83.   if (xmax < (info2[i].X))
  84.      { 
  85.       xmax= info2[i].X;
  86.      } else {}
  87.   if (xmin > (info2[i].X))
  88.      {
  89.       xmin= info2[i].X;
  90.      }else {}
  91. fread(&info2[i].Y,4,1,fp1);
  92.   if (ymax < (info2[i].Y))
  93.      { 
  94.       ymax= info2[i].Y;
  95.      } else {}
  96.   if (ymin > (info2[i].Y))
  97.      {
  98.       ymin= info2[i].Y;
  99.      } else {} 
  100. fread(&info2[i].Z,4,1,fp1);
  101.   if (zmax < (info2[i].Z))
  102.      { 
  103.       zmax= info2[i].Z;
  104.      } else {}
  105.   if (zmin > (info2[i].Z))
  106.      {
  107.       zmin= info2[i].Z;
  108.      }else {}         
  109. fread(&info2[i].A,4,1,fp1);
  110. fread(&info2[i].B,4,1,fp1);
  111. fread(&info2[i].C,4,1,fp1);
  112. fread(&info2[i].F,4,1,fp1);
  113. }
  114. //build the step for smaller grid
  115. nb_step_Y=int((ymax-ymin+2)/precision);
  116. nb_step_X=int((xmax-xmin+2)/precision);
  117. nb_step_Z=int((zmax-zmin+2)/precision);
  118. //build the array with the lines by smaller grid
  119. n=0;
  120. for (long k=0;k<nb_step_X+2;k++)
  121. {
  122.     for (long j=0;j<nb_step_Y+2;j++)
  123. {
  124.     for (long l=0;l<nb_step_Z+2;l++)
  125.         {
  126.           dd=0;
  127.             for (h=0;h<numx;h++)     
  128.   {
  129.             xi=info2[h].X;
  130.   x1=xmin-0.5+precision*k;
  131.   x2=xmin+0.5+precision*k;
  132.   yi=info2[h].Y;
  133.   y1=ymin-0.5+precision*j;
  134.   y2=ymin+0.5+precision*j;
  135.   zi=info2[h].Z;
  136.   z1=zmin-0.5+precision*l;
  137.   z2=zmin+0.5+precision*l;
  138.   ai=info2[h].A;
  139.             bi=info2[h].B;
  140.             ci=info2[h].C;
  141.             fi=info2[h].F;
  142.                if (x1<xi && xi<x2 && y1<yi && yi<y2 && z1<zi && zi<z2)
  143. {
  144.                    juju2[dd].X=xi;
  145.                    juju2[dd].Y=yi;
  146.                    juju2[dd].Z=zi;
  147.                    juju2[dd].A=ai;
  148.                    juju2[dd].B=bi;
  149.                    juju2[dd].C=ci;
  150.                    juju2[dd].F=fi;
  151.      juju2[-1].X=0;
  152.      juju2[-1].Y=0;
  153.      juju2[-1].Z=0;
  154.      juju2[-1].A=0;
  155.      juju2[-1].B=0;
  156.      juju2[-1].C=0;
  157.      juju2[-1].F=0;
  158.                         moy2[dd].X = (juju2[dd-1].X+juju2[dd].X)/(dd+1);
  159.      moy2[dd].Y = (juju2[dd-1].Y+juju2[dd].Y)/(dd+1);
  160.      moy2[dd].Z = (juju2[dd-1].Z+juju2[dd].Z)/(dd+1);
  161.      moy2[dd].A = juju2[dd-1].A+juju2[dd].A;
  162.      moy2[dd].B = juju2[dd-1].B+juju2[dd].B;
  163.      moy2[dd].C = juju2[dd-1].C+juju2[dd].C;
  164.      moy2[dd].F = juju2[dd-1].F+juju2[dd].F;
  165.     dd=dd+1;
  166.     n=n+1;
  167.                  aa[n]=moy2[dd-1].X;
  168.     bb[n]=moy2[dd-1].Y;
  169.                  uu[n]=moy2[dd-1].Z;
  170.     zz[n]=moy2[dd-1].F;
  171.     } 
  172.      }
  173.         }//for l
  174.      }//for k
  175. }//for j
  176. // recording of result in file txt
  177. FILE* fichier = NULL;
  178. fichier = fopen("C:\\Sample\\donnees.txt", "a+" );
  179.   for (n=0;n<=numx;n++)
  180.    {
  181. fprintf(fichier,"%f \ ", aa[n]);
  182. fprintf(fichier,"%f \ ", bb[n]);
  183.     fprintf(fichier,"%f \ ", uu[n]);
  184. fprintf(fichier,"%f \n ", zz[n]);
  185.    }
  186.   fclose(fichier); // On ferme le fichier qui a été ouvert
  187. return 0;
  188. }

mood
Pub
Posté le 19-02-2010 à 21:43:23  
 

n°19742
cmoila
Profil : Membre
Posté le 20-02-2010 à 21:18:40  
 

Ton prog n'a qu'un seul thread, comment veux tu qu'il en utilise 4 coeurs ?
 
Quel est la taille des float en compilation x64 ?

n°19743
cedm237
Profil : Jeune recrue
Posté le 20-02-2010 à 21:29:15  
 

-merci pour ta réponse, j'ai jamais créé de thread, j'ai trouvé CreateThread sur msdn, mais je dois dire que j'ai pas compris grand chose.
je voulais diviser cette boucle:
for (long k=0;k<nb_step_X+2;k++)
 
en 2 boucles chacune traitée par 1 processeur chacunes:
for (long k=0;k<(nb_step_X+2)/2;k++)
et
for (long k=(nb_step_X+2)/2+1;k<nb_step_X+2;k++).
 
-sur les float, tu m'en demandes beaucoup, je suis pas un professionnel de la programmation, enfin toi les float tu les remplacerais par ??? pour le x64.

n°19744
cmoila
Profil : Membre
Posté le 20-02-2010 à 21:40:36  
 

Et oui, les thread c'est hyper compliqué. et en plus il suffit pas de savoir créer et lancer les thread supplémentaire, mais il faut une architecture logiciel qui nécessite plusieurs exécution simultanée , donc pas seulement séquentiel comme tu le fais.  
Il ne s'agit pas de diviser une boucle mais de lancer une partie de boucle dans deux processus différents (un processus étant rien d'autre qu'un prog. sauf qu'ensuite faut qu'ils se rejoignent en fin de traitement. Et dernière difficulté, le partage des données entre deux thread !
 
a priori les float en x64 font 8 octets, alors qu'ils en font 4 (32bits) en x32.
ce qui veut dire que tes lignes : fread(&numf,4,1,fp1);
deviennent fausses en x64
 
faut mettre au debut :  
dimfloat = sizeof( float) ;
 
et ensuite des  
fread(&numf,dimfloat,1,fp1);

n°19745
cedm237
Profil : Jeune recrue
Posté le 20-02-2010 à 22:06:00  
 

-le fichier *.dis est un binaire, venant d'un programme 32bits, donc mon cpp en x64 doit rester avec fread(&numf,4,1,fp1), non?

n°19746
cmoila
Profil : Membre
Posté le 20-02-2010 à 23:27:12  
 

Effectivement si le fichier source n'est pas créé par toi, faut pas changer les 4 octets lus a la fois.
 
Et après vérification, il semblerait que meme en x64 les float sont encore en 32bits. C'est vraiment pas clair dans l'aide où il ne parle que du x32.
Il y a moyen de forcer les float en simple précision, c'est de les déclarer en "FP32". Mais il semble que le pb doit venir d'ailleurs. Pour l'instant j'ai pas d'idée.
En tout cas meme si tu réussis a le faire tourner en 64bit, il n'y aura aucune différence de vitesse d'execution, car tu ne traites rien en 64bit.

n°19748
cmoila
Profil : Membre
Posté le 21-02-2010 à 18:14:53  
 

IL y a un pb dans ton code que j'ai pas vu hier.
 
juju2[-1].X=0;
...
et
moy2[dd].X = (juju2[dd-1].X+juju2[dd].X)/(dd+1);
...
 
avec un indice -1 tu affectes en dehors de la memoire allouée.
idem pour les cas initial ou dd=0

n°19749
cedm237
Profil : Jeune recrue
Posté le 21-02-2010 à 20:42:17  
 

t'as raison, mais ca explique pas pourquoi ca compile en x32 et pas en x64, changeons de sujet, t'as l'air bien calé en C, ce qui n'est pas mon cas
tu sais comment je peux faire ceci:
lire un fichier txt et recupérer les valeur dans une structure type:
struct inf2 {
float X, Y, Z ;
}info2[10000000];
 
le nombre data X,Y,Z se trouve juste après "point", c'est 40000
ce nombre est à récupérer et les data en X,Y,Z sont à mettre dans la structure.
 
((asap-oriented point 40000)
(x
23.4589E-3
0
0
0
54.12E3
0
0
0
0
etc...40000 data
)
(y
78.458E-3
...etc..40000data
)
(z
48.569
.....40000data
)

  FORUM Rue-Montgallet.com
  Programmation
  C - C++

  x64 probleme

© 2000-2024 Forum.rue-montgallet.com - Tous droits réservés