Разрывы кода при установке - PullRequest
0 голосов
/ 05 апреля 2011

Я распараллеливаю цикл, используя tbb от Intel, и он прерывается, когда я запускаю его, указывая на эту функцию в task.h

//! Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.
    static void spawn_root_and_wait( task& root ) {
        root.prefix().owner->spawn_root_and_wait( root, root.prefix().next );
    }

Я не понимаю, какая проблема может быть причиной этого?Больше информации: я в основном пытаюсь выполнить какое-то сопоставление изображений, формируя область интереса (ROI) на левом изображении, а затем ищу то же на правом. Это операция, которую я пытаюсь распараллелить. Моя идея состоит в том, что в определенном ряду я могу распараллелить операцию сопоставления левого изображения с правым, потому что они выглядят для меня независимыми.

Это моя основная функция (которая вызываетсяв каждой строке, то есть по высоте)

parallel_for(blocked_range<size_t> (2,left_image_width-2),ApplyMLR(left_image_width,right_image_width,leftImageROI,rightImageROI,i,j,curHeight));

, и это функция MLR (ApplyMLR - просто объект body).

void MLR( int curWidth,int left_image_width, int right_image_width, IplImage* leftImageROI,IplImage* rightImageROI, int i,int j, int curHeight){
                    CvPoint minloc, maxloc;
                    double minval, maxval;


                    // create 5 by 5 window of leftImageROI that is to be compared with the rightImageROI
                    cvSetImageROI(leftImageROI, cvRect(curWidth - 2, 0, 5, 5));
                    IplImage* currentROI = cvCreateImage(cvSize(5, 5), leftImageROI->depth, leftImageROI->nChannels);                   
                    cvCopy(leftImageROI, currentROI);
                    cvResetImageROI(leftImageROI);

                    // since we have no disparity values from a previous level, we have to compare across all of rightImageROI
                    if (j == tot_pyramid_levels[i/2] - 1) {

                        // For cvMatchTemplate: if rightImageROI is WxH and currentROI is wxh then result must be W-w+1xH-h+1.
                        IplImage* re = cvCreateImage(cvSize(rightImageROI->width - 5 + 1, 1), IPL_DEPTH_32F, 1);    // the results will be stored in here
                        cvZero(re);
                        cvMatchTemplate(rightImageROI, currentROI, re, CV_TM_CCORR_NORMED);
                        cvMinMaxLoc(re, &minval, &maxval, &minloc, &maxloc);
                        cvReleaseImage(&re);
                        //printf("%4.4f\n", minval);
                    }

                    else { // we can use disparity of previous level to narrow down search area

//Similar to above part uses cvTemplate but difference is it uses reduced area for matching                             

                            maxloc.x = maxloc.x + left_limit;   // to account for the limits set above
                            cvReleaseImage(&re);

                        }
                        disparity_map[i][j][curHeight][curWidth] = curWidth - (maxloc.x + 2);       
                        cvReleaseImage(&currentROI);

    }
...