摘要:作者:zyl910。 本文面对对SSE等SIMD指令集有一定基础的读者,以32位整数数组求和为例演示了如何跨平台使用MMX、SSE2指令集。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。一、关键讲解 前文(http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html)演示了如何使用SSE、AVX指令集 处理 单精度浮点数组求和。现在对其进行改造,使用MMX、SSE2指令集 处理 32位整数数组求和。因程序基本上差不多,文本就不详细讲解了,只说关键变化。1.1 指令集简介 先来看看支...
阅读全文
随笔分类 - C10 C系列
C/C++/C#/Java
摘要:作者:zyl910。 本文面对对SSE等SIMD指令集有一定基础的读者,以双精度浮点数组求和为例演示了如何跨平台使用SSE2、AVX指令集。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。一、关键讲解 前文(http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html)演示了如何使用SSE、AVX指令集 处理 单精度浮点数组求和。现在对其进行改造,使用SSE2、AVX指令集 处理 双精度浮点数组求和。因程序基本上差不多,文本就不详细讲解了,只说关键变化。1.1 指令集简介 先来看看支...
阅读全文
摘要:作者:zyl910。 本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个模块,可以完全避免手工编写汇编代码,具有很高可移植性。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。一、问题背景 最初,我们只能使用汇编语言来编写SIMD代码。不仅写起来很麻烦,而且易读性、可维护性、移植性都较差。 不久,VC、GCC等编译器相继支持了Intrinsic函数,使我们可以摆脱汇编,利用C语言来调用SIMD指令集,大大提高了易读性和可维护。而且移植性...
阅读全文
摘要:作者:zyl910。 之前的ccpuid V1.02的mmx/sse指令可用性检查存在缺陷。现在的V1.03版改进了mmx/sse指令可用性检查,使用signal、setjmp,能够支持纯C程序。修正了AVX检查Bug。增加多文件链接ccpuid的测试例程。一、更新说明1.1 改进mmx/sse指令可用性检查1.1.1 问题背景 以前是使用结构化异常处理来确认当前环境是否能运行mmx/sse指令的。该方法存在两个问题。 首先,仅有C++支持结构化异常处理,而纯C是不支持的。所以在V1.02版中,是根据__cplusplus宏来做条件编译的。造成仅有C++版支持指令可用性检查,而纯C版没有...
阅读全文
摘要:新版本——http://www.cnblogs.com/zyl910/archive/2012/11/07/zintrin_v102.html[C] zintrin.h: 智能引入intrinsic函数 V1.02版。支持VC2012,增加INTRIN_ALIGN、INTRIN_COMPILER_NAME宏作者:zyl910。 之前的zintrin V1.00版对Mac OS X平台支持性不佳。现在的V1.01版改进对Mac OS X的支持,还做了这些改进——增加INTRIN_WORDSIZE宏 等。一、更新说明1.1 改进对Mac OS X的支持 前几天在使用Xcode时,发现mac下也..
阅读全文
摘要:新版本——http://www.cnblogs.com/zyl910/archive/2012/10/13/ccpuid_v103.html作者:zyl910。 之前的ccpuid V1.01版只支持Windows和Linux平台。现在的V1.02版增加对Mac OS X平台的支持,还做了这些改进——支持纯C、增加CPUF常数、x86平台判断。一、更新说明1.1 支持Mac OS X平台 之前我发现了Mac OS X中的“/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/li..
阅读全文
摘要:作者:zyl910 前段时间我尝试用Finder的搜索功能查找intrin头文件,可惜没有找到,于是误以为Mac OS X的llvm-gcc不支持intrin函数。 今天在使用Xcode时,发现它是支持的,intrin头文件位于“/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/4.0/include”目录中。 搜索不到文件,可能是因为“/Applications/Xcode.app”并不是普通的目录。 在Finder中定位到“应用程序”目录,如果双击...
阅读全文
摘要:作者:zyl910。 这是一个小工具,枚举ActiveX控件的 CLSID 和 implemented/required CATIDs。可用来帮助分析ActiveX控件部署问题。一、代码 全部代码——View Code #include <stddef.h>#include <stdio.h>#include <tchar.h>#include <locale.h> #include <Windows.h>#include <crtdbg.h>#include <comcat.h>#include <at
阅读全文
摘要:新版本——http://www.cnblogs.com/zyl910/archive/2012/10/01/zintrin_v101.html作者:zyl910。 现在很多编译器支持intrinsic函数,这给编写SSE等SIMD代码带来了方便。但是各个编译器略有差异,于是我编写了zintrin.h,智能引入intrinsic函数。一、各种编译器的区别1.1 Visual C++(Windows) 最早支持intrinsic函数的VC编译器是VC 6.0。它在装上Visual Studio 6.0 Service Pack 5、Visual C++ 6.0 Processor Pack这两..
阅读全文
摘要:作者:zyl910。 这几天在调试一个使用Http POST协议的接口。在网上找了几个Http测试工具,但感觉不太好用。于是自己用C#写了一个简单的测试工具。一、使用介绍 默认是“POST”模式。在最上面的文本框中输入Url地址,然后在“Post Data”文本框中输入Post参数,再点击“Go”按钮发送请求。 如果想使用“GET”模式。便点击左上角的组合框,选择“GET”模式,再点击“Go”按钮发送请求。 当发现回应内容乱码时。点击“Response Encoding”组合框,选择合适的编码。再点击“Go”按钮重新发送请求。二、全部代码 窗口的代码(FrmTestHttpPost....
阅读全文
摘要:作者:zyl910。折腾了好几天,终于在Mac OS X Lion 10.7.4上装好GTK+了。其中走了不少弯路,于是将经验教训总结了一下。一、系统环境(OS X与XCode) 操作系统:Mac OS X Lion 10.7.4(11E53) 编程工具:Xcode 4.4.1(1448),并装好了它的“Command Line Tools”。 安装过程可参考这些帖子——在virtualbox上安装Mac OS X Lion 之 配置过程http://www.crifan.com/install_mac_os_x_lion_on_virtualbox_config_process/给Vi...
阅读全文
摘要:作者:zyl910。 之前的ccpuid V1.00版(http://www.cnblogs.com/zyl910/archive/2012/07/11/ccpuid.html)只支持VC。 现在的V1.01版支持GCC,不仅兼容32位/64位Linux下的GCC,还兼容Windows下的MinGW、MinGW-w64、TDM-GCC等。可以自由的编译为Windows下、或Linux下的程序。一、更新说明 主要的改进有——1. 支持GCC。2. 使用getcpuid/getcpuidex函数来获取CPUID信息。3. 使用C99标准整数类型uint32_t,提高可移植性。二、全部代码2....
阅读全文
摘要:作者:zyl910 为了适应现在越来越流行的64位系统,经常需要将代码分别编译为32位版和64位版。其次,除了需要生成debug版用于开发测试外,还需要生成release版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本,而且不仅兼容Linux下的GCC,还支持MinGW、TDM-GCC等Windows下的GCC编译器。一、C程序代码 为了测试条件编译的效果,以下面这个C语言程序为例(gcc64_make.c)——#include <stdio.h>#include <assert.h>// 获取程序位数(被编译为多少位的代码)int GetProgr
阅读全文
摘要:新版本——http://www.cnblogs.com/zyl910/archive/2013/01/10/c99int_v101.html[C] 让VC支持C99的整数类型V1.01。避免包含目录问题,更名auto_stdint.h、auto_inttypes.h(在VC6至VC2012、GCC、BCB等编译器下测试通过)作者:zyl910 C99标准定义了stdint.h、inttypes.h,用于统一的跨平台数据定义。可惜VC、BCB等编译器对C99的兼容性较差,有些版本没有该头文件。本文对此进行探讨,编写了一套兼容VC、BCB、GCC的stdint.h、inttypes.h。一、心得.
阅读全文
摘要:作者:zyl910 前面我们尝试过在VC中获取CPUID信息。现在再来试试GCC编译器。一、调用CPUID指令 怎么调用CPUID指令呢?有三种办法——1. 用汇编语言编写一个cpuid函数,然后调整链接器配置,在C语言中调用该函数。2. 使用内嵌汇编调用CPUID指令。3. 使用编译器提供的Intrinsics函数来调用CPUID等特定平台指令。 我们一般优先使用第3种办法,代码量少、可读性高、编译维护简单。例如VC(VC2005或更高)在“intrin.h”中声明了 __cpuid函数。 当编译器没有提供Intrinsics函数时,就只有使用前两种办法了。1.1 查找函数 首先,...
阅读全文
摘要:作者:zyl910 在编写跨平台的程序时,我们经常使用预定义宏来检测编译环境。虽然编译器的手册中有预处理宏的介绍,但是不够详细,而且还有很多宏没有介绍。于是,我编写了一个小程序,显示常见C/C++编译器的编译器的预定义宏。一、心得 最直接的办法是逐个逐个的用#ifdef判断宏是否存在,然后再printf显示其内容。可是预定义宏有些是整数、有些是字符串,还有些是关键字不能直接用printf输出,用起来挺麻烦的。 在网上发现一种不错办法,出自《关于CPP的预定义宏:unix、linux、i386、i586,大家中过招吗?》4楼“太平绅士”——View Code #include <stdio
阅读全文
摘要:作者:zyl910更多详情见——http://www.cnblogs.com/zyl910/archive/2012/04/26/md00.htmlSIMD函数整理:00 索引贴R:寄存器。M:64位MM寄存器;X:128位XMM寄存器;Y:256位YMM寄存器。Name:函数名。Name2:另一种函数名。功能:功能描述。Asm:汇编指令。PCode:伪代码。RNameName2功能AsmPCodeX_MM_SHUFFLE混洗的掩码.4#http://msdn.microsoft.com/en-us/library/4d3eabky(vs.71).aspxX_MM_TRANSPOSE4_PS矩
阅读全文
摘要:作者:zyl910 随着wchar_t类型引入C语言,字符串处理变得越来越复杂。例如字符串输出有printf、wprintf这两个函数,当参数中既有char字符串又有wchar_t字符串时,该怎么填写格式控制字符呢?本文对此进行探讨。一、翻阅文档 先翻阅一下各个编译器的文档及C99标准,看看它们对格式控制字符的说明。1.1 VC的文档 在MSDN官网上,可以找到printf与wprintf的格式字符串的说明,在《Format Specification Fields: printf and wprintf Functions》(http://msdn.microsoft.com/en-u...
阅读全文
摘要:作者:zyl910 在不同平台上开发C/C++程序时,为了避免源码文件乱码,得采用UTF-8编码来存储源码文件。但是很多编译器对UTF-8源码文件兼容性不佳,于是我做了一些测试,分析了最佳保存方案。一、测试程序 为了测试编译器对UTF-8源码文件兼容性,我编写了这样的一个测试程序——//#if _MSC_VER >= 1600 // VC2010//#pragma execution_character_set("utf-8")//#endif#include <stdio.h>#include <locale.h>#include <s
阅读全文
摘要:作者:zyl910更多详情见——http://www.cnblogs.com/zyl910/archive/2012/04/26/md00.htmlSIMD函数整理:00 索引贴Name:函数名。Name2:另一种函数名。功能:功能描述。Asm:汇编指令。PCode:伪代码。 NameName2功能AsmPCode_m_empty_mm_emptyMMX状态置空EMMS_m_from_int_mm_cvtsi32_si64加载32位MOVDr=ZX(i)_m_to_int_mm_cvtsi64_si32返回低32位MOVDr=(uD)m_m_packsswb_mm_packs_pi16...
阅读全文