C++ 开放Mp嵌套并行
所以我有两个内部平行区域和两个外部平行区域。是否可以将2个螺纹装入外平行螺纹,将4个螺纹装入每个内平行螺纹?我做了这样的东西,但它似乎不工作,我希望它。有什么建议吗C++ 开放Mp嵌套并行,c++,c,multiprocessing,openmp,C++,C,Multiprocessing,Openmp,所以我有两个内部平行区域和两个外部平行区域。是否可以将2个螺纹装入外平行螺纹,将4个螺纹装入每个内平行螺纹?我做了这样的东西,但它似乎不工作,我希望它。有什么建议吗 start_r = omp_get_wtime(); omp_set_nested(1); omp_set_num_threads(2); #pragma omp parallel { printf("Thread %d executes the outer parallel region\n",omp_get_threa
start_r = omp_get_wtime();
omp_set_nested(1);
omp_set_num_threads(2);
#pragma omp parallel
{
printf("Thread %d executes the outer parallel region\n",omp_get_thread_num());
omp_set_num_threads(4);
#pragma omp parellel for private(i,j,color)schedule(guided, chunk) default(shared)
{
// Blur
for (int i = 1; i < x-1; i++)
for (int j = 1; j < y-1; j++)
for (int k = 0; k < 3; k++)
{
wynik = 0;
wynik = ((color[(i-1)][((j - 1))][k] +
color[(i-1)][j][k] +
color[(i-1)][(j + 1)][k] +
color[i][(j - 1)][k] +
color[i][j][k] +
color[i][(j + 1)][k] +
color[(i+1)][(j - 1)][k] +
color[(i+1)][j][k] +
color[(i+1)][(j + 1)][k])/9);
if (wynik>255)wynik = 255;
if (wynik<0)wynik = 0;
color2[i][j][k] = wynik;
}
stop_r = omp_get_wtime();
cout << "Wyostrzenie zejelo : " << (stop_r-start_r) <<" sekund"<< endl;
cout<<omp_get_nested( )<<endl;
cout<<"Ilość wątków dla rozmycia : "<<omp_get_num_threads( )<<endl;
printf("Thread %d executes the inner parallel region\n",omp_get_thread_num());
}
omp_set_num_threads(4);
#pragma omp parellel for schedule(guided, chunk) privat(i,j,color) default(shared)
{
// Sharp
for (int i = 1; i < x - 1; i++)
for (int j = 1; j < y - 1; j++)
for (int k = 0; k < 3; k++)
{
wynik = 0;
wynik = (color[(i-1)][(j - 1)][k] * (0) +
color[(i-1)][j][k] * (-1) +
color[(i-1)][(j + 1)][k] * (0) +
color[i][(j - 1)][k] * (-1) +
color[i][j][k] * 20 +
color[i][(j + 1)][k] * (-1) +
color[(i+1)][(j - 1)][k] * (0) +
color[(i+1)][j][k] * (-1) +
color[(i+1)][(j + 1)][k] * (0))/16;
wynik = wynik % 255;
color3[i][j][k] = wynik;
}
cout<<omp_get_nested( )<<endl;
cout<<"Ilość wątków dla wyostrzenia : "<<omp_get_num_threads( )<<endl;
printf("Thread %d executes the inner parallel region\n",omp_get_thread_num());
}
}
for (int j = 0; j < y; j++)
for (int i = 0; i < x; i++)
{
fwrite(color2[i][j], 1, 3, fp2);
fwrite(color3[i][j], 1, 3, fp3);
}
fclose(fp);
fclose(fp2);
fclose(fp3);
system("PAUSE");
return 0;
}
}
start\u r=omp\u get\u wtime();
omp_集合_嵌套(1);
omp_设置_数量_线程(2);
#pragma-omp并行
{
printf(“线程%d执行外部并行区域”,omp_get_Thread_num());
omp_设置_数量_线程(4);
#pragma omp并行专用(i、j、颜色)计划(引导、块)默认值(共享)
{
//模糊
对于(int i=1;i255)wynik=255;
如果(wynik,则可以使用以下命令设置循环上的线程数:
#pragma parallel for num_threads(variable)
另请参见这篇文章这在VS2012中有效
例如:
#include <iostream>
#include <omp.h>
int main()
{
omp_set_nested(2);
#pragma omp parallel num_threads( 2 )
{
int threadID1 = omp_get_thread_num();
#pragma omp parallel num_threads( 4 )
{
int threadID2 = omp_get_thread_num();
#pragma omp critical
{
std::cout << "tID1: " << threadID1 << std::endl;
std::cout << "tID2: " << threadID2 << std::endl;
std::cout << std::endl;
}
}
}
return EXIT_SUCCESS;
}
我建议你也用OpenMPY来标记它。我试图像这样将线程数放在内部区域,但它们仍然只有两个线程作为外部区域。这应该可以用来设置在for(…)而不是区域上工作的线程数。即使我将4个线程放在for并行循环中,omp_get_num_threads()-也会给我相同的anserw(这个循环中只有两个线程在工作)。这似乎取决于我在外部区域之前设置了多少线程,但即使我设置了8个线程,它们都在内部区域工作(我不能将它们同时划分为两个线程)。很难回答、更新您的问题、发布一个工作代码以便我可以测试它。
tID1: 0
tID2: 0
tID1: 0
tID2: 2
tID1: 0
tID2: 1
tID1: 0
tID2: 3
tID1: 1
tID2: 0
tID1: 1
tID2: 1
tID1: 1
tID2: 2
tID1: 1
tID2: 3