我正在寻找一种方法来并行执行代码部分,每个部分使用多个线程。例如,如果我有 16 个线程和两个任务,我希望每个线程有 8 个线程同时执行这两个任务。 OpenMP 有多种构造(section
, task
)并行执行一般代码,但它们是单线程的。在我的场景中,使用section
or task
将导致一个线程执行这两个任务中的每一个,而 14 个线程闲置。
OpenMP 可以实现类似的功能吗?如果是这样,我该怎么做,如果不是,我可以用什么来达到这个目的?
谢谢你的时间!
edit 2:
让我用示例代码来扩展这个问题:
class some_class{
void task(){
cout<<"Entering the task method"<<endl;
#pragma openmp parallel for
for(int i=0; i < large_matrix.rows(); i++){
perform_thread_safe_operation(large_matrix.getRow(i));
}
}
matrix large_matrix;
};
void main(){
//I have 16 cores, so I want to spawn 16 threads
some_class o1;
some_class o2;
// I want 8 of the 16 threads to execute this line:
o1.task();
// and 8 remaining threads to execute this line:
o2.task();
}
您可以使用嵌套并行区域来完成此操作。
omp_set_nested(1);
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0){
#pragma omp parallel num_threads(8)
{
// Task 0
}
}else{
#pragma omp parallel num_threads(8)
{
// Task 1
}
}
}
或者,您可以这样做:
#pragma omp parallel num_threads(16)
{
if (omp_get_thread_num() < 8){
// Task 0
}else{
// Task 1
}
}
请注意,如果 OpenMP 决定使用少于 16 个线程,则此代码将不起作用。您必须为此插入自己的清理代码。
编辑:响应您的更新:
class some_class{
void task(){
cout<<"Entering the task method"<<endl;
#pragma omp parallel for num_threads(8)
for(int i=0; i < large_matrix.rows(); i++){
perform_thread_safe_operation(large_matrix.getRow(i));
}
}
matrix large_matrix;
};
void main(){
omp_set_nested(1);
//I have 16 cores, so I want to spawn 16 threads
some_class o1;
some_class o2;
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0){
// I want 8 of the 16 threads to execute this line:
o1.task();
}else{
// and 8 remaining threads to execute this line:
o2.task();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)