I suggest you include verification somewhere in your fix. Sun 2010/9/1 Jiangzhou HE <hejiangz...@gmail.com>: > Hi, Sun, > > Let me state that more clearly. > > Currently, lower_mp() uses the verifier to make sure there is no OpenMP > directive after lower_mp() returns (the verifier runs by the destructor). > However, for an OpenMP directive with nested OpenMP directive inside, the > nested OpenMP directive will remain after the outer directive is lowered by > lower_mp(). The verifier will stop the compiler in that case. That is the > bug. > > There are two ways to fix the bug. One way is to add new code in lower_mp() > to call itself recursively, so nested OpenMP directives can also be lowered > before the verifier runs. The other solution is to allow the lowered code of > lower_mp() contains OpenMP directives (lower_mp() will be called again by > lower_block(), so finally nested OpenMP directives will also be lowered), so > we need to remove the verifier for lower_mp() (maybe add the same verifier > in some upstream function). > > My argument is that it is not appropriate to call lower_mp() itself > recursively, so the second solution is better. > > Thanks. > > Jiangzhou > > > 2010/9/1 Sun Chan <sun.c...@gmail.com> >> >> Sorry, I am not familiar with openMP code, but your arguments doesn't >> seem to relate to the verifier. You are saying verifier will call >> lower_mp(), causing that to be recursive? >> Sun >> >> 2010/9/1 Jiangzhou HE <hejiangz...@gmail.com>: >> > Hi, Jianxin, >> > >> > I think there are two reasons why the verifier should be removed from >> > lower_mp(). >> > >> > 1. lower_mp() cannot be called recursively because it uses many global >> > variables. Many other functions in that file, which is called by >> > lower_mp(), >> > also used these global variables. It is not safe to call lower_mp() >> > recursively. At least, calling lower_mp() recursively is not elegant for >> > such a function which depends on so many global variables. >> > >> > 2. If there is no verifier for lower_mp(), lower_block() will call >> > lower_mp() until all OpenMP directives are lowered. I think that is the >> > most >> > natural way to solve the problem (only a verifier removed, no concrete >> > code >> > changed). If we solve the problem by calling lower_mp() recursively, >> > lower_block() will do extra work during OMP lowering. >> > >> > How about remove the verifier in lower_mp(), and calling it in some >> > upstream >> > function, such as lower_entry()? >> > >> > Thanks. >> > >> > Jiangzhou >> > >> > >> > 2010/9/1 Jian-Xin Lai <laij...@gmail.com> >> >> >> >> I have a question about the item #4 about the Verify_MP_Lowered. I >> >> don't >> >> think it's a good fix to remove the verifier. The root issue is there >> >> is >> >> only one verifier and the pointer is passed so that it can not be used >> >> recursively. >> >> >> >> 2010/8/31 Jiangzhou HE <hejiangz...@gmail.com> >> >>> >> >>> Hi, all, >> >>> >> >>> This is the fixes for several OpenMP bugs. Could gatekeeper help to >> >>> review it? I attached the test case for the fix. >> >>> >> >>> I have fixed the following bugs: >> >>> >> >>> 1. bug of driver (see test_has_openmp.c) >> >>> The case works with -mp but fails with -fopenmp. Since the command >> >>> line options should be compatible with gcc, -fopenmp should also work. >> >>> I fixed this bug by change osprey/driver/OPTION. >> >>> >> >>> 2. bug of atomic directive (see test_atomic.c) >> >>> Atomic directive did not work correctly sometimes. >> >>> Without this fix, atomic directive was lowered to >> >>> INTRN_COMPARE_AND_SWAP_XX. The lowered code checks whether its result >> >>> is >> >>> non-zero, to decide whether to try again. So INTRN_COMPARE_AND_SWAP_XX >> >>> should be replaced by INTRN_BOOL_COMPARE_AND_SWAP in the lowered code. >> >>> The change for omp_lower.cxx is for this bug. >> >>> >> >>> 3. bug of variable declared in nested block (see test_local_var.c) >> >>> >> >>> For code like this: >> >>> >> >>> int s; >> >>> #pragma parallel >> >>> { >> >>> int t; >> >>> .... >> >>> } >> >>> >> >>> In the parallel region, the variable s should be shared by >> >>> default, >> >>> and the variable t should be private. However, in WHIRL, all the local >> >>> variables are put in the symbol table of current function, so the >> >>> declaring >> >>> block for local variables such as s and t cannot be distinguished. >> >>> Therefore, in the backend, both s and t are treated as shared >> >>> variable, >> >>> which is not correct. >> >>> I fixed this bug by adding some code in wgen. By this fix, wgen >> >>> will >> >>> insert an explicit private pragma for local variables such as t. >> >>> >> >>> 4. bug of nested OpenMP directives (see test_nested_critical.c) >> >>> >> >>> Some OpenMP directives, like critical, master, can be nested with >> >>> each >> >>> other. >> >>> >> >>> Most OpenMP directives are lowered by lower_mp() (in >> >>> osprey/be/com/wn_mp.cxx). lower_mp() is called by lower_block() (in >> >>> osprey/be/com/wn_lower.cxx). lower_mp() returns the first statement of >> >>> the >> >>> replacing block, so lower_block() will call lower_mp() again for the >> >>> nested >> >>> directives. I believe that is the right way to deal with the nested >> >>> OpenMP >> >>> directives ( another way may be run lower_mp() recursively, however, >> >>> since >> >>> lower_mp() uses many global variables, I think it was not designed to >> >>> be >> >>> called recursively). >> >>> >> >>> However, there is a class Verify_MP_Lowered in wn_mp.cxx to check >> >>> whether all the generated code in lower_mp() has not OpenMP >> >>> directives. >> >>> Since for nested OpenMP directives, the generated code in the first >> >>> invocation of lower_mp() would certainly contain OpenMP directives >> >>> (which >> >>> will be lowered in the next invocation of lower_mp()), I think we >> >>> should >> >>> remove that verifier here. Most changes of wn_mp.cxx is for that. >> >>> >> >>> >> >>> After applying the fixes, all the cases work. >> >>> >> >>> Thanks. >> >>> >> >>> Regards, >> >>> Jiangzhou >> >>> >> >>> -- >> >>> Jiangzhou HE (何江舟) >> >>> >> >>> Institute of High-Performance Computing >> >>> Department of Computer Science and Technology >> >>> Tsinghua University, Beijing, China >> >>> >> >>> >> >>> >> >>> >> >>> ------------------------------------------------------------------------------ >> >>> This SF.net Dev2Dev email is sponsored by: >> >>> >> >>> Show off your parallel programming skills. >> >>> Enter the Intel(R) Threading Challenge 2010. >> >>> http://p.sf.net/sfu/intel-thread-sfd >> >>> _______________________________________________ >> >>> Open64-devel mailing list >> >>> Open64-devel@lists.sourceforge.net >> >>> https://lists.sourceforge.net/lists/listinfo/open64-devel >> >>> >> >> >> >> >> >> >> >> -- >> >> Regards, >> >> Lai Jian-Xin >> > >> > >> > >> > -- >> > Jiangzhou HE (何江舟) >> > >> > Institute of High-Performance Computing >> > Department of Computer Science and Technology >> > Tsinghua University, Beijing, China >> > >> > >> > >> > ------------------------------------------------------------------------------ >> > This SF.net Dev2Dev email is sponsored by: >> > >> > Show off your parallel programming skills. >> > Enter the Intel(R) Threading Challenge 2010. >> > http://p.sf.net/sfu/intel-thread-sfd >> > _______________________________________________ >> > Open64-devel mailing list >> > Open64-devel@lists.sourceforge.net >> > https://lists.sourceforge.net/lists/listinfo/open64-devel >> > >> > > > > > -- > Jiangzhou HE (何江舟) > > Institute of High-Performance Computing > Department of Computer Science and Technology > Tsinghua University, Beijing, China > >
------------------------------------------------------------------------------ This SF.net Dev2Dev email is sponsored by: Show off your parallel programming skills. Enter the Intel(R) Threading Challenge 2010. http://p.sf.net/sfu/intel-thread-sfd _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel