c++ 使用OpenMP时,不得不划分线程工作,用单个线程执行一条指令,用其余线程执行并行指令

cngwdvgl  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(182)

我发布了我的代码的当前版本,就是这个

#   pragma omp parallel
{ 
...
...
...
#   pragma omp single nowait   
   for (int i = 0; i < M; i++) { 
       centroids[points[i].cluster].points_in_cluster++;
   }
   

   for (int i = 0; i < M; i++) { //I want thread_count - 1 to be working here
#       pragma omp for
       for (int coord = 0; coord < N; coord++){
           //int my_tid = omp_get_thread_num();
           //printf("my tid:%d my_coord: %d my i:%d\n ", my_tid, coord, i);
           centroids[points[i].cluster].accumulator.coordinates[coord] += points[i].coordinates[coord];
       }
   }
#   pragma omp barrier
...
...
...
}

并且已经工作得很好了,但是我想看看是否可以通过执行以下操作来缩短时间,让一个线程执行omp single pragma下的任务,另一个线程执行下面的任务,不需要它的帮助。因此,如果有8个线程,1个线程将执行single部分,7个线程将执行其他部分。
我尝试使用omp sections,但它不起作用,因为它说work-sharing region may not be closely nested inside of work-sharing

z31licg0

z31licg01#

你可以使用任务来解决你的问题。在这种情况下,一个线程将运行第一个循环,所有其他线程将运行第二个循环。

#pragma omp parallel
#pragma omp single
{
    #pragma omp task
    {
        // one task (thread) runs this part of the code
    }
    
    #pragma omp taskloop num_tasks(omp_get_num_threads()-1)
    for (....){
        // all other tasks (threads) run this loop
    }
}

顺便说一句,我不认为这段代码比另一种方法运行得更快,因为使用任务的开销更高。

相关问题