@@ -816,6 +816,98 @@ double fn20(const double* x, int n) {
816816// CHECK-NEXT: }
817817// CHECK-NEXT: }
818818
819+ double fn21 (const double * x , int n ) {
820+ double result = 0 ;
821+ #pragma omp parallel for
822+ for (int i = 0 ; i < n ; i ++ ) {
823+ #pragma omp critical
824+ {
825+ result += x [0 ] * x [0 ];
826+ }
827+ }
828+ return result ;
829+ }
830+
831+ // CHECK: void fn21_grad(const double *x, int n, double *_d_x, int *_d_n) {
832+ // CHECK-NEXT: double _d_result = 0.;
833+ // CHECK-NEXT: double result = 0;
834+ // CHECK-NEXT: #pragma omp parallel
835+ // CHECK-NEXT: {
836+ // CHECK-NEXT: int _t_chunklo0 = 0;
837+ // CHECK-NEXT: int _t_chunkhi0 = 0;
838+ // CHECK-NEXT: clad::GetStaticSchedule(0, n - 1, 1, &_t_chunklo0, &_t_chunkhi0);
839+ // CHECK-NEXT: for (int i = _t_chunklo0; i <= _t_chunkhi0; i += 1) {
840+ // CHECK-NEXT: #pragma omp critical
841+ // CHECK-NEXT: {
842+ // CHECK-NEXT: result += x[0] * x[0];
843+ // CHECK-NEXT: }
844+ // CHECK-NEXT: }
845+ // CHECK-NEXT: }
846+ // CHECK-NEXT: _d_result += 1;
847+ // CHECK-NEXT: #pragma omp parallel
848+ // CHECK-NEXT: {
849+ // CHECK-NEXT: int _t_chunklo1 = 0;
850+ // CHECK-NEXT: int _t_chunkhi1 = 0;
851+ // CHECK-NEXT: clad::GetStaticSchedule(0, n - 1, 1, &_t_chunklo1, &_t_chunkhi1);
852+ // CHECK-NEXT: for (int i = _t_chunkhi1; i >= _t_chunklo1; i -= 1) {
853+ // CHECK-NEXT: #pragma omp critical
854+ // CHECK-NEXT: {
855+ // CHECK-NEXT: {
856+ // CHECK-NEXT: double _r_d0 = _d_result;
857+ // CHECK-NEXT: _d_x[0] += _r_d0 * x[0];
858+ // CHECK-NEXT: _d_x[0] += x[0] * _r_d0;
859+ // CHECK-NEXT: }
860+ // CHECK-NEXT: }
861+ // CHECK-NEXT: }
862+ // CHECK-NEXT: }
863+ // CHECK-NEXT: }
864+
865+ double fn22 (const double * x , int n ) {
866+ double result = 0 ;
867+ #pragma omp parallel for
868+ for (int i = 0 ; i < n ; i ++ ) {
869+ #pragma omp critical
870+ {
871+ result += x [0 ] * x [1 ];
872+ }
873+ }
874+ return result ;
875+ }
876+
877+ // CHECK: void fn22_grad(const double *x, int n, double *_d_x, int *_d_n) {
878+ // CHECK-NEXT: double _d_result = 0.;
879+ // CHECK-NEXT: double result = 0;
880+ // CHECK-NEXT: #pragma omp parallel
881+ // CHECK-NEXT: {
882+ // CHECK-NEXT: int _t_chunklo0 = 0;
883+ // CHECK-NEXT: int _t_chunkhi0 = 0;
884+ // CHECK-NEXT: clad::GetStaticSchedule(0, n - 1, 1, &_t_chunklo0, &_t_chunkhi0);
885+ // CHECK-NEXT: for (int i = _t_chunklo0; i <= _t_chunkhi0; i += 1) {
886+ // CHECK-NEXT: #pragma omp critical
887+ // CHECK-NEXT: {
888+ // CHECK-NEXT: result += x[0] * x[1];
889+ // CHECK-NEXT: }
890+ // CHECK-NEXT: }
891+ // CHECK-NEXT: }
892+ // CHECK-NEXT: _d_result += 1;
893+ // CHECK-NEXT: #pragma omp parallel
894+ // CHECK-NEXT: {
895+ // CHECK-NEXT: int _t_chunklo1 = 0;
896+ // CHECK-NEXT: int _t_chunkhi1 = 0;
897+ // CHECK-NEXT: clad::GetStaticSchedule(0, n - 1, 1, &_t_chunklo1, &_t_chunkhi1);
898+ // CHECK-NEXT: for (int i = _t_chunkhi1; i >= _t_chunklo1; i -= 1) {
899+ // CHECK-NEXT: #pragma omp critical
900+ // CHECK-NEXT: {
901+ // CHECK-NEXT: {
902+ // CHECK-NEXT: double _r_d0 = _d_result;
903+ // CHECK-NEXT: _d_x[0] += _r_d0 * x[1];
904+ // CHECK-NEXT: _d_x[1] += x[0] * _r_d0;
905+ // CHECK-NEXT: }
906+ // CHECK-NEXT: }
907+ // CHECK-NEXT: }
908+ // CHECK-NEXT: }
909+ // CHECK-NEXT: }
910+
819911template < size_t N >
820912void reset (double (& arr )[N ], double val = 0 ) {
821913 for (size_t i = 0 ; i < N ; ++ i )
@@ -924,5 +1016,15 @@ int main() {
9241016 auto fn20_grad = clad ::gradient (fn20 );
9251017 fn20_grad .execute (x , 4 , dx , & dn );
9261018 printf ("{%.2f, %.2f, %.2f, %.2f}\n" , dx [0 ], dx [1 ], dx [2 ], dx [3 ]); // CHECK-EXEC: {4.00, 6.00, 8.00, 10.00}
1019+
1020+ reset (dx );
1021+ auto fn21_grad = clad ::gradient (fn21 );
1022+ fn21_grad .execute (x , 4 , dx , & dn );
1023+ printf ("{%.2f, %.2f, %.2f, %.2f}\n" , dx [0 ], dx [1 ], dx [2 ], dx [3 ]); // CHECK-EXEC: {16.00, 0.00, 0.00, 0.00}
1024+
1025+ reset (dx );
1026+ auto fn22_grad = clad ::gradient (fn22 );
1027+ fn22_grad .execute (x , 4 , dx , & dn );
1028+ printf ("{%.2f, %.2f, %.2f, %.2f}\n" , dx [0 ], dx [1 ], dx [2 ], dx [3 ]); // CHECK-EXEC: {12.00, 8.00, 0.00, 0.00}
9271029 return 0 ;
9281030}
0 commit comments