在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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團隊

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

    關注

    1804

    文章

    48798

    瀏覽量

    247130
  • OpenCV
    +關注

    關注

    32

    文章

    642

    瀏覽量

    42511
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    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 ?7988次閱讀

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

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

    如何在OpenCV實現CUDA加速

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

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

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

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

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

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,提供了大量的圖像處理和計算機視覺相關的算法。以下是一些常見的OpenCV
    的頭像 發表于 07-16 10:40 ?1791次閱讀
    主站蜘蛛池模板: 亚洲码在线 | 亚洲人成影院在线高清 | h免费在线观看 | 曰本毛片| 免费欧美 | 国产免费久久精品99久久 | 日本全黄视频 | 黄色亚洲 | 又粗又长又爽又长黄免费视频 | 久久日精品 | 五月婷婷六月激情 | 性欧美video视频另类 | 国产呦系列呦交 | 婷婷 综合网站 | 免费黄视频在线观看 | 最近国语剧情视频在线观看 | 日本高清网站 | 国产亚洲精品线观看77 | 手机看片福利国产 | yy4080一级毛片免费观看 | 天天操狠狠操夜夜操 | 性free中国美女hd | 很色视频 | 午夜影视福利 | 黄色的视频网站 | 台湾久久 | 非常黄的网站 | 天天视频天天爽 | 色婷婷亚洲综合五月 | 国产午夜亚洲精品 | 夜夜艹 | 九九九色 | 神马午夜在线观看 | 国产精品午夜免费观看网站 | 五月激情站 | 色激情五月 | 菲菲国产在线观看 | 国产福利在线观看一区二区 | 免费一级在线观看 | 天天操夜夜夜 | 久久99热精品这里久久精品 |