2012-01-17 3 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로 컴파일 하시겠습니까? 왜 지금 너를 사용하고 있니? – Tudor

+0

여러 개의 CPU 코어를 가질 수 있지만 메모리 버스는 하나뿐입니다. 여기서 제약 조건은 바이트 만 이동하는 것입니다. –

+0

믿기지 않을 경우, 실행중인 프로세스 수에 대한 검사를 추가하십시오.'int omp_get_num_threads()'를보십시오. – Bort

답변

3

나는 당신의 코드를 컴파일 할 수 없었기 때문에 나는 꽤 유사하다고 생각하는 자기 자신을 썼다. 당신은 2D 매트릭스를 평평하게하고 나는 괴롭혀 질 수는 없지만 그것이 내가 당신에게 잘못된 생각에 영향을 줄 것이라고는 생각하지 않습니다.

#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 

나는 프로그램이 메모리을 결합하기 때문에 더 속도 향상이없는 이유가 생각합니다. 즉, 프로그램의 속도는 메모리로 데이터를 전송하는 속도에 의해 제어됩니다. 따라서 얼마나 많은 코어를 가지고 있더라도 아무런 제한이 없습니다.

관련 문제