Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Seg fault lors d'une optimisation avec icc

23 réponses
Avatar
Student
Bonjour,

Lors de l'optimisation d'un code avec icc, j'ai eu un seg fault, apr=E8s
un petit analyse j'ai trouv=E9 que le programme essaye d'=E9crire sur un
tableau non alou=E9, l'allocation je le fait par des boucles puisque c
des tableaux de plusieur dimensions, (exemple pour un float ** :
allocation de float ** puis des float *), est ce que c possible que
lors de l'optilisation cette boucle soit traiter en bloques?, si c le
cas comment je peux eviter une telle erreur,
j'utilise : icc avec LDFLAFGS=3D-xW -tpp7 -O3

merci

3 réponses

1 2 3
Avatar
Student
merci pour l'expilcation, mais j'ai des doutes que le compilateur
essaie de vectoriser la boucle de l'allocation, une fois que j'ai
réussie à voire le prog avec ddd, j'ai vue qu'il exécute le main en
parralèle et pas en sequentiel, genre il va à la ligne 24 (qui fait
l'init) puis il retourne à la ligne 12 (qui fait l'alloc), mais je
suis pas sure, je sais qu'il existe des macros pour empêcher la
vectorisation de certaines parties mais j'ai pas reussi à les
retrouvés encore, le fait que 9.1 marche sans problème et que le 9.0
leve l'assertion, se que je comprend pas non plus, de toute façon je
vais continuer mon debug et je te remerci bien Marc.

Hicham


erreur de frappe,


Oui, mais ça fatigue les gens qui prennent du temps
pour t'aider.

float ** allocArrayf2D(int x, int y){
float **a;
int i,j;
if( (a = (float **)malloc(sizeof(float*)*x)) == NULL){
fprintf(stderr,"Error:allocation Failed n");
return NULL;
}
for( i = 0; i<x; i++){
if( (a[i] = (float*)malloc(sizeof(float)*y)) ==NULL){
fprintf(stderr,"Error:allocation Failedn");
for( j=i-1; j>-1; j--){
free(a[j]);
}
free(a);
return NULL;
}
return a; // c'est ici le 'return a;'
}

et le initArrayf2D c'est ça :

int
initArrayf2D(float** c,int xi, int xj,float value){
assert((c != NULL));

int i,j;

for(i=0; i<xi; i++)
for(j=0; j<xj; j++){
c[i][j]=value;
// printf(" c[%d][%d]=> %f n",i,j,c[i][j]);
}
return EXIT_SUCCESS;
}


Je ne vois rien de grave dans ce code.

onde2: src/tools.c:31: initArrayf2D: Assertion `(c != 0L)' failed.
Abort


Comme déjà dit au moins 3 fois, c'est caractéristique d'un code
faux mais qui marche par [mal]chance.

alors voici le code qui mene à cela:
c = allocArrayf2D(x,y);
initArrayf2D(c,x,y ,2.);




Le 'Assertion `(c != 0L)' failed' signifie que c est NULL,
ce qui peut simplement venir du fait que malloc a retourné
NULL, ce qui n'est pas en soit un bug.


Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)





Avatar
Alain Gaillard

Mais est-ce que tu cherches l'erreur au bon endroit ?
Peut être qu'il se situe en amont. Peut être une compilation
conditionnelle. Ou un test viré par l'optimiseur parce qu'il le
considère toujours vrai. Et du coup ta fonction d'allocation du tableau
ne serait même pas appelée.


--
Alain
Avatar
Marc Boyer
Le 11-09-2006, Student a écrit :
merci pour l'expilcation, mais j'ai des doutes que le compilateur
essaie de vectoriser la boucle de l'allocation, une fois que j'ai
réussie à voire le prog avec ddd, j'ai vue qu'il exécute le main en
parralèle et pas en sequentiel, genre il va à la ligne 24 (qui fait
l'init) puis il retourne à la ligne 12 (qui fait l'alloc), mais je
suis pas sure


Attention, ddd n'est pas un outil miracle. Surtout que pour
utiliser ddd, il faut activer des infos de debug, et que
souvent, les options de debug et celles d'optimisation
sont incompatibles.
Par contre, les traces à coup de printf, j'ai plus confiance.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)

1 2 3