C++ 尝试并行嵌套循环时出现OpenMP seg错误(Android NDK)
我正在尝试在我的Android NDK项目中使用OpenMP。我有一个程序,从相机接收帧,并对2D矩阵进行处理。我想并行访问和更新每个像素值。我有以下代码,其中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)
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;xomp\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)
的调用,仍然存在分段错误。我也尝试了计划(静态)
——但没有运气。