c - How does the gcc "parallelize" code? -
i'm writing simple system call function, , came across phenomenon couldn't understand. in code below, used variable "flag" replace long bothering "prptr->prhasmsgb" @ [1] , [2]. supposed won't cause difference, turned out first call function, prptr->prhasmsgb=0, skip if , enter switch(). error consistent, , suppose may have compiler (gcc)? also, how compiler (gcc) determine independent , parallelize? i've got no clue on compiler, advice appreciated. thanks!
ps: code below have in original code, except part.
prptr = &proctab[currpid]; /* prptr pointer, , below supposed */ /* dealing different prptr->prhasmsgb. */ /* prptr->prhasmsgb = (int){0,1,2,3} */ // int flag; // flag = prptr->prhasmsgb; /* used flag replace prptr->prhasmsgb */ // /* if[1] & switch[2] "paralleled" somehow */ /* case 0 handled here */ if (prptr->prhasmsgb == 0) { /* [1] once flag */ something; resched(); /* call reschedule */ } switch (prptr->prhasmsgb) { /* [2] once flag */ case 1: something; return value; case 2: something; return value; case 3: something; return value; case 0: /* should never enter case 0 */ default: return error; }
the compiler doesn't parallelize code in sense of multi-threading, "vectorize" code if can pack multiple operands vector register, isn't going on here.
my guess call resched() change contents of proctab[currpid], when returns program has different value. long access dereferencing prptr compiler safe thing, , makes no assumptions contents of memory @ location, generates load memory.
however, if use local variable, flag, "cache" contents of prptr->prhasmsgb, doesn't reload memory, , don't execute case 1, 2, or 3 in switch, execute case 0 falls thru default case , return error.
Comments
Post a Comment