我发布了我的代码的当前版本,就是这个
# 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
。
1条答案
按热度按时间z31licg01#
你可以使用任务来解决你的问题。在这种情况下,一个线程将运行第一个循环,所有其他线程将运行第二个循环。
顺便说一句,我不认为这段代码比另一种方法运行得更快,因为使用任务的开销更高。