SIMD-векторизация функции Собеля на ARM Cortex - PullRequest
2 голосов
/ 26 мая 2020

В настоящее время пытается векторизовать функцию, как показано ниже. Это функция, используемая для обработки изображений, и я не могу понять, как ее векторизовать. Я предполагаю, что мне нужно оптимизировать для l oop, где переменные Gx и Gy обновляются в // Вычислить сумму маски Собела, умноженную на девять окружающих пикселей в секции x и y.

Мне рекомендовали использовать __SMLAD () из встроенных функций руки, как указано здесь: https://developer.arm.com/docs/dui0472/j/armv6-simd-instruction-intrinsics/__smlad-intrinsic Однако я просто не могу понять, как его использовать ... любая помощь о том, как использовать __SMLAD (), будет буду очень признателен, поскольку кажется, что просто нет никаких примеров его использования в inte rnet где-либо.

Вот функция:

void Sobel(){

int row, col, rowOffset, colOffset,Gx,Gy;   

float thisAngle;                
uint8_t newAngle;

    /*---------------------- Sobel ---------------------------------*/
    for (row = 1; row < N-1; row++) {
    for (col = 1; col < M-1; col++) {

        Gx = 0;
        Gy = 0;

        //Calculate the sum of the Sobel mask times the nine surrounding pixels in the x and y direction 
        for (rowOffset=-1; rowOffset<=1; rowOffset++) {
            for (colOffset=-1; colOffset<=1; colOffset++) {

                Gx += out_img[row+rowOffset][col+colOffset] * GxMask[rowOffset + 1][colOffset + 1];
                Gy += out_img[row+rowOffset][col+colOffset] * GyMask[rowOffset + 1][colOffset + 1];
            }
        }

        gradient[row][col] = abs(Gx) + abs(Gy); // Calculate gradient strength      
        thisAngle = (atan2((float) Gx, (float) Gy)/3.14159f) * 180.0f;      // Calculate actual direction of edge [-180, +180]

        // Convert actual edge direction to approximate value 
        if ( ( (thisAngle >= -22.5f) && (thisAngle <= 22.5f) ) || (thisAngle >= 157.5f) || (thisAngle <= -157.5f) )
            newAngle = 0;
        if ( ( (thisAngle > 22.5f) && (thisAngle < 67.5f) ) || ( (thisAngle > -157.5f) && (thisAngle < -112.5f) ) )
            newAngle = 45;
        if ( ( (thisAngle >= 67.5f) && (thisAngle <= 112.5f) ) || ( (thisAngle >= -112.5f) && (thisAngle <= -67.5f) ) )
            newAngle = 90;
        if ( ( (thisAngle > 112.5f) && (thisAngle < 157.5f) ) || ( (thisAngle > -67.5f) && (thisAngle < -22.5f) ) )
            newAngle = 135;

        edge_Dir[row][col] = newAngle;      


    }
}

}
...