并行洪水填充算法 - OpenGL和OpenMP

时间:2014-11-11 03:06:51

标签: c++ opengl openmp

我正在尝试使用OpenMP并行运行泛洪填充算法。 着色在“关键”部分中定义。但OpenGL仅适用于上下文处于活动状态的一个线程(thread_no == 0)。我试过“#pragma omp master”。 没有结果。 在这里帮助我。

     #pragma omp critical //(or master)
     {
        color = getPixelColor(x, y);
        same_color = color.r == oldColor.r && color.g == oldColor.g && color.b == oldColor.b;
        if(same_color){
                setPixelColor(x, y, newColor);
        }
     }

   void floodFill(GLint x, GLint y, Color oldColor, Color newColor) {
   cout<<"Calling "<<x<<" and "<<y<<" in "<<omp_get_thread_num()<<endl;
    if(x < 0 || y < 0 || x > 500 || y >500){
        return;
    }
    bool same_color;
    Color color;
    #pragma omp critical
    {
        color = getPixelColor(x, y);
        same_color = color.r == oldColor.r && color.g == oldColor.g && color.b == oldColor.b;
        if(same_color){
                setPixelColor(x, y, newColor);
        }
    }
    if(same_color)
    {
            cout<<"Same Color"<<endl;
            #pragma omp task firstprivate(x, y, oldColor, newColor)
            {
                floodFill(x+1, y, oldColor, newColor);
            }

            #pragma omp task firstprivate(x, y, oldColor, newColor)
            {

                floodFill(x, y+1, oldColor, newColor);
            }

            #pragma omp task firstprivate(x, y, oldColor, newColor)
            {
                floodFill(x-1, y, oldColor, newColor);
            }

            #pragma omp task firstprivate(x, y, oldColor, newColor)
            {
                floodFill(x, y-1, oldColor, newColor);
            }

            #pragma omp taskwait
    }
    else{
        cout<<"Flood fill"<<endl;
    }
    return;
}

0 个答案:

没有答案