开源库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
相关文章:

Dubbo2.6.5+Nacos注册中心(代替Zookeeper)
在上一节的小栗子的基础上,只需要更改两个地方 第一个:父工程的pom依赖增加 <!-- Dubbo Nacos registry dependency --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo-registry-nacos</artifactId>…

Nginx(二) 配置与调试
nginx 主配置文件在安装目录下的conf中,名字为nginx.conf:主配置文件主要分为4部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和location&#x…

AI编程语言图鉴
作者 | 元宵大师责编 | 胡巍巍来源 | CSDN(CSDNnews)当前最炙手可热的领域非“人工智能”(Artificial Intelligence)莫属。其实,“人工智能”的火热并非一蹴而就,早在1956年“人工智能”概念就已经被提出了…

C++动态二维数组演示的代码
将代码过程中经常用到的代码珍藏起来,下边资料是关于C动态二维数组演示的代码。 #include <iostream> #include <string>using namespace std;{for( int i 0; i < x; i ){List[i] new int[y];for( int j 0; j < y; j ){List[i][j] 0;}}for( i…

linux发送email错误 501 Syntax: HELO hostname
2019独角兽企业重金招聘Python工程师标准>>> 查看你的hostname hostnamecentos58 然后vi /etc/hosts 添加hostname对应的ip 103.24.3.171 centos58 参考http://blog.csdn.net/tammy_zhu/article/details/5563383 转载于:https://my.oschina.net/u/257088/bl…

redux-thunk使用教程
从无到有一步一步创建一个react-redux、redux-thunk使用教程:本教程GitHub地址:https://github.com/chunhuigao/react-redux-thunk创建react工程在电脑上找一个文件夹,在命令窗使用create-react-app 创建我的react工程;这一步应该…

VLC SDK在VS2010中的配置及简单使用举例
1. 从http://www.videolan.org/vlc/download-windows.html下载vlc-2.2.0-win32.7z,解压缩;2. 新建一个VLCtest控制台工程;3. 将/vlc-2.2.0-win32/vlc-2.2.0/sdk/include添加到工程属性中,C/C -->General …

百万奖金悬赏AI垃圾分类,就问你来不来?
也许我们从来没有想过,看似简单的垃圾分类居然给“聪明”的人类带来如此大的困扰2019年7月1日,史称“最严格的垃圾分类法”《上海市生活垃圾管理条例》正式开始施行一夜之间上海人最常用的见面语从“侬好”变成了“侬是什么垃圾?”虽然只有可…

资质申报 - 系统集成企业资质等级评定条件(2012年修定版)
关于发布《计算机信息系统集成企业资质等级评定条件(2012年修定版)》的通知工信计资[2012]6号各省、自治区、直辖市、计划单列市工业和信息化主管部门、新疆生产建设兵团工业和信息化委员会、各级资质评审机构,各有关单…

@HostListener 可接收的事件列表
下面有一个文档详细介绍Angular 中的事件列表: https://github.com/angular/angular/blob/master/packages/compiler/src/schema/dom_element_schema_registry.ts#L78。 星号代表的是事件 (no prefix): property is a string.*: property represents an event.!: pr…

GraphSAGE: GCN落地必读论文
作者 | William L. Hamilton, Rex Ying, Jure Leskovec来源 | NIPS17导读:图卷积网络(Graph Convolutional Network,简称GCN)最近两年大热,取得不少进展。作为 GNN 的重要分支之一,很多同学可能对它还是一知…

Ubuntu14.04 32位上编译VLC2.2.0源码操作步骤
1. 首先安装必须的依赖软件,打开终端,执行:sudo apt-get install git libtool build-essential pkg-config autoconf2. 从 http://www.videolan.org/vlc/download-sources.html 下载vlc-2.2.0源码,将其存放到/home/spring/VLC目录…

根据PromiseA+规范实现Promise
Promise是ES6出现的一个异步编程的一个解决方案,改善了以往回调函数的回调地狱(虽然写起来也挺像的)。不会Promise的可以移步阮一峰的Promise,这里讲的非常清晰。 就现在的发展情况而言,Promise这种解决方案频繁的在我们的代码中出现…

黄浴:基于深度学习的超分辨率图像技术发展轨迹一览
作者 | 黄浴转载自知乎导读:近年来,使用深度学习技术的图像超分辨率(SR)取得了显著进步。本文中,奇点汽车自动驾驶首席科学家黄浴对基于深度学习技术的图像超分辨率技术进行了一次全面的总结,分析了这门技术…

Qt简介、安装及在Ubuntu14.04 32位上简单使用举例
Qt是一个跨平台的C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序。Qt是面向对象的框架,很容易扩展。Qt是一个C工具包,它由几百个C类构成,你在程序中可以使用这些类。Qt具有OOP的所有优点。 跨平台的…

FOSCommentBundle功能包:设置Doctrine ODM映射(投票)
原文出处:12b-mapping_mongodb.md原文作者:FriendsOfSymfony授权许可:创作共用协议翻译人员:FireHare校对人员:适用版本:FOSCommentBundle 2.0.5文章状态:草译阶段Step 12b: Setup MongoDB mapp…

Python最大堆排序实现方法
Python最大堆排序实现方法,具体代码如下: # -*- coding: utf-8 -*- def merge_sort(seq, cmpcmp, sentinelNone): """合并排序,伪码如下: MERGE(A, p, q, r) 1 n1 ← q - p 1 // 前个子序列长度 2 …

内含福利 | 世界人工智能大会:对话大咖,深挖机器学习的商业应用
机器学习作为人工智能时代的关键技术突破,已经在日常生活中广泛应用,给用户带来便利。越来越多的企业也通过机器学习,解决生产和经营中的难题。传统制造业:应用机器学习,部署系统异常检测方案,预测组件寿命…

windows7 64位操作系统上使vs2010和vs2013能够并存的处理方法
之前机子上是只安装有vs2010,后来在没有卸载vs2010的情况下想装个vs2013,使vs2010与vs2013同时并存在windows764位机上。需要依次安装cn_visual_studio_ultimate_2013_x86_dvd_3009109.iso、vs2013.2.iso和vc_mbcsmfc.exe。在安装过程中遇到的问题有: (…

Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0
Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0 昨晚Nacos社区发布了第一个生产级版本:0.8.0。由于该版本除了Bug修复之外,还提供了几个生产管理非常重要的特性,所以觉得还是有必要写一篇讲讲这次升级,在后续的…

awk命令使用和取出数据的最大值,最小值和平均值
得到取出数据的最大值:cat manager.txt |grep monitor|awk {print$9}|sort -rn|head -1得到取出数据的最小值:cat manager.txt|grep monitor |awk {print $9}|sort -n|head -1得到取出数据的平均值:cat manager.txt|grep monitor |awk {print…

windows7 64位机上CUDA7.0配置及在VS2010中的简单使用举例
1. 查看本机配置,查看显卡类型是否支持NVIDIA GPU,选中计算机--> 右键属性 --> 设备管理器 --> 显示适配器:NVIDIA GeForce GT 610,从https://developer.nvidia.com/cuda-gpus可以查到相应显卡的compute capabili…

用友云平台,真正的云原生架构,加速云应用落地
数字化经济的出现,企业需要通过新技术实现数字化转型,完成企业管理和业务模式变革。而云计算是数字化中尤为重要且能够更快实现的技术手段。真正的云应用必须是基于云原生架构的,PaaS是一个重要的步骤,因为这是云原生的第一接触点…

从ACM班、百度到亚马逊,深度学习大牛李沐的开挂人生
“大神”,是很多人对李沐的印象。作为一经推出便大受追捧的 MXNet 深度学习框架的主要贡献者之一,李沐功不可没。值得注意的是,这个由 DMLC(Distributed Machine Learning Community)打造的深度学习框架,创…

Linux基础介绍
Linux的创始人Linus Torvalds。Linux的官方标准发音为[linəks]。Linux和Unix是非常像的,Linux就是根据Unix演变过来的。Linux是免费的,其实只是说Linux的内核免费。在Linux内核的基础上产生了众多的Linux版本。Linux的发行版说简单点就是将Linux内核与应…

Go在区块链的发展和演进
Go语言发展至今已经过去十年多了,是目前最流行的新兴语言,云计算领域的首选语言,而且目前随着区块链的流行,Go再次成为了这个领域的第一语言,以太坊,IBM的fabric等重量级的区块链项目都是基于Go开发。 原文…

一天掌握AI核心技术,上手应用,开发者该划哪些重点?
Alpha Go 只会下棋,却并不擅长垃圾分类;智能助手已经可以执行很多任务,但距离真正的人机自然交互还很远。如今 AI 的发展面临着诸多瓶颈,基础理论研究缺失,深度学习的黑箱属性无解,把一切托付于未知并不可靠…

学会这21条,你离Vim大神就不远了
来源 | Python编程时光(ID: Python-Time)导语:作者本人是 Vim 的重度使用者,就因为喜欢上这种双手不离键盘就可以操控一切的feel,Vim 可以让人对文本的操作更加精准、高效。对于未使用过 Vim 的朋友来说,可…

C 语言 和 C++语言的对比学习 二 数据类型
不管是什么语言,我们最习惯的是通过 “hello world” ,来昭告世界,我们有了新的语言来向这个世界问好,尽管真正属于我们自己的其实是哭声。(呵呵,笑点有点低),下面我们来介绍最为基础…

Makefile语法基础介绍
在Linux下,make是一个命令工具,是一个解释Makefile中指令的命令工具。make命令执行时,需要一个Makefile文件,以告诉make命令需要怎么样去编译和链接程序。 make如何工作:在默认的方式下,只输入make命令&am…