C++ 如何让OpenMP与#pragma omp任务一起工作?
我正在使用OpenMP和Linux终端。我用标志C++ 如何让OpenMP与#pragma omp任务一起工作?,c++,c,multithreading,parallel-processing,openmp,C++,C,Multithreading,Parallel Processing,Openmp,我正在使用OpenMP和Linux终端。我用标志-fopenmp编译我的程序。我使用的环境确实支持多线程 #pragma omp parallel num_threads(3) { #pragma omp task R11Inverted = compute_inverse(r11, half); #pragma omp task printf("5 I am thread # %d\n&q
-fopenmp
编译我的程序。我使用的环境确实支持多线程
#pragma omp parallel num_threads(3)
{
#pragma omp task
R11Inverted = compute_inverse(r11, half);
#pragma omp task
printf("5 I am thread # %d\n", omp_get_thread_num());
R22Inverted = compute_inverse(r22, half);
}
作为一个简单且最低限度的测试,我所要做的就是获取printf(“5我是线程#%d\n”,omp_get_thread_num())代码>以显示程序正在使用三个线程运行。基本上,omp\u get\u thread\u num()
应该返回值0、1或2
上面的代码块被多次重复调用。但是,每次的结果都显示线程没有工作,程序只使用一个线程(线程0)。您缺少代码块周围的{}以及单个子句
请尝试以下操作:
#pragma omp parallel num_threads(3)
{
#pragma omp single
{
#pragma omp task
R11Inverted = compute_inverse(r11, half);
#pragma omp task
{
printf("5 I am thread # %d\n", omp_get_thread_num());
R22Inverted = compute_inverse(r22, half);
}
}
}
#pragma omp parallel num_threads(3)
{
#pragma omp master
printf("Total Threads # %d\n", omp_get_num_threads());
#pragma omp single
compute_inverse(...); // First call to the recursive function
}
然而,每次的结果都表明,线程不是
正在工作,并且程序仅使用单个线程(线程0)
如果要检查是否由多线程调用,则使用,这将返回团队需要的线程数
#pragma omp parallel num_threads(3)
{
#pragma omp master
{
printf("Total Threads # %d\n", omp_get_num_threads());
}
#pragma omp single
{
#pragma omp task
R11Inverted = compute_inverse(r11, half);
#pragma omp task
{
printf("5 I am thread # %d\n", omp_get_thread_num());
R22Inverted = compute_inverse(r22, half);
}
}
}
如果上面的代码是递归调用的,那么您需要适应以下情况:
#pragma omp parallel num_threads(3)
{
#pragma omp single
{
#pragma omp task
R11Inverted = compute_inverse(r11, half);
#pragma omp task
{
printf("5 I am thread # %d\n", omp_get_thread_num());
R22Inverted = compute_inverse(r22, half);
}
}
}
#pragma omp parallel num_threads(3)
{
#pragma omp master
printf("Total Threads # %d\n", omp_get_num_threads());
#pragma omp single
compute_inverse(...); // First call to the recursive function
}
在计算逆函数中:
#pragma omp task
R11Inverted = compute_inverse(r11, half);
#pragma omp task
{
printf("5 I am thread # %d\n", omp_get_thread_num());
R22Inverted = compute_inverse(r22, half);
}
不客气,是的,当然可以:)。但是通常您应该在之后删除它们,因为它们与线程无关