Archive

Archive for the ‘未分类’ Category

Inside AMD 7900 ‘Leo’ demo: A bit more about their tile based forward lighting

2012年02月6日 Leave a comment

After some unzipping of their demo, and debugging with GPUPerfStudio, I found that my previous understanding of their method is quite close to the truth :). But their implementation, in terms of light culling, looks much more efficient (<0.1 ms in the demo). and here is the key difference. Note that the demo team did a lot of experimental branch code path, but many of them are not used at last. So I’m going to talk only about what is actually running in the final demo.

  • There are actually two Compute Shaders invoked across the frame. One for computing frustum for each tile, the other for culling. While in Intel’s demo they do Z reduction, frustum computing, and lighting in one shader.
  • Difference with thread dispatching:
    – 32 * 32 pixels for each tile, (vs 16 * 16);
    – 64 thread groups for each tile, (vs 16 * 16);
    – Dispatched groups is in 1D ( TileCount, 1, 1), (vs 2D ( TileCol, TileRow, 1 ))
  • They are using a 1D buffer for storing light indices.
  • They used two buffer for light properties, one for position and range, one for color. So there are less data to bind when doing culling pass.
  • They are not culling with Z-reduction. (There is actually a Z-pre pass ran for the demo, and they have a branch to do the Z reduction, but it is not used, at least for this release. Maybe they are going to provide some options to tweak it on off in the next releases.).

I tried with these hints in my test program and the result is obviously improved. I still kept depth reduction in the culling shader. Since now there are 64 threads for 32 * 32 pixels, I can calculate a minZ/maxZ for the 16 pixels within a thread, then do the interlocked min/max operation to write to group shared memory. I assume this is helpful for performance. The same could apply when writing light indices to group shared memory.

Here is a scene with 1024 big lights, and fairly depth complexity, run at around 200 fps, and light culling consumed 0.9ms according to GPUPerfStudio:

Thanks to the Rock model exported from UDK used in the test, copyright belongs to original author. And thanks to AMD’s demo team with this great implementation. As metioned in the last post, I believe the true power of this way is the  ability to use much more complicated shading models, and hope this could be “the way DX11’s meant to be played”…

Advertisements

Compile Error C3918 , for event in Cli/C++

2010年10月13日 Leave a comment

In C#, we can check if an event variable is null before firing the event. For example:

public class MyClass
{
  public event EventHandler MyEvent;
  public void FireEvent()
  {
    // Check if there is any event handler registered.
    if (MyEvent != null) { MyEvent(this, new EventArgs()); }
  }
}

But if we do the same thing in C++/CLI, we will get an compile error C3918.

ref class MyClass
{
public:
  event EventHandler^ MyEvent;
  void FireEvent()
  {
    if(MyEvent != nullptr) // C3918
    {
      MyEvent(this, gcnew EventArgs());
    }
  }
};

Here is the solution:

public ref class MyClass
{
  EventHandler^ m_myEvent;
public:
  event EventHandler^ MyEvent
  {
    void add(EventHandler^ handler) { m_myEvent += handler; }
    void remove(EventHandler^ handler) { m_myEvent -= handler; }
    void raise(Object^ sender, EventArgs^ e)
    {
      // Check if there is any event handler registered.
      if (m_myEvent != nullptr)
      {
        m_myEvent->Invoke(sender, e);
      }
    }
  }
};

Categories: 未分类

Let’s get rid of DirectInput

2010年04月22日 Leave a comment
http://msdn.microsoft.com/en-us/library/ee418864.aspx

"DirectInput is a set of API calls that abstracts input devices on the
system. Internally, DirectInput creates a second thread to read
WM_INPUT data, and using the DirectInput APIs will add more overhead
than simply reading WM_INPUT directly. DirectInput is only useful for
reading data from DirectInput joysticks; however, if you only need to
support the Xbox 360 controller for Windows, then use XInput
instead. Overall, using DirectInput offers no advantages when reading
data from mouse or keyboard devices, and the use of DirectInput in these
scenarios is discouraged."

I’m currently working on a wrapper class for keyboard and mouse inputs using this WM_INPUT and raw-input data. It will be here soon.

Categories: 未分类

Extensions to Luna to support userdata as return values from a lua-c call

2010年04月21日 Leave a comment
As a helper to Lua-C interops, Luna is pretty small and elegant without fucking usage of boost or python.
But there seems to be no support for userdata ( such as a C class pointer, witch will be used in lua ) as return values from a c function. So we made a bit extension.

With a public member function "push_userdata":

    static void push_userdata(lua_State *L, T* pT) {
        userdataType *ud =
            static_cast<userdataType*>(lua_newuserdata(L, sizeof(userdataType)));
        ud->pT = pT;
        luaL_getmetatable(L, T::className);
        lua_setmetatable(L, -2);
    }

and a macro

#define PUSH_USERDATA(ClassName, LuaState, UserDataPtr) Luna<ClassName>::push_userdata(LuaState, UserDataPtr);
#define DECL_SCRIPT_METHOD(FunctionName) int FunctionName(lua_State* L)
#define IMPL_SCRIPT_METHOD(ClassName, FunctionName) int ClassName::FunctionName(lua_State* L)

So we can use that:

//in .h
class B;
class A {
    B* m_pB;
public:
    B* GetB() { return m_pB; }

    DECL_SCRIPT_METHOD( GetB );
};

//in .cpp

IMPL_SCRIPT_METHOD(A, GetB)
{
    PUSH_USERDATA(A, L, this->GetB())
    return 1;
}

It seems working correctly. A new user data is created once the method is called from lua.
I’m doubtting if there are safety or efficiency problems with this implementation. Farther tests are taking on and hope your advise 🙂

Categories: 未分类

王文琴:未曾命名的湖和未曾面对的历史

2010年03月10日 Leave a comment
来源:二闲集
信息:曾在人人网校内被删除,在天涯Qzone等地未通过敏感词过滤

迟疑很久,我才开始写这篇文章。我被一个问题萦绕:我为学校作了什么?

一九八一年春天,我是北大本科生的时候,发表过一篇题为《未名湖,你听我说》的短文,写到了湖畔风光和刚刚过去的文革祸难,也写了自己得到某种选择的 自由时产生的惶惑、思考和自勉。这篇文章曾做成配乐朗诵在电台广播,也被选入现代散文选集。我曾收到不少读者来信。他们诚挚坦率的言辞给了我温暖的鼓励。
这次前辈校友邀请撰写未名湖,我担心会重复旧话而不能动笔,直到我写完了《六十三名受难者和北京大学文革》。多年以来,我访问了上千的文革经历者,也 收集当时的文字资料。在前年完成的五十万字的《文革受难者》一书中,所记六百五十九名受难者出自全国各地,按照姓名拼音次序排列,而这一篇集中于北大一个 学校。
我未曾亲眼看见过北大文革。然而我在文革后考入北大,所以熟悉受难者死亡的地点——大多数受难者都是被害死在北大校园中的,也就是说,屠戮场所,就在未名湖周围。当我在电脑键盘上打出一个一个方块字的时候,文字所指代的死亡地点会具体形象地浮现在眼前。
一九六八年,俄语系讲师龚维泰被关在第一教室楼。他睡在地板上,看守他的人睡在床上。十一月七日,他在系中遭到“斗争”,除了“坐喷气式飞机”即弯腰 低头双臂被反拧在后形如飞机之外,拧他手臂的学生还用脚往下踹他的肩膀。那天夜间,龚维泰用刮脸刀割动脉自杀。第二天早上看守呵叱他为什么不起床,掀开被 子看到血流了一地。他的一个同事那天从门外经过,看到地面湿湿的,刚刚用拖把擦过,后来才知道用水擦去的是龚维泰的血。
我是北大学生的时候,常常在简称“一教”的这个楼里上课。坐在靠窗的座位时,看到窗外成群的燕子欢快地盘旋,我还为此写过一篇散文题为“啁啾”。但是我丝毫不知道脚下的地板上,曾经流淌过人血。看不到有关文字记载。文革刚刚过去三四年,留下的已经是水洗般的遗忘。
进北大西门往北,在校园的西北角上有一个幽静的小湖。这小湖是北大湖群中的一个,却没有名字,似乎是真正的“未名”之湖。地处“海淀”(此“海”并非 今日所说的“大海”之海),北大校园有若干小湖,未名湖是其中大者。那小湖岸边有一棵大树,树上有一根横枝伸向湖面。经济系学生杨明爱被指控为“反动学 生”并停发生活费。一九六六年九月,当红卫兵们得到免费车票和食宿兴高采烈到全国各地“革命大串连”的时候,杨明爱在那根横枝上吊死了自己。那小湖、大树 以及那横枝至今依然还在,杨明爱的名字则没有人知道了。 
陈彦荣是中国科学院气体厂工人,三十七岁,家住北大旁边的蓝旗营一O九号。一九六六年八月二十七日傍晚,北京大学附属中学红卫兵抄了他的家,并把他和 妻子刘万才一起抓到北京大学附属中学校内。他们用铜头皮带、木棒和铁条毒打陈彦荣刘万才夫妇。下半夜一点,陈彦荣被打死,刘万才也被打得遍体鳞伤。和陈彦 荣一起被打死的,还有一名至今不知姓名的老年女人。文革后“平反”,标准做法是付给家人二百四十元。陈彦荣有六个未成年的孩子,因此北大给了他家二千五百 元。他的妻子拿到钱的时候说:“我一辈子从来没见过这么多钱呀。”然后她大哭说:“我要钱干什么?我要人呐。”
人在哪里?他们原本是在未名湖边走着、跑着、工作着的活生生的人。在湖边,他们遭到了“斗争”,毒打,监禁,各种侮辱,还有心理摧残和折磨。六十三个人被害死了,占当时北大总人口的百分之零点五。如今未名湖水依旧,但是永远不会再现曾经投影其中的受难者的身影。
一九九八年为百年校庆编写了两卷本北大历史。我注意到,书中只印出了文革中被迫害致死的正教授的名字,连副教授都不记,更不要说年轻教员和普通职员、 炊事员了。(北京农业大学校史印出了包括助教学生在内的三十名文革受难者的名字。不过,清华大学篇幅更长的校史连正教授的名字都没有写。)我为此问起北大 出版社的编辑。编辑苦笑着说,就这样,还有人到办公室来纠缠,要把现有校史的文革部分删除。
对比于这种嚣张,是受害者们的沉默。
一九九九年,一位同届北大同学告诉我,历史系俞伟超老师在大教室讲授“秦汉考古”,听课的学生很多,也都看到他缺失手指,听说是在文革中遭到“批斗” (需要一本文革“词典”来解释这种词语,不过本书读者多半还都知其意)后自杀未死留下的残疾。他那时任中国历史博物馆馆长,我立刻就往博物馆给他写了信, 希望了解他的文革遭遇。
我从未收到他的回信,也没有收到被邮局退回的信。
北大历史系在文革中有五个人“自杀”身亡。我用了引号,因为不认为这是通常所说的“自杀”,而是被文革谋杀的。俞伟超老师在一九六六年文革开始的时候 两次自杀。第一次触高压电,双手食指被烧毁。第二次卧轨,火车头把他铲出了轨道。他活了下来,文革后成为中国历史的最高行政长官之一。我当然不会给他讲历 史写作重要性的大道理,也不会跟他说如果北大历史系的文革历史都不写出,遑论别处。他的失去的手指显然也每一天都提醒着他的文革经历。但是,连他也对文革 历史讳莫如深。这是因为什么?我确实很想向他询问,而不是自己来猜测。可是我一直没有能找到他的电话号码,也不可能再找到——他已经在去年离世。
北大之湖,名为未名。湖名的字面意思是从未命名,但是这“未名”就成为湖的名字。从起名字的角度来说,这未尝不是一个别致的方式。但是北大的未被面对的近期历史,却不能用这种方式对待,不能总是未被面对下去。
一本世界历史书谈到亚洲文明古国时说,印度是一个宗教的国度,中国是一个历史的国度。这种说法大概过于简略。不过,中国古代文明确实留下了很多历史 书。实际上,在中国的传统中,除了记录发生过的事情,历史写作也承担了其他文明中可能并非由其承担的任务,其中最突出的一个方面是阐明道德原则和是非基 准。正因为此,历史写作也更加具有正面的建设性的意义。我以为文革历史的写作,对当代人尤其可能具有这方面的意义。这项工作是为了面对历史、记录真相,也 是为了社会的道德自救。
一九九O年代,在北大西门内,盖起了漂亮的赛克勒考古博物馆。我在那里看到远古时代的石器,在玻璃背后,在柔和的灯光下,熠熠生辉。可是我也知道,一 九六八年五月十六日,就在这块宅基地上,在互为直角的“民主楼”和“外文楼”对面,又加筑了两面围墙,围成了“监改大院”,关押了北大二百多名“牛鬼蛇 神”。因为被关者不被认为是人,这种校园监狱被俗称为“牛棚”,全国每个单位都建立了。这座大“牛棚”存在了十个月,里面有监规,还有各种刑罚。英语教授 徐锡良,是在美国出生长大的华侨,普通话说得不太流利,有一天没有能背诵出毛泽东语录,被罚跪的时候,头上还顶了一块板,板上放了一碗水,水翻出来就遭 打。西语系另一教授朱光潜有一天正在“劳改”,一个看守人员叫他过去,扔给他一条绳子,说:“老家伙你活得腻不腻?上吊吧。要不,用剪子刀子也行。”文革 中西语系也有五个人被迫害致死。
石器时代的文物当然应该珍藏,但是文革历史如“牛棚”也应该被记载,文革受难者的名单也应该被永久保存在博物馆里面让人看到。在这个科学技术前所未有 地高度发达的时代,人的生命和尊严,也应该得到有史以来最高的地位。今天,被希特勒杀害的三百万的人的名单已经放在庄严的大博物馆里和电脑网上的资料库 里,被斯大林杀害的一百三十四万个名字已经被刻写在电脑光盘上和大量分散各处的小型纪念碑上。我想,有尊严的北大人不会同意,北大受难者的名字是低人一等 不需纪念的,是可以被水洗般地遗忘的。
五年以前,我在网络空间中建立了一座文革受难者纪念园,宗旨是记录每一个受难者的名字。这是一项志愿工作。我想借此文集发行,邀请校友们参与这项工作。我的电邮地址是:ywang7@uchicago.edu。谢谢你们。

王文琴
二OO五年七月
Categories: 未分类

Twitter works on technology to evade censors

2010年01月28日 Leave a comment
Categories: 未分类

keso’s view: 三网融合:不要成为倒退

2010年01月24日 Leave a comment

2010-01-16

三网融合:不要成为倒退

三网融合,几乎注定要成为一次巨大的倒退,宣传系统取得互联网主导权,电信系统彻底沦为“管道”。从去年下半年以来的发展看,宣
传系统利用手里的宣传工具,进行赤裸裸的舆论审判、舆论镇压,拼命打击电信系统,以至于今天的工信部,看上去像一个丫鬟一样,低眉顺眼,唯唯诺诺。在对三
网融合一片叫好声中,感谢《中国企业家》发出不同声音。

三网融合:不要成为倒退:
谁将拥有这此的主导权呢?根据会议结果来看,主要变化在于,符合条件的广电企业可以经营增值电信业务、基础电信业务和互联网业
务;符合条件的电信企业可以从事部分广播电视节目的生产制作和传输。按照这个标准,电信能够开展的业务仅为IPTV,而广电无疑扩展空间更大。而且,据相
关人士透露,在决议草稿征求意见时,广电方面保持了强势。

http://www.cnemag.com.cn/fenxplun/newsfx/2010-01-15/184918.shtml

Categories: 未分类