This is an archive of the discontinued LLVM Phabricator instance.

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

Authored by ABataev on Apr 20 2015, 10:03 PM.

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.

Diff Detail

Repository
rL LLVM

Event Timeline

ABataev updated this revision to Diff 24097.Apr 20 2015, 10:03 PM
ABataev retitled this revision from to [OPENMP] Codegen for 'reduction' clause in 'for' directive.
ABataev updated this object.
ABataev edited the test plan for this revision. (Show Details)
ABataev added a subscriber: Unknown Object (MLST).
This revision was automatically updated to reflect the committed changes.