C++ 尝试并行嵌套循环时出现OpenMP seg错误(Android NDK)

C++ 尝试并行嵌套循环时出现OpenMP seg错误(Android NDK),c++,multithreading,android-ndk,openmp,C++,Multithreading,Android Ndk,Openmp,我正在尝试在我的Android NDK项目中使用OpenMP。我有一个程序,从相机接收帧,并对2D矩阵进行处理。我想并行访问和更新每个像素值。我有以下代码,其中mat是processFrame函数的局部2D矩阵,但是这会导致分段错误: unsigned y,x; #pragma omp parallel shared(mat) private(y,x) { #pragma omp for schedule(dynamic,1) collapse(2)

我正在尝试在我的Android NDK项目中使用OpenMP。我有一个程序,从相机接收帧,并对2D矩阵进行处理。我想并行访问和更新每个像素值。我有以下代码,其中
mat
processFrame
函数的局部2D矩阵,但是这会导致分段错误:

unsigned y,x;
    #pragma omp parallel shared(mat) private(y,x)
            {
    #pragma omp for schedule(dynamic,1) collapse(2)
                //For each row
                for (y = 0U; y < _height; ++y){
                    // For each column
                    for ( x = 0U; x < _width; ++x){
                        mat.at<Vec3b>(y, x) = Vec3b(0, 0, 0);           // Background
                    }
                }
            }
无符号y,x;
#pragma omp并行共享(mat)专用(y,x)
{
#计划的pragma omp(动态,1)崩溃(2)
//每行
对于(y=0U;y<_高度;++y){
//每列
用于(x=0U;x<_宽度;++x){
mat.at(y,x)=Vec3b(0,0,0);//背景
}
}
}
在程序开始时,我能够使用OpenMP初始化全局矩阵,例如:

#pragma omp parallel for schedule(dynamic,1) collapse(2)
for (unsigned y = 0U; y < height; ++y)
{
    // For each column
    for (unsigned x = 0U; x < width; ++x)
    {
        // For each channel
        #pragma omp parallel for
        for (unsigned i = 0U; i < 3U; ++i)
            pixels[x][y].bgr[i] = pixels[x][y].mean_bgr[i] = 0.0F;

        pixels[x][y].scalar = pixels[x][y].pot = pixels[x][y].mean_pot = pixels[x][y].std_pot = 0.0F;
    }
}
计划(动态,1)折叠(2)的pragma omp并行 用于(无符号y=0U;y<高度;++y) { //每列 用于(无符号x=0U;x 上面的代码似乎工作正常。注意:我调用
omp\u set\u嵌套(1)在我的主方法中。我不确定我做错了什么

更新:


我认为问题在于Java本机接口。因为我的
processFrame()
函数是一个JNI函数调用,所以JVM将其中的所有处理仅限于主线程(我认为)。我尝试包装处理,即使用JNI函数调用本机函数,该函数使用
Mat
image frame变量的克隆,但这也失败了。我认为在这种情况下可能无法使用OpenMP。因此,我的新策略是Java端的多线程-将
Mat
图像帧分割成块,并在单独的线程中处理每个块。我不确定Java中是否有易于使用的OpenMP等效库,但我将研究Java并发性。谢谢你的意见

不启用OpenMP时会发生什么情况。代码还能用吗?我看不出有什么明显的错误。您需要提供有关
mat
的更多信息。我认为您应该使用
schedule(static)
,没有理由只使用三次迭代来并行化循环。我认为
mat
可能是一个问题。它是一个OpenCV类(表示我从相机获得的帧),方法
mat.at(x,y)
返回指定位置的像素。OpenMP不支持吗?您是从主线程还是后台线程运行此代码?我只有一个主线程。注意:我删除了对
mat.at(x,y)
的调用,仍然存在分段错误。我也尝试了
计划(静态)
——但没有运气。