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);
}
아무도 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?
-openmp로 컴파일 하시겠습니까? 왜 지금 너를 사용하고 있니? – Tudor
여러 개의 CPU 코어를 가질 수 있지만 메모리 버스는 하나뿐입니다. 여기서 제약 조건은 바이트 만 이동하는 것입니다. –
믿기지 않을 경우, 실행중인 프로세스 수에 대한 검사를 추가하십시오.'int omp_get_num_threads()'를보십시오. – Bort