/* openmp divide and conquer example SJ */ /* requires openMP >= 3.0 */ #include #include #include #include void dcexample(int N, int P); void dcexample_r(int N, int P); void dcexample_seq(int N); int main(int argc, char *argv[]) { dcexample(100, 16); } // main() void dcexample(int N, int P) { // set maximum levels of nested omp_set_nested(1); omp_set_max_active_levels(10); // set num of threads omp_set_num_threads(P); dcexample_r(N, P); } void dcexample_r(int N, int P) { if (N < 1) return; printf("dcexample_r N=%d P=%d num_threads=%d thread_num=%d level=%d team_size=%d\n", N, P, omp_get_num_threads(), omp_get_thread_num(), omp_get_level(), omp_get_team_size(omp_get_level())); if (P < 2) { dcexample_seq(N); return; } #pragma omp parallel sections num_threads(P) { #pragma omp section dcexample_r(N/2, P/2); #pragma omp section dcexample_r(N/2, P/2); } } void dcexample_seq(int N) { printf("dcexample_seq N=%d\n", N); } void dcexample_r2(int N) { int middle = rand()%N; if (N < 1) return; }