色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用OpenCV中的universal intrinsics為算法提速 (三)

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-10 19:40 ? 次閱讀
本文作者:于仕琪(OpenCV團隊)

OpenCV 4.x中提供了強大的統一向量指令(universal intrinsics),使用這些指令可以方便地為算法提速。所有的計算密集型任務皆可使用這套指令加速,非計算機視覺算法也可。目前OpenCV的代碼加速實現基本上都基于這套指令。

前序文章:
使用OpenCV中的universal intrinsics為算法提速 (1)
使用OpenCV中的universal intrinsics為算法提速 (2)

前序文章1介紹了怎么編寫C語言代碼使用OpenCV中的universal intrinsics來加速;文章2介紹了編譯器的選項。

本文使用一個向量點乘的例子,來展示universal intrinsics的的提速。

我們有兩個向量vec1和vec2,將對應元素相乘,然后累加起來。計算公式為:

sum=vec1[0]*vec2[0] + vec1[1]*vec2[1]+ ... + vec1[n]*vec2[n].

如果采用純C語言,兩個行向量的點乘實現如下(如代碼顯示不完整,可以左右滑動;或橫屏閱讀)

float dotproduct_c_float(Mat vec1, Mat vec2)
{
    float * pV1 = vec1.ptr(0);
    float * pV2 = vec2.ptr(0);
    float sum = 0.0f;
    for (size_t c = 0; c < vec1.cols; c++)
    {
        sum += pV1[c] * pV2[c];            
    }
    return sum;
}

如果采用OpenCV的universal intrinsics,兩個行向量的點乘實現如下:

(注意:下面函數僅為展示原理,未考慮數組長度不是16(32或64)字節倍數情況)

float dotproduct_simd_float(Mat vec1, Mat vec2)
{
    float * pV1 = vec1.ptr(0);
    float * pV2 = vec2.ptr(0);
    size_t step = sizeof(v_float32)/sizeof(float);

    //向量元素全部初始化為零
    v_float32 v_sum = vx_setzero_f32();
    for (size_t c = 0; c < vec1.cols; c+=step)
    {
        v_float32 v1 = vx_load(pV1+c);
        v_float32 v2 = vx_load(pV2+c);
        //把乘積累加
        v_sum += v1 * v2; 
    }
    //把向量里的所有元素求和
    float sum = v_reduce_sum(v_sum);

    return sum;
}

例程使用OPEN AI LAB的EAIDK-310開發板,OpenCV4.2.0,CPU型號為是RK3228H,采用ARM四核64位處理器 ,四核Cortex-A53,最高1.3GHz。

兩個例子的編譯命令分別如下(注意:皆采用了-O3選項以提速):

g++ dotproduct-c.cpp -o dotproduct-c -O3 -I/usr/local/include/opencv4 -lopencv_core
g++ dotproduct-simd.cpp -o dotproduct-simd -O3 -I/usr/local/include/opencv4 -lopencv_core

從兩個函數的耗時可以看出,采用OpenCV的universal intrinsics后耗時僅為一半,速度翻倍。

兩個例程的完整源代碼如下。首先是C語言版本的dotproduct-c.cpp:


#include 

using namespace cv;

float dotproduct_c_float(Mat vec1, Mat vec2)
{
    float * pV1 = vec1.ptr(0);
    float * pV2 = vec2.ptr(0);
    float sum = 0.0f;
    for (size_t c = 0; c < vec1.cols; c++)
    {
        sum += pV1[c] * pV2[c];            
    }
    return sum;
}

int main(int argc, char ** argv)
{

    Mat vec1(1, 16*1024*1024, CV_32FC1);
    Mat vec2(1, 16*1024*1024, CV_32FC1);

    vec1.ptr(0)[2]=3.3f;
    vec2.ptr(0)[2]=2.0f;

    double t = 0.0;
    t = (double)getTickCount();

    float sum = dotproduct_c_float(vec1, vec2);

    t = ((double)getTickCount() - t) / (double)getTickFrequency() * 1000; 
    printf("C time = %gms/n", t);
    printf("sum=%g/n", sum);

    return 0;
}

dotproduct-simd.cpp如下:

#include 
#include 
#include 
using namespace cv;

float dotproduct_simd_float(Mat vec1, Mat vec2)
{
    float * pV1 = vec1.ptr(0);
    float * pV2 = vec2.ptr(0);
    size_t step = sizeof(v_float32)/sizeof(float);

    //向量元素全部初始化為零
    v_float32 v_sum = vx_setzero_f32();
    for (size_t c = 0; c < vec1.cols; c+=step)
    {
        v_float32 v1 = vx_load(pV1+c);
        v_float32 v2 = vx_load(pV2+c);
        //把乘積累加
        v_sum += v1 * v2; 
    }
    //把向量里的所有元素求和
    float sum = v_reduce_sum(v_sum);

    return sum;
}

int main(int argc, char ** argv)
{

    Mat vec1(1, 16*1024*1024, CV_32FC1);
    Mat vec2(1, 16*1024*1024, CV_32FC1);

    vec1.ptr(0)[2]=3.3f;
    vec2.ptr(0)[2]=2.0f;

    double t = 0.0;
    t = (double)getTickCount();

    float sum = dotproduct_simd_float(vec1, vec2);

    t = ((double)getTickCount() - t) / (double)getTickFrequency() * 1000; 
    printf("SIMD time = %gms/n", t);

    printf("sum=%g/n", sum);

    return 0;
}

OpenCV中國團隊由深圳市人工智能機器人研究院支持,是一個非營利的開源團隊,致力于OpenCV的開發、維護和推廣工作。

獲取OpenCV最新動態,長按下方二維碼關注

本文轉載自公眾號: OpenCV團隊

審核編輯 黃昊宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 人工智能
    +關注

    關注

    1792

    文章

    47409

    瀏覽量

    238924
  • OpenCV
    +關注

    關注

    31

    文章

    635

    瀏覽量

    41386
收藏 人收藏

    評論

    相關推薦

    intrinsics.h出錯問題

    在iccavr運行,出現cannot #include file "intrinsics.h", file not found,請問要怎么解決?求原因和方法
    發表于 09-20 10:00

    【NanoPi NEO試用體驗】OpenCV使用篇

    opencv”和“opencv2”兩個文件夾,文件夾一些頭文件,在編寫程序的時候需要用到。、軟件編寫1.
    發表于 12-03 20:56

    新手求助,HLS實現opencv算法加速的IP在vivado的使用

    我照著xapp1167文檔,用HLS實現fast_corners的opencv算法,并生成IP。然后想把這個算法塞到第季的CH05_AXI_DMA_OV5640_HDMI上,這個de
    發表于 01-16 09:22

    基于QT+OpenCv的目標跟蹤算法實現

    視頻目標跟蹤,本文將首先向大家介紹常用的粒子濾波視頻目標跟蹤算法,對其原理進行簡單的分析,后續進一步選擇和應用算法實現目標跟蹤提供基礎。一、機器視覺及相關理論及OpenCv 機器視覺
    發表于 09-21 10:42

    OpenCV自帶組件HighGUI怎么使用?

    將介紹OpenCV自帶組件HighGUI的簡單使用。當我們在測試算法,查看算法效果的時候,需要用到可視化,動態調參的界面,也可能需要監聽鼠標,鍵盤等的動作,這時,HighGUI就發揮
    發表于 11-05 06:54

    移植OpenCV-4.3.0的過程

    OpenCV-4.3.0是較新的OpenCV版本,最新的版本是OpenCV-4.4.0,由于GitHub太慢總是下載失敗,不得已就移植OpenCV-4.3.0這個版本用著先。在
    發表于 11-04 08:51

    NEON匯編與NEON intrinsics編程的優缺點比較

    的硬件資源不同,即使用intrinsics,有時我們也需要兩套代碼。Ne10FFT實現就是一個例子:上述代碼描述了32位浮點復數FFT算法的基本元——基4蝶形運算。從代碼我們可以看
    發表于 03-30 10:46

    [譯]在RISC-V CPU上運行OpenCV

    正在準備推出。 盡管不同的CPU架構具有不同的矢量指令,但OpenCV許多時間關鍵的內核都使用我們自己的跨平臺Wide Universal Intrinsics進行優化——輕量級內聯
    發表于 06-22 18:54

    openCV的庫自帶了模板匹配算法嗎?

    openCV的庫自帶了模板匹配算法
    發表于 10-10 06:48

    opencv 白平衡算法

    白平衡就是圖片中最亮的部分為白色,最暗的部分為黑色,其余部分進行拉伸。下文將詳細介紹OpenCV實現的灰度世界算法
    發表于 01-17 09:05 ?7827次閱讀

    OpenCV白平衡算法之灰度世界法_OpenCV實現馬賽克和毛玻璃濾鏡效果

    OpenCV白平衡算法之灰度世界法(消除RGB受光照影響) 在用OpenCV對圖像進行處理時,利用顏色定位是常常會接觸到的方法,但RGB受光照影響比較嚴重,轉換到HSV XYZ等空間也解決不了
    發表于 01-17 09:34 ?6824次閱讀

    如何在OpenCV實現CUDA加速

    OpenCV4.x關于CUDA加速的內容主要有兩個部分,第一部分是之前OpenCV支持的圖像處理與對象檢測傳統算法的CUDA加速;第二部分是Ope
    的頭像 發表于 09-05 10:03 ?5073次閱讀

    對比NEON匯編與NEON Intrinsics編程的優缺點

    對于初學者來說,Intrinsics比較易學易用。但是對于有匯編經驗的開發者來說,可能更熟悉NEON匯編編程,切換到Intrinsics反倒需要有個適應過程。下文列出了實際開發的一些問題。
    的頭像 發表于 12-14 09:20 ?1225次閱讀

    OpenCV邊緣模板匹配算法原理詳解

    OpenCV自帶的模板匹配算法,完全是像素基本的模板匹配,特別容易受到光照影響,光照稍微有所不同,該方法就會歇菜了!搞得很多OpenCV初學者剛學習到該方法時候很開心,一用該方法馬上
    的頭像 發表于 12-07 10:56 ?1423次閱讀
    <b class='flag-5'>OpenCV</b>邊緣模板匹配<b class='flag-5'>算法</b>原理詳解

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,提供了大量的圖像處理和計算機視覺相關的算法。以下是一些常見的OpenCV
    的頭像 發表于 07-16 10:40 ?1095次閱讀
    主站蜘蛛池模板: 亚洲 自拍 清纯 综合图区| 麻豆最新免费版| 亚洲裸舞 hd| 国产又湿又黄又硬又刺激视频| 国产高清在线a视频大全| CHINESE老阿姨免费视频| 91综合精品网站久久| 最近最新中文字幕MV高清在线| 一二三四在线观看高清电视剧 | 学生小泬无遮挡女HD| 偷窥 亚洲 色 国产 日韩| 日日摸夜夜添无码AVA片| 日韩精品久久久久久久电影| 青青久在线| 麻豆成人啪啪色婷婷久久 | 亚洲午夜久久久无码精品网红A片| 亚洲欧美中文字幕高清在线| 伊人亚洲综合网色| 97国产人妻精品无码AV在线| 糙汉顶弄抽插HHHH| 国产女合集小岁9三部| 精品免费在线视频| 美女也烦恼主题曲| 青柠在线观看免费高清电视剧荣耀| 日韩 无码 手机 在线| 强伦姧久久久久久久久久| 小小水蜜桃视频高清在线播放| 伊人久久大香线蕉综合色啪 | 2019午夜75福利不卡片在线| A级韩国乱理伦片在线观看| 国产精品久久久久一区二区三区| 国产亚洲精品久久孕妇呦呦你懂| 久久99re热在线播放7| 女的把腿张开男的往里面插| 午夜在线观看免费观看 视频| 99久久国产免费福利| 精品国产三级a| 特黄特黄aaaa级毛片免费看| 无限资源在线观看播放| 伊人久久综合| 俄罗斯1819y0u|