zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2012年8月27日

摘要: 作者:zyl910。列名解释——GCC470:GCC 4.7.0 (Fedora 17)。/usr/lib/gcc/i686-redhat-linux/4.7.0/include/。GCC462:GCC 4.6.2 (MinGW)。\lib\gcc\mingw32\4.6.2\include。宏:判断该指令集是否启用的宏。参数:启用该指令集的命令行参数。描述:指令集描述。 GCC470GCC462宏参数描述abmintrin.h__ABM__-mabmABM: Advanced Bit Manipulation. 改为lzcntintrin.h.ammintrin.hammintrin.h.. 阅读全文
posted @ 2012-08-27 22:45 zyl910 阅读(11385) 评论(1) 推荐(0) 编辑

2012年8月22日

摘要: 作者: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.... 阅读全文
posted @ 2012-08-22 23:01 zyl910 阅读(4294) 评论(0) 推荐(1) 编辑

2012年8月16日

摘要: Gunpowder Magazine and Firecracker Workshop (火药库与爆竹坊){Rule} Steel technology found [ICON_RES_COAL] Coal. (获得炼钢科技时发现煤矿){New Building} Gunpowder Magazine(火药库): +15% [ICON_PRODUCTION] Production when building Gunpowder/Siege Units. Each source of [ICON_RES_COAL] Coal worked by this City produce +1 [ICO 阅读全文
posted @ 2012-08-16 23:16 zyl910 阅读(1377) 评论(0) 推荐(1) 编辑

2012年8月14日

摘要: 作者: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 阅读全文
posted @ 2012-08-14 16:05 zyl910 阅读(87981) 评论(3) 推荐(7) 编辑

2012年8月8日

摘要: 新版本——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。一、心得. 阅读全文
posted @ 2012-08-08 22:49 zyl910 阅读(20375) 评论(4) 推荐(5) 编辑

2012年8月6日

摘要: 作者:zyl910 前面我们尝试过在VC中获取CPUID信息。现在再来试试GCC编译器。一、调用CPUID指令 怎么调用CPUID指令呢?有三种办法——1. 用汇编语言编写一个cpuid函数,然后调整链接器配置,在C语言中调用该函数。2. 使用内嵌汇编调用CPUID指令。3. 使用编译器提供的Intrinsics函数来调用CPUID等特定平台指令。 我们一般优先使用第3种办法,代码量少、可读性高、编译维护简单。例如VC(VC2005或更高)在“intrin.h”中声明了 __cpuid函数。 当编译器没有提供Intrinsics函数时,就只有使用前两种办法了。1.1 查找函数 首先,... 阅读全文
posted @ 2012-08-06 16:17 zyl910 阅读(17494) 评论(0) 推荐(2) 编辑

2012年8月2日

摘要: Game Speed Packet(游戏速度模式大补包)Only Visable in Advanced Menu, you can switch back to Standard Menu after choosing.(仅在高级设置界面可见,您可以选择后再点击“后退”回到标准设置界面。)x2 : GAMESPEED_STANDARD * 2. 1000 turns.x2.5: GAMESPEED_STANDARD * 2.5. 1250 turns.x4 : GAMESPEED_STANDARD * 4. 2000 turns.x5 : GAMESPEED_STANDARD * 5. 25 阅读全文
posted @ 2012-08-02 23:51 zyl910 阅读(1915) 评论(0) 推荐(0) 编辑

摘要: 作者:zyl910 在编写跨平台的程序时,我们经常使用预定义宏来检测编译环境。虽然编译器的手册中有预处理宏的介绍,但是不够详细,而且还有很多宏没有介绍。于是,我编写了一个小程序,显示常见C/C++编译器的编译器的预定义宏。一、心得 最直接的办法是逐个逐个的用#ifdef判断宏是否存在,然后再printf显示其内容。可是预定义宏有些是整数、有些是字符串,还有些是关键字不能直接用printf输出,用起来挺麻烦的。 在网上发现一种不错办法,出自《关于CPP的预定义宏:unix、linux、i386、i586,大家中过招吗?》4楼“太平绅士”——View Code #include <stdio 阅读全文
posted @ 2012-08-02 18:24 zyl910 阅读(12205) 评论(0) 推荐(3) 编辑

2012年7月31日

摘要: 作者: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矩 阅读全文
posted @ 2012-07-31 18:32 zyl910 阅读(8695) 评论(1) 推荐(1) 编辑

2012年7月30日

摘要: 作者: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... 阅读全文
posted @ 2012-07-30 18:12 zyl910 阅读(4786) 评论(0) 推荐(0) 编辑

2012年7月26日

摘要: 作者: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 阅读全文
posted @ 2012-07-26 23:56 zyl910 阅读(16681) 评论(5) 推荐(3) 编辑

2012年7月19日

摘要: 作者: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... 阅读全文
posted @ 2012-07-19 22:48 zyl910 阅读(4311) 评论(0) 推荐(0) 编辑

2012年7月11日

摘要: 作者:zyl910 关于获取各种CPUID信息,我之前积累了不少代码,现在决定将它们封装在一个模块中,方便代码复用。 其次,前面只是介绍了CPUID的一些常用功能,而Intel、AMD的手册中定义了大量的CPUID功能。所以我希望有一个程序能按照功能号顺序,依次显示所有的CPUID信息。这样就能很方便的与Intel、AMD的手册进行对照,有助于学习与理解。一、模块设计 最初方案是 想将所有功能全部放在一个“ccpuid.h”头文件中,这样用起来会比较方便。 但是考虑到全局变量等问题,以及需要编写CCPUID类。所以最终决定按照常规做法,分解为头文件与实现文件。 对于原先所写的宏定义、... 阅读全文
posted @ 2012-07-11 16:17 zyl910 阅读(1103) 评论(0) 推荐(0) 编辑

2012年7月6日

摘要: 网上有很多介绍VC与GCC预定义宏的帖子,例如《C\C++宏大全》。 而对于Intel C++编译器的预定义宏,似乎没人介绍。 我Google了很久,发现Intel官网上有,但是很奇怪,很多链接都失效了,报告404错误。反复调整搜索关键字,一个一个的尝试链接,最后终于找到了有效的页面了。为了怕以后链接失效,赶紧记录下载。 该手册的名字是《Intel® C++ Compiler XE 12.1 User and Reference Guides》,分别有Windows版和Linux版——Windows:http://software.intel.com/sites/products/d 阅读全文
posted @ 2012-07-06 11:03 zyl910 阅读(6459) 评论(0) 推荐(0) 编辑

2012年7月4日

摘要: 从2011年的Sandy Bridge微架构处理器开始,现在支持AVX系列指令集的处理器越来越多了。本文探讨如何用VC编写检测AVX系列指令集的程序,并利用了先前的CPUIDFIELD方案。一、AVX系列指令集简介 SSE5 指令:SSE5 是一个纸面上的指令集,并没有最终实现,AMD 在 2007 年 8 月公布 SSE5 指令集规范,在 2009 年 5 月 AMD 推出了 XOP,FMA4 以及 CVT16 来取代 SSE5 指令。 AVX 指令:2008 年 3 月 Intel 发布了 AVX(Advanced Vector Extensions)指令集规范,首次在 Sandy B.. 阅读全文
posted @ 2012-07-04 16:01 zyl910 阅读(11395) 评论(0) 推荐(0) 编辑

2012年6月29日

摘要: 除了基本的MMX和SSE系列指令集外,x86体系还有其他扩展指令集,例如SSE4A、AES、PCLMULQDQ等,它们也可以利用CPUID指令来检测。但是,这些指令集细碎杂多。如果像以前那样分别编写检测函数的话,那工作量太大,不值得。而且大量的函数名也会给使用带来麻烦。于是文篇探讨如何设计一套通用的检测方案。零、指令简介 SSE4A指令:是AMD提出的,最早出现在2007年的K10微架构的处理器上。它针对Intel的SSE4指令集修改而来,去除其中对I64优化的指令,保留图形、影音编码、3D运算、游戏等多媒体指令,并完全兼容。 AES指令:是Intel提出的,最早出现在2010年的West.. 阅读全文
posted @ 2012-06-29 14:11 zyl910 阅读(4030) 评论(0) 推荐(0) 编辑

2012年6月19日

摘要: 我们有时需要写一些小工具,或者是需要写一些简短的测试程序,这时编写命令行程序会比较方便。但是命令行程序用起来不太方便,比如——1.查看信息困难。有时候我们需要观察命令行程序的输出结果,但是在默认情况下,命令行程序执行完毕后会自动关闭窗口,来不及观察信息。这时可以采取“在程序中等待按键”、“手工打开命令提示符输入命令”、“在批处理中等待按键”、“批处理重定向”等方法,但是都比较麻烦。2.命令参数困难。某些命令行程序需要参数,这时只有手工打开命令提示符输入命令。有时要键入文件的全限定名,那就更花功夫了。 怎么解决以上难题呢? 首先想到的是把那些小程序改写为图形界面程序,或者为命令行程序分别... 阅读全文
posted @ 2012-06-19 17:29 zyl910 阅读(3061) 评论(0) 推荐(0) 编辑

2012年5月25日

摘要: 以前我写了一篇《[VC6] 检查MMX和SSE系列指令集的支持级别(最高SSE4.2)》(http://www.cnblogs.com/zyl910/archive/2012/03/01/checksimd.html)。现在发现该方法存在两点缺陷——1.不支持64位,因为VC的64位程序不支持内嵌汇编;2.没有区分硬件支持与操作系统支持。 怎么解决这两点缺陷呢? 对于第1点,可以利用Intrinsics函数来兼容32位和64位。为了更方便的使用CPUID指令,可以利用《如何在各个版本的VC及64位下使用CPUID指令》(http://www.cnblogs.com/zyl910/arc... 阅读全文
posted @ 2012-05-25 22:22 zyl910 阅读(4827) 评论(0) 推荐(1) 编辑

2012年5月22日

摘要: 新版本——http://www.cnblogs.com/zyl910/archive/2012/11/14/pdf_remove_watermake_marco_v2.html[使用心得] 利用按键精灵批量删除pdf中的水印 V2:用于页面内对象数量不定时删除最后一个对象一、利用“内容”面板删除水印 启动Acrobat Prefessional,打开该pdf文档。 点击菜单栏中的“视图→导航面板→内容”,打开“内容”面板—— 观察内容面板,展开树列表,会发现每一页中的第3个对象是水印(容器<Artifact> www.ckook.com)—— 在水印对象上右击鼠标弹出快捷菜单,点击 阅读全文
posted @ 2012-05-22 16:20 zyl910 阅读(5269) 评论(1) 推荐(0) 编辑

2012年5月21日

摘要: 前面我们探讨了在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等Intrinsics函数 在32位模式下,我们可以使用内嵌汇编来调用cpuid指令。但在64位模式下,VC编译器不支持内嵌汇编。 于是微软提供了Intrinsics函数——编译器会将Intrins... 阅读全文
posted @ 2012-05-21 18:04 zyl910 阅读(12460) 评论(0) 推荐(0) 编辑

2012年5月15日

摘要: 一、分解x2APIC_ID摘自《Intel® 64 Architecture Processor Topology Enumeration》中的“Sub ID Extraction Parameters for x2APIC ID”——SMT_ID: CPUID.(EAX=11, ECX=0):EAX[4:0] provides the width parameter to derive a SMT select mask to extract the SMT_IDs of logical processors within the same processor core. The 阅读全文
posted @ 2012-05-15 17:24 zyl910 阅读(3118) 评论(0) 推荐(0) 编辑

2012年5月14日

摘要: 有时我们需要编写DOS实模式下的CPU信息诊断程序,但是TurboC++等很多16位C++编译器不支持CPUID指令和32位汇编。于是本文介绍了一种办法,靠内嵌机器码实现了获取CPUID信息。一、CPUID指令简介 CPUID指令是intel IA32架构下获得CPU信息的汇编指令,可以得到CPU类型,型号,厂商信息,商标信息,序列号,缓存等一系列CPU相关的东西。 CPUID指令一般使用使用eax作为输入参数(某些时候会用到ecx),eax、ebx、ecx、edx作为输出参数。例如这样的汇编代码——mov eax, 1cpuid... 以上代码以1为输入参数,执行cpuid后... 阅读全文
posted @ 2012-05-14 23:57 zyl910 阅读(4054) 评论(0) 推荐(0) 编辑

2012年5月9日

摘要: tiled_index类中有4个属性与线程编号有关——tiled_index.global:线程的全局编号。相当于DirectCompute中的SV_DispatchThreadID。tiled_index.local:线程的局部编号。相当于DirectCompute中的SV_GroupThreadID。tiled_index.tile:线程块的编号。相当于DirectCompute中的SV_GroupID。tiled_index.tile_origin:线程块中首个线程的全局编号。(tile_origin=global-local)。参考文献——http://msdn.microsoft.c 阅读全文
posted @ 2012-05-09 15:24 zyl910 阅读(819) 评论(0) 推荐(0) 编辑

2012年5月8日

摘要: 现在多核处理器已经很普及了,市场主流是双核处理器,还有4核、8核等高端产品。而且Intel推广了超线程技术(Hyper-Threading Technology, HTT),可以将一个物理核心模拟为两个逻辑处理器。这一切使得“CPU数量”这一概念变得复杂起来,对于软件开发人员来说,希望能获得物理CPU数、CPU核心数、逻辑CPU数等详细信息。 在Windows平台,可以调用GetLogicalProcessorInformation函数来获取它们的详细信息。一、背景知识 先来明确一下名词——physical processor packages:物理处理器封装个数,即俗称的“物理CPU... 阅读全文
posted @ 2012-05-08 18:06 zyl910 阅读(2870) 评论(0) 推荐(1) 编辑

2012年5月7日

摘要: 假定——[numthreads(TX, TY, TZ)] // 线程组尺寸。既线程组内有多少个线程。Dispatch(GX, GY, GZ); // 线程组的数量。既有多少个线程组。那么——SV_GroupThreadID={iTX, iTY, iTZ} // 【线程组内的】线程3D编号SV_GroupID={iGX, iGY, iGZ} // 线程组的3D编号SV_DispatchThreadID={iGX*TX+iTX, iGY*TY+iTY, iGZ*TZ+iTZ} // 将线程组展开后,每个线程的全局3D编号。SV_GroupIndex=iTX + iTY*TX + iTZ*TX*TY 阅读全文
posted @ 2012-05-07 16:50 zyl910 阅读(865) 评论(0) 推荐(0) 编辑

2012年5月4日

摘要: 更新历史——[2012-5-4] V1.1.3& 兼容最新的 AHD 2.31beta(2012-04-27):http://bbs.52pcgame.com/thread-424493-1-1.html& 文本修订。下载地址——http://115.com/file/e73tbte8http://u.xunzai.com/fileview_1147668.htmlhttp://dl.dbank.com/c0xsvgps5w更多内容——http://www.cnblogs.com/zyl910/archive/2012/02/17/RecoverMingV_V1.html[维多 阅读全文
posted @ 2012-05-04 23:12 zyl910 阅读(1140) 评论(0) 推荐(0) 编辑

2012年4月26日

摘要: 一、来源 来源:《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术 书籍信息——http://e.360buy.com/30027396.htmlPC平台新技术MMX(上册):开发编程指南作 者: 吴乐南 编 出 版 社: 东南大学出版社 ISBN:9787810502528出版时间:1997-10-01页 数:149字 数:237000所属分类: 电子书 > 计算机与互联网 > 编程语言与程序设计 电子书 > 计算机与互联网 > 计算机工具书 二、整理后的代码 代码——#include <Windows.h>#include <st 阅读全文
posted @ 2012-04-26 21:59 zyl910 阅读(2366) 评论(0) 推荐(0) 编辑

摘要: 作者:zyl910 关于SIMD(MMX、SSE、AVX)编程的资料一直很零散,于是我试图进行收集整理,便于随时翻阅学习。而且很多代码是直接用汇编写的,易读性差、难以重用,于是我决定将其统一改写为Intrinsics函数版。一、Instructions函数对照表 在使用Instructions函数时,很多时候会发现MSDN说的不详细,这时只有去翻阅Intel、AMD文档了。但Intel、AMD文档都是按照汇编指令名排序的,查起来不太方便。 而且SIMD指令大多很复杂,文字描述难以详细的解释其功能,唯有伪代码才能精确的解释其功能。但Intel、AMD文档上的伪代码大多很长,不适合随时翻阅。... 阅读全文
posted @ 2012-04-26 21:53 zyl910 阅读(6755) 评论(0) 推荐(2) 编辑

2012年4月23日

摘要: 当使用Intrinsics函数来操作SIMD指令集(MMX/SSE/AVX等)时,会面对不同长度的SIMD数据类型,其中又分为多种紧缩格式。为此,我设计了一套SIMD变量命名规范,可以有效的提高代码的可读性。一、SIMD数据类型简介 SIMD数据类型有——__m64:64位紧缩整数(MMX)。__m128:128位紧缩单精度(SSE)。__m128d:128位紧缩双精度(SSE2)。__m128i:128位紧缩整数(SSE2)。__m256:256位紧缩单精度(AVX)。__m256d:256位紧缩双精度(AVX)。__m256i:256位紧缩整数(AVX)。注:紧缩整数包括了8位、16... 阅读全文
posted @ 2012-04-23 17:49 zyl910 阅读(9701) 评论(1) 推荐(1) 编辑

2012年4月19日

摘要: 在传统印象中,数字的比较关系只有6种。但在AVX指令集中,Intel一下给出了32种浮点比较谓词,详见下图——(Intel手册:Table 3-9. Comparison Predicate for VCMPPD and VCMPPS Instructions) 为什么会有这么多种比较谓词呢?我为此困惑困惑了很久。 直到最近翻阅了不少资料后,才终于将它们弄懂了。一、浮点数据类型 Intel使用的是IEEE 754规范的浮点数据类型。对于浮点数据类型来说,除了可以存储数字、无穷之外,还可以存储 NaN(not a number。非数)。 NaN(非数)分为两大类——1.QNaN:qu... 阅读全文
posted @ 2012-04-19 15:50 zyl910 阅读(4934) 评论(0) 推荐(0) 编辑

2012年4月13日

摘要: 一、测试结果汇总 将前面的测试结果进行汇总,整理为表格(单位是毫秒,数值越小越好)—— 测试f0_iff1_minf2_negf3_sarf4_mmxf5_sseVC6 on 32bit2016206371967237.525.7VC6 on 64bit2028207571868737.125.3VC2010(32) on 32bit17932112512437VC2010(32) on 64bit17162106514437VC2010(64) on 64bit16231997421328C#2010(any) on 32bit192221472471559C#2010(any) on... 阅读全文
posted @ 2012-04-13 17:20 zyl910 阅读(1802) 评论(2) 推荐(0) 编辑

2012年4月12日

摘要: 在上一篇测试了MMX指令集,这次我们来测试SSE指令集。说的更精确一点,是测试SSE2指令集。 本篇致力于解决以下问题——1.SSE/SSE2指令集是什么?2.如何阅读Intel/AMD的手册?3.如何运用SSE指令集?如何将MMX代码升级为SSE代码。4.如何在VC++6.0这样的高级语言编译器中使用MMX指令集?一、简介 1999 年 Intel 推出了第 1 代的 SSE(Streaming SIMD Extensions)指令以回击 AMD 的 3DNow! 指令,使用在 Pentium III 处理器上。随后 AMD 在 2001 年 10 月 发布 的 Athlon XP ... 阅读全文
posted @ 2012-04-12 22:09 zyl910 阅读(4382) 评论(2) 推荐(0) 编辑

2012年4月9日

摘要: 前面我们测试了高级语言做饱和处理的性能。其实,对于这样的大批量数据处理,使用SIMD(Single Instruction Multiple Data,单指令多数据流)技术能极大的提高性能。MMX指令集是目前x86平台上覆盖最广的SIMD指令集,于是本文对它进行探讨。 本文致力于解决以下问题——1.MMX指令集是什么?2.如何阅读Intel/AMD的手册?2.如何运用MMX指令集?3.如何在VC++6.0这样的高级语言编译器中使用MMX指令集?一、MMX指令集简介 MMX(Multi Media eXtension,多媒体扩展指令集)指令集是Intel公司于1996年推出的一项多媒体指... 阅读全文
posted @ 2012-04-09 22:25 zyl910 阅读(3284) 评论(0) 推荐(0) 编辑

2012年4月6日

摘要: 更新历史——[2012-4-6] V1.1.2& 兼容最新的 AHD 2.3beta(2012-03-31)* 修正“再造共和”决议。防止多次触发。& 文本修订。下载地址——http://dl.dbank.com/c0xuar98mghttp://www.rayfile.com/zh-cn/files/97e8ab19-7ff2-11e1-a5a0-0015c55db73d/http://u.xunzai.com/fileview_1102599.html更多内容——http://www.cnblogs.com/zyl910/archive/2012/02/17/Recover 阅读全文
posted @ 2012-04-06 22:23 zyl910 阅读(912) 评论(0) 推荐(0) 编辑

2012年3月30日

摘要: 更新历史——[2012-3-30] V1.1.1* 调整重建大明系列决议,仅移除关内地区的CHI核心。* 放松“独立自治”决议的条件。当CHI失去对北京的军事控制时便可执行。* 当不同意“清帝退位”时,次国家触发“响应革命”事件。+ 新决议——重回关东、天朝正统、重建大明(君宪)。& 文本修订。下载地址——http://115.com/file/e7lxruw6http://u.xunzai.com/fileview_1088987.html更多内容——http://www.cnblogs.com/zyl910/archive/2012/02/17/RecoverMingV_V1.ht 阅读全文
posted @ 2012-03-30 20:36 zyl910 阅读(1718) 评论(0) 推荐(0) 编辑

摘要: 前面我们测试了C系列语言,验证了位掩码算法的确实性能不错。那么对于Basic系列语言,该算法的效率怎样呢?于是本文对此进行探讨。 VB.Net与C#一样,也是由.Net虚拟机执行的,没有多大的测试价值。所以我决定测试VB6。一、移植要点 VB6的功能与C系列语言差很多。很多地方需要换另一种方法去实现,甚至不能实现。 要点有——1.VB6不支持控制台程序,只支持窗口程序。所以我们的测试程序得修改为窗口程序。2.VB6不支持指针,所以依靠数组。幸好现在的操作比较简单,用数组的性能损失不大。3.VB6没有带符号移位运算法,所以无法实现f3_sar函数。4.VB6和C#一样不支持宏,所以得手... 阅读全文
posted @ 2012-03-30 16:49 zyl910 阅读(3599) 评论(0) 推荐(0) 编辑

2012年3月29日

摘要: 前面我们测试了C语言这样纯编译型语言。那么对于像C#这样由虚拟机执行的语言,“位掩码代替分支”法是否也有效果呢?于是本文对此进行探讨。一、移植要点 C#的语法与C语言很相像,多数代码可以直接用,但要注意以下几点。1.1 unsafe——不安全上下文 C#虽然支持指针,但必须在unsafe——不安全上下文 中才能使用。 要使用unsafe,必须先配置项目属性,允许不安全代码——1.项目->属性,打开项目的属性页。2.点击左侧“生成”,切换到“生成”页。3.点击上侧的“配置”组合框,选择“所有配置(C)”。4.勾选“常规”中的“允许不安全代码(F)”。5.点击工具栏上的“保存”按钮。 ... 阅读全文
posted @ 2012-03-29 17:08 zyl910 阅读(1411) 评论(0) 推荐(0) 编辑

2012年3月28日

摘要: 前面我们用VC6测试了位掩码代替分支的速度。VC6是1998年发售的,离现在有14年了。在14年里,Intel与AMD的CPU都换了好几套微架构了,VC6编译器很可能无法充分发挥它们的性能。而且,从2003年AMD推出了64位处理器开始,现在64位系统越来越普及,我们希望测试64位下的性能。 于是选择最新的VC系列编译器——Visual C++ 2010,它是2010年发售的,支持x64平台。一、代码改进1.1 通用字符处理——tchar.h 传统的Windows程序一般使用ANSI+DBCS字符集。而从Windows NT开始,Windows内核采用Unicode字符集。但那时基于A... 阅读全文
posted @ 2012-03-28 16:35 zyl910 阅读(1136) 评论(0) 推荐(0) 编辑

2012年3月27日

摘要: wuhanbingwhdx提到了数据相关也会影响流水线(http://blog.csdn.net/zyl910/article/details/1330614)。 他的说法是有一定道理的。但是,在很多时候我们并不仅仅处理一个数值。比如将循环展开,在内循环处理2个或更多个的数值。而现代编译器面对循环展开时,在编译优化操作中会调整指令顺序,错开有相关性指令。因现代处理器支持超标量,这样的指令顺序调整能获得较好的指令级并行度,从而优化了性能。 其次,就算编译器对循环展开优化的不够彻底,没将相关性指令错开。但因现代处理器支持乱序执行,当遇到相关性指令需要等待时,处理器会处理后面未相关的指令,从... 阅读全文
posted @ 2012-03-27 15:31 zyl910 阅读(975) 评论(0) 推荐(0) 编辑

2012年3月21日

摘要: 查看编译器生成的汇编代码,有助于我们分析程序的性能。1 让VC6输出编译的汇编代码 用VC6打开前一篇文章(http://www.cnblogs.com/zyl910/archive/2012/03/12/noifopex1.html)的工程“noifCheck.dsw”。 首先需要配置项目设置——1.点击菜单栏 “工程”->“Project Settings”打开“Project Settings”对话框。2.将“Settings For:”设为“Win32 Release”。3.将右侧的选项卡换到“C/C++”面板。4.点击“Category:”组合框,选择“Listing Fil. 阅读全文
posted @ 2012-03-21 15:10 zyl910 阅读(960) 评论(0) 推荐(0) 编辑