This is an archive of the discontinued LLVM Phabricator instance.

[OPENMP] Codegen for 'reduction' clause in 'sections' directive.
ClosedPublic

Authored by ABataev on Apr 24 2015, 1:19 AM.

Details

Summary

Emit a code for reduction clause. Next code should be emitted for reductions:

static kmp_critical_name lock = { 0 };

void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
  *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);
  ...
  *(Type<n>-1*)lhs[<n>-1] =
  ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],
  *(Type<n>-1*)rhs[<n>-1]);
}

 ...
 void *RedList[<n>] = {&<RHSExprs>[0], ..., &<RHSExprs>[<n>-1]};
 switch (__kmpc_reduce{_nowait}(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>)) {
 case 1:
  <LHSExprs>[0] = ReductionOperation0(*<LHSExprs>[0], *<RHSExprs>[0]);
  ...
  <LHSExprs>[<n>-1] = ReductionOperation<n>-1(*<LHSExprs>[<n>-1], *<RHSExprs>[<n>-1]);
 __kmpc_end_reduce{_nowait}(<loc>, <gtid>, &<lock>);
 break;
 case 2:
  Atomic(<LHSExprs>[0] = ReductionOperation0(*<LHSExprs>[0], *<RHSExprs>[0]));
  ...
  Atomic(<LHSExprs>[<n>-1] = ReductionOperation<n>-1(*<LHSExprs>[<n>-1], *<RHSExprs>[<n>-1]));
 break;
 default:;
 }

Reduction variables are a kind of a private variables, they have private copies, but initial values are chosen in accordance with the reduction operation.
If sections directive has only single section, then original shared variables are used instead with barrier at the end of the directive.

Diff Detail

Repository
rL LLVM

Event Timeline

ABataev updated this revision to Diff 24363.Apr 24 2015, 1:19 AM
ABataev retitled this revision from to [OPENMP] Codegen for 'reduction' clause in 'sections' directive..
ABataev updated this object.
ABataev edited the test plan for this revision. (Show Details)
ABataev added reviewers: rjmccall, hfinkel.
ABataev added subscribers: ejstotzer, fraggamuffin, Unknown Object (MLST).
This revision was automatically updated to reflect the committed changes.