From: Eric Frederich (eric.frederich_at_gmail_dot_com)
Date: Thu Dec 08 2005 - 14:30:57 PST
Dan, I appreciate you looking into this and I am glad I could help in finding a bug. I hadn't been working on that program too much before I noticed that behavior. I almost didn't send this in because my code looked horrible at that point since I just wound up taking working sequential code and parallelizing it. Since then I have replaced those ABS macros with calls to fabs and replaced other parts of my code with upc_memget and upc_memput for copying shared rows into local memory and then back into shared. Now the program actually scales on a single machine with two processors. I just need to get some reduction operations working and it may scale on remote machines. Thanks again, ~Eric On 12/8/05, Dan Bonachea <bonachea_at_cs_dot_berkeley_dot_edu> wrote: > > Hi Eric - > > It appears that your program has exposed a bug in our UPC translator, > which is > causing the incorrect behavior. Specifically, your application of the > ABS() > macro to a shared array element is causing the translator to generate > incorrect code. > > I've submitted the problem to our bug database, and someone should look > into > it shortly - you can track the status here: > http://upc-bugs.lbl.gov/bugzilla/show_bug.cgi?id=1352 > > Apologies for the confusion and inconvenience. In the meantime, the patch > to > your program shown below provides a workaround. > > Incidentally, this is probably the way you should write the code anyhow, > because it implies fewer communication operations, at least in a naive > translation. By reading the (potentially remote) array element into the > tmp > before operating on it, you guarantee there will be at most one (get) > communication operation for that statement. Applying the macro directly to > a > remote array element (eg ABS(a[j][i])) expands to something like (a[j][i] > < 0 > ? -(a[j][i]) : (a[j][i])), which naively implies two get communication > operations unless the optimizer is smart enough to remove one. > > Hope this helps... > Dan > > --- matrixSolver-orig.upc 2005-12-08 10:12:40.000000000 -0800 > +++ matrixSolver.upc 2005-12-08 10:13:50.000000000 -0800 > @@ -71,10 +71,12 @@ > // printf("a[%d][%d] : %f\n",maxrow,i,a[maxrow][i]); > fflush(stdout); > // printf("ABS(a[%d][%d]) : %f\n",j,i,ABS(a[j][i])); > fflush(stdout); > // printf("ABS(a[%d][%d]) : > %f\n",maxrow,i,ABS(a[maxrow][i])); fflush(stdout); > - tmpa = ABS(a[j][i]); > - tmpb = ABS(a[maxrow][i]); > + tmpa = a[j][i]; > + tmpb = a[maxrow][i]; > + tmpa = ABS(tmpa); > + tmpb = ABS(tmpb); > // printf("tmpa : %f\ntmpb : %f\n",tmpa,tmpb); > fflush(stdout); > - if (ABS(a[j][i]) > ABS(a[maxrow][i])){ > + if (tmpa > tmpb){ > // printf("Seting maxrow to %d\n",maxrow); > maxrow = j; > } > > > At 02:47 PM 12/7/2005, Eric Frederich wrote: > >Hello, > >I'd like to share something that has been troubling me. > > > >Attached I have two files. One is the program, the other is the input to > the > >program. > > > >I compiled the program with > > > >./upcc -pthreads -o matrixSolver -T=2 matrixSolver.upc > > > >and run the program like > > > >./upcrun -n 2 -c 2 -p 2 matrixSolver <http://matrix.500.in>matrix.500.in > > > >As the program is attached it freezes on me at the following point in the > >code. > >if (ABS(a[j][i]) > ABS(a[maxrow][i])) > > > >I take the two operands of this inequality and store them in local > variables > >tmpa and tmpb. > >If you use these variables for the inequality (like if(tmpa > tmpb) ) the > >program runs fine and solves the matrix. > > > >This confuses me greatly since the macro ABS still works since I am using > it > >when storing the variables in tmpa and tmpb. > > > >the ABS macro is defined as follows... > > > >#define ABS(x) (x < 0 ? -(x) : (x)) > > > >Any ideas anyone? > > > >Also, I hope that I am accomplishing what I wanted to do. I want to > >distribute the rows of the matrix in a round robin fashion. > >I haven't got to dynamic memory allocation with UPC yet so I defined the > >array as follows. > > > >shared[1001] double a[1000][1001]; > > > >By doing this is affinity of a[0][0] through a[0][1001] going to the > first > >thread, > >and the affinity of a[1][0] through a[1][1001] going to the next thread, > >and the affinity of a[2][0] through a[2][1001] to the next, and so on? > > > >This is a square matrix with an extra column to store the one dimensional > >vector. > > > > > > > >Thanks ahead of time, > >------------------------ > >Eric L. Frederich > > > >#Attachment Converted: "c:\program > >files\eudora\data\imap\dominant\inbox\attach\matrixSolver.upc" > > > >#Attachment Converted: "c:\program > >files\eudora\data\imap\dominant\inbox\attach\Makefile.in" > > -- ------------------------ Eric L. Frederich