Se connecter / S'enregistrer

Résolu X64 probleme

Solutions (8)
Tags :
  • Programme
  • Programmation
|
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 debud 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, @+

voilà je joint le 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.  
  5. #include "stdafx.h"
  6. #include <fstream>
  7. #include <iomanip>
  8. #include <iostream>
  9. #include <cstring>
  10. #include "stdio.h"
  11. #include "stdlib.h"
  12. #include <vector>
  13.  
  14. FILE *fp1;
  15. FILE *fp2;
  16. std::string;
  17.  
  18. //Variable
  19. int i,h,nb_step_X,nb_step_Y,nb_step_Z,j,k,dd,n;
  20. long lenr,numf,numx,numy,recl;
  21. float xmin,xmax,ymin,ymax,zmin,zmax,x1,x2,y1,y2,z1,z2,xi,yi,zi,ai,bi,ci,fi;
  22.  
  23. struct inf2 {
  24. float X, Y, Z ;
  25. float A, B, C, F ;
  26. }info2[10000000];
  27.  
  28. struct juj2 {
  29. float X, Y, Z ;
  30. float A, B, C, F ;
  31. }juju2[10000000];
  32. struct moy {
  33. float X, Y, Z ;
  34. float A, B, C, F ;
  35. }moy2[10000000];
  36.  
  37. int precision = 1; //mm
  38.  
  39. float aa[10000000];
  40. float bb[10000000];
  41. float uu[10000000];
  42. float zz[10000000];
  43. int main()
  44. {
  45.  
  46. errno_t err;
  47. //Read from data file
  48. if((err=fopen_s(&fp1,"C:\\Sample\\raysdetector.dis","rb"))!=0)exit(-1);
  49. fseek(fp1,28,0);
  50. fread(&recl,sizeof(recl),1,fp1);
  51. lenr=recl/256/4;
  52. fseek(fp1,28+24,0);
  53. fread(&numf,4,1,fp1);
  54. fseek(fp1,3*28+16,0);
  55. fread(&ymin,4,1,fp1);
  56. fread(&ymax,4,1,fp1);
  57. fread(&numy,4,1,fp1);
  58. fseek(fp1,4*28+16,0);
  59. fread(&xmin,4,1,fp1);
  60. fread(&xmax,4,1,fp1);
  61. fread(&numx,4,1,fp1);
  62. FILE* fichier3 = NULL;
  63. fichier3 = fopen("C:\\Sample\\header.txt", "a+");
  64. //fprintf(fichier3,"%i \ ", recl);
  65. //fprintf(fichier3,"%i \ ", numf);
  66. //fprintf(fichier3,"%f \ ", ymin);
  67. //fprintf(fichier3,"%f \ ", ymax);
  68. fprintf(fichier3,"%i \ ", numy);
  69. //fprintf(fichier3,"%f \ ", xmin);
  70. //fprintf(fichier3,"%f \ ", xmax);
  71. //fprintf(fichier3,"%i \n ", numx);
  72. fclose(fichier3);
  73. fread(&info2[0].X,4,1,fp1);
  74. xmin=info2[0].X;
  75. xmax=xmin;
  76. fread(&info2[0].Y,4,1,fp1);
  77. ymin=info2[0].Y;
  78. ymax=ymin;
  79. fread(&info2[0].Z,4,1,fp1);
  80. zmin=info2[0].Z;
  81. zmax=zmin;
  82. fread(&info2[0].A,4,1,fp1);
  83. fread(&info2[0].B,4,1,fp1);
  84. fread(&info2[0].C,4,1,fp1);
  85. fread(&info2[0].F,4,1,fp1);
  86. numx=-numy;
  87. //numx=100;
  88. for (long i=1;i<numx;i++)
  89. {
  90. fread(&info2[i].X,4,1,fp1);
  91. if (xmax < (info2[i].X))
  92. {
  93. xmax= info2[i].X;
  94. } else {}
  95. if (xmin > (info2[i].X))
  96. {
  97. xmin= info2[i].X;
  98. }else {}
  99. fread(&info2[i].Y,4,1,fp1);
  100. if (ymax < (info2[i].Y))
  101. {
  102. ymax= info2[i].Y;
  103. } else {}
  104. if (ymin > (info2[i].Y))
  105. {
  106. ymin= info2[i].Y;
  107. } else {}
  108. fread(&info2[i].Z,4,1,fp1);
  109. if (zmax < (info2[i].Z))
  110. {
  111. zmax= info2[i].Z;
  112. } else {}
  113. if (zmin > (info2[i].Z))
  114. {
  115. zmin= info2[i].Z;
  116. }else {}
  117. fread(&info2[i].A,4,1,fp1);
  118. fread(&info2[i].B,4,1,fp1);
  119. fread(&info2[i].C,4,1,fp1);
  120. fread(&info2[i].F,4,1,fp1);
  121. }
  122. //build the step for smaller grid
  123. nb_step_Y=int((ymax-ymin+2)/precision);
  124. nb_step_X=int((xmax-xmin+2)/precision);
  125. nb_step_Z=int((zmax-zmin+2)/precision);
  126. //build the array with the lines by smaller grid
  127. n=0;
  128. for (long k=0;k<nb_step_X+2;k++)
  129. {
  130. for (long j=0;j<nb_step_Y+2;j++)
  131. {
  132. for (long l=0;l<nb_step_Z+2;l++)
  133. {
  134. dd=0;
  135. for (h=0;h<numx;h++)
  136. {
  137. xi=info2[h].X;
  138. x1=xmin-0.5+precision*k;
  139. x2=xmin+0.5+precision*k;
  140. yi=info2[h].Y;
  141. y1=ymin-0.5+precision*j;
  142. y2=ymin+0.5+precision*j;
  143. zi=info2[h].Z;
  144. z1=zmin-0.5+precision*l;
  145. z2=zmin+0.5+precision*l;
  146. ai=info2[h].A;
  147. bi=info2[h].B;
  148. ci=info2[h].C;
  149. fi=info2[h].F;
  150. if (x1<xi && xi<x2 && y1<yi && yi<y2 && z1<zi && zi<z2)
  151. {
  152. juju2[dd].X=xi;
  153. juju2[dd].Y=yi;
  154. juju2[dd].Z=zi;
  155. juju2[dd].A=ai;
  156. juju2[dd].B=bi;
  157. juju2[dd].C=ci;
  158. juju2[dd].F=fi;
  159. juju2[-1].X=0;
  160. juju2[-1].Y=0;
  161. juju2[-1].Z=0;
  162. juju2[-1].A=0;
  163. juju2[-1].B=0;
  164. juju2[-1].C=0;
  165. juju2[-1].F=0;
  166. moy2[dd].X = (juju2[dd-1].X+juju2[dd].X)/(dd+1);
  167. moy2[dd].Y = (juju2[dd-1].Y+juju2[dd].Y)/(dd+1);
  168. moy2[dd].Z = (juju2[dd-1].Z+juju2[dd].Z)/(dd+1);
  169. moy2[dd].A = juju2[dd-1].A+juju2[dd].A;
  170. moy2[dd].B = juju2[dd-1].B+juju2[dd].B;
  171. moy2[dd].C = juju2[dd-1].C+juju2[dd].C;
  172. moy2[dd].F = juju2[dd-1].F+juju2[dd].F;
  173. dd=dd+1;
  174. n=n+1;
  175. aa[n]=moy2[dd-1].X;
  176. bb[n]=moy2[dd-1].Y;
  177. uu[n]=moy2[dd-1].Z;
  178. zz[n]=moy2[dd-1].F;
  179. }
  180. }
  181. }//for l
  182. }//for k
  183. }//for j
  184. // recording of result in file txt
  185. FILE* fichier = NULL;
  186. fichier = fopen("C:\\Sample\\donnees.txt", "a+");
  187. for (n=0;n<=numx;n++)
  188. {
  189. fprintf(fichier,"%f \ ", aa[n]);
  190. fprintf(fichier,"%f \ ", bb[n]);
  191. fprintf(fichier,"%f \ ", uu[n]);
  192. fprintf(fichier,"%f \n ", zz[n]);
  193. }
  194. fclose(fichier); // On ferme le fichier qui a été ouvert
  195. return 0;
  196. }
Contenus similaires
Meilleure solution
partage
|
En fait, tu donnes en paramètre un pointeur sur la fonction à exécuter à parallèle. Je te suggère de partir de l'exemple et de faire des tests pour bien comprendre.
  • Commenter cette solution |
Score
0
òh
òi
|
Meilleure réponse sélectionnée par cedm237.
  • Commenter cette réponse |
Score
0
òh
òi
|
ca semble bien compliqué, j'ai rien compris à la mise en oeuvre.
  • Commenter cette réponse |
Score
0
òh
òi
|
Il te faut créer un thread avec CreateThread.
Un exemple ici:
http://msdn.microsoft.com/en-us/library/ms682516%28VS.85%29.aspx
  • Commenter cette réponse |
Score
0
òh
òi
|
ok, disons que divise cette boucle:
for (long k=0;k<nb_step_X+2;k++)

en 2 boucles chacune traitée par 1 processeur:
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++)

quel serait la syntaxe?
  • Commenter cette réponse |
Score
0
òh
òi
|
C'est dans la conception de ton programme. Tu dois chercher ce qui peut se calculer en parallèle, et comment synchroniser les calculs. Ensuite tu gères threads (dépendant de l'OS) avec leur lancement et synchronisation.
  • Commenter cette réponse |
Score
0
òh
òi
|
merci, comment on parallélise ce petit programme?
  • Commenter cette réponse |
Score
0
òh
òi
|
Il faut mettre le code en code par citation. :) 

Ensuite tu ne fais pas de calcul parallèle (aucun thread), alors je ne vois pas pourquoi tu aurais plus d'un core qui exécuterait ton programme.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS