2013年10月31日星期四

未使用mfence引起的bug

前几天为了提高内存分配模块的效率,而使用了自行实现的spin_lock(即采用GCC的内置宏__sync_lock_test_and_set、MSVC的内置宏_InterlockedExchange)

理论上,释放锁时,需要考虑执行乱序的问题,需要有Memory Barrier(即执行mfence)避免临界区内的改动在临界区外生效。不过,我在本机上测试,发现无论如何不会出现乱序的情况,这让我以为处理器有机制避免这种乱序问题。考虑到引入mfence会带来明显的性能下降,我就去掉了这个语句。

结果,QA在服务器上测试时,就发现了异常问题,而且看上去和内存管理有关。在排除了其他bug以后(事实上,这个版本有很多其他各色问题),仍然没有彻底解决。我考虑可能和未使用mfence有关,便重新加上,果然恢复正常了。

测试表明,若无mfence,桌面的处理器和AMD的服务器处理器似乎都不会有乱序执行导致错误,而XEON则很容易出现问题。

一段用于测试乱序执行的代码:

makefile

a.out : main.cpp
    g++ -O2 -g -lpthread -o $@ lt;


main.cpp

#include
#include
#include
#include
#include

volatile unsigned int a1 = 0;
volatile unsigned int b1 = 0;

int lock = 0;

int failed_count = 0;

#define spin_lock(p) while (__sync_lock_test_and_set(p, 1)) __asm("pause")

#if 0
// No mfence
#define spin_unlock(p) *p = 0
#else
// Use mfence
#define spin_unlock(p) __sync_synchronize(); *p = 0
#endif

static void* f(void* arg)
{
    unsigned int c1, d1;

    for(;;)
    {
        spin_lock(&lock);
        c1 = a1;
        d1 = b1;

        a1++;
        b1++;
        spin_unlock(&lock);
        if (c1 != d1)
        {
            failed_count++;
            spin_lock(&lock);
            a1 = b1;
            spin_unlock(&lock);
        }
    }
}

static void* g(void* arg)
{
    struct timeval now, last;
    int us;

    gettimeofday(&last, NULL);
    for(;;)
    {
        spin_lock(&lock);

        b1++;
        a1++;
        if (b1 >= 0x1000000)
            break;

        spin_unlock(&lock);
    }

    gettimeofday(&now, NULL);
    us = (now.tv_sec - last.tv_sec) * 1000000;
    us += (now.tv_usec - last.tv_usec);
    printf("us = %d.\n", us);
    printf("failed_count = %d.\n", failed_count);
    exit(0);
}

int main(int argc, const char* argv[])
{
    pthread_t pid1,pid2;

    if (pthread_create(&pid1, 0, f, 0))
    {
        printf("Create thread1 error\n");
        exit(-1);
    }

    if (pthread_create(&pid2, 0, g, 0))
    {
        printf("Create thread2 error\n");
        exit(-1);
    }

    while (1)
        sleep(1);

    return 0;
}


通过调整#if 0/1的开关,可以选择使用/不使用mfence。

注意:出现failed count说明受到乱序执行的影响;但是若没有出现failed count并不意味不存在问题,可能只是没有引发问题;另外,编译时必须开启优化,否则生成臃肿的代码很可能会掩盖问题。

2013年10月27日星期日

英语、数学和八股文

经过多年的反英、反高考变态化人士的不懈努力,终于迎来了一个重要的变化 - 北京高考英语降低权重了,降低的分值转加到了语文科目。

这战果深刻鼓舞了各界人士,于是对数学发起了追击,更有大量网友投票,要求数学滚出高考。理由大抵是:变态的难,学不明白,无以致用,生活中除了加减乘除,其他毫无用处。

若投票真能发挥作用,数学大概就会死在滚滚的历史车轮之下了。这就是民主制度导致退步的非理智典型案例。

作为饱受英语折磨的一员,当年我也曾无数次企盼它被降分,甚至被踢出高考。然而这只是我的心情,合理的选择是英语不仅不应削弱地位,反而应该加强,让高考增设英文的听力、写作项目(口语考试太难评分,难以纳入)

这个问题需要从几个角度来看:

首先,需要变革的是中国教育资源分配及就业市场的问题。

目前我国教育资源明显集中在北大清华这几个一线院校和教育部直属的几十个二线院校上。结果就是像很多人往北上广深和各地省会、大城市等一、二线城市集中一样,学生也会削尖脑袋挤入这些一、二流的学校。同时,就业市场也会集中从这些学校挑选人才,结果又造成这些学校更有号召力,资源更集中,成了一个不断强化的循环。在这个问题解决之前,所有针对考核科目、繁重作业、补习问题的改革都不会有任何实际作用。

这种具有“跃龙门”效果的考试,当然是题目越出越变态。即使把所有的现行科目全部拿下,将内容改为比“糊火柴盒”,其结果也将是一批具有世界级糊火柴盒能力的人在考核中获得好成绩,从而进入理想的学校。

而国家的公务员考试,题目之所以还没有像高考那么变态(已经有开始变态的趋势),主要原因是开展时间不久并且考试相比高考还不够公平(内定的情况很严重)。若这个考试能够做到当年高考那样公平,再过几年,公务员考试也会很变态 - 无论考什么科目。

其次,高考内容本来就和生活无关。

很多人痛恨数学,这可以理解。但是以“数学在生活中毫无用处”为理由去排斥它,则失于偏颇。从初中开始,我们学习的知识基本就和生活无关了。总的来说,我们日常生活所需要的知识是很少的,有一些文字基础、认识ABC、会加减乘除也就足够了。但是,高考是高等教育的入门考试,和生活就是两码事。数学作为理工、经济类学科的基础,属于必备知识。(当然,文科、艺术类的考试,可以将数学内容去除。)

最后,若高考不考这些,考什么?

文科类的高考科目且不谈,这可以重新审视。

理工类的高考科目,若不考英语,不考数学,难道专考语文 - 这不是回到了八股文时代么?事实上,八股文要做好也是非常困难的。

因为觉得难而削减科目,是削足适履。

“题目难”是体制缺陷的结果,而不是成因。直接在结果上修正,无异于削足适履。

若没有基础的英语水平和数学功底,又谈何学习高等教育的其他科目 - 大学里的数学、物理、化学那可远比高考要求的内容变态。只不过考试评定松懈的很,所以容易蒙混过关罢了。若是以“对生活工作无用”的目的,把这些大学科目也全部废除,何不废除大学算了?其实我们小学毕业后,除非搞科研,否则就可以直接参加工作了。

事实上,对这个世界上绝大部分工作而言,小学毕业时掌握的知识的确足够了。不过招聘的企业并不会这么想,大部分企业会倾向于招一些学历更高、出身更好的人员。这个道理也很简单,毕竟我们不能使用童工,参加工作时都要18岁以上,企业自然会考虑从大学生中招募。而高考作为一个选拔体系,好学校的学生(意味着高考中获得了更好的分数)普遍具有更强的学习能力和勤奋程度,自然也被企业所青睐,在这个人群中挑选,选择成本更低。

高考之所以够难够折磨人,是因为后面“好出路”的稀缺性导致的。即使全面废弃高考,我们也会面临这个竞争压力,承受这个竞争带来的痛苦。无论怎么限制科目,调整分数,作业减负,禁止补习都没有什么意义。只有让社会发展,分配公平,增多“好出路”,才能缓解这种压力。

至于为了应付高考而进行“毫无意义”的学习,真的会降低我们的创造力吗?这可不见得。这是另一个大话题,姑且不谈。

ps:应该彻底从课程和考试中消失的是政治,它不仅没有达到稳定我党统治的目的,反而一早就教会了大家说谎话,建立混乱的逻辑等恶习。

2013年10月2日星期三

什么是政府关门?

美国政府关门,我国官媒很低调的起了下哄,批评了一下“美国的虚伪民主”,毕竟老百姓不太好忽悠了,说多了也没意思。

所谓的政府关门,无非就是小区里的业主委员会分为两拨,产生了分歧,到续合同的时候确定不了,物业的人回家睡觉等消息而已。没什么大不了的,什么时候找到解决方案,什么时候物业的人回来上班,当然了,这要忍受一些不便,比如小区垃圾没人清洁了。

我国的物业公司后台普遍比较硬,要牛气的多,业委会都是在物业公司的英明领导下工作的,自然不会有太大分歧。若真有刺头出现,可以出动后台物理镇压,也可以私下里给点甜头收买;当然,小区里面有时也有一些得罪不起的特别人物,可以在楼顶加盖,物业也奈何他们不得。我国政府就是管理全国的超级物业公司,而且自己还豢养了武装力量,自然是一言九鼎,逆我者亡。什么时候我国的物业公司基本都正常了,政府估计也就正常了。

2013年10月1日星期二

遗产税

据说要收遗产税了,又据说起征点从80万开始,新闻很多,不附链接。

这是我国政府推行政策传统手法,先放风,给个惊天动地的条件来试探一下群众的底线,若尚可控即推行;反之则略作调整再推行,让大家有种还价成功的感觉。过两年正式出台的时候,条件或许是800万开征,老百姓心头一算,似乎不关我啥事,说明我党从谏如流,于是喜而纳之。

当然了,现在互联网发达,民智已开,就算一时把人们忽悠住了,到最后未必也就是我党想要的结果。故而我党现在忙着清理大V,杜绝谣言,以免不好管理。

其实争论遗产税的起征点毫无意义。一方面,我们现在通胀很快,并且面临持续上涨的巨大压力,就算是800万,二十年后很可能也就是一套普通的住房,伪“中产”们人人都躲不过遗产税这一刀;另一方面,起征点和遗产税的覆盖面其实并无关系。很多人以为只要起征点高,普通人就可以躲过这一劫,由巨富们来承担,进而达到“均富”的目的。实际上,不管遗产税怎么征收,都不可能让实际的有钱人来承担。隐形的公务员富豪,我们连他们的财产是多少都搞不清楚,谈何征收;对官员和关系户来说,办理多个身份证都是轻而易举的事情,谈何征税?而明面上的有钱人,有各种手段转移财产。所以,最终征税目标,还是落在那些握着房子的老百姓头上。

其实这些都不重要,再怎么说,遗产税也是我们挂了以后才征收,影响的是我们的子孙。真正可怕的问题在于:政府缺钱了,要扩大税源。

我们政府效率低下,贪污严重,在经济高速增长时这些问题都被掩盖了。而随着经济增速放缓,贪污腐败日益恶化,政府赤字越发严重。不能节流,只好开源,之前卖地卖了二十年,仍然不够,政府必须寻找新的增长点。所以扩大税源、提高收税力度是势在必行之举。遗产税只不过是冰山一角罢了,各种稀奇古怪的税都会冒出来。比如增加消费税(西方国家也有嘛),生育税(开放多胎,但是每多一个就要交税,把原先的社会抚养费变成税收,同时鼓励多生),提高汽油税(可以说是保护环境),提高电价,水价,凡是等等,不一而足。

古往今来、世界各国政府均是如此,要削减赤字,只有开源节流,开源无非就是提高税收。这点倒是不必则对我党多加苛责。只是若不能节流(中国历届政府都无法解决贪腐问题,因此不具备节流能力,最后一一倒台),开源迟早会压垮整个社会经济体系。

政府最后一招是征收通胀税,这个征收成本低,过程隐蔽。政府倒台前一般都要收这个税。

ps:若真是开征遗产税,对赠与也严格控制,会不会发生“先离婚,然后公公和儿媳结婚,婆婆和女婿结婚,再离婚,再复婚”,这种奇葩的财产转移方法?所谓淮北为枳,大概就是这个道理了。