本文主要是介绍OpenMP编程-数据传递,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
//分配四个线程,做多线程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 sectionprintf("section 1 ThreadId = %d\n", omp_get_thread_num());#pragma omp sectionprintf("section 2 ThreadId = %d\n", omp_get_thread_num());#pragma omp sectionprintf("section 3 ThreadId = %d\n", omp_get_thread_num());#pragma omp sectionprintf("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;
}
这篇关于OpenMP编程-数据传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!