@@ -22,23 +22,37 @@ class Sum {
22
22
#pragma omp declare reduction(sum_reduction:Sum : omp_out += omp_in) \
23
23
initializer (omp_priv = Sum(0 ))
24
24
25
+ #pragma omp declare reduction(sum_pctor_reduction:Sum : omp_out += omp_in) \
26
+ initializer (omp_priv = Sum(1 )) // non-default ctor
27
+
25
28
int checkUserDefinedReduction() {
26
29
Sum final_result_udr (0 );
30
+ Sum final_result_udr_pctor (1 );
27
31
Sum array_sum[N];
28
32
int error_flag = 0 ;
29
33
int expected_value = 0 ;
34
+ int expected_value_pctor = 0 ;
30
35
for (int i = 0 ; i < N; ++i) {
31
36
array_sum[i] = Sum (i);
32
37
expected_value += i; // Calculate expected sum: 0 + 1 + ... + (N-1)
38
+ expected_value_pctor += i;
33
39
}
34
- #pragma omp parallel num_threads(4) private(final_result_udr)
40
+ int num_threads_for_pctor_calc = 4 ; // num_threads(4)
41
+ int priv_initializer_val_pctor = 1 ; // initializer(omp_priv = Sum(1))
42
+ expected_value_pctor +=
43
+ num_threads_for_pctor_calc + priv_initializer_val_pctor;
44
+ #pragma omp parallel num_threads(4) private(final_result_udr) private( \
45
+ final_result_udr_pctor)
35
46
{
36
- #pragma omp for reduction(sum_reduction : final_result_udr)
47
+ #pragma omp for reduction(sum_reduction : final_result_udr) \
48
+ reduction (sum_pctor_reduction : final_result_udr_pctor)
37
49
for (int i = 0 ; i < N; ++i) {
38
50
final_result_udr += array_sum[i];
51
+ final_result_udr_pctor += array_sum[i];
39
52
}
40
53
41
- if (final_result_udr.getValue () != expected_value)
54
+ if (final_result_udr.getValue () != expected_value ||
55
+ final_result_udr_pctor.getValue () != expected_value_pctor)
42
56
error_flag += 1 ;
43
57
}
44
58
return error_flag;
0 commit comments