【发布时间】:2019-09-27 06:25:02
【问题描述】:
我正在尝试使用 Neon SIMD 在 ODROID XU4 ARM 平台上加速立体匹配算法。为此,我正在使用 openMp 语用。
void StereoMatch:: sadCol(uint8_t* leftRank,uint8_t* rightRank,const int SAD_WIDTH,const int SAD_WIDTH_STEP, const int imgWidth,int j, int d , uint16_t* cost)
{
uint16_t sum = 0;
int n = 0;
int m =0;
for ( n = 0; n < SAD_WIDTH+1; n++)
{
#pragma omp simd
for( m = 0; m< SAD_WIDTH_STEP; m = m + imgWidth )
{
sum += abs(leftRank[j+m+n]-rightRank[j+m+n-d]);
};
cost[n] = sum;
sum = 0;
};
我对 SIMD 和 openMp 还很陌生,我知道在代码中使用 SIMD pragma 会指示编译器对减法进行矢量化处理,但是当我执行代码时,我发现没有区别。我应该在我的代码中添加什么以对其进行矢量化?
【问题讨论】:
-
你用什么标志编译?试试
-O3 -fopenmp-simd -march=native -mfpu=neon -
在您的特定情况下,您还需要将
reduction(+:sum)与simdpragma 一起使用。 -
我没有使用 Neon 的实际经验,但 SIMD 通常不适用于跨步内存访问。我会切换循环的顺序,即在内循环中累积到多个
cost[n]。SAD_WIDTH、SAD_WIDTH_STEP和imgWidth的典型值是什么? -
这是 Godbolt 上的清理版本:godbolt.org/z/SPQ5_t。您可能需要使用内在函数手动优化它,但您可以尝试使用内部循环的指针;
-d绝对是搞砸事情的好人选。 -
@TakiEddine 我不认为您所经历的加速要归功于 SIMD,而是 OpenMP 完成了通过多个内核分配工作负载的工作。如果编写得当,即使在单核上,它也会比原来的快几十倍。我不会使用多核来完成这样一项带宽有限的琐碎工作。
标签: arm openmp simd neon odroid