Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3877 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Auteur Sujet :

[C\C++] Développement sur GPU : NVIDIA Cuda

n°1856050
0x90
Posté le 27-02-2009 à 15:38:44  profilanswer
 

Reprise du message précédent :

Joel F a écrit :

les GPU sont surtout faites pr des calculs data-parallel dense ... Le structures de stockage sparse implique généralement des espaces méméoires plus petit, disjoint e moins pratique à manipuler


Il me semble que dans Gpu Gems 2 ils en parlent, en utilisant une indirection avec une texture et quelques subtilités en plus pour conserver une localité décente, c'est pas aussi efficace que du dense mais ça reste ptêtre intéressant.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
mood
Publicité
Posté le 27-02-2009 à 15:38:44  profilanswer
 

n°1856078
Joel F
Real men use unique_ptr
Posté le 27-02-2009 à 17:03:18  profilanswer
 

tu dois avoir un remplissage merdique et une coallescence dramatique :/
Et de toute façon, si c'est pour ce casser à faire ça et avoir un gain de 8, autant le faire sur du quad-core avec des outils qui marchent :o

n°1856086
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2009 à 17:19:38  profilanswer
 

Ok, merci du conseil. Donc comme "outils qui marchent" pour du quad-core, tu préconiserais quoi? Ce que tu m'a dis précédemment, LAPACK tuné pour mon archi (atlas en SSE2 par exemple)?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1856088
Joel F
Real men use unique_ptr
Posté le 27-02-2009 à 17:24:46  profilanswer
 

LAPACK pour du tout fait validé qui dépote.
 
si tu tiens à rigoler en implantant un SVD parallele tout seul : OpenMP ou boost::thread pr les threads, NT² pr l'aspect SIMD automatique.
Et bon courage :o

n°1869601
Tetedeienc​h
Head Of God
Posté le 05-04-2009 à 01:40:13  profilanswer
 

Mon conseil : Cuda est une magnifique techno, peline d'avenir, mais attendez encore un peu avant de vous lancer, que ca mûrisse un peu. C'est une techno d'avenir, encore légèrement jeune, mais qui sera bientôt prête.

 

Ca fonctionne très très très bien, mais par contre :

  • L'allocation mémoire est encore bugguée : Le pilote qui connait pas encore ses limites (et qui vous autorise à allouer de la mémoire dans le pilote aéro de vista... qui va donc vous faire crasher votre magnifique appli, sans warning, sans rien, tout accès ram est revenu à 0 quand vous allez dans les 40 derniers Mo de la carte). Exemple : le driver vous raporte 950Mo de libre, allouez que 900Mo, sinon, crash... et des fois, vous pouvez aller jusque 970Mo (sous XP32 par exemple :D )
  • Les versions ne tournent pas sur toutes les cartes (cf Cuda 2.0 qui ne tournent pas sur les G80 première génération... dommage)
  • certaines limites "étranges" (pas plus de 4096 cudaMallocs sous Vista sinon crash)
  • un comportement erratique sous vista justement (bon, c'est le point 1 et 3 combinés).


Par contre, une fois stabilisé, ce sera clairement quelque chose de fantastique. Mais cela souffre encore d'erreurs de jeunesse AMHA.

 

Utilisez-la, mais évitez pour le moment de faire comme moi et d'aller dans les limites et de titiller les bornes de l'allocation mémoire, ou vous aurez des surprises...


Message édité par Tetedeiench le 05-04-2009 à 01:45:40

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°1869653
enfoiro
a nickname is just a nickname
Posté le 05-04-2009 à 13:12:48  profilanswer
 

surtout que ca se standardise vraiment autour d'openCL.

n°1869750
Joel F
Real men use unique_ptr
Posté le 05-04-2009 à 19:49:28  profilanswer
 
n°1870821
el muchach​o
Comfortably Numb
Posté le 07-04-2009 à 22:27:03  profilanswer
 

Tu fais quoi avec, Tetedeiench ?


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1870897
burn2
Pour ceux qui viendront après
Posté le 08-04-2009 à 09:54:08  profilanswer
 

http://forum.hardware.fr/hfr/Overc [...] 7556_1.htm :o


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°1872443
el muchach​o
Comfortably Numb
Posté le 13-04-2009 à 11:15:51  profilanswer
 

Je sais pas si c'est passé, mais il y a une belle série d'articles sur Dr Dobb's:
http://www.ddj.com/hpc-high-perfor [...] /207200659


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
mood
Publicité
Posté le 13-04-2009 à 11:15:51  profilanswer
 

n°1872651
Joel F
Real men use unique_ptr
Posté le 14-04-2009 à 10:38:11  profilanswer
 

Encore des benchs foireux :/
Ils oublient de dire que sur le Q6700, SSE2+OpenMP vont à peu prés aussi vite que leur x12 quoi [:dawa] pour un effort similaire et plus portable.

 

Le jour ou NVIDIA et consort arreteront leur mauvaise fois, on y verra plus clair.

 

Et le priceless :

 
Citation :


To perform useful work, data must be transferred between the memory space of the host computer and CUDA device(s). For this reason, performance results must include IO time to be informative. Colleagues have also referred to these as "Honest Flops" because they more accurately reflect the performance applications will deliver in production.

 

Chez moi, on doit FORCEMENT mesurer des HFLOPS sinon ca sert à rien :D


Message édité par Joel F le 14-04-2009 à 10:39:28
n°1880271
elsass gam​er
Posté le 03-05-2009 à 13:06:17  profilanswer
 

c'est un monstre cette tesla.

n°1971884
aziz1803
Posté le 08-03-2010 à 11:11:11  profilanswer
 

salut!
je suis un débutant en CUDA. j'ai une carte GPU EN9800GT, j'ai téléchargé cuda toolkit 2.3 et le cuda sdk 2.3 comme dans les instructions d'installation. là j'essaye de compiler et exécuter le projet template fourni avec les sources mais ça marche pas. je me pose donc la question: la carte GPU accepte-t-elle deux "entrées" à la fois (l'écran branché à la GPU et les algorithmes qu'on lui envoie)?  
quelqu'un a une petite idée SVP?
 
ps: je travaille sur win XP 32bits et VS2008.

n°1972364
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 09-03-2010 à 17:19:21  profilanswer
 

Oui, la carte accepte les deux entrées. Par contre c'est pas supporté pour VS2008 il me semble, lu ici : http://codereflect.com/2008/09/26/ [...] -visual-c/

n°1976818
enfoiro
a nickname is just a nickname
Posté le 24-03-2010 à 14:31:06  profilanswer
 


 
openCL :  :jap:  
 
au moins c'est portable et standard...
 
ca m'a tj fait marrer les devs trop proches du hard : en général ils pronent des solutions non évolutives.
 
le hard s'adapte au soft, et non l'inverse.
 
les jeux ps3 tournent bien et les devs ne s'amusent plus a optimiser le placement des pixels en mémoire.
 
les seules technos viables sur le long terme sont des standards et ouverts de surcroit.
 
le reste périt obligatoirement du fait de la complexité inutile engendrées et des difficultés rencontrées.
 
arm, x86, http, c, fortran, xvid, dvd
 
vs wma, aac, atrac, les disquettes amstrad, les nombreux ports video des macs, 3dfx et le glide, ...
 
et il est impératif de ne jamais mettre tous ses oeufs dans le meme panier, ce conseil est digne de la  
ménagère et pourtant, s'applique bien ici, sinon on n'a plus de comparaison par exemple possible pour  
l'execution d'un code...
 
toutes les bibs d'opti à terme seront en language standard, ce qui permet de surcroit de comparer deux
archis à code constant, et d'illustrer le rôle du compilateur.
 
En bref remettre ce paradigme à zéro c'est revenir en arrière et s'auto limiter pour le futur.
 
Et avant de cracher sur openCL essaie de savoir si il permet de coder efficacement ce que tu veux faire...
 
 

n°1996978
cHacAL31
Jamais parlé de Boobs&Guns !
Posté le 29-05-2010 à 00:32:40  profilanswer
 

[:gaga drapal]
 
il y a d'autres topic sur la programmation gpu (en particulier opencl) ou c'est le seul :??:


---------------
Tests debiles | Jeu TV mystere | !!! Frappez Raymond !!!!
n°1997012
Joel F
Real men use unique_ptr
Posté le 29-05-2010 à 12:26:32  profilanswer
 

enfoiro a écrit :


Et avant de cracher sur openCL essaie de savoir si il permet de coder efficacement ce que tu veux faire...


 
Avant de parler renseigne toi :o

n°1997013
Joel F
Real men use unique_ptr
Posté le 29-05-2010 à 12:26:53  profilanswer
 

cHacAL31 a écrit :

[:gaga drapal]il y a d'autres topic sur la programmation gpu (en particulier opencl) ou c'est le seul :??:


 
y a que celui la, poses ta question ;)

n°1997015
cHacAL31
Jamais parlé de Boobs&Guns !
Posté le 29-05-2010 à 12:39:21  profilanswer
 

Joel F a écrit :

 

y a que celui la, poses ta question ;)

 

j'avais pas spécialement de question pour l'instant (débutant-inside) mais au cas où : est-ce qu'il y a déjà de bonnes librairies opencl (pas trop pourraves à prendre en main et efficaces en temps calcul) de résolution de gros systèmes linéaires prêtes en gpu ou est-ce que je suis bon pour finir le code que j'ai commencé ?

 

edit: j'ai vu qu'en cuda il y avait un cula pour ça mais je préfère tenter ma chance sur opencl :/


Message édité par cHacAL31 le 29-05-2010 à 12:40:22

---------------
Tests debiles | Jeu TV mystere | !!! Frappez Raymond !!!!
n°1997054
Joel F
Real men use unique_ptr
Posté le 29-05-2010 à 15:07:41  profilanswer
 

openCL est encore tres peu mature. Y a pas mal de chose faites en CUDA avec des performances corrects.

n°1997363
Evadream -​jbd-
Posté le 31-05-2010 à 00:26:11  profilanswer
 

“Believe it or Not! Multi-core CPUs Can Match GPU Performance for FLOP-intensive Application!”
 
Un chouette article, avec très certainement des choses discutables dans l'implémentation CUDA, mais rafraîchissant.

n°1997477
Joel F
Real men use unique_ptr
Posté le 31-05-2010 à 11:37:30  profilanswer
 

\o/ enfin :o

n°1997916
GrosBocdel
Posté le 01-06-2010 à 12:50:17  profilanswer
 

il a pris une gtx 285, il a donc plafonné à 720 Glops.
Avec une Gtx 480 il serait monté à 1.3 TFlops et donc sa publi elle serait passée à la trappe.

n°2001374
Joel F
Real men use unique_ptr
Posté le 14-06-2010 à 08:27:01  profilanswer
 

Figure 1 : Apprendre à GrosBoc la notion de délai de publications ...

n°2001381
cHacAL31
Jamais parlé de Boobs&Guns !
Posté le 14-06-2010 à 08:52:05  profilanswer
 

Figure 2 : "c'est moi qui est le plus gros flop..." :o


---------------
Tests debiles | Jeu TV mystere | !!! Frappez Raymond !!!!
n°2001382
Joel F
Real men use unique_ptr
Posté le 14-06-2010 à 08:54:53  profilanswer
 

aussi ^^

n°2001634
GrosBocdel
Posté le 15-06-2010 à 08:30:12  profilanswer
 

A la même époque, il pouvait le faire avec des Tesla.  [:maverick10]  [:the cart:3]  [:schimble]

n°2001636
Joel F
Real men use unique_ptr
Posté le 15-06-2010 à 08:51:29  profilanswer
 

Tesla qui avait encore le probleme de Dual Issues.

n°2001644
cHacAL31
Jamais parlé de Boobs&Guns !
Posté le 15-06-2010 à 09:08:36  profilanswer
 

pour changer, une vraie question GPU : sous opencl il y a un truc que j'ai du mal à comprendre c'est le rôle du local_work_size dans le EnqueueNDRangeKernel

clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);

 

d'après ce que j'ai vu on peut mettre NULL et dans ce cas il gère par défaut, mais d'après les tests que j'ai fait selon la taille du problème à faire tourner il vaut mieux mettre un local_work_size >0 et dans ce cas global_work_size=n * local_work_size... mais ça ne change absolument pas la valeur du global_work_size qui correspond toujours à la vraie taille de mon problème ! dans ce cas comment on gère le local_work_size :??: :pt1cable:

Message cité 1 fois
Message édité par cHacAL31 le 15-06-2010 à 09:09:27

---------------
Tests debiles | Jeu TV mystere | !!! Frappez Raymond !!!!
n°2001652
burn2
Pour ceux qui viendront après
Posté le 15-06-2010 à 09:35:12  profilanswer
 

Les spec d'openCL 1.1 sont sorties. :)


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°2001666
GrosBocdel
Posté le 15-06-2010 à 09:56:39  profilanswer
 

cHacAL31 a écrit :

pour changer, une vraie question GPU : sous opencl il y a un truc que j'ai du mal à comprendre c'est le rôle du local_work_size dans le EnqueueNDRangeKernel

clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);


 
d'après ce que j'ai vu on peut mettre NULL et dans ce cas il gère par défaut, mais d'après les tests que j'ai fait selon la taille du problème à faire tourner il vaut mieux mettre un local_work_size >0 et dans ce cas global_work_size=n * local_work_size... mais ça ne change absolument pas la valeur du global_work_size qui correspond toujours à la vraie taille de mon problème ! dans ce cas comment on gère le local_work_size :??: :pt1cable:


 
Effectivement, openCL gère tout seul ces aspects, par défaut.
De tête parce que je n'ai pas les documents sous la main, ton local_work_size c'est le nombre de threads par blocs dans la dénomination utilisée par cuda : 32, 64, 128, 256, 512, (1024).
Ton global_work_size c'est la taille de tes données.

n°2001667
GrosBocdel
Posté le 15-06-2010 à 09:57:11  profilanswer
 

burn2 a écrit :

Les spec d'openCL 1.1 sont sorties. :)


 
C''est infernal, ya pas moyen de suivre.

n°2001671
cHacAL31
Jamais parlé de Boobs&Guns !
Posté le 15-06-2010 à 10:04:03  profilanswer
 

burn2 a écrit :

Les spec d'openCL 1.1 sont sorties. :)


 
c'est cette version qui doit enfin gérer les chargements en mémoire décalés de kernels ?
 

GrosBocdel a écrit :


 
Effectivement, openCL gère tout seul ces aspects, par défaut.
De tête parce que je n'ai pas les documents sous la main, ton local_work_size c'est le nombre de threads par blocs dans la dénomination utilisée par cuda : 32, 64, 128, 256, 512, (1024).
Ton global_work_size c'est la taille de tes données.


 
pour les valeurs du local_work_size j'ai testé avec un peu n'importe quoi (du moment que c'était inférieur à la valeur  512 indiquée par ma carte et que c'était un diviseur du global_work_size) et la seule différence que j'y ai vu  c'était que sur NULL j'avais pour des données assez grosses une segmentation fault et que pour d'autres valeurs j'arrivais à les faire passer... ça ne m"aide pas à comprendre comment ça marche et comment le calibrer automatiquement :(


---------------
Tests debiles | Jeu TV mystere | !!! Frappez Raymond !!!!
n°2001674
burn2
Pour ceux qui viendront après
Posté le 15-06-2010 à 10:07:14  profilanswer
 

cHacAL31 a écrit :


 
c'est cette version qui doit enfin gérer les chargements en mémoire décalés de kernels ?
 


Je te laisse vérifier par toi même:
http://www.khronos.org/registry/cl [...] cl-1.1.pdf  :D  


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
n°2043006
White Sh4d​ow
GHz-O-Meter !
Posté le 18-12-2010 à 12:55:15  profilanswer
 

Bonjour tout le monde,
 
J'aimerais savoir si l'emplacement est adéquat à ma question :
J'aimerais de l'aide pour porter un programme c++ très parallélisable , sur ma 8800 GTS 512, qui doit probablement savoir exécuter le code plus vite que mon processeur. CUDA étant une facon de le faire si j'ai bien compris.
 
Merci, n'hésiter pas à me rediriger si je ne me trouve pas dans le bon thread  :jap:  (Celui ci me semblait être le plus propice à me répondre).


Message édité par White Sh4dow le 18-12-2010 à 12:56:41
n°2043008
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 18-12-2010 à 13:16:50  profilanswer
 

Vazy, balance...

n°2043010
White Sh4d​ow
GHz-O-Meter !
Posté le 18-12-2010 à 13:31:26  profilanswer
 

Je sais que c'est pas facile à lire comme code, je suis pas très doué mais voilà, ca me fait plaisir si vous pouvez m'aider.
 
Pour ceux que ça intéressent : à la base c'est un problème de calcul d’électromagnétisme, mais ne vous intéressez pas à la formule qui se trouve au final dans la condition, vous n'allez probablement rien comprendre (c'est normal ^^).
 
Edit : Je vous remercie d'avance  :jap:  
 

Code :
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <fstream>
  5. using namespace std;
  6. int main()
  7. {
  8. cout << "Ce programme n'est garantit que pour des lambdas dont la precision n'excede pas le millieme." << endl<<endl;
  9. //Ici on définit les constantes du problème
  10. double lambda = 0.3; // la longueur d'onde
  11. double Zc = 50;
  12. ofstream impedances;//lien vers le fichier
  13. impedances.open ("impedances.txt", ios::out|ios::trunc); // ouverture du fichier
  14. //Ici on définit RL, un vecteur de 100'000 valeurs possibles, par incréments de 0.01
  15. vector <double> RL;
  16. for (int i = 0; i < 100000; i++)
  17. {   RL.push_back(i/100.0);}
  18. cout << "Premiere matrice RL chargee." << endl;
  19. //Ici on définit RX, un vecteur de 300'000 valeurs possibles, par incréments de 0.01
  20. vector <double> XL;
  21. for (int i = 0; i < 300000; i++)
  22. { XL.push_back((- 150000 + i)/100.0);}
  23. cout << "Deuxieme matrice XL chargee." << endl;
  24. //Ici on définit d1, un vecteur de 150 valeurs possibles, par incréments de 0.001
  25. vector <double> d1;
  26. for (int i = 0; i < int(lambda*1000/2); i++)
  27. { d1.push_back(i/1000.0);}
  28. cout << "Troisieme matrice d1 chargee." << endl;
  29. //Ici on définit d1, un vecteur de 150 valeurs possibles, par incréments de 0.001
  30. vector <double> d2;
  31. for (int i = 0; i < int(lambda*1000/2) ; i++)
  32. { d2.push_back(i/1000.0);}
  33. cout << "Derniere matrice d2 chargee." << endl<<endl;
  34. //Ici on cherche les valeurs de RL,XL,d1,d2 pour lesquelles on a moins de 0.05 d'erreur.
  35. //On note ces résultats dans un fichier impédances.
  36. for (int i = 0; i < 100000; i++){
  37.     cout << i << " eme valeur de RL sur 100'000." << endl << endl << endl;
  38.     for (int j = 0; j < 300000; j++)
  39.     {
  40.         for (int k = 0; k < int(lambda*1000/2); k++)
  41.         {
  42.             for (int l = 0; l < int(lambda*1000/2); l++)
  43.             {
  44.             //impedances<< i << "ème valeur de RL sur 100'000." << endl << endl << endl;
  45.             double D1 = tan(2*M_PI*d1[k]/lambda);
  46.             double D2 = tan(2*M_PI*d2[l]/lambda);
  47.             if
  48.             (abs(((Zc*RL[i]*D1*(Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j]))-Zc*D1*RL[i]*(Zc*D2+XL[j]))
  49.             /( RL[i]*RL[i] + (Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j]))*
  50.             (Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j]))))-40) <= 0.05
  51.             &&
  52.             abs((Zc*RL[i]*RL[i]*D1+ Zc*D1*(Zc*D2+XL[j])*(Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j])))
  53.             /( RL[i]*RL[i] + (Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j]))*
  54.            (Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j])))) <= 0.05)
  55.                 {
  56.                 cout << i << "\t\tImpedance trouvee : RL = " << RL[i]
  57.                      << " XL = " << XL[j] << " d1 = " << d1[k] << " d2 = " << d2[l] << endl;
  58.             impedances<< i << "\t\tImpedance trouvee : RL = " << RL[i]
  59.                      << " XL = " << XL[j] << " d1 = " << d1[k] << " d2 = " << d2[l] << endl;
  60.                 }
  61.             }
  62.         }
  63.     }
  64. }
  65. impedances.close();
  66. return 0;
  67. };

Message cité 1 fois
Message édité par White Sh4dow le 18-12-2010 à 13:32:11
n°2043017
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 18-12-2010 à 15:43:55  profilanswer
 

Effectivement, ça semble être un cas d'école. Je ne vais pas écrire le programme pour toi, mais tu devrais pouvoir y arriver simplement en suivant les exemples donnés par le guide de programmation.  
 
Ici, ton problème se prête bien à une parallélisation mono-dimensionnelle : tu vas te contenter d'écrire la fonction qui est dans la première boucle for sous forme de fonction cuda, et demander à 100 000 noyaux de l'exécuter.
 
Tu devras cependant faire une petite modification, dans la façon dont tu gères tes différentes matrices de valeurs possibles (d'ailleurs je ne suis pas sûr que ce soit très pertinent, même dans le cas présent) : plutôt que de calculer les valeurs dans la phase d'initialisation, et de les stocker en mémoire, il sera nettement plus rentable de les faire calculer au fur et à mesure des calculs par chacun des fils d'exécution de ton gpu. L'expression de chacun de tes vecteurs en fonction de i, j, k et l est triviale. Ça t'évitera des accès mémoire dans la mémoire globale au coût prohibitif.
 
(De façon général, déjà que c'est mal de programmer en français, c'est pire si on fait des fautes d'orthographe. Et c'est vraiment très inélégant ces deux boucles for de construction et d'utilisation des vecteur, en plus d'être source à des erreurs d'exécution.)

n°2043030
bjone
Insert booze to continue
Posté le 18-12-2010 à 18:12:36  profilanswer
 

White Sh4dow a écrit :

Je sais que c'est pas facile à lire comme code, je suis pas très doué mais voilà, ca me fait plaisir si vous pouvez m'aider.
 
Pour ceux que ça intéressent : à la base c'est un problème de calcul d’électromagnétisme, mais ne vous intéressez pas à la formule qui se trouve au final dans la condition, vous n'allez probablement rien comprendre (c'est normal ^^).
 
Edit : Je vous remercie d'avance  :jap:  
 

Code :
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <fstream>
  5. using namespace std;
  6. int main()
  7. {
  8. cout << "Ce programme n'est garantit que pour des lambdas dont la precision n'excede pas le millieme." << endl<<endl;
  9. //Ici on définit les constantes du problème
  10. double lambda = 0.3; // la longueur d'onde
  11. double Zc = 50;
  12. ofstream impedances;//lien vers le fichier
  13. impedances.open ("impedances.txt", ios::out|ios::trunc); // ouverture du fichier
  14. //Ici on définit RL, un vecteur de 100'000 valeurs possibles, par incréments de 0.01
  15. vector <double> RL;
  16. for (int i = 0; i < 100000; i++)
  17. {   RL.push_back(i/100.0);}
  18. cout << "Premiere matrice RL chargee." << endl;
  19. //Ici on définit RX, un vecteur de 300'000 valeurs possibles, par incréments de 0.01
  20. vector <double> XL;
  21. for (int i = 0; i < 300000; i++)
  22. { XL.push_back((- 150000 + i)/100.0);}
  23. cout << "Deuxieme matrice XL chargee." << endl;
  24. //Ici on définit d1, un vecteur de 150 valeurs possibles, par incréments de 0.001
  25. vector <double> d1;
  26. for (int i = 0; i < int(lambda*1000/2); i++)
  27. { d1.push_back(i/1000.0);}
  28. cout << "Troisieme matrice d1 chargee." << endl;
  29. //Ici on définit d1, un vecteur de 150 valeurs possibles, par incréments de 0.001
  30. vector <double> d2;
  31. for (int i = 0; i < int(lambda*1000/2) ; i++)
  32. { d2.push_back(i/1000.0);}
  33. cout << "Derniere matrice d2 chargee." << endl<<endl;
  34. //Ici on cherche les valeurs de RL,XL,d1,d2 pour lesquelles on a moins de 0.05 d'erreur.
  35. //On note ces résultats dans un fichier impédances.
  36. for (int i = 0; i < 100000; i++){
  37.     cout << i << " eme valeur de RL sur 100'000." << endl << endl << endl;
  38.     for (int j = 0; j < 300000; j++)
  39.     {
  40.         for (int k = 0; k < int(lambda*1000/2); k++)
  41.         {
  42.             for (int l = 0; l < int(lambda*1000/2); l++)
  43.             {
  44.             //impedances<< i << "ème valeur de RL sur 100'000." << endl << endl << endl;
  45.             double D1 = tan(2*M_PI*d1[k]/lambda);
  46.             double D2 = tan(2*M_PI*d2[l]/lambda);
  47.             if
  48.             (abs(((Zc*RL[i]*D1*(Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j]))-Zc*D1*RL[i]*(Zc*D2+XL[j]))
  49.             /( RL[i]*RL[i] + (Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j]))*
  50.             (Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j]))))-40) <= 0.05
  51.             &&
  52.             abs((Zc*RL[i]*RL[i]*D1+ Zc*D1*(Zc*D2+XL[j])*(Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j])))
  53.             /( RL[i]*RL[i] + (Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j]))*
  54.            (Zc*D2+XL[j]+D1*D2*(RL[i]-XL[j])))) <= 0.05)
  55.                 {
  56.                 cout << i << "\t\tImpedance trouvee : RL = " << RL[i]
  57.                      << " XL = " << XL[j] << " d1 = " << d1[k] << " d2 = " << d2[l] << endl;
  58.             impedances<< i << "\t\tImpedance trouvee : RL = " << RL[i]
  59.                      << " XL = " << XL[j] << " d1 = " << d1[k] << " d2 = " << d2[l] << endl;
  60.                 }
  61.             }
  62.         }
  63.     }
  64. }
  65. impedances.close();
  66. return 0;
  67. };



 
avant de penser à cuda, un peu de refactorisation peut pas faire de mal.
 
- resize() un bon coup et []= au lieu de faire des push_back
- dans ton if, t'as moultes termes utilisées plusieures fois, utilise des variables pour les évaluer une seul fois.
 
- si ce que tu mets dans tes vectors sont bien des constantes stupides (ie i/100.0), alors benne tes vectors, et utilise un for( double truc =  0 ; .... ; truc += 0.01 ) ou le /100 dans la boucle. éjecte un max d'accès mémoire.


Message édité par bjone le 18-12-2010 à 18:17:27
n°2043039
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 18-12-2010 à 19:04:52  profilanswer
 

Reserve et non resize à ce compte là [:dks:1]
 
(mais benner les vecteurs, c'est mieux :jap:)

n°2043043
White Sh4d​ow
GHz-O-Meter !
Posté le 18-12-2010 à 19:31:39  profilanswer
 

Bonsoir messieurs,
Je suis heureux de voir que vous répondez :)
 
Alors à mon tour :
 
hephaestos :  
>> Tu me conseils de voir "les exemples donnés par le guide de programmation", mais quel guide ? Le guide CUDA sur le site nVidia officiel ?
>> "Il sera nettement plus rentable de les faire calculer au fur et à mesure des calculs par chacun des fils d'exécution de ton gpu. Ça t'évitera des accès mémoire dans la mémoire globale au coût prohibitif." Je prends note, merci.
>> "Et c'est vraiment très inélégant ces deux boucles for de construction et d'utilisation des vecteur." Je ne suis pas sûr de comprendre. Penses-tu qu'il serait plus intelligent de ne pas créer de vecteur et d'utiliser des valeurs qui seront générées au fur et à mesure de leur appellation ?
(>> Pour la langue française je suis conscient que je ne suis pas une bête, veux tu bien me préciser où se trouvent mes erreurs ? Ça m'aidera à les corriger, merci.)
 
bjone :
>> Je suis pour toute simplification ! Je vais voir ce que je peux faire au niveau de la factorisation. C'est vrai que j'ai balancé la formule comme calculée directement sans penser à la simplifier au maximum.
>>  Pour le resize() je me demande si en fait, il ne serait pas mieux de manipuler des vecteurs de taille fixe ( des tableaux ). Qu'en pensez vous ?
>> pour la boucle for et les /100, j'avais jamais pensé à utiliser autre chose que des nombre entiers je dois vous avouer ^^, je vais donc faire ceci :
for(double i = 0; i < C; i += 0.01){...}
Quel vision étroite de ma part !
 
J'ai apprécié tous vos commentaires et suggestions, et je vous en remercie.
 
PS : je crois que je vais virer les vecteurs, ils servent à rien en fait... j'essaye de faire un code trop propre mais là pour du calcul comme ça, je perds trop en performance.
 
J'ai vu le temps que ça me prenait sur mon Q6600 @ 3.6 GHz, il me faut 11 ans... Mais c'est sans parallélisation.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

Aller à :
Ajouter une réponse
 

Sujets relatifs
[JAVA] recherche un framework de développement RADle développement des applications web
Développement DirectX9, trop tard?Question pour le développement d'un site
Developpement de projetMCU SIP en CUDA
Développement MacroEvaluer un Ingénieur développement
Plus de sujets relatifs à : [C\C++] Développement sur GPU : NVIDIA Cuda


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)