struct donne
{
double Int;
double Ext;
double IntExt;
}
puis un tableau aloué statiquement pour le moment
donne Tab[1024];
Ma question est assez simple, dans quel ordre en memoire, sont les données ?
Est-ce que je peux faire un truc du genre :
double *ptr=&Tab[0].Int;
for (int i=0;i<256;i++,ptr+=3)
{
*ptr=1.0;
}
Afin d'initialiser tous les champ Int de toutes les classes du tableau ?
Et si oui est-ce que ca reste valable si je fait un tableau dynamique à la C
(new/delete) ? ou avec std::vector<donne> ?
| >> Ca dépend donc du contexte. May, y-a-t-il en effet une raison pour | > laquelle | >> tu veux itérer sur un pointeur vers double plutôt que de passer par | >> Tab[i].Int ? | >> | >> -- | >> Sam | > | > Désolée, j'ai eu une coupure reseau cette journée | > Effectivement , je veux utiliser la Vector Math Library de la MKL pour | > "unpack" un tableau de double dans un tableau d'objets de 3 doubles. | > | > En fait j'ai un tableau de double nommé Int a mettre dans tous les champs | > Int des mes classes "donne". | > Pour cela la MKL propose une fonction unpack dans la sous librairie VML | > mais pour cela j'ai besoin d'un offset constant. | > | > Tout le probleme est affaire de performance la MKL utilisant le cache L2 | > du processeur, c'est en moyenne 3 fois plus rapide qu'une boucle "for" | > (comme proposé). | > | > J'espere etre claire .... c'est pas sur | | si si, je vois la situation. | | alors comme je disais, le tout est de t'assurer que sizeof(donne) est un | multiple de sizeof(double) | Si c'est un programme que tu dois juste compiler toi-même, tu peux supposer | que c'est le cas et faire : | | #include <cassert> | double *ptr=&Tab[0].Int; | assert(sizeof(donnee) % sizeof(double) == 0); | for (int i=0;i<256;i++,ptr+= sizeof(donnee)/sizeof(double))
Pourquoi ne pas simplement mettre la taille de Tab utilisée dans sa déclaration ?
-- Gaby
Samuel Krempp <krempp@crans.truc.en.trop.ens-cachan.fr> writes:
| >> Ca dépend donc du contexte. May, y-a-t-il en effet une raison pour
| > laquelle
| >> tu veux itérer sur un pointeur vers double plutôt que de passer par
| >> Tab[i].Int ?
| >>
| >> --
| >> Sam
| >
| > Désolée, j'ai eu une coupure reseau cette journée
| > Effectivement , je veux utiliser la Vector Math Library de la MKL pour
| > "unpack" un tableau de double dans un tableau d'objets de 3 doubles.
| >
| > En fait j'ai un tableau de double nommé Int a mettre dans tous les champs
| > Int des mes classes "donne".
| > Pour cela la MKL propose une fonction unpack dans la sous librairie VML
| > mais pour cela j'ai besoin d'un offset constant.
| >
| > Tout le probleme est affaire de performance la MKL utilisant le cache L2
| > du processeur, c'est en moyenne 3 fois plus rapide qu'une boucle "for"
| > (comme proposé).
| >
| > J'espere etre claire .... c'est pas sur
|
| si si, je vois la situation.
|
| alors comme je disais, le tout est de t'assurer que sizeof(donne) est un
| multiple de sizeof(double)
| Si c'est un programme que tu dois juste compiler toi-même, tu peux supposer
| que c'est le cas et faire :
|
| #include <cassert>
| double *ptr=&Tab[0].Int;
| assert(sizeof(donnee) % sizeof(double) == 0);
| for (int i=0;i<256;i++,ptr+= sizeof(donnee)/sizeof(double))
Pourquoi ne pas simplement mettre la taille de Tab utilisée dans sa
déclaration ?
| >> Ca dépend donc du contexte. May, y-a-t-il en effet une raison pour | > laquelle | >> tu veux itérer sur un pointeur vers double plutôt que de passer par | >> Tab[i].Int ? | >> | >> -- | >> Sam | > | > Désolée, j'ai eu une coupure reseau cette journée | > Effectivement , je veux utiliser la Vector Math Library de la MKL pour | > "unpack" un tableau de double dans un tableau d'objets de 3 doubles. | > | > En fait j'ai un tableau de double nommé Int a mettre dans tous les champs | > Int des mes classes "donne". | > Pour cela la MKL propose une fonction unpack dans la sous librairie VML | > mais pour cela j'ai besoin d'un offset constant. | > | > Tout le probleme est affaire de performance la MKL utilisant le cache L2 | > du processeur, c'est en moyenne 3 fois plus rapide qu'une boucle "for" | > (comme proposé). | > | > J'espere etre claire .... c'est pas sur | | si si, je vois la situation. | | alors comme je disais, le tout est de t'assurer que sizeof(donne) est un | multiple de sizeof(double) | Si c'est un programme que tu dois juste compiler toi-même, tu peux supposer | que c'est le cas et faire : | | #include <cassert> | double *ptr=&Tab[0].Int; | assert(sizeof(donnee) % sizeof(double) == 0); | for (int i=0;i<256;i++,ptr+= sizeof(donnee)/sizeof(double))
Pourquoi ne pas simplement mettre la taille de Tab utilisée dans sa déclaration ?
Pourquoi ne pas simplement mettre la taille de Tab utilisée dans sa déclaration ?
parceque je pensais plus à ce 256 et que j'ai copier-collé :)
-- Sam
Michaël Monerau
Mickael Pointier wrote:
Non, car tu n'as aucune garantie que sizeof(donne)==3; Sur un système 32 bits par exemple, ce ne serait pas étonnant que sizeof(donne)==4;
C'est moi qui suit dans la quatrième dimension ???
Disons sur un PC x86 en Win32, sizeof(double) ca vaut 8 (et sizeof(float) vaut 4).
Si je fait sur mon PC sizeof(donne) j'obtient 24.
sizeof() ca donne bien la taille (paddée) de la somme des tailles des éléments, non ??? Ca donne pas le nombre d'élément ?
En effet, Arnaud a dû écrire un peu trop vite... sizeof renvoie bien la taille en octets de la structure paddée. Dans ton cas, 8x3, qui tombe juste sur un multiple de 4, et qui donc n'est pas paddée. -- <=- Michaël "Cortex" Monerau -=>
Mickael Pointier wrote:
Non, car tu n'as aucune garantie que sizeof(donne)==3; Sur un système
32 bits par exemple, ce ne serait pas étonnant que sizeof(donne)==4;
C'est moi qui suit dans la quatrième dimension ???
Disons sur un PC x86 en Win32, sizeof(double) ca vaut 8 (et
sizeof(float) vaut 4).
Si je fait sur mon PC sizeof(donne) j'obtient 24.
sizeof() ca donne bien la taille (paddée) de la somme des tailles des
éléments, non ??? Ca donne pas le nombre d'élément ?
En effet, Arnaud a dû écrire un peu trop vite... sizeof renvoie bien la
taille en octets de la structure paddée. Dans ton cas, 8x3, qui tombe juste
sur un multiple de 4, et qui donc n'est pas paddée.
--
<=- Michaël "Cortex" Monerau -=>
Non, car tu n'as aucune garantie que sizeof(donne)==3; Sur un système 32 bits par exemple, ce ne serait pas étonnant que sizeof(donne)==4;
C'est moi qui suit dans la quatrième dimension ???
Disons sur un PC x86 en Win32, sizeof(double) ca vaut 8 (et sizeof(float) vaut 4).
Si je fait sur mon PC sizeof(donne) j'obtient 24.
sizeof() ca donne bien la taille (paddée) de la somme des tailles des éléments, non ??? Ca donne pas le nombre d'élément ?
En effet, Arnaud a dû écrire un peu trop vite... sizeof renvoie bien la taille en octets de la structure paddée. Dans ton cas, 8x3, qui tombe juste sur un multiple de 4, et qui donc n'est pas paddée. -- <=- Michaël "Cortex" Monerau -=>
Gabriel Dos Reis
writes:
| "Mickael Pointier" wrote in message | news:<bkpjae$qgk$... | > Gabriel Dos Reis wrote: | > > Samuel Krempp writes: | | > >> le Tuesday 23 September 2003 13:59, | > >> écrivit : | | > >>>> double *ptr=&Tab[0].Int; | > >>>> for (int i=0;i<256;i++,ptr+=3) | | > >>> for (int i = 0; i < 256; ++i, ptr += sizeof (donne)) | > >> mais là je pense que tu as oublié de déclarer ptr comme tu le veux | > >> au préalable : | > >> void * ptr | > >> (et il faut faire des casts dans la boucle) | | > > Non. Je n'ai rien oublié. En fait, déclarer ptr de type « void* » | > > rend l'arithmétique invalide. | | > J'ai du louper un morceau. | | Seulement le fait que Gaby n'a pas dormi hier soir, ou quelque chose de | semblable.
Tu es très mal informé.
| C'est rare qu'il se plante dans quelque chose d'aussi gros, | mais c'est la seconde fois aujourd'hui.
et la seconde est ?
-- Gaby
kanze@gabi-soft.fr writes:
| "Mickael Pointier" <mpointie@eden-studios.fr> wrote in message
| news:<bkpjae$qgk$1@reader1.imaginet.fr>...
| > Gabriel Dos Reis wrote:
| > > Samuel Krempp <krempp@crans.truc.en.trop.ens-cachan.fr> writes:
|
| > >> le Tuesday 23 September 2003 13:59, dosreis@cmla.ens-cachan.fr
| > >> écrivit :
|
| > >>>> double *ptr=&Tab[0].Int;
| > >>>> for (int i=0;i<256;i++,ptr+=3)
|
| > >>> for (int i = 0; i < 256; ++i, ptr += sizeof (donne))
| > >> mais là je pense que tu as oublié de déclarer ptr comme tu le veux
| > >> au préalable :
| > >> void * ptr
| > >> (et il faut faire des casts dans la boucle)
|
| > > Non. Je n'ai rien oublié. En fait, déclarer ptr de type « void* »
| > > rend l'arithmétique invalide.
|
| > J'ai du louper un morceau.
|
| Seulement le fait que Gaby n'a pas dormi hier soir, ou quelque chose de
| semblable.
Tu es très mal informé.
| C'est rare qu'il se plante dans quelque chose d'aussi gros,
| mais c'est la seconde fois aujourd'hui.
| "Mickael Pointier" wrote in message | news:<bkpjae$qgk$... | > Gabriel Dos Reis wrote: | > > Samuel Krempp writes: | | > >> le Tuesday 23 September 2003 13:59, | > >> écrivit : | | > >>>> double *ptr=&Tab[0].Int; | > >>>> for (int i=0;i<256;i++,ptr+=3) | | > >>> for (int i = 0; i < 256; ++i, ptr += sizeof (donne)) | > >> mais là je pense que tu as oublié de déclarer ptr comme tu le veux | > >> au préalable : | > >> void * ptr | > >> (et il faut faire des casts dans la boucle) | | > > Non. Je n'ai rien oublié. En fait, déclarer ptr de type « void* » | > > rend l'arithmétique invalide. | | > J'ai du louper un morceau. | | Seulement le fait que Gaby n'a pas dormi hier soir, ou quelque chose de | semblable.
Tu es très mal informé.
| C'est rare qu'il se plante dans quelque chose d'aussi gros, | mais c'est la seconde fois aujourd'hui.
et la seconde est ?
-- Gaby
Christophe Lephay
"Gabriel Dos Reis" a écrit dans le message de news:
"Christophe Lephay" writes: | Une autre possibilité qui me vient : sizeof( char ) == 1, mais avec 1 = 4 | octets pour ce qui concerne l'arithmétique des pointeurs ?
oui.
Thx (bis)
Chris
"Gabriel Dos Reis" <dosreis@cmla.ens-cachan.fr> a écrit dans le message de
news:flllsfpp5b.fsf@sel.cmla.ens-cachan.fr...
"Christophe Lephay" <christophe-lephay@wanadoo.fr> writes:
| Une autre possibilité qui me vient : sizeof( char ) == 1, mais avec 1 = 4
| octets pour ce qui concerne l'arithmétique des pointeurs ?
"Gabriel Dos Reis" a écrit dans le message de news:
"Christophe Lephay" writes: | Une autre possibilité qui me vient : sizeof( char ) == 1, mais avec 1 = 4 | octets pour ce qui concerne l'arithmétique des pointeurs ?
oui.
Thx (bis)
Chris
Michel Michaud
Dans news:AF0cb.63112$, Michaël
En effet, Arnaud a dû écrire un peu trop vite... sizeof renvoie bien la taille en octets de la structure paddée. Dans ton cas, 8x3,
Non, sizeof donne la taille en multiple de la taille des char (car sizeof(char)==1 que char soit sur un octet, sur plusieurs ou même sur un nombre de bits non multiple de 8...).
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Dans news:AF0cb.63112$hd6.632164@news.chello.at, Michaël
En effet, Arnaud a dû écrire un peu trop vite... sizeof renvoie
bien la taille en octets de la structure paddée. Dans ton cas, 8x3,
Non, sizeof donne la taille en multiple de la taille des char (car
sizeof(char)==1 que char soit sur un octet, sur plusieurs ou même
sur un nombre de bits non multiple de 8...).
--
Michel Michaud mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
En effet, Arnaud a dû écrire un peu trop vite... sizeof renvoie bien la taille en octets de la structure paddée. Dans ton cas, 8x3,
Non, sizeof donne la taille en multiple de la taille des char (car sizeof(char)==1 que char soit sur un octet, sur plusieurs ou même sur un nombre de bits non multiple de 8...).
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
kanze
Gabriel Dos Reis wrote in message news:...
writes:
| C'est rare qu'il se plante dans quelque chose d'aussi gros, mais | c'est la seconde fois aujourd'hui.
et la seconde est ?
Tu as dit que :
typedef int I ; unsigned I i ;
était légal.
Je sais qu'on n'est pas toujours d'accord sur la façon à interpréter la norme, mais là, c'était un peu gros.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> wrote in message
news:<flwubzl3s1.fsf@sel.cmla.ens-cachan.fr>...
kanze@gabi-soft.fr writes:
| C'est rare qu'il se plante dans quelque chose d'aussi gros, mais
| c'est la seconde fois aujourd'hui.
et la seconde est ?
Tu as dit que :
typedef int I ;
unsigned I i ;
était légal.
Je sais qu'on n'est pas toujours d'accord sur la façon à interpréter la
norme, mais là, c'était un peu gros.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
| C'est rare qu'il se plante dans quelque chose d'aussi gros, mais | c'est la seconde fois aujourd'hui.
et la seconde est ?
Tu as dit que :
typedef int I ; unsigned I i ;
était légal.
Je sais qu'on n'est pas toujours d'accord sur la façon à interpréter la norme, mais là, c'était un peu gros.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Gabriel Dos Reis
writes:
| Gabriel Dos Reis wrote in message | news:... | > writes: | | > | C'est rare qu'il se plante dans quelque chose d'aussi gros, mais | > | c'est la seconde fois aujourd'hui. | | > et la seconde est ? | | Tu as dit que : | | typedef int I ; | unsigned I i ; | | était légal. | | Je sais qu'on n'est pas toujours d'accord sur la façon à interpréter la | norme, mais là, c'était un peu gros.
un peu gros pour toi, très probablement. Dois-je installer un compteur en ton nom ? (je n'y avais pas pensé jusqu'à présent).
-- Gaby
kanze@gabi-soft.fr writes:
| Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> wrote in message
| news:<flwubzl3s1.fsf@sel.cmla.ens-cachan.fr>...
| > kanze@gabi-soft.fr writes:
|
| > | C'est rare qu'il se plante dans quelque chose d'aussi gros, mais
| > | c'est la seconde fois aujourd'hui.
|
| > et la seconde est ?
|
| Tu as dit que :
|
| typedef int I ;
| unsigned I i ;
|
| était légal.
|
| Je sais qu'on n'est pas toujours d'accord sur la façon à interpréter la
| norme, mais là, c'était un peu gros.
un peu gros pour toi, très probablement.
Dois-je installer un compteur en ton nom ?
(je n'y avais pas pensé jusqu'à présent).
| Gabriel Dos Reis wrote in message | news:... | > writes: | | > | C'est rare qu'il se plante dans quelque chose d'aussi gros, mais | > | c'est la seconde fois aujourd'hui. | | > et la seconde est ? | | Tu as dit que : | | typedef int I ; | unsigned I i ; | | était légal. | | Je sais qu'on n'est pas toujours d'accord sur la façon à interpréter la | norme, mais là, c'était un peu gros.
un peu gros pour toi, très probablement. Dois-je installer un compteur en ton nom ? (je n'y avais pas pensé jusqu'à présent).
-- Gaby
May
"Samuel Krempp" a écrit dans le message de news:3f70953b$0$20634$
Pourquoi ne pas simplement mettre la taille de Tab utilisée dans sa déclaration ?
parceque je pensais plus à ce 256 et que j'ai copier-collé :)
-- Sam
Au temps pour moi, c'est effectivement pas 256 dan sla boucle mais 1024 (la taille de mon tableau).
A cause de la future utilisation de la MKL, il me faut tester ce que va faire la MKL pour copier. Pour etre plus claire, j'ai ceci :
struct donne { double Int; double Ext; double IntExt; };
double Int[1024]; donne Tab[1024]; //puis a remplacer par std::vector<donne> Tab(1024);
Je veux maintenant copier le tableau Int dans les champs Tab[x].Int Mais pour des problemes de performances, je doit utiliser la MKL. Or la MKL est codée en C et pas en C++ ou je ne sais trop quoi .... Donc sa facon d'acceder a la memoire est par pointeur. Donc exit, les tests (oui oui je teste ce que va faire la MKL) du type : for (...) { Tab[i].Int=1.0; } ou ptr->Int=1.0; Je ne doit pas utiliser l'interface de classe mais un acces memoire direct.
Donc pour m'assurer que la MKL copie au bon endroit dans la memoire, il faut lui donner l'offset entre 2 Champs Int dans le tableau Tab (ie offset=&(Tab[1].Int)-&(Tab[0].Int))
Mon probleme etait de savoir, si dans les cas d'une allocation statique et dynamique (a la new/delete et a la std::vector<donne>), on peut considerer offset constant. C'est a dire
Offset[i]=&(Tab[i+1].Int)-&(Tab[i].Int)==offset pour tout i ?
et cela pour chaque possibilité d'implementation: - allocation statique : donne Tab[1024] - dynamique C : donne* Tab=new donne[1024]; - dynamique C++ : std::vector<donne> Tab(1024);
Merci encore de vos reponses May
Ps: Ca m'apprendra à pas donner toutes les infos relatives à mon cas.
"Samuel Krempp" <krempp@crans.truc.en.trop.ens-cachan.fr> a écrit dans le
message de news:3f70953b$0$20634$626a54ce@news.free.fr...
le Tuesday 23 September 2003 20:29, dosreis@cmla.ens-cachan.fr écrivit :
Pourquoi ne pas simplement mettre la taille de Tab utilisée dans sa
déclaration ?
parceque je pensais plus à ce 256 et que j'ai copier-collé :)
--
Sam
Au temps pour moi, c'est effectivement pas 256 dan sla boucle mais 1024 (la
taille de mon tableau).
A cause de la future utilisation de la MKL, il me faut tester ce que va
faire la MKL pour copier.
Pour etre plus claire, j'ai ceci :
struct donne
{
double Int;
double Ext;
double IntExt;
};
double Int[1024];
donne Tab[1024]; //puis a remplacer par std::vector<donne> Tab(1024);
Je veux maintenant copier le tableau Int dans les champs Tab[x].Int
Mais pour des problemes de performances, je doit utiliser la MKL.
Or la MKL est codée en C et pas en C++ ou je ne sais trop quoi ....
Donc sa facon d'acceder a la memoire est par pointeur. Donc exit, les tests
(oui oui je teste ce que va faire la MKL) du type :
for (...)
{
Tab[i].Int=1.0;
}
ou ptr->Int=1.0;
Je ne doit pas utiliser l'interface de classe mais un acces memoire direct.
Donc pour m'assurer que la MKL copie au bon endroit dans la memoire, il faut
lui donner l'offset entre 2 Champs Int dans le tableau Tab (ie
offset=&(Tab[1].Int)-&(Tab[0].Int))
Mon probleme etait de savoir, si dans les cas d'une allocation statique et
dynamique (a la new/delete et a la std::vector<donne>), on peut considerer
offset constant.
C'est a dire
Offset[i]=&(Tab[i+1].Int)-&(Tab[i].Int)==offset pour tout i ?
et cela pour chaque possibilité d'implementation:
- allocation statique : donne Tab[1024]
- dynamique C : donne* Tab=new donne[1024];
- dynamique C++ : std::vector<donne> Tab(1024);
Merci encore de vos reponses
May
Ps: Ca m'apprendra à pas donner toutes les infos relatives à mon cas.
Pourquoi ne pas simplement mettre la taille de Tab utilisée dans sa déclaration ?
parceque je pensais plus à ce 256 et que j'ai copier-collé :)
-- Sam
Au temps pour moi, c'est effectivement pas 256 dan sla boucle mais 1024 (la taille de mon tableau).
A cause de la future utilisation de la MKL, il me faut tester ce que va faire la MKL pour copier. Pour etre plus claire, j'ai ceci :
struct donne { double Int; double Ext; double IntExt; };
double Int[1024]; donne Tab[1024]; //puis a remplacer par std::vector<donne> Tab(1024);
Je veux maintenant copier le tableau Int dans les champs Tab[x].Int Mais pour des problemes de performances, je doit utiliser la MKL. Or la MKL est codée en C et pas en C++ ou je ne sais trop quoi .... Donc sa facon d'acceder a la memoire est par pointeur. Donc exit, les tests (oui oui je teste ce que va faire la MKL) du type : for (...) { Tab[i].Int=1.0; } ou ptr->Int=1.0; Je ne doit pas utiliser l'interface de classe mais un acces memoire direct.
Donc pour m'assurer que la MKL copie au bon endroit dans la memoire, il faut lui donner l'offset entre 2 Champs Int dans le tableau Tab (ie offset=&(Tab[1].Int)-&(Tab[0].Int))
Mon probleme etait de savoir, si dans les cas d'une allocation statique et dynamique (a la new/delete et a la std::vector<donne>), on peut considerer offset constant. C'est a dire
Offset[i]=&(Tab[i+1].Int)-&(Tab[i].Int)==offset pour tout i ?
et cela pour chaque possibilité d'implementation: - allocation statique : donne Tab[1024] - dynamique C : donne* Tab=new donne[1024]; - dynamique C++ : std::vector<donne> Tab(1024);
Merci encore de vos reponses May
Ps: Ca m'apprendra à pas donner toutes les infos relatives à mon cas.