开源库Simd在vs2010中的编译及简单使用
Simd是開源的圖像處理庫,它提供了很多高性能的算法,這些優化算法主要由SIMD指令來實現,包括SSE、SSE2、SSSE3、SSE4.1、SSE4.2、AVX等,此庫可以應用在windows/linux 32bit/64bit等系統中。此庫更新較頻繁。此庫的license是MIT。
下面詳細介紹其在vs2010中的編譯及使用:
1.????????從https://sourceforge.net/projects/simd/?source=typ_redirect下載最新版本simd.2.2.27.443,解壓縮;
2.????????新建一個libSimd靜態庫工程,將/simd.2.2.27.443/simd/src/Simd目錄下的.h、.cpp文件加入到此工程中,將../../../src/simd.2.2.27.443/simd/src/加入到C/C++--> General --> Additional Include Directories中,編譯即可生成靜態庫,其實/simd.2.2.27.443/simd/prj/vs11中已經有了vs2012的工程配置,只是工程數太多,我把它們都放在一個工程里了;
3.? 新建一個testSimd控制臺工程,測試生成的libSimd庫的正確性,相關代碼如下:
stdafx.h:
#pragma once#include "targetver.h"#include <stdio.h>#include "Simd/SimdSse2.h"
#include "Simd/SimdBase.h"#include "../../OpenCV/2.4.9/vs2010/install/include/opencv2/core/core.hpp"
#include "../../OpenCV/2.4.9/vs2010/install/include/opencv2/highgui/highgui.hpp"
#include "../../OpenCV/2.4.9/vs2010/install/include/opencv2/imgproc/imgproc.hpp"
stdafx.cpp:
#include "stdafx.h"#ifdef _DEBUG#pragma comment(lib, "../../../lib/dbg/x86_vc10/libSimd[dbg_x86_vc10].lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/zlibd.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/IlmImfd.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/libjasperd.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/libjpegd.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/libpngd.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/libtiffd.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/opencv_core249d.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/opencv_highgui249d.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/opencv_imgproc249d.lib")#pragma comment(lib, "comctl32.lib")
#else#pragma comment(lib, "../../../lib/rel/x86_vc10/libSimd[rel_x86_vc10].lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/zlib.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/IlmImf.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/libjasper.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/libjpeg.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/libpng.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/libtiff.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/opencv_core249.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/opencv_highgui249.lib")#pragma comment(lib, "../../../../OpenCV/2.4.9/vs2010/install/x86/vc10/staticlib/opencv_imgproc249.lib")#pragma comment(lib, "comctl32.lib")
#endif
testSimd.cpp:
#include "stdafx.h"
#include <iostream>
#include <string>using namespace std;void BgraToGrayTest()
{string strImageName = "../../../testdata/cat.jpg";int iImageWidth = 10000;int iImageHeight = 10000;cv::Mat matSrc = cv::imread(strImageName, 1);cv::cvtColor(matSrc, matSrc, cv::COLOR_BGR2BGRA);cv::resize(matSrc, matSrc, cv::Size(iImageWidth, iImageHeight), 0, 0, 1);cv::Mat matDst1, matDst2;matDst1 = cv::Mat::zeros(iImageHeight, iImageWidth, CV_8UC1);matDst2 = cv::Mat::zeros(iImageHeight, iImageWidth, CV_8UC1);int iRemainder = iImageWidth & 0x03;int iGrayStride = iRemainder ? iImageWidth + 4 - iRemainder : iImageWidth;CV_Assert(iRemainder == 0);double dTimeC = cv::getTickCount();Simd::Base::BgraToGray(matSrc.data, iImageWidth, iImageHeight, iImageWidth * 4, matDst1.data, iGrayStride);dTimeC = ((double)cv::getTickCount() - dTimeC) / cv::getTickFrequency();double dTimeSimd = cv::getTickCount();Simd::Sse2::BgraToGray(matSrc.data, iImageWidth, iImageHeight, iImageWidth * 4, matDst2.data, iGrayStride);dTimeSimd = ((double)cv::getTickCount() - dTimeSimd) / cv::getTickFrequency();cout<<"C run time : "<<dTimeC<<endl;cout<<"Simd run time : "<<dTimeSimd<<endl;int iDiffCount = 0;for (int i = 0; i < iImageHeight; i++) {uchar* p1 = matDst1.ptr<uchar>(i);uchar* p2 = matDst2.ptr<uchar>(i);for (int j = 0; j < iImageWidth; j++) {if (p1[j] != p2[j])iDiffCount ++;} }cout<<"the different count: "<<iDiffCount<<endl;
}int main(int argc, char* argv[])
{BgraToGrayTest();cout<<"ok!"<<endl;return 0;
}
運行結果見下 圖:
運行多次,SIMD的執行速度基本上比C快3倍,它們的結果是完全一致的。
GitHub:https://github.com/fengbingchun/Simd_Test
總結
以上是生活随笔為你收集整理的开源库Simd在vs2010中的编译及简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FreeType简介及在vs2010的编
- 下一篇: VLC简介