
#All - 所有
文章平均质量分 93
zyl910
这个作者很懒,什么都没留下…
展开
-
[C] 跨平台使用TCHAR——让Linux等平台也支持tchar.h,解决跨平台时的格式控制字符问题,多国语言的同时显示(兼容vc/gcc/bcb,支持Windows/Linux/Mac)
作者:zyl910 将Windows程序移植到Linux等平台时,经常会遇到tchar.h问题与字符串的格式控制字符问题(char串、wchar_t串、TCHAR串混合输出)。本文探讨如何解决这些问题。一、背景1.1 历史 传统的C程序使用char字符串,采用ANSI+DBCS方案来支持当地语言,不能实现多国语言同时显示。 当年微软在设计Windows NT时考虑到国原创 2013-01-17 21:50:34 · 14391 阅读 · 4 评论 -
深入探讨用位掩码代替分支(7):MMX指令集速度测试
前面我们测试了高级语言做饱和处理的性能。其实,对于这样的大批量数据处理,使用SIMD(Single Instruction Multiple Data,单指令多数据流)技术能极大的提高性能。MMX指令集是目前x86平台上覆盖最广的SIMD指令集,于是本文对它进行探讨。 本文致力于解决以下问题——1.MMX指令集是什么?2.如何阅读Intel/AMD的手册?2.如何运用MMX指令集原创 2012-04-09 23:08:54 · 2587 阅读 · 0 评论 -
深入探讨用位掩码代替分支(2):汇编代码分析
查看编译器生成的汇编代码,有助于我们分析程序的性能。1 让VC6输出编译的汇编代码 用VC6打开前一篇文章(http://blog.youkuaiyun.com/zyl910/article/details/7345655)的工程“noifCheck.dsw”。 首先需要配置项目设置——1.点击菜单栏 “工程”->“Project Settings”打开“Project Settings”原创 2012-03-21 15:20:56 · 1580 阅读 · 2 评论 -
深入探讨用位掩码代替分支(6):VB6速度测试
前面我们测试了C系列语言,验证了位掩码算法的确实性能不错。那么对于Basic系列语言,该算法的效率怎样呢?于是本文对此进行探讨。 VB.Net与C#一样,也是由.Net虚拟机执行的,没有多大的测试价值。所以我决定测试VB6。一、移植要点 VB6的功能与C系列语言差很多。很多地方需要换另一种方法去实现,甚至不能实现。 要点有——1.VB6不支持控制台程序,只支持窗口程序。所原创 2012-03-30 16:53:32 · 4138 阅读 · 1 评论 -
深入探讨用位掩码代替分支(5):C#2010速度测试
前面我们测试了C语言这样纯编译型语言。那么对于像C#这样由虚拟机执行的语言,“位掩码代替分支”法是否也有效果呢?于是本文对此进行探讨。一、移植要点 C#的语法与C语言很相像,多数代码可以直接用,但要注意以下几点。1.1 unsafe——不安全上下文 C#虽然支持指针,但必须在unsafe——不安全上下文 中才能使用。 要使用unsafe,必须先配置项目属性,允许不安全代码原创 2012-03-29 17:15:48 · 2174 阅读 · 0 评论 -
深入探讨用位掩码代替分支(4):VC2010速度测试
前面我们用VC6测试了位掩码代替分支的速度。VC6是1998年发售的,离现在有14年了。在14年里,Intel与AMD的CPU都换了好几套微架构了,VC6编译器很可能无法充分发挥它们的性能。而且,从2003年AMD推出了64位处理器开始,现在64位系统越来越普及,我们希望测试64位下的性能。 于是选择最新的VC系列编译器——Visual C++ 2010,它是2010年发售的,支持x64平台原创 2012-03-28 16:41:25 · 1753 阅读 · 0 评论 -
深入探讨用位掩码代替分支(1):利用带符号移位生成掩码
几年前我写了一篇“优化分支代码——避免跳转指令堵塞流水线”(http://blog.youkuaiyun.com/zyl910/article/details/1330614)。因当时是整理笔记,有些粗略。这几年又有了新的心得,故决定深入探讨,顺便回答网友评论。 housisong(http://blog.youkuaiyun.com/housisong)提到了用利用带符号移位生成掩码——(假设n是32bit有原创 2012-03-12 17:09:22 · 2510 阅读 · 2 评论 -
深入探讨用位掩码代替分支(3):VC6速度测试
wuhanbingwhdx提到了数据相关也会影响流水线(http://blog.youkuaiyun.com/zyl910/article/details/1330614)。 他的说法是有一定道理的。但是,在很多时候我们并不仅仅处理一个数值。比如将循环展开,在内循环处理2个或更多个的数值。而现代编译器面对循环展开时,在编译优化操作中会调整指令顺序,错开有相关性指令。因现代处理器支持超标量,这样的指令顺序原创 2012-03-27 15:51:13 · 1629 阅读 · 0 评论 -
[VC6] 检查MMX和SSE系列指令集的支持级别(最高SSE4.2)
参考文献——《Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z》. December 2011.http://www.intel.com/content/www/us/en/architecture-an原创 2012-03-01 22:45:06 · 2820 阅读 · 0 评论 -
Intrinsics头文件与SIMD指令集、Visual Studio版本对应表
File:Intrinsics头文件描述:指令集描述VS:Visual Studio版本号VisualStudio:Visual Studio版本名File描述VSVisualStudiointrin.hAll Architectures8.02005mmintrin.hMMX intrinsics6.06原创 2012-02-28 22:35:56 · 2657 阅读 · 0 评论 -
VC 64位程序开发心的——获得程序位数和操作系统位数
如今64位系统越来越流行了,对于软件开发人员来说,掌握64位开发技术将会有更好的发展空间。而且经过这几年的发展,64位开发工具也成熟了,例如Visual Studio 2010。 关于如何配置64位平台,MSDN上有详细的介绍——http://msdn.microsoft.com/zh-cn/library/9yb4317s.aspx如何:针对 64 位平台配置 Visual C++原创 2012-02-19 22:46:29 · 2890 阅读 · 1 评论 -
[x86]SIMD指令集发展历程表(MMX、SSE、AVX等)
自1996年的MMX指令集以来,Intel和AMD不断为x86体系添加新的SIMD指令集。时至2012年,Intel的Ivy Bridge即将发布,这16年来SIMD指令集有了哪些发展呢?于是我决定整理一份SIMD指令集的发展历程表。通过阅读Intel和AMD的手册,以及搜索网上资料,我初步完成了这项工作。表格如下——指令集条DateICPUIDateA原创 2012-02-26 19:40:23 · 3122 阅读 · 0 评论 -
IVY Bridge : There's more than 22nm(IVB的新指令)
今天在百度上看到一则消息——http://tieba.baidu.com/p/1362181987IVY Bridge : There's more than 22nmI named this title...this is a information that were said to be confirmed on Intel forums"• Two instruct翻译 2012-01-12 12:41:17 · 1036 阅读 · 0 评论 -
C#类与结构体究竟谁快——各种函数调用模式速度评测
以前我一直有个疑惑——在C#中,究竟是类(class)比较快,还是结构体(struct)比较快?当时没有深究。最近我遇到一个难题,需要将一些运算大的指针操作代码给封装一下。原先为了性能,这些代码是以硬编码的形式混杂在算法逻辑之中,不但影响了算法逻辑的可读性,其本身的指针操原创 2011-09-19 00:48:22 · 7668 阅读 · 14 评论 -
深入探讨用位掩码代替分支(8):SSE指令集速度测试
在上一篇测试了MMX指令集,这次我们来测试SSE指令集。说的更精确一点,是测试SSE2指令集。 本篇致力于解决以下问题——1.SSE/SSE2指令集是什么?2.如何阅读Intel/AMD的手册?3.如何运用SSE指令集?如何将MMX代码升级为SSE代码。4.如何在VC++6.0这样的高级语言编译器中使用SSE指令集?一、简介 1999 年 Intel 推出了第 1原创 2012-04-12 22:30:16 · 3306 阅读 · 0 评论 -
优化分支代码——避免跳转指令堵塞流水线
File: noifop.txtName: 优化分支代码——避免跳转指令堵塞流水线Author: zyl910Blog: http://blog.youkuaiyun.com/zyl910/Version: V2.00Updata: 2006-10-11(注意修改下载后的扩展名)一、起因——饱和处理 在编写图象处理程序时,经常原创 2006-10-11 19:19:00 · 8171 阅读 · 5 评论 -
SIMD函数整理:01 《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术
一、来源 来源:《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术 书籍信息——http://e.360buy.com/30027396.htmlPC平台新技术MMX(上册):开发编程指南作 者: 吴乐南 编 出 版 社: 东南大学出版社 ISBN:9787810502528出版时间:1997-10-01页 数:149字 数:23700原创 2012-04-26 22:22:22 · 2485 阅读 · 0 评论 -
[C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)
作者:zyl910。 本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个模块,可以完全避免手工编写汇编代码,具有很高可移植性。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。一、问题背景 最初,我们只能使用汇编语言来编写SI原创 2012-10-22 22:28:17 · 7241 阅读 · 1 评论 -
[C] 跨平台使用Intrinsic函数范例2——使用SSE2、AVX指令集 处理 双精度浮点数组求和
作者:zyl910。 本文面对对SSE等SIMD指令集有一定基础的读者,以双精度浮点数组求和为例演示了如何跨平台使用SSE2、AVX指令集。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。一、关键讲解 前文(http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html)演示原创 2012-10-26 18:06:18 · 5899 阅读 · 0 评论 -
[C] 跨平台使用Intrinsic函数范例3——使用MMX、SSE2指令集 处理 32位整数数组求和
作者:zyl910。 本文面对对SSE等SIMD指令集有一定基础的读者,以32位整数数组求和为例演示了如何跨平台使用MMX、SSE2指令集。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。 一、关键讲解 前文(http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html)演原创 2012-10-26 21:23:44 · 10588 阅读 · 0 评论 -
[C] zintrin.h : 智能引入intrinsic函数。支持VC、GCC,兼容Windows、Linux、Mac OS X
作者:zyl910。 现在很多编译器支持intrinsic函数,这给编写SSE等SIMD代码带来了方便。但是各个编译器略有差异,于是我编写了zintrin.h,智能引入intrinsic函数。一、各种编译器的区别1.1 Visual C++(Windows) 最早支持intrinsic函数的VC编译器是VC 6.0。它在装上Visual Studio 6.0 Service原创 2012-09-23 23:19:35 · 7033 阅读 · 0 评论 -
ccpuid:CPUID信息模块。范例:显示所有的CPUID信息
作者:zyl910 关于获取各种CPUID信息,我之前积累了不少代码,现在决定将它们封装在一个模块中,方便代码复用。 其次,前面只是介绍了CPUID的一些常用功能,而Intel、AMD的手册中定义了大量的CPUID功能。所以我希望有一个程序能按照功能号顺序,依次显示所有的CPUID信息。这样就能很方便的与Intel、AMD的手册进行对照,有助于学习与理解。一、模块设计 最原创 2012-07-11 16:47:40 · 9833 阅读 · 0 评论 -
SIMD函数整理:00 索引贴(2012-07-31更新)
作者:zyl910 关于SIMD(MMX、SSE、AVX)编程的资料一直很零散,于是我试图进行收集整理,便于随时翻阅学习。而且很多代码是直接用汇编写的,易读性差、难以重用,于是我决定将其统一改写为Intrinsics函数版。一、Instructions函数对照表 在使用Instructions函数时,很多时候会发现MSDN说的不详细,这时只有去翻阅Intel、AMD文档了。但I原创 2012-04-26 22:01:43 · 2233 阅读 · 0 评论 -
[VC] CPUIDFIELD:CPUID字段的统一编号、读取方案。范例:检查SSE4A、AES、PCLMULQDQ指令
除了基本的MMX和SSE系列指令集外,x86体系还有其他扩展指令集,例如SSE4A、AES、PCLMULQDQ等,它们也可以利用CPUID指令来检测。但是,这些指令集细碎杂多。如果像以前那样分别编写检测函数的话,那工作量太大,不值得。而且大量的函数名也会给使用带来麻烦。于是文篇探讨如何设计一套通用的检测方案。零、指令简介 SSE4A指令:是AMD提出的,最早出现在2007年的K10微原创 2012-06-29 14:48:06 · 3420 阅读 · 0 评论 -
[VC] 检测AVX系列指令集的支持级别(AVX、AVX2、F16C、FMA、FMA4、XOP)
从2011年的Sandy Bridge微架构处理器开始,现在支持AVX系列指令集的处理器越来越多了。本文探讨如何用VC编写检测AVX系列指令集的程序,并利用了先前的CPUIDFIELD方案。一、AVX系列指令集简介 SSE5 指令:SSE5 是一个纸面上的指令集,并没有最终实现,AMD 在 2007 年 8 月公布 SSE5 指令集规范,在 2009 年 5 月 AMD 推出了 XOP,原创 2012-07-04 16:07:52 · 15785 阅读 · 1 评论 -
如何在各个版本的VC及64位下使用CPUID指令
前面我们探讨了在16位的DOS实模式下使用CPUID指令(http://www.cnblogs.com/zyl910/archive/2012/05/14/dos16_getcpuid.html)。而现在64位Windows系统已经很流行了,在32/64位模式下如何使用CPUID呢?于是本文介绍了如何在各个版本的VC及64位下使用CPUID指令。一、推荐使用__cpuid、__cpuidex等原创 2012-05-21 18:05:24 · 6217 阅读 · 0 评论 -
[FileFormat]用VB写的高速GIF、JPEG 编码/解码 程序
1.zSaveGIF下载:http://files.cnblogs.com/zyl910/zSaveGIF.zip快速的GIF编码/解码程序。其中的GIF_LZW编码/解码算法是我最自豪的。2.NetPicTran下载(注意修改下载后的扩展名) ~~~~~~~~~~~~~~~~~~原创 2006-05-29 22:59:00 · 12566 阅读 · 9 评论 -
使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)
现在多核处理器已经很普及了,市场主流是双核处理器,还有4核、8核等高端产品。而且Intel推广了超线程技术(Hyper-Threading Technology, HTT),可以将一个物理核心模拟为两个逻辑处理器。这一切使得“CPU数量”这一概念变得复杂起来,对于软件开发人员来说,希望能获得物理CPU数、CPU核心数、逻辑CPU数等详细信息。 在Windows平台,可以调用GetLogica原创 2012-05-08 18:13:45 · 11332 阅读 · 1 评论 -
深入探讨用位掩码代替分支(9):测试成绩总结
一、测试结果汇总 将前面的测试结果进行汇总,按照三点取中方式筛选结果,整理为表格(单位是毫秒,数值越小越好)——测试f0_iff1_minf2_negf3_sarf4_mmxf5_sseVC6 on 32bit2016206371967237.525.7VC6 on 64bit20282075原创 2012-04-13 17:29:17 · 3248 阅读 · 12 评论 -
AVX指令集中的32种浮点比较关系详解(NaN、无序、有序等)
在传统印象中,数字的比较关系只有6种。但在AVX指令集中,Intel一下给出了32种浮点比较谓词,详见下图——(Intel手册:Table 3-9. Comparison Predicate for VCMPPD and VCMPPS Instructions) 为什么会有这么多种比较谓词呢?我为此困惑困惑了很久。 直到最近翻阅了不少资料后,才终于将它们弄懂了。 一、浮原创 2012-04-19 16:37:41 · 3514 阅读 · 0 评论 -
三探C#类与结构体究竟谁快——MSIL(微软中间语言)解读
上次我分别测试了类与结构体(http://blog.youkuaiyun.com/zyl910/article/details/6788417)、密封类(http://blog.youkuaiyun.com/zyl910/article/details/6793908)的函数调用速度评测。现在进行进一步原创 2011-09-24 12:30:12 · 1644 阅读 · 0 评论 -
四探C#类与结构体究竟谁快——跨程序集(assembly)调用
前面的三次测试都是在同一个项目内的,既处于同一个程序集。那么,跨程序集调用会怎么样呢?因为为了保证可维护性,我们会把一些常用操作封装到类库中去。然后实际项目开发时,引用该类库,使得解决方案中存在多个项目。编译完成后,将会是一个主要的exe和若干个dll文件,主exe程序集中的原创 2011-10-01 23:23:38 · 1493 阅读 · 2 评论 -
正确的优化分段函数形式的多重分支代码
File: fastmif.txtName: 正确的优化分段函数形式的多重分支代码Author: zyl910Blog: http://blog.youkuaiyun.com/zyl910/Version: V1.00Updata: 2006-10-13一、基本代码 有时候,我们会碰上这样的多重分支代码:char szbuf[10];if (scor原创 2006-10-13 11:07:00 · 2679 阅读 · 2 评论 -
当年我QB的封笔之作——在VGA 12h 模式下实时抖动绘制真彩色数据
当年我QB的封笔之作——在VGA 12h 模式下实时抖动绘制真彩色数据View RGB作者:zyl910使用有序抖动算法(dither)绘制线性渐变区域、RGB色彩空间(Screen 12下) Up , Down , PageUp , PageDown: 改变B分量 F4~F8: 改变背景 Esc: 退出直接在QB环境下运行速度很慢,编译为exe后就快些了展示了以下技术原创 2006-05-29 20:59:00 · 3692 阅读 · 3 评论 -
封装回调函数——为对象方法(Object Method,参数中带this指针的函数) 构造 普通函数(参数中无this指针的函数)形式 的入口
文件:mFunEntry.bas功能:封装回调函数——为对象方法(Object Method,参数中带this指针的函数) 构造 普通函数(参数中无this指针的函数)形式 的入口作者:zyl910版本:V1.0日期:2005-6-24 在VB使用回调函数很麻烦,得写在模块中,且很难封装。这个模块就是为了解决这个问题。 原理:VB对象的结构~~~~~~~~~~~~~~~~~~原创 2006-05-29 23:27:00 · 4402 阅读 · 1 评论 -
[Color]深入学习YCbCr色彩模型
File: StudyYCbCr.txtName: 深入学习YCbCr色彩模型Author: zyl910Version: V1.0Updata: 2006-5-28 最近突然又对图形学有了兴趣,翻出了多年前学习图形学的笔记,感触良多。于是将它们整理好发了上来。一、基础 RGB转YCbCr的转换是这样的:[Y ] = [ 0.299 0.58原创 2006-05-29 00:27:00 · 6709 阅读 · 1 评论 -
[VB6]支持UTF文本文件访问的模块
支持UTF文本文件访问的模块支持常见的ANSI、UTF-8、UTF-16LE、UTF-16BE这几种编码文本是为了解决这个帖子:http://community.youkuaiyun.com/Expert/topic/4527/4527535.xml使用Open XXX For Input As #1打开一文本文件时,为什么中文字符处理不对头? 原理~~~~以二进制方式打开,判断BOM标记,自原创 2006-05-30 08:43:00 · 12459 阅读 · 3 评论 -
用VB6写的一个简单俄罗斯方块代码
网络上有很多俄罗斯方块代码。它们大都为了视觉效果,程序比较复杂,不利于学习游戏编程。所以我写了个简单俄罗斯方块代码,尽量用VB本身的功能,没有复杂的DirectX。下载(注意修改下载后的扩展名) mBlock.bas Attribute VB_Name = "mBlock"Option原创 2006-05-30 00:11:00 · 17387 阅读 · 5 评论 -
Win32文本信息处理导航 V1.2
File: W32TextI.txtName: Win32文本信息处理导航Author: zyl910Version: V1.2Updata: 2006-5-31 从Windows 2000开始,Windows系统对Unicode多语言支持性非常好,有许多强大API。API函数集~~~~~~~~~National Language Support本原创 2006-05-28 11:48:00 · 2168 阅读 · 1 评论 -
用VB写高效的图像处理程序 V2.0(2006-5-24)
用VB写高效的图像处理程序 V2.0(2006-5-24)作者:zyl910 一、为什么这么慢? 二、DIB的结构 三、DIB访问函数原创 2006-05-24 00:21:00 · 18580 阅读 · 9 评论