Friday, August 20, 2010

boost::MPL - basic tools

1. lambda表达式:一种元数据(metadata)。有两种表达方式,一是普通的元数据类,二是占位符表达式(placeholder expressions)。占位符表达式的本质是把第n个元数据封装成一个元数据类。

    如"mpl::plus<_1, _2>",其中的"_1"大致相当于下边的定义:

    struct arg<1>
    {
        template <class A1, class A2 &gt;
        struct apply
        {
             typedef A1 type; // return first argument
        }
    };

    整个语句的含义相当于:
    struct Temp
    {
        template<typename Arg1, typename Arg2>
        struct apply {
            typedef mpl::plus<Arg1, Arg2> type;
        };
    }

2. mpl::vector, mpl::list, etc. 与std::vector, std::list有类似语义的元数据。但是,std容器中装的是变量,mpl容器中装的是类型。即:mpl可以对mpl容器中的类型进行运算,得到新的类型。

3.有价值的概念
   3.1 compile time to runtime mapping,
      用途: 从mataprogramming 转到
      工具:mpl::for_each<>, boost::fusion

   3.2 runtime to compile time mapping。
      用途:提供缓式计算,避免不必要的运行时开销,提高性能
      工具:参照blitz++

   3.3 闭包

   3.4 命名参数
      用途:函数接受大量参数时,简化参数传递
      工具:

boost::MPL - Conceptions

1. MPL 的几个重要概念。

    1.1 元数据(Metadata): 可以被C++编译器在编译期操纵的"值",主要有两种:类型和常量(int, bool, global ptr, etc)。由于元数据是不可变的(immutable),元编程(Metaprogramming)中的迭代一般是通过递归来完成的。如:

        template <int base, int power>
        struct Power
        {
            static const int value = base * Power::value;
        };
       
        template
<int base>
        struct Power<base, 0>
        {
            static const int value = 1;
        };
       
        int _3power5 = Power<3, 5>::value;



    1.2 元函数(Metafunction):一个可以在编译期"调用"的"函数",输入参数是metadata(也可以没有任何输入参数),输出参数是一个名为"type"的类型。对于数值型metafunction,还有输出一个名为"value"的常量。

    元函数与传统的traits很相似,但在概念上有很大区别。traits是把很多特性集合在一起,运用程序在这个集合中各取所需。元函数则完全模仿了"函数(function)"这个概念,具有很强的可扩展性。

        template <bool condition, class L, class R>
        struct Selector
        {
            typedef L type;
        };
       
        template <class L, class R>
        struct Selector<false, L, R >
        {
            typedef R type;
        };


        Selector<true, int, float>::type _int = 10;      // int
        Selector<false, int, float>::type _float = 1.23; // float


    1.3 元函数类(Metafunction class)(??有更好的不容易与元函数混淆的翻译??): 一个实现了元函数"apply"的类。概念上类似于c++中的仿函数(functor).

        struct SelectorWrapper
        {
            template<bool condition, class L, class R>
            struct apply
            {
                typedef typename Selector<condition, L, R>::type type;
            };
        };

        SelectorWrapper::apply<true, int, float>::type _int1 = 20; // still int


    1.4 多态(Polymorphism):同一接口具有操作不同类型的能力。MPL通过返回"type"和"value"的约定,确保代码的可复用性和组件之间互操作的自然性。


    1.5 高阶元函数(high-order metafunction):一种元函数,接受并且在运算中使用其它元函数参数。概念上类似于接受函数指针的函数,或接受functor的函数。典型的高阶元函数是 boost::mpl::transform

        template<class F, class X>
        struct high_order_fun
        {
            typedef typename F::template apply::type type;
        };

Thursday, August 19, 2010

smartwin++

1. http://smartwinlib.org/

  粗略的看了一些,感觉结构设计很差。能流行的原因估计有二:

    1)用户接口比较友好;
    2)功能比较全

notus

1.简介。

http://notus.sourceforge.net/

notus是win32下的一个轻量GUI库,依赖c++ template技术,实现Model-Strategies-View模型。

优点:1) 轻量,高效。大量使用template技术,直接调用平台native的GUI实现。
      2) 理论上说,可以有很强的可移植性。

缺点:1) 缺乏维护,多年未有更新。一些基本操作没有很好封装,显得繁琐。
      2) 对GUI模型的抽象度不是特别的好,对Win32有过强的依赖。

2. 的模块结构
3.view的组成。一个view是由一个Display,一个Strategies组以及一个model_controller组成。


4. Strategies的构成。strategies是由boost::tuple组成的一个strategy集合,当收到event时,遍历该集合,调用适当strategy。遍历过程是编译时处理的,不影响运行时速度。

5. Display中可用的组件。这些组件都是抽象的接口,依赖于impl包中对于不同平台的具体实现。由于直接使用平台相关的native implementation,所以程序效率很高。
6. 典型的消息过程

Wednesday, August 18, 2010

Makefile

1. Makefile的自动变量

"$@":  规则中的目标文件名。如果规则中有多个目标(使用'%'匹配模式),那"$@"就是触发该规则的目标文件名。

"$<": 依赖目标中的第一个目标名字。


"$?":  所有比目标新的依赖目标的集合,以空格分隔。

"$^ ":  所有的依赖目标的集合,以空格分隔。如果某个文件在依赖中重复,那这个变量会去除重复,只保留一份。

"$+ ":  与"$^"很接近,也是所有依赖目标的集合。只是它不去除重复的依赖。

"$*":  1) 对于明确规则(explicit rule), 如果目标文件的后缀是Make系统认识的,则"$*"代表目标名减去后缀部分。如bar/foo.c, $* = bar/foo

          2) 对于隐含规则(implicit rule), "$*"包含了目标文件的主干部分。

WiMax - Control Plane Protocols and Procedures

1. Network Entry Discovery and Selection/Re-selection

    1.1 NAP Discovery: MS在检测到的channel上,通过解码和扫描ASN的DL-MAP,来检测NAPs. NAP_ID即Operator ID,用Base Station ID的高24bit来表示。

    1.2 NSP Discovery:一个NAP可以支持一个或多个NSP。The list of NSP IDs and verbose NSP names presented over the air interface as part of SII-ADV and/or SBC-RSP, and all NSP realms that can be obtained using SBC-REQ/RSP SHALL be uniform across all Base Stations of the same NAP ID

        MS顺序地对每个NAP执行NSP Discovery 操作;

    1.3 NSP Enumeration and Selection:WiMax支持手动和自动两种网络选择模式,在发现的NSP中做出选择

    1.4 ASN Attachment:选择好NSP之后,MS选择一个与该NSP相关连的ASN,使用NAI执行Attach过程。

2. WiMax密钥

    2.1 MS与Home NSP,通过EAP协议完成用户的身份验证功能。验证成功后,产生MSK和EMSK。
        2.1.1 MSK通过AAA协议传递到MS当前的NAS,用于生成密钥来保护R1(MS <-> BS)接口的数据传输。
        2.1.2 EMSK保存在MS和EAP验证服务器中,用于生成MIP-RK来保护Mobile IP的信令数据。


3. AAA

     3.1 For device authentication based on X.509 certificates, MS SHALL support EAP-TLS, Username of the NAI presented in EAP-Response/Identity SHALL be the MAC Address of the device.

    3.2 For user authentication, MS SHALL support at least one of EAP-AKA [18] or EAP-TTLS [19]. When EAP-TTLS is used, the MS and AAA SHALL support TTLS version 0 [19] and MS-CHAPv2 [20] as a tunneled authentication protocol.

    3.3 NAI.
      3.3.1 Outer-Identity, In EAP the outer identity refers to the NAI delivered by the EAP-Peer in the EAP-Identity Response. The RADIUS User-Name attribute is set to this value in the Access-Request. The AAA infrastructure routes the AAA packets according to the information contained in this attribute.

Tuesday, August 17, 2010

WiMAX -- 网络结构和参考点


1.  功能体和参考点



几个重要的概念:
    1.1 Access Service Network (ASN):defined as a complete set of network functions needed to provide radio access to a WiMAX subscriber(为WiMAX用户提供无线接入服务的一个功能体)

    1.2 Network Access Provider (NAP):NAP is a business entity that provides WiMAX radio access infrastructure to one or more WiMAX Network Service Providers (NSPs). A NAP implements this infrastructure using one or more ASNs(为WiMAX运营商提供无线接入服务的基础设施,由一个或多个ASN组成。是一个商业上的概念)

   1.3 Connectivity Service Network (CSN):Connectivity Service Network (CSN) is defined as a set of network functions that provide IP connectivity services to the WiMAX subscriber(s).(为WiMAX用户提供IP联接服务的功能体)

   1.4 Network Service Provider (NSP): NSP is a business entity that provides IP connectivity and WiMAX services to WiMAX subscribers compliant with the Service Level Agreement it establishes with WiMAX subscribers. (为注册用户提供IP联接和其他WiMAX服务,是一个商业上的概念)



2. 组网方式。WiMAX可以采用灵活的组网方式,一个BS可以同时接入多个ASN-GW;一个ASN可以同时接入多个CSN,并且,这些CSN可以属于不同的Service provider.



3. 传输层的协议结构,分为控制面(CP)和数据(UP)面两种。控制面的消息直接在MAC(R1)或IP(R3/R6)上传递;用户面的消息在R3/R6上通过IP隧道传递。
 
 

4. 主要协议

4.1 IP地址分配: DHCP
4.2 AAA: RADIUS + EAP
4.3 移动性管理: MIPv4(Client MIP, ProxyMIP), IPv6

参考文献:
[1] WMF-T32-002-R010v04_Network-Stage2-Part1
[2] WMF-T32-003-R010v04_Network-Stage2-Part2

Friday, August 6, 2010

Performance tunning

1. 性能优化的一般步骤。

   1.1 首先,在系统一级进行。在网络IO性能,磁盘性能,内存使用率等地方找出瓶颈,可用的分析工具有任务管理器,windows自带的perfmon.exe等。一般情况下这是花精力少,见效明显的方法。

   1.2 其次,从应用程序的角度进行,关注锁等共享资源的竞争,调整程序结构,优化运算的并行度。这个步骤能取得的效果与应用程序的特性有关。

   1.3 最后,从CPU硬件结构的角度进行,关注Cache的使用,总线使用效率等。对于Intel的CPU,可用工具有"Intel VTune Performance Analyzer"。这个步骤稍微复杂一些,但对于某些特定的应用,能轻易地提高一倍以上的运算效率,原因有二:1) CPU访问Cache的效率比访问内存快上几个数量级;2)在多核情况下,内存总线经常成为计算机系统的性能瓶颈。

2.  Intel VTune Performance Analyzer工具的使用。vTune提供两种采样模式
   time-based sampling:
   event-based sampling: 使用Processor内部的计数器来统计软件的工作状态,不同的CPU构架有不同的Event,所以使用前必须先了解CPU类型

   常用的评估参数

   2.1 Cycles per Retired Instruction (CPI) = CPU_CLK_UNHALTED.CORE / INST_RETIRED.ANY
      统计每条指令所花的时钟周期数,越小越好。由于多流水线结构,CPU能在一个时钟周期完成多条指令,即CPI远小于1

   2.2 Excution Stalled rate = (UOPS_EXECUTED.CORE_STALL_CYCLES / (UOPS_EXECUTED.CORE_STALL_CYCLES + UOPS_EXECUTED.CORE_ACTIVE_CYCLES) ) * 100


   2.3 L2 Cache Miss Impact
   2.4 Branch Misprediction Ratio
   2.5 Bus Utilization Ratio


3 Core i7, Xeon 5500系列CPU常用的event

   CPU_CLK_UNHALTED.THREAD: counter measures unhalted clockticks on a per thread basis.So for each tick of the CPU's clock, the counter will count 2 ticks if Hyper-Threading is enabled, 1 tick if Hyper-Threading is disabled. There is no per-core clocktick counter.

   CPU_CLK_UNHALTED.REF: counts unhalted clockticks per thread, at the reference frequency for the CPU. In other words, the CPU_CLK_UNHALTED.REF counter should not increase or decrease as a result of frequency changes due to Turbo Mode or Speedstep Technology


    UOPS_EXECUTED.CORE_STALL_CYCLES: counter measures when the EXECUTION stage of the pipeline is stalled. This counter counts per CORE, not per thread.

    UOPS_EXECUTED.CORE_ACTIVE_CYCLES:
   

    INST_RETIRED.ANY