簡體   English   中英

如何加快我的雙線性插值?

[英]How to speed up my bilinear interpolation?

我花了無數小時試圖加快雙線性插值的速度,但無濟於事。 我什至嘗試了SSE版本(雙重版本和浮動版本),但是比這個版本還要慢。

有人有什么想法嗎?

template <typename T>
__forceinline void interp2_mx(const T& x, const T& y,
                              const T* z,
                              const int32_t& n,
                              const int32_t& mm2,
                              const int32_t& nm2,
                              T& val,
                              const T& extrapval = T(0))
{
    int64_t xp = (int64_t)(x) - 1;      // adjust for MATLAB indexing
    int64_t yp = (int64_t)(y) - 1;
    if (xp < 0 || xp > nm2 || yp < 0 || yp > mm2)
    {
        val = extrapval;
    }
    else
    {
        const T* line = z + yp * n + xp;
        T xf = x - (int64_t)(x);        
        T yf = y - (int64_t)(y);
        T x1mf = (T)1 - xf;
        T y1mf = (T)1 - yf;

        T v00 = x1mf * y1mf * (*(line));
        T v01 = xf * y1mf * (*(line + 1));     
        T v10 = x1mf * yf * (*(line + n));     
        T v11 = xf * yf * (*(line + n + 1));   
        val = v00 + v01 + v10 + v11;
    }
} 

template <typename T>
void interp2(const T* z,
             const int32_t& mz, const int32_t& nz,
             const T* xi, const T* yi,
             const int32_t& mi, const int32_t& ni,
             T* zi,
             const T& extrapval = T(0))
{
    const int32_t nzm2 = nz - 2;
    const int32_t mzm2 = mz - 2;    
    #pragma omp parallel for
    for (int m = 0; m < mi; ++m)
    {        
        T* line_zi = zi + m * ni;    
        const T* x = xi + m * ni;
        const T* y = yi + m * ni;
        for (int n = 0; n < ni; ++n, ++x, ++y, ++line_zi)
        {
            interp2_mx((*x), (*y), z, nz, mzm2, nzm2, (*line_zi));            
        }
    }
}

您對xf計算會進行float-to-int64_t-float轉換。 我假設您知道該值在范圍內,否則將為“未定義行為”(數學上沒有意義)。 std::modf()可能是更好的函數,因為它直接計算所需的值。

我還認為相鄰像素具有相當相關的xf和x1mf值,但您需要重新計算它們。 我不確定這是因為您的坐標似乎是間接存儲的( (*x), (*y) )。 即時計算可能會更有效。 由於這些指針可能會使輸出別名,因此無法預取它們,並且讀取將阻塞內存總線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM