Я распараллеливаю цикл, используя 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(¤tROI);
}