//分配四个线程,做多线程for循环 void test2() { const int NUMBER = 100; int* dataA = new int[NUMBER]; int* dataB = new int[NUMBER]; for (int i= 0; i < NUMBER; i++) { dataA[i] = i+1; dataB[i] = 2*(i+1); } long double sum = 0.0; omp_set_num_threads(4); #pragma omp parallel for reduction(+:sum) for (int i = 0; i < NUMBER; i++) { sum += dataA[i] + dataB[i]; cout<<omp_get_thread_num()<<" "; } cout<<sum<<endl; delete [] dataA; delete [] dataB; }
//为每个section分配一个线程,适用于函数 void test3() { //分配四个线程 omp_set_num_threads(4); #pragma omp parallel { #pragma omp sections { #pragma omp section printf("section 1 ThreadId = %d\n", omp_get_thread_num()); #pragma omp section printf("section 2 ThreadId = %d\n", omp_get_thread_num()); #pragma omp section printf("section 3 ThreadId = %d\n", omp_get_thread_num()); #pragma omp section printf("section 4 ThreadId = %d\n", omp_get_thread_num()); } } }
//并行内部私有,不传出。 void test4() { int share_a = 10; // 共享变量 int share_to_private_b = 10; //通过private子句修饰该变量之后在并行区域内变为私有变量 #pragma omp parallel { #pragma omp for private(share_to_private_b) for (int i = 0; i < share_to_private_b; ++i) //该循环变量是私有的,若为两个线程,则一个线程执行0 <= i < 5,另一个线程执行5 <= i < 10 { std::cout << i << std::endl; } } }
//并行区域内私有,不传出。 void test5() { int share_a = 10; // 共享变量 int share_to_private_b = 10; //通过private子句修饰该变量之后在并行区域内变为私有变量 #pragma omp parallel for firstprivate(share_to_private_b) for (int i = 0; i < 10; ++i) { cout<<"ID "<<omp_get_thread_num()<<" "; std::cout << ++share_to_private_b << std::endl; } cout<<"share_to_private_b is :"<<share_to_private_b<<endl; }
//并行区域内私有,传出 void test6() { int shared_to_last_private = 1; omp_set_num_threads(1); #pragma omp parallel for lastprivate(shared_to_last_private) firstprivate(shared_to_last_private) for (int i = 0; i < 10; ++i) { std::cout << ++shared_to_last_private << std::endl; } std::cout << "After: " << shared_to_last_private << std::endl; }
////共享 传出 void test7() { int sum = 0; omp_set_num_threads(4); #pragma omp parallel for shared(sum) for (int i = 0; i < 10; ++i) { sum += i; cout<<"ID "<<omp_get_thread_num()<<" "; std::cout << sum << std::endl; } std::cout << "After: " << sum << std::endl; }