openmp-使用openMP加速遇到的问题

问题描述

使用openMP加速遇到的问题

使用openMP对嵌套for循环加速来遍历图像中的每个像素但是调试的时候出现问题错误提示:test.exe已出发一个断点。test.exe 中的 0x011e1297 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。有时候会出现Windows 已在 test.exe 中触发一个断点。其原因可能是堆被损坏,这说明 test.exe 中或它所加载的任何 DLL 中有 Bug。原因也可能是用户在 test.exe 具有焦点时按下了 F12。输出窗口可能提供了更多诊断信息。然后中断跳转到xstring的1070行 return(*this) this的值为d:opencv2.4.5opencvbuildincludeopencv2coremat.hpp" std::basic_string,std::allocator > * const
我尝试跑空循环是没有错的,不知道为什么,求教

static void initGMMs( const Mat& img, const Mat& mask, GMM& bgdGMM, GMM& fgdGMM )

{

const int kMeansItCount = 10; //迭代次数

const int kMeansType = KMEANS_PP_CENTERS; //Use kmeans++ center initialization by Arthur and Vassilvitskii

Mat bgdLabels, fgdLabels; //记录背景和前景的像素样本集中每个像素对应GMM的哪个高斯模型,论文中的kn
vector<Vec3f> bgdSamples, fgdSamples; //背景和前景的像素样本集
int x,y;
#pragma omp parallel for
for (y = 0; y < img.rows; y++)
//for( p.y = 0; p.y < img.rows; p.y++ )
{
    for (x = 0; x < img.cols; x++)
    //for( p.x = 0; p.x < img.cols; p.x++ )
    {
        #pragma omp critical
        {
        Point p;
        p.y = y;
        p.x = x;
        //mask中标记为GC_BGD和GC_PR_BGD的像素都作为背景的样本像素
        if( mask.at<uchar>(p) == GC_BGD || mask.at<uchar>(p) == GC_PR_BGD )
            bgdSamples.push_back( (Vec3f)img.at<Vec3b>(p) );
        else
            fgdSamples.push_back( (Vec3f)img.at<Vec3b>(p) );
        }
    }
 }  

CV_Assert( !bgdSamples.empty() && !fgdSamples.empty() );  

Mat _bgdSamples( (int)bgdSamples.size(), 3, CV_32FC1, &bgdSamples[0][0] );
kmeans( _bgdSamples, GMM::componentsCount, bgdLabels,
        TermCriteria( CV_TERMCRIT_ITER, kMeansItCount, 0.0), 0, kMeansType );
Mat _fgdSamples( (int)fgdSamples.size(), 3, CV_32FC1, &fgdSamples[0][0] );
kmeans( _fgdSamples, GMM::componentsCount, fgdLabels,
        TermCriteria( CV_TERMCRIT_ITER, kMeansItCount, 0.0), 0, kMeansType );  

bgdGMM.initLearning();
try
{
#pragma omp parallel for
for( int i = 0; i < (int)bgdSamples.size(); i++ )
    bgdGMM.addSample( bgdLabels.at<int>(i,0), bgdSamples[i] );
bgdGMM.endLearning();
}
catch( cv::Exception& e )
{
    const char* err_msg = e.what();
    printf ("%sn", err_msg);
}
fgdGMM.initLearning();
int t = (int)fgdSamples.size();
try
{
#pragma omp parallel for
for( int i = 0; i < (int)fgdSamples.size(); i++ )
    fgdGMM.addSample( fgdLabels.at<int>(i,0), fgdSamples[i] );
fgdGMM.endLearning();
}
catch(cv::Exception& e)
{
    const char* err_msg = e.what();
    printf ("%sn", err_msg);
}

}

解决方案

push_back的问题

时间: 2024-10-01 07:42:53

openmp-使用openMP加速遇到的问题的相关文章

OpenMP框架入门

OpenMP 框架是使用 C.C++ 和 Fortran 进行并发编程的一种强大方法.GNU Compiler Collection (GCC) V4.2 支持 OpenMP 2.5 标准,而 GCC 4.4 支持最新的 OpenMP 3 标准.包括 Microsoft? Visual Studio 在内的其他编译器也支持 OpenMP.在本文中,您可以学习使用 OpenMP 编译指示 (pragma),寻找对 OpenMP 提供的一些应用程序编程接口 (API) 的 支持,并使用一些并行算法对

多线程-为何使用openmp对程序进行加速,但效果并不理想

问题描述 为何使用openmp对程序进行加速,但效果并不理想 我需要多次(约30万次)对一个较大的矩阵(88147乘以2000)进行计算,而计算过程并不复杂,只是简单的将整个矩阵遍历一遍,做一些小的计算. 这30万次计算中的每一次都是基于上一次的计算结果. 我在一台32核的服务器上跑这个程序,因为计算一次的时间较长(约10分钟),30万次所需的时间太长,因此我想使用openmp来加速它,因为第一次使用openmp,我简单的使用了"for"来对for循环加速,下面是我的代码,openmp

C/C++中榨干硬件性能的N种并行姿势初探

1. 前言 关于并行计算介绍参见https://computing.llnl.gov/tutorials/parallel_comp/ 下面主要就部分单进程中常见的几种并行优化技术和相应的框架做一些简单的整理和分析对比,并且主要偏重于端,不涉及多节点多进程! 2. 并行计算结构分类 目前常见的是分类方法主要是Flynn提出的经典分类法:根据指令流(单指令或多指令)和数据流(单数据流或多数据流)来分类,如下图: 几种常见的并行计算框架(技术) 1). 基于SIMD的并行优化技术 a. Neon技术

值得推荐的开源C/C++框架和库

值得学习的C语言开源项目   - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力.Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行. 下载链接:http://home.tiscali.cz/~cz210552/webbench.html - 2. Tinyhttpd tinyhttpd是一个超轻量型

值得推荐的C/C++框架和库

下次造轮子前先看看现有的轮子吧   值得学习的C语言开源项目 - 1. Webbench  Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力.Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行. 下载链接:http://home.tiscali.cz/~cz210552/webbench.html - 2. Tinyhttpd

【干货】国外程序员整理的 C++ 资源大全

 关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准

站在巨人的肩膀上,C++开源库大全

程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等.   标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架

国外程序员整理的 C++ 资源大全

摘要:C++是在C语言的基础上开发的一种集面向对象编程.泛型编程和过程化编程于一体的编程语言.应用较为广泛,是一种静态数据类型检查的,支持多重编程的通用程序设计语言. 关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等.   标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Templat

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来.需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善. 2000年,UIUC的Chris Lattner主持开发了一套称为LLVM(Low Level Virtual Machine)的编译器工具库套件.后来,LLVM的scope越来越大,Low Level Virtual Machine已经不足以表示LLVM的全部,于是,LLVM就变成了正式的名字.LLVM可以