2012-01-17 39 views
3

我想使用OpenMP對IplImage進行一些轉換。這是簡單的轉換,將圖像顛倒。 OpenMP的代碼與沒有的代碼運行相同。這並不重要。使用OpenMP的並行IplImage轉換

void UpsideDownFilter::filter(IplImage* dstImage) { 
uchar temp; 
int j; 
int i; 
#pragma omp parallel shared(dstImage) private(j, i, temp) 
{ 
    //  std::cout << omp_get_thread_num() << std::endl; 
#pragma omp for schedule(static, 30) nowait 
    for(j = 0; j < dstImage->height/2; ++j) { 

     for(i = 0; i < dstImage->widthStep; ++i) { 
      temp = dstImage->imageData[i + j * dstImage->widthStep]; 

      dstImage->imageData[i + j * dstImage->widthStep] = 
       dstImage->imageData[i + (dstImage->height - 1 - j) * 
            dstImage->widthStep]; 

      dstImage->imageData[i + (dstImage->height - 1 - j) * 
           dstImage->widthStep] = temp; 
     } 
    } 
} 
} 

我已經將#pragma omp推到內部循環。當我不知道什麼是錯的時候,我做了所有其他的魔術(刪除這個,加上)。這是我如何從我的代碼中調用該方法:

for (vector<filter_ptr>::iterator it = filters.begin(); 
    it != filters.end(); ++it) { 

    (*it)->filter(dstImage); 
} 

有人能告訴我我做錯了什麼嗎?

+0

你用-openmp編譯嗎?你爲什麼使用nowait? – Tudor 2012-01-17 19:52:35

+0

您可以擁有多個CPU核心,但仍然只有一條內存總線。這裏的約束是,你只是移動字節。 – 2012-01-18 05:01:14

+0

如果您不相信它,請添加有關您正在運行的進程數量的檢查,請參閱int omp_get_num_threads()' – Bort 2012-01-18 09:51:52

回答

3

由於我無法編譯你的代碼,我寫了我自己的代碼,我覺得它非常相似。你已經放平了你的二維矩陣,我不會受到困擾,但我認爲這不會影響我認爲會出錯的東西。

#include <vector> 

typedef std::vector<std::vector<double> > matrix_t; 

void flip(matrix_t& A, int const m, int n) 
{ 
    int m_2 = m/2; 
    #pragma omp parallel for 
    for (int i = 0; i < m_2; ++i) { 
     for (int j = 0; j < n; ++j) { 
      std::swap(A[i][j], A[m - (i + 1)][j]); 
     } 
    } 
} 

int 
main() 
{ 
    int n = 20000; 
    matrix_t A (n, std::vector<double>(n, 1.0)); 
    flip(A, n, n); 
    return 0; 
} 

在四核機器上,我也沒有加速。

> g++ -O2 s18.cc && /usr/bin/time ./a.out && g++ -fopenmp -O2 s18.cc && /usr/bin/time ./a.out 
2.61user 2.18system 0:04.79elapsed 99%CPU (0avgtext+0avgdata 12805936maxresident)k 
0inputs+0outputs (0major+800428minor)pagefaults 0swaps 
7.67user 2.23system 0:04.71elapsed 210%CPU (0avgtext+0avgdata 12806512maxresident)k 
0inputs+0outputs (0major+800481minor)pagefaults 0swaps 

我覺得爲什麼沒有加速的原因是因爲程序存儲器限制。這就是程序的速度是由向內存發送和從內存發送數據的速度控制的。所以無論你擁有多少核心,你都不可能走得更快,因爲它們不是限制因素。