使用OpenMP的并行IplImage转换
Parallel IplImage transformation using OpenMP
我想使用OpenMP对IplImage进行一些转换。这是一个简单的变换,将图像颠倒过来。使用OpenMP的代码与不使用OpenMP相同。这其实并不重要。
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推送到内部循环。当我不知道出了什么问题时,我已经做了所有其他神奇的事情(删除这个,添加那个)。这就是我从代码中调用该方法的方式:
for (vector<filter_ptr>::iterator it = filters.begin();
it != filters.end(); ++it) {
(*it)->filter(dstImage);
}
有人能告诉我我做错了什么吗?
由于我无法编译您的代码,我自己编写了代码,我认为这非常相似。你已经压平了你的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
我认为没有加速的原因是程序内存受限。也就是说,程序的速度由向存储器发送数据和从存储器发送数据的速度控制。因此,无论你有多少核心,你都不能走得更快,因为它们不是限制因素。
相关文章:
- 将C OpenCV Iplimage Imagedata和widthstep转换为Android OpenCV垫子
- opencv:将垫子转换为 iplImage 问题
- 将 IplImage 转换为 Mat 时出错
- 将IplImage IPL_DEPTH_32S转换为QImage Format_RGB32的最快方法
- 将 DirectX11 ID3D11Texture2D 从 Shader 转换为 OpenCV IplImage
- OpenCV:将 IPLIMAGE 转换为 MAT 后出错
- 将 Vector<vector<Point> > X 转换为 IplImage* 或 cv::Mat*
- 如何将IplImage opencv转换为字节数组(bmp格式)C++
- 使用OpenMP的并行IplImage转换
- 错误 C2679:二进制'=':未找到采用类型 'IplImage *' 的右侧操作数的运算符(或没有可接受的转换) OpenCV
- 将IplImage*类型转换为CvMat
- 将IPLimage转换为h.263格式
- Opencv:转换垫IplImage为cvLabel
- 将IplImage转换为位图的错误头文件
- 如何在OpenCV中将8位IplImage转换为24位IplImage
- 如何转换IplImage(OpenCV)到ALLEGRO_BITMAP (A5)快速
- 转换从IplImage*到cv::MAT
- 使用 reinterpret_cast将一维动态数组转换为 IplImage 的图像数据类型
- 在OpenCV和C/C++中将Mat转换为IplImage*
- 从 Iplimage 转换为 Mat 不会保留深度信息