出于某种原因,我需要强调我的处理器,我想在OpenMP中分叉很多线程。在pthreads中,您可以使用for循环轻松完成它,因为它分叉线程只是一个函数调用。但是在OpenMP中你必须有这样的东西:
#pragma omp parallel sections
{
#pragma omp section
{
//section 0
}
#pragma omp section
{
//section 1
}
.... // repeat omp section for n times
}
我只是想知道是否有更简单的方法在OpenMP中分叉大量线程?
答案 0 :(得分:1)
您不需要做任何特别的事情,几乎。只需为计算密集型任务编写代码并将其放在并行区域中。然后指出您想要的线程数。为了做到这一点,你使用omp_set_dynamic(0)
来禁用动态线程(这有助于实现你想要的线程数,但它仍然无法得到保证),然后omp_set_num_threads(NUM_THREADS)
来指示什么你想要的线程数。
然后每个线程将克隆您在代码中指明的任务。就这么简单。
const int NUM_THREADS = 100;
omp_set_dynamic(0);
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
// How many threads did we really get? Let's write it once only.
#pragma omp single
{
cout << "using " << omp_get_num_threads() << " threads." << std::endl;
}
// write some compute-intensive code here
// (be sure to print the result at the end, so that
// the compiler doesn't throw away useless instructions)
}
答案 1 :(得分:0)
要做你想做的事,你得到线程号,然后根据你所在的线程做不同的事情。
// it's not guaranteed you will actually get this many threads
omp_set_num_threads( NUM_THREADS );
int actual_num_threads;
#pragma omp parallel
{
#pragma omp single
{
actual_num_threads = omp_get_num_threads();
}
int me = omp_get_thread_num();
if ( me < actual_num_threads / 2 ) {
section1();
}
else {
section2();
}
}