2014-09-11 48 views
-1

我對OpenMP和OpenCV非常陌生。我正在嘗試縮短使用OpenCV和OpenMP差異化兩張圖像的時間。但是,使用OpenMP並行循環所花費的時間比順序循環所耗費的時間多一些。謹慎地建議可以做些什麼。使用OpenMP和OpenCV減少處理時間

我的代碼是

int main() 
{ 

omp_set_num_threads(4); 
double omp_time1,omp_time2; 

cv::Mat image_1= cv::imread("1.png"); 
cv::Mat image_2=cv::imread("2.png"); 


vector<cv::Mat> rgb_planes_1; 
cv::split(image_1, rgb_planes_1); 
vector<cv::Mat> rgb_planes_2; 
cv::split(image_2, rgb_planes_2); 

cv::Mat sub_rgb_0[3]; 

#ifdef _OPENMP 
omp_time1 = omp_get_wtime(); 
#endif 

#pragma omp parallel private(tid) 
    { 
    tid = omp_get_thread_num(); 
    if (tid == 0) 
    { 
    nthreads = omp_get_num_threads(); 
    printf("Number of threads = %d\n", nthreads); 
    } 
    printf("Thread %d starting...\n",tid); 
    #pragma omp for schedule(static) 
    for (i=0; i<3; i++) 
    { 

     absdiff(rgb_planes_1[i],rgb_planes_2[i],sub_rgb_0[i]); 

    } 
    } 
#ifdef _OPENMP 
omp_time2 = omp_get_wtime(); 
#endif 

printf("Parallel::%f seconds.\n", omp_time2 - omptime1); 
} 

這需要 並行::0.006757秒。

當我在沒有OpenMP段的情況下嘗試相同時,CPU時鐘給出了 0.00200秒。

+0

我不認爲你需要'schedule(static)'for 3 for for循環。看看避免這種情況是否會變得更快。 – 2014-09-11 12:40:59

+0

你只運行一次你的基準測試,這是一個非常非常小的測試。時間可能由OpenMP初始化時間控制,這隻會影響第一次運行。我建議兩個實驗:嘗試10次運行測試,而不是一次,然後嘗試一個(更多)更大的圖像。 – pburka 2014-09-11 15:19:12

回答

0

除了Alex和pburka給出的信息,你的sceduling並不一定是最佳的,因爲如此少量的循環和時間只是一輪不能提供可靠的度量,請記住,OpenCV是高度優化的並且使用自身TBB和SMID優化。所以你可能不會比用3通道Mat調用absdiff好一點。