zyl910的专栏

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。主力博客:http://www.cnblogs.com/zyl910/...

SIMD函数整理:00 索引贴(2012-07-31更新)

作者:zyl910   关于SIMD(MMX、SSE、AVX)编程的资料一直很零散,于是我试图进行收集整理,便于随时翻阅学习。而且很多代码是直接用汇编写的,易读性差、难以重用,于是我决定将其统一改写为Intrinsics函数版。 一、Instructions函数对照表   在使用Inst...

2012-04-26 22:01:43

阅读数:1781

评论数:0

[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+DB...

2013-01-17 21:50:34

阅读数:11082

评论数:3

[C] 跨平台使用Intrinsic函数范例3——使用MMX、SSE2指令集 处理 32位整数数组求和

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以32位整数数组求和为例演示了如何跨平台使用MMX、SSE2指令集。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。   一、关键讲解   前文(http://www.cnblog...

2012-10-26 21:23:44

阅读数:6304

评论数:0

[C] 跨平台使用Intrinsic函数范例2——使用SSE2、AVX指令集 处理 双精度浮点数组求和

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以双精度浮点数组求和为例演示了如何跨平台使用SSE2、AVX指令集。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。 一、关键讲解   前文(http://www.cnblogs...

2012-10-26 18:06:18

阅读数:4519

评论数:0

[C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个模块,可以完全避免手工编写汇编代码,具有很高可移植性。支持vc、gcc编译器,在Windows、L...

2012-10-22 22:28:17

阅读数:3343

评论数:2

[C] zintrin.h : 智能引入intrinsic函数。支持VC、GCC,兼容Windows、Linux、Mac OS X

作者:zyl910。   现在很多编译器支持intrinsic函数,这给编写SSE等SIMD代码带来了方便。但是各个编译器略有差异,于是我编写了zintrin.h,智能引入intrinsic函数。 一、各种编译器的区别 1.1 Visual C++(Windows)   最早支持int...

2012-09-23 23:19:35

阅读数:5439

评论数:0

ccpuid:CPUID信息模块。范例:显示所有的CPUID信息

作者:zyl910   关于获取各种CPUID信息,我之前积累了不少代码,现在决定将它们封装在一个模块中,方便代码复用。   其次,前面只是介绍了CPUID的一些常用功能,而Intel、AMD的手册中定义了大量的CPUID功能。所以我希望有一个程序能按照功能号顺序,依次显示所有的CPUID信息...

2012-07-11 16:47:40

阅读数:7511

评论数:0

[VC] 检测AVX系列指令集的支持级别(AVX、AVX2、F16C、FMA、FMA4、XOP)

从2011年的Sandy Bridge微架构处理器开始,现在支持AVX系列指令集的处理器越来越多了。本文探讨如何用VC编写检测AVX系列指令集的程序,并利用了先前的CPUIDFIELD方案。 一、AVX系列指令集简介   SSE5 指令:SSE5 是一个纸面上的指令集,并没有最终实现,AMD ...

2012-07-04 16:07:52

阅读数:10300

评论数:0

[VC] CPUIDFIELD:CPUID字段的统一编号、读取方案。范例:检查SSE4A、AES、PCLMULQDQ指令

除了基本的MMX和SSE系列指令集外,x86体系还有其他扩展指令集,例如SSE4A、AES、PCLMULQDQ等,它们也可以利用CPUID指令来检测。但是,这些指令集细碎杂多。如果像以前那样分别编写检测函数的话,那工作量太大,不值得。而且大量的函数名也会给使用带来麻烦。于是文篇探讨如何设计一套通用...

2012-06-29 14:48:06

阅读数:2801

评论数:0

如何在各个版本的VC及64位下使用CPUID指令

前面我们探讨了在16位的DOS实模式下使用CPUID指令(http://www.cnblogs.com/zyl910/archive/2012/05/14/dos16_getcpuid.html)。而现在64位Windows系统已经很流行了,在32/64位模式下如何使用CPUID呢?于是本文介绍了...

2012-05-21 18:05:24

阅读数:5719

评论数:0

使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)

现在多核处理器已经很普及了,市场主流是双核处理器,还有4核、8核等高端产品。而且Intel推广了超线程技术(Hyper-Threading Technology, HTT),可以将一个物理核心模拟为两个逻辑处理器。这一切使得“CPU数量”这一概念变得复杂起来,对于软件开发人员来说,希望能获得物理C...

2012-05-08 18:13:45

阅读数:7639

评论数:0

SIMD函数整理:01 《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术

一、来源   来源:《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术   书籍信息—— http://e.360buy.com/30027396.html PC平台新技术MMX(上册):开发编程指南 作 者: 吴乐南 编 出 版 社: 东南大学出版社 ISBN...

2012-04-26 22:22:22

阅读数:1929

评论数:0

AVX指令集中的32种浮点比较关系详解(NaN、无序、有序等)

在传统印象中,数字的比较关系只有6种。但在AVX指令集中,Intel一下给出了32种浮点比较谓词,详见下图—— (Intel手册:Table 3-9. Comparison Predicate for VCMPPD and VCMPPS Instructions)   为什么会有这么多种比...

2012-04-19 16:37:41

阅读数:2226

评论数:0

深入探讨用位掩码代替分支(9):测试成绩总结

一、测试结果汇总   将前面的测试结果进行汇总,按照三点取中方式筛选结果,整理为表格(单位是毫秒,数值越小越好)—— 测试 f0_if f1_min f2_neg f3_sar f4_mmx f5_sse VC6 on 32bit 2016 2063 ...

2012-04-13 17:29:17

阅读数:2766

评论数:12

深入探讨用位掩码代替分支(8):SSE指令集速度测试

在上一篇测试了MMX指令集,这次我们来测试SSE指令集。说的更精确一点,是测试SSE2指令集。   本篇致力于解决以下问题—— 1.SSE/SSE2指令集是什么? 2.如何阅读Intel/AMD的手册? 3.如何运用SSE指令集?如何将MMX代码升级为SSE代码。 4.如何在VC++6....

2012-04-12 22:30:16

阅读数:2595

评论数:0

深入探讨用位掩码代替分支(7):MMX指令集速度测试

前面我们测试了高级语言做饱和处理的性能。其实,对于这样的大批量数据处理,使用SIMD(Single Instruction Multiple Data,单指令多数据流)技术能极大的提高性能。MMX指令集是目前x86平台上覆盖最广的SIMD指令集,于是本文对它进行探讨。   本文致力于解决以下问题...

2012-04-09 23:08:54

阅读数:2137

评论数:0

深入探讨用位掩码代替分支(6):VB6速度测试

前面我们测试了C系列语言,验证了位掩码算法的确实性能不错。那么对于Basic系列语言,该算法的效率怎样呢?于是本文对此进行探讨。   VB.Net与C#一样,也是由.Net虚拟机执行的,没有多大的测试价值。所以我决定测试VB6。 一、移植要点   VB6的功能与C系列语言差很多。很多地方需要...

2012-03-30 16:53:32

阅读数:3645

评论数:1

深入探讨用位掩码代替分支(5):C#2010速度测试

前面我们测试了C语言这样纯编译型语言。那么对于像C#这样由虚拟机执行的语言,“位掩码代替分支”法是否也有效果呢?于是本文对此进行探讨。 一、移植要点   C#的语法与C语言很相像,多数代码可以直接用,但要注意以下几点。 1.1 unsafe——不安全上下文   C#虽然支持指针,但必须在u...

2012-03-29 17:15:48

阅读数:1881

评论数:0

深入探讨用位掩码代替分支(4):VC2010速度测试

前面我们用VC6测试了位掩码代替分支的速度。VC6是1998年发售的,离现在有14年了。在14年里,Intel与AMD的CPU都换了好几套微架构了,VC6编译器很可能无法充分发挥它们的性能。而且,从2003年AMD推出了64位处理器开始,现在64位系统越来越普及,我们希望测试64位下的性能。  ...

2012-03-28 16:41:25

阅读数:1462

评论数:0

深入探讨用位掩码代替分支(3):VC6速度测试

wuhanbingwhdx提到了数据相关也会影响流水线(http://blog.csdn.net/zyl910/article/details/1330614)。   他的说法是有一定道理的。但是,在很多时候我们并不仅仅处理一个数值。比如将循环展开,在内循环处理2个或更多个的数值。而现代编译器面...

2012-03-27 15:51:13

阅读数:1394

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭