c++ - OpenMP 在 for 循环中并行化代码块?

标签 c++ openmp

大家好

我想在单独的 OpenMP 线程中运行循环内的代码块。 我是否在以下代码片段中定义了正确的 OpenMP 指令:

#ifdef OPENMP_ENABLE
        #pragma omp parallel for
    #endif

for(int i=0;i<numOfSlices;i++){                  // Entire block inside this loop should be fun in new OpenMP thread

        int id =0;

        #ifdef OPENMP_ENABLE
               id=omp_get_thread_num();
              qDebug("------- OPENMP thread number  %d",id);
        #endif
            qDebug("      - Image Slice %d",i);

        int width=0,height=0;
        //Image Buffer
        unsigned char *buff=planeViewer->getImageBuggerOfSlice(i,height,width);

        //Trunk
        RzTrunk *rztrnk=planeViewer->getTrunkOfSlice(i);

        //If Empty trunk,add frame @TODO Hard coded
        if(rztrnk->getCurveCount()==0){
           RzCurve *crv=rztrnk->createFrameCurve(10,10,width-10,height-10);
           rztrnk->addCurve(crv);
        }

       //Covert Rinzo Trunk to Centy Trunk!
       //TODO Make sure to deallocate memory
       QImage *qimg=new QImage(buff,width,height,QImage::Format_RGB32);
       trnk_t *trnkt = convertRzTrunkToCntyTrunk(rztrnk, qimg->width(),qimg->height());


       //Convert QImage to Cnty Image format
       image_t *imgt=convertQImageToImaget(qimg);

       //This extract parts , first should detect outer border
       if(etype==EXTRACT_DEFL_INOUT){
            cnty_extract_contour(EXTRACT_DEFL_OUT, trnkt, imgt, NULL, NULL,settings2, NULL);
            trnk_make_crvs_nodes_active(trnkt);
       }

       cnty_extract_contour(etype, trnkt, imgt, NULL, NULL,settings, NULL);
       convertCntyTrunkToRzTrunk(trnkt, rztrnk);

       trnk_destruct(trnkt);
       destroyImaget(imgt);
       delete qimg;
       delete buff;    
} //end of for loop

最佳答案

我发现了问题。原因是“cnty_extract_contour()”方法不是线程安全的。

关于c++ - OpenMP 在 for 循环中并行化代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801121/

相关文章:

c++ - 为什么矢量化使用 float 比使用双数更有效?

c++ - ANT 不会终止 openmp 可执行文件 (C++)

c - OpenMP 金字塔嵌套循环计数器

c++ - 通用类型的 is_base_of

c++ - Direct3D11 缓冲区对齐要求

c++ - 远程主机不编译,但它应该

parallel-processing - 基于求和的 OpenMP

c - 并行执行时间

C++ 命名空间函数

c++ - 修改编译后的exe中的dll函数调用