перемножение ядра свертки фильтра размером 3x3 с массивом це
От: MartinEden  
Дата: 17.05.18 14:39
Оценка:
Имеется сверточное ядро 3х3 и изображение, представленной массивом пикселей целочисленных значение.
Сверточное ядро представлено так:

//составные сверточные ядра :
//                 
// сверточное ядро H = 
//......| 1, 0,  1|
//src x | 0, 0,  0|
//......|-1, 0, -1|
//                 

//                 
// сверточное ядро V = 
//......| 1, 0, -1|
//src x | 0, 0,  0|
//......| 1, 0, -1|
//


сверточное ядро = ядро H + ядро V

Реализация на С-коде имеется, теперь пытаюсь ее переложить на SSE код.


    for(int inc=0; inc<height-2; inc++)
    {
        //загрузил в пямять 3 строки
            str1_16pxs = _mm_loadu_si128((__m128i*)(src_all_str));
        str2_16pxs = _mm_loadu_si128((__m128i*)(src2_all_str));
        str3_16pxs = _mm_loadu_si128((__m128i*)(src3_all_str));

        //упаковал по 16 разрядов
        str1_16pxs_pack1st_8to16 = _mm_cvtepu8_epi16(str1_16pxs);
        str2_16pxs_pack1st_8to16 = _mm_cvtepu8_epi16(str2_16pxs);
        str3_16pxs_pack1st_8to16 = _mm_cvtepu8_epi16(str3_16pxs);

//---!
        //здесь делаем 1ую свертку для 8px's
        //... В этом месте должен вставляется код !!!!
//---

        //summ 1st 8to16 vertical registers
        sum1_str12_vert_16pxs_pack1st_8to16  = _mm_add_epi16(str1_16pxs_pack1st_8to16,           str2_16pxs_pack1st_8to16);
        sum1_str123_vert_16pxs_pack1st_8to16 = _mm_add_epi16(sum1_str12_vert_16pxs_pack1st_8to16,str3_16pxs_pack1st_8to16);

        for(int jnc=0; jnc<(width >> 4); jnc++)
        {

            str1_16pxs_plus_8pxs = _mm_srli_si128(str1_16pxs, 8);
            str2_16pxs_plus_8pxs = _mm_srli_si128(str2_16pxs, 8);
            str3_16pxs_plus_8pxs = _mm_srli_si128(str3_16pxs, 8);

            //pack 2nd 8to16 registers (+8px's)
            str1_16pxs_pack2nd_8to16 = _mm_cvtepu8_epi16(str1_16pxs_plus_8pxs);
            str2_16pxs_pack2nd_8to16 = _mm_cvtepu8_epi16(str2_16pxs_plus_8pxs);
            str3_16pxs_pack2nd_8to16 = _mm_cvtepu8_epi16(str3_16pxs_plus_8pxs);

//---!
            //делаем свертку для остальных 8px's и так до конца считанной строки
            //... В этом месте должен вставляется код !!!!
//---

            //summ vertic 8to16 registers
            sum1_str12_vert_16pxs_pack2nd_8to16  = _mm_add_epi16(str1_16pxs_pack2nd_8to16,           str2_16pxs_pack2nd_8to16);
            sum1_str123_vert_16pxs_pack2nd_8to16 = _mm_add_epi16(sum1_str12_vert_16pxs_pack2nd_8to16,str3_16pxs_pack2nd_8to16);

//---!4            loading next 16 px's
            src_all_str += 16;
            src2_all_str += 16;
            src3_all_str += 16;

            //...

            _mm_store_si128((__m128i*)(dst_all_str), res);
            dst_all_str += 8;

        }//for(jnc)

    }//for(inc)

Я правда не знаю, как делать перемножение сверточного 3x3 ядра с SSE считанной строкой.
Буду очень благодарен, если покажете.
Отредактировано 22.05.2018 14:37 MartinEden . Предыдущая версия . Еще …
Отредактировано 22.05.2018 12:35 MartinEden . Предыдущая версия .
Re: перемножение ядра свертки фильтра размером 3x3 с массивом це
От: T4r4sB Россия  
Дата: 22.05.18 12:43
Оценка: :)
Такое на КУДЕ лучше делается...
Re[2]: перемножение ядра свертки фильтра размером 3x3 с массивом це
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 22.05.18 13:01
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Такое на КУДЕ лучше делается...


...и не работает на компах без Nvidia. То есть на куче ноутов. Намного лучше на OpenCL тогда уже, покрытие куда большее: CPU, iGPU, Nvidia GPU, AMD GPU. Куда — это только для конкретных случаев.
Re: перемножение ядра свертки фильтра размером 3x3 с массивом це
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 22.05.18 13:02
Оценка: 1 (1)
Здравствуйте, MartinEden, Вы писали:

ME>Я правда не знаю, как делать перемножение сверточного 3x3 ядра с SSE считанной строкой.

ME>Буду очень благодарен, если покажете.

Ответа не знаю, потому что пользуюсь библиотечным фильтром, который внутри себя как раз SSE и использует.
Re[2]: перемножение ядра свертки фильтра размером 3x3 с массивом це
От: MartinEden  
Дата: 30.05.18 11:57
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, MartinEden, Вы писали:


ME>>Я правда не знаю, как делать перемножение сверточного 3x3 ядра с SSE считанной строкой.

ME>>Буду очень благодарен, если покажете.

N>Ответа не знаю, потому что пользуюсь библиотечным фильтром, который внутри себя как раз SSE и использует.

Добрый день.) Задача решилась, всем спасибо.) На исходники библиотечн. фильтра посмотрел, слов нет, ребята определенно постарались.)
Re[3]: перемножение ядра свертки фильтра размером 3x3 с массивом це
От: IID Россия  
Дата: 18.06.18 13:10
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>...и не работает на компах без Nvidia. То есть на куче ноутов. Намного лучше на OpenCL тогда уже, покрытие куда большее: CPU, iGPU, Nvidia GPU, AMD GPU. Куда — это только для конкретных случаев.


Вчера, поиграв в Tomb Raider и Starcraft 2 на своей 1080ti, я запустил AIDA64 по просьбе знакомого, снять данные о скорости видеопамяти.

И она сообщила мне, что... OpenCL устройств у меня нет Хотя менее года назад работала прекрасно. Вот тебе, бабка, и Юрьев день. ХЗ что наменялось в последних драйверах на видюху, апдейтятся они регулярно, может версия AIDA уже устарела и несовместима. Разбираться мне лень.
kalsarikännit
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.