C++ Coder

HCP高性能计算架构,实现,编译器指令优化,算法优化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首页 新随笔 联系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

2013年4月24日 #

http://bbs.hiapk.com/thread-7959-1-1.html
http://mobile.51cto.com/android-220033_1.htm

在一个Android应用中,主要是由四种组件组成的,这四种组件可参考“Android应用的构成”。
而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。

在这些组件之间的通讯中,主要是由Intent协助完成的。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)
为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),
将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。

一、抽象描述要描述什么

在Android参考文档中,对Intent的定义是执行某操作的一个抽象描述(确实很抽象)。我们先来看看这里的抽象描述,到底描述了什么。
首先,是要执行的动作(action)的一个简要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android为我们定义了一套标准动作:

MAIN_ACTION
VIEW_ACTION
EDIT_ACTION
PICK_ACTION
GET_CONTENT_ACTION
DIAL_ACTION
CALL_ACTION
SENDTO_ACTION
ANSWER_ACTION
INSERT_ACTION
DELETE_ACTION
RUN_ACTION
LOGIN_ACTION
CLEAR_CREDENTIALS_ACTION
SYNC_ACTION
PICK_ACTIVITY_ACTION
WEB_SEARCH_ACTION
此外,我们还可以根据应用的需要,定义我们自己的动作,并可定义相应的Activity来处理我们的自定义动作。

其次,是执行动作要操作的数据(data),Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。
这种URI表示,通过 ContentURI这个类来描述,具体可以参考android.net.ContentURI类的文档。

以联系人应用为例,以下是一些action / data对,及其它们要表达的意图:
VIEW_ACTION content://contacts/1-- 显示标识符为"1"的联系人的详细信息
EDIT_ACTION content://contacts/1-- 编辑标识符为"1"的联系人的详细信息
VIEW_ACTION content://contacts/-- 显示所有联系人的列表
PICK_ACTION content://contacts/-- 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父activity。例如:电子邮件客户端可以使用这个Intent,要求用户在联系人列表中选择一个联系人

另外,除了action和data这两个重要属性外,还有一些附加属性: 
category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。
type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

总之,action、 data/type、category和extras 一起形成了一种语言。
这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。
随着应用不断的加入到系统中,它们可以添加新的action、 data/type、category来扩展这种语言。
应用也可以提供自己的Activity来处理已经存在的这样的“短语”,从而改变这些“短语”的行为。

二、Android如何解析Intent

在应用中,我们可以以两种形式来使用Intent:
直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

三、应用例子

以下,以Android SDK中的便笺例子来说明,Intent如何定义及如何被解析。这个应用可以让用户浏览便笺列表、查看每一个便笺的详细信息。 


  • <manifest
  • xmlns:android="http://schemas.android.com/apk/res/android"
  • package="com.google.android.notepad">
  • <application
  • android:icon="@drawable/app_notes"
  • android:label="@string/app_name">
  • <provider
  • class="NotePadProvider"
  • android:authorities="com.google.provider.NotePad"
  • />
  • <activity
  • class=".NotesList"
  • android:label="@string/title_notes_list">
  •      <intent-filter>
  •        <action android:value="android.intent.action.MAIN"/>
  •        <category android:value="android.intent.category.LAUNCHER"/>
  •       </intent-filter>
  •      <intent-filter>
  •        <action android:value="android.intent.action.VIEW"/>
  •        <action android:value="android.intent.action.EDIT"/>
  •        <action android:value="android.intent.action.PICK"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <type android:value="vnd.android.cursor.dir/vnd.google.note"/>
  •       </intent-filter>
  •      <intent-filter>
  •        <action android:value="android.intent.action.GET_CONTENT"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <type android:value="vnd.android.cursor.item/vnd.google.note"/>
  •       </intent-filter>
  •     </activity>
  •   <activity class=".NoteEditor" android:label="@string/title_note">
  •      <intent-filter android:label="@string/resolve_edit">
  •        <action android:value="android.intent.action.VIEW"/>
  •        <action android:value="android.intent.action.EDIT"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <type android:value="vnd.android.cursor.item/vnd.google.note"/>
  •       </intent-filter>
  •      <intent-filter>
  •        <action android:value="android.intent.action.INSERT"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <type android:value="vnd.android.cursor.dir/vnd.google.note"/>
  •       </intent-filter>
  •     </activity>
  •   <activity class=".TitleEditor" android:label="@string/title_edit_title" android:theme="@android:style/Theme.Dialog">
  •      <intent-filter android:label="@string/resolve_title">
  •        <action android:value="com.google.android.notepad.action.EDIT_TITLE"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <category android:value="android.intent.category.ALTERNATIVE"/>
  •        <category android:value="android.intent.category.SELECTED_ALTERNATIVE"/>
  •        <type android:value="vnd.android.cursor.item/vnd.google.note"/>
  •       </intent-filter>
  •     </activity>
  • </application>
  • </manifest>

复制代码
例子中的第一个Activity是com.google.android.notepad.NotesList,它是应用的主入口,提供了三个功能,分别由三个 intent-filter进行描述:

1、第一个是进入便笺应用的顶级入口(action为android.app.action.MAIN)。类型为android.app.category.LAUNCHER表明这个Activity将在Launcher中列出。
2、第二个是,当type为vnd.android.cursor.dir/vnd.google.note(保存便笺记录的目录)时,可以查看可用的便笺(action为android.app.action.VIEW),或者让用户选择一个便笺并返回给调用者(action为 android.app.action.PICK)。
3、第三个是,当type为vnd.android.cursor.item/vnd.google.note时,返回给调用者一个用户选择的便笺(action为android.app.action.GET_CONTENT),而用户却不需要知道便笺从哪里读取的。有了这些功能,下面的 Intent就会被解析到NotesList这个activity:

{ action=android.app.action.MAIN }:与此Intent匹配的Activity,将会被当作进入应用的顶级入口。
{ action=android.app.action.MAIN, category=android.app.category.LAUNCHER }:这是目前Launcher实际使用的 Intent,用于生成Launcher的顶级列表。
{ action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes }:
显示"content://com.google.provider.NotePad/notes"下的所有便笺的列表,使用者可以遍历列表,并且察看某便笺的详细信息。
{ action=android.app.action.PICK data=content://com.google.provider.NotePad/notes }:
显示"content://com.google.provider.NotePad/notes"下的便笺列表,让用户可以在列表中选择一个,然后将选择的便笺的 URL返回给调用者。
{ action=android.app.action.GET_CONTENT type=vnd.android.cursor.item/vnd.google.note }:和上面的action为pick的Intent类似,不同的是这个Intent允许调用者(在这里指要调用NotesList的某个 Activity)指定它们需要返回的数据类型,系统会根据这个数据类型查找合适的 Activity(在这里系统会找到NotesList这个Activity),供用户选择便笺。
第二个Activity是com.google.android.notepad.NoteEditor,它为用户显示一条便笺,并且允许 用户修改这个便笺。
它定义了两个intent-filter,所以具有两个功能。

第一个功能是,当数据类型为 vnd.android.cursor.item/vnd.google.note时,允许用户查看和修改一个便签(action为 android.app.action.VIEW和android.app.action.EDIT)。
第二个功能是,当数据类型为 vnd.android.cursor.dir/vnd.google.note,为调用者显示一个新建便笺的界面,并将新建的便笺插入到便笺列表中(action为android.app.action.INSERT)。
      有了这两个功能,下面的Intent就会被解析到NoteEditor这个activity:

{ action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes/{ID}} :向用户显示标识为 ID的便笺。

{ action=android.app.action.EDIT data=content://com.google.provider.NotePad/notes/{ID}}:允许用户编辑标识为ID的便笺。

{ action=android.app.action.INSERT data=content://com.google.provider.NotePad/notes }:在“content://com.google.provider.NotePad/notes”这个便笺列表中创建一个新的空便笺,并允许用户编辑这个便签。当用户保存这个便笺后,这个新便笺的URI将会返回给调用者。
最后一个Activity是com.google.android.notepad.TitleEditor,它允许用户编辑便笺的标题。

它可以被实现为一个应用可以直接调用(在Intent中明确设置component属性)的类,不过这里我们将为你提供一个在现有的数据上发布可选操作的方法。

在这个 Activity的唯一的intent-filter中,拥有一个私有的action: com.google.android.notepad.action.EDIT_TITLE,表明允许用户编辑便笺的标题。

和前面的view和edit 动作一样,调用这个Intent 的时候,也必须指定具体的便笺(type为vnd.android.cursor.item/vnd.google.note)。不同的是,这里显示和编辑的只是便笺数据中的标题。

      除了支持缺省类别(android.intent.category.DEFAULT),标题编辑器还支持另外两个标准类别: android.intent.category.ALTERNATIVE和
android.intent.category.SELECTED_ALTERNATIVE。

实现了这两个类别之后,其它 Activity就可以调用queryIntentActivityOptions(ComponentName, Intent[], Intent, int)查询这个Activity提供的action,而不需要了解它的具体实现;

或者调用addIntentOptions(int, int, ComponentName, Intent[], Intent, int, Menu.Item[])建立动态菜单。需要说明的是,在这个intent-filter中有一个明确的名称(通过android:label= "@string/resolve_title"指定),在用户浏览数据的时候,如果这个Activity是数据的一个可选操作,指定明确的名称可以为用户提供一个更好控制界面。

有了这个功能,下面的Intent就会被解析到TitleEditor这个Activity:

{ action=com.google.android.notepad.action.EDIT_TITLE data=content://com.google.provider.NotePad/notes/{ID}}:显示并且允许用户编辑标识为ID的便笺的标题。
posted @ 2013-04-24 14:19 jackdong 阅读(456) | 评论 (0)编辑 收藏

     摘要: http://www.cnblogs.com/keyindex/articles/1822463.htmlandroid的Handler前言  学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用。从一些开源应用中吸收点东西,一边进行量的积累,一边探索android的学习研究方向。这里我首先选择了jwood的 Stan...  阅读全文
posted @ 2013-04-24 10:55 jackdong 阅读(675) | 评论 (0)编辑 收藏

http://www.pin5i.com/showtopic-android-handler.html

一、Handler的定义:

          主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

          解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,    或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了.,来解决这个复杂的问题 ,    由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

二、Handler一些特点

        handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
        它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
      
        Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long)

        以上post类方法允许你排列一个Runnable对象到主线程队列中,
        sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

三、Handler实例

      (1) 子类需要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据

      以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容
  1. public class MyHandlerActivity extends Activity {
  2.     Button button;
  3.     MyHandler myHandler;

  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(R.layout.handlertest);

  7.         button = (Button) findViewById(R.id.button);
  8.         myHandler = new MyHandler();
  9.         // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
  10.         // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
  11.         // (2): 让一个动作,在不同的线程中执行.

  12.         // 它安排消息,用以下方法
  13.         // post(Runnable)
  14.         // postAtTime(Runnable,long)
  15.         // postDelayed(Runnable,long)
  16.         // sendEmptyMessage(int)
  17.         // sendMessage(Message);
  18.         // sendMessageAtTime(Message,long)
  19.         // sendMessageDelayed(Message,long)
  20.       
  21.         // 以上方法以 post开头的允许你处理Runnable对象
  22.         //sendMessage()允许你处理Message对象(Message里可以包含数据,)

  23.         MyThread m = new MyThread();
  24.         new Thread(m).start();
  25.     }

  26.     /**
  27.     * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
  28.     * */

  29.     class MyHandler extends Handler {
  30.         public MyHandler() {
  31.         }

  32.         public MyHandler(Looper L) {
  33.             super(L);
  34.         }

  35.         // 子类必须重写此方法,接受数据
  36.         @Override
  37.         public void handleMessage(Message msg) {
  38.             // TODO Auto-generated method stub
  39.             Log.d("MyHandler", "handleMessage......");
  40.             super.handleMessage(msg);
  41.             // 此处可以更新UI
  42.             Bundle b = msg.getData();
  43.             String color = b.getString("color");
  44.             MyHandlerActivity.this.button.append(color);

  45.         }
  46.     }

  47.     class MyThread implements Runnable {
  48.         public void run() {

  49.             try {
  50.                 Thread.sleep(10000);
  51.             } catch (InterruptedException e) {
  52.                 // TODO Auto-generated catch block
  53.                 e.printStackTrace();
  54.             }

  55.             Log.d("thread.......", "mThread........");
  56.             Message msg = new Message();
  57.             Bundle b = new Bundle();// 存放数据
  58.             b.putString("color", "我的");
  59.             msg.setData(b);

  60.             MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI

  61.         }
  62.     }

  63. }
复制代码
posted @ 2013-04-24 10:35 jackdong 阅读(366) | 评论 (0)编辑 收藏

2013年3月8日 #

http://maxianhui120.blog.163.com/blog/static/2700629720101130111041369/

嵌入式linux入门学习规划  

嵌入式Linux操作系统及其上应用软件开发目标: 
(1) 掌握主流嵌入式微处理器的结构与原理(初步定为 arm9)                                                                                                                    
(2) 必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定) 
(3) 必须熟悉嵌入式软件开发 流程并至少做一个嵌入式软件项目。 
从事嵌入式软件开发的好处是: 
(1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非 专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。 
(2)与企业计算等应用软件不同,嵌入式领 域人才的工作强度通常低一些(但收入不低)。 
(3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公 司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。 
(4)兴趣所在,这是最主要的。 
从事嵌入 式软件开发的缺点是: 
(1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此 行。 
(2)这方面的企业数量要远少于企业计算类企业。 
(3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多 数公司也并无此要求,只要有经验即可。 
(4)平台依托强,换平台比较辛苦。 
兴趣的由来: 
1、成功观念不同,不虚度此生,就 是我的成功。 
2、喜欢思考,挑战逻辑思维。 
3、喜欢C 
C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成 短句如下: 
相信程序员。 
不要阻止程序员做那些需要去做的。 
保持语言短小精干。 
一种方法做一个操作。 
使 得它运行的够快,尽管它并不能保证将是可移植的。 
4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。 
5、发展前景好,适合 创业,不想自己要死了的时候还是一个工程师。 
方法步骤: 
1、基础知识: 
目的:能看懂硬件工作原理,但重点在嵌入式软件,特 别是操作系统级软件,那将是我的优势。 
科目:数字电路、计算机组成原理、嵌入式微处理器结构。 
汇编语言、C/C++、编译原理、离散 数学。 
数据结构和算法、操作系统、软件工程、网络、数据库。 
方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可 根据需要选修。 
主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。 

2、 学习linux: 
目的:深入掌握linux系统。 
   方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析 linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。 
主 攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。 
3、学习嵌入式linux: 
目 的:掌握嵌入式处理器其及系统。 
方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。 
   (2)嵌 入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。 
   (3)必须有块开发板(arm9以上),有条件可参 加培训(进步快,能认识些朋友)。 
   主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。 

4、深入 学习: 
   A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。 
   B、通信协议及编程技术:TCP/IP 协议、802.11,Bluetooth,GPRS、GSM、CDMA等。 
   C、网络与信息安全技术:如加密技术,数字证书CA等。 
    D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。 
    说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一 种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。 
   注意: 要学会 举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。 
    不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻电影。还有一些不 愿意做但必须要做的! 
   技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编 程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。 

   嵌入式 书籍推荐 
   Linux基础 
   1、《Linux与Unix Shell 编程指南》 
   C语言基础 
    1、《C Primer Plus,5th Edition》【美】Stephen Prata着 
   2、 《The C Programming Language, 2nd Edition》【美】 Brian W. Kernighan David M. Rithie(K & R)着 
   3、 《Advanced Programming in the UNIX Environment,2nd Edition》(APUE) 
    4、《嵌入式Linux应用程序开发详解》 
   Linux内核 
   1、《深入理解Linux内核》(第三版) 
    2、《Linux内核源代码情景分析》毛德操 胡希明著 
   研发方向 
   1、 《UNIX Network Programming》(UNP) 
   2、《TCP/IP详解》 
   3、《Linux内核编 程》 
   4、《Linux设备驱动开发》(LDD)  
   5、《Linux高级程序设计》 杨宗德著
   硬件基础 
    1、《ARM体系结构与编程》杜春雷着 
   2、S3C2410 Datasheet 
   英语基础 
   1、《计算 机与通信专业英语》 
   系统教程 
   1、《嵌入式系统――体系结构、编程与设计》 
   2、《嵌入式系统――采用公开 源代码和StrongARM/Xscale处理器》毛德操 胡希明着 
   3、 《Building Embedded Linux Systems》   
   4、《嵌入式ARM系统原理与实例开发》 杨宗德著
    理论基础 
   1、《算法导论》 
   2、《数据结构(C语言版)》 
   3、《计算机组织与体系结构?性能分析》 
    4、《深入理解计算机系统》【美】Randal E. Bryant David O''Hallaron着 
   5、《操作系统:精髓与 设计原理》 
   6、《编译原理》 
   7、《数据通信与计算机网络》 
   8、《数据压缩原理与应用》 

    C语言书籍推荐 
   1. The C programming language 《C程序设计语言》 
    2. Pointers on C 《C和指针》 
   3. C traps and pitfalls 《C陷阱与缺陷》 
尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要。

posted @ 2013-03-08 16:12 jackdong 阅读(520) | 评论 (0)编辑 收藏

2013年2月19日 #

http://www.csdn.net/article/2013-02-17/2814154-AMD_creat_HSA

摘要:在PC产业日渐颓势和移动行业方兴未艾的大环境下,AMD作为PC CPU芯片行业的两个供应商之一,如何在上下夹击的态势下突出重围,大家一直拭目以待。经过近两年的调整,AMD并非没有出路,他们已经为自己规划了三个快速发展的机遇:双核、异构、低功耗。而开放和开源的思维贯穿始终。

开放才是未来

早在2012年,AMD就高调宣布要设计基于64-bit ARM架构的处理器,而为了在2014年处理器问世前打造一条完整的软硬件生态链,AMD更是同ARM一起成立了HSA基金会(异构系统架构基金会)。HSA基金会倡导的是一种更简单、开放,同时还可以涵盖PC与移动设备(不光是跨 OS)的标准。目的在于通过基于GPU的并行运算来提升处理器的表现。比如图像处理器将不仅仅用于图像、游戏等方面,普通的任务和应用也可以用到它。


图:HSA帮助从服务器端到移动端提升效率、降低功耗

“虽然用OpenCL这个工业标准已经能达到这种效果,但这样的做法仍旧太复杂,而且主流的开发者也不容易接受。NVIDIA虽然大力推进自己的CUDA运算架构,不过CUDA和OpenCL是同一层面的技术,而基于私有架构的开发栈终将没落。”

AMD中国开发合作与解决方案中心总监楚含进坦言,目前AMD所有做的事情都是为将来某一段时间产品集中爆发做技术上系统储备。在HSA基金会中,其中的厂商从服务器到PC到手机厂商都会有,AMD将帮助各个伙伴更好的去驱动软件生态系统,促使软件里面的工具、软件里面的库、软件里面的开发环境让更多的人更容易的去使用。

“其次,我们将一直致力于降低功耗,这两年我们会把生态链去闭环运营。在中国来说,我们有一个开发团队会帮助国内的开发人员能够学会如何在GPU上进行编程;而在技术层面上,我们更希望能够向着平板电脑这个方向进行过度。 最终目的是在低功耗上推出AMD的一系列产品,x86和ARM双核并行战略。”

而从市场的直接反馈结果来看,AMD拥抱开放技术的策略也受到了开发者的一致欢迎。

作为软件开发人员尤其是学生开发人群,是AMD首先取悦的人群,在前不久举行的异构编程大赛上,AMD收到了40多个作品,从开发者的关注点来看,他们也正向着云计算、多媒体、移动互联网应用这些深层次的产品优化的方向,同目前的行业热点是有很好的契合点的。并且在相当多的参赛作品中,无论是学生本人,还是在导师的带领下,这些行业还是都比较容易产生有创意或者是有深度有质量的软件实现的算法或者产品的核心技术,而这些注定是未来软件公司差异化的核心。

从作品的类型来看,有数据搜索和数据的作品,也有算法优化方面的内容。而在多媒体、图形图像方面,比如损失图像的修复、二维图像的三维化、图像的拼接以及细化和分割,这些(技术)在很多领域无论是移动还是多媒体领域有着深远的意义。

对于此次大赛的结果,楚含进表示,“大赛只是AMD对异构编程技术的一个普及推广形式。根据以往的大赛经验,在作品的推广中,学生是不利的。一般参赛的大部人是年轻人,年轻人有干劲,但是他们有时只见树木不见森林。如果把大赛中学生的每一件作品拿出来,稍加深化补充,都可以成为一个很好的分子。但是把分子作为一个产品还要花一段时间的。所以AMD一直在思考能不能把学生做的引擎收集起来,不论是计划上的还是部分实现上的,让他们能够沿着这个方向更好的研究下去,产生一些有影响力的,不论是论文还是实际案例,抑或在他们自己的产品中能够把它延伸到自己研究的领域。”

“因此,从AMD帮助学生开发技术提高来看,会做三件事,第一是与CSDN一起来探讨利用学生的自身优势和他们本身已经完成的工作,继续能够指导他们做一些成果出来。我们不是只针对TOP10,甚至是TOP20。第二种是扶植学生能够真正的发布自己的作品,以及针对于当前工作真正有用的。我们给予他们业务层面的指导。还有一种想法是把他们的某一些业务成果提交给我们的客户,这样能把他们转化为真正的生产力。第三点是我们希望能够与CSDN形成一个比较切实的基于GPU的异构开发人群,然后把一些作品放在开源的社区来进行一些补充。这个项目本身不会成为一个独立运行的具有某种功能的产品模块,但是我们希望过开源社区的力量,把这些产品形成一种相对来说比较独立通用的一个库,并提供相应的访问接口。这样,越来越多的人就会去很容易的使用它,而且这样可以真正的培养开发人员尤其学生的软件产品意识。”

AMD结盟ARM, 横跨x86和ARM架构?

目前的芯片市场,实际上是有两大芯片阵营,ARM与x86两大阵营在博弈。在智能手机出现之前,是通用处理器的天下,这种通用处理器包括ARM、x86。实际上更多领域用的还是通用处理器,通用处理器时代,CPU的设计是个门槛,决定这个公司的成败。但随着智能手机和移动互联的大量实现,决定这个公司的未来是是否具有设计CPU以及设计多核CPU的能力。

“通用处理器的设计已经不再是门槛了,因为ARM已经把整个CPU体系帮你设计完成了。第二,Intel的x86处理器通用处理器也由于开始受到主机的云应用的影响。用户会问,问什么要用通用处理器来做这种非通用的应用?给我一个理由,这会是一个很大的问题。”从技术层面,这背后其实系统和产品设计日益差异化需求的问题。、

在未来的CPU发展趋势上也许我们可以看到几个趋势:一、像Facebook、Google已经把精力放在整个架构上,希望他们自己的服务器作为行业标准化,个性定制化?开发化,所谓的标准化就是说不需要限定在某种通用处理器,而是需要针对自己应用和系统架构构建专属系统。二、在移动领域,芯片设计的趋势是从通用处理器到SoC,而从SoC又逐渐是往专属领域有独特要求的处理器演变。这种情况下,生产通用处理器的公司会受到非常非常大的挑战,那么将来的局面会是,任何一个行业里面的任何一个公司所生产出来的芯片不会是万能的,应该是在本行业里有独特的特点,符合行业的趋势和需求。比如做手机的核心一定是通信功能,做游戏的核心一定是游戏的引擎,做服务器的核心一定是数据处理能力和带宽和在某个领域具有处理特定需求的能力。

“AMD对于GPU的发展技术上有很独创的见解,在游戏以及图形图像处理上非常的专注,所以这就是AMD能够走SoC和将来走可定制化专用服务器领域的一个信号”,楚含进表示。

可以看到,目前x86上很多的开源项目是集成在服务器领域里面,而传统的ARM则是集中在手机领域。两者本质的区别是x86的开源是集中在通用处理器上,而ARM在完善了基于以linux内核为核心的一套开源系统之后,更多的会布置在专用的领域上,比如基于ARM的多媒体应用、基于ARM的编译器,以及很多开源项目。随着开源的项目越来越多,在这个领域就会形成一定的技术门槛,尤其是软件技术门槛,所以x86面临的问题就是开发者为什么要用通用处理器去做非通用的事情。在这种大的背景下,如果所有的开源都是为通用服务的话,为什么还要用通用的软件去搭建一个需要特定处理能力的平台?所以在目标不一致、指导思想不一致的情况下,研发人员在做开源项目的整个方向就不一样。举个例子,比如开源项目Ubuntu,它在PC上的用户体验与在手机上完全不一样,虽然都是同一套Linux,都是开源搭出来的。它桌面的Xwindow系统都已经不再用在手机上了。如果你把Xwindow强行放在手机上,你所产生的成本,以及所占用的资源都会是很大的。那么在未来,ARM服务器和手机更交融的情况来看,ARM和x86两种开源社区也会出现交融的情况,这种交融会带来更多独创的开源项目。比如在ARM上运行的底层软件,能不能实时的在x86上运行,x86上运行的软件能不能不改动任何代码就放到手机上运行,现在已经有一些好的开源项目在开始做了,比如LLVM项目。

ARM和x86在服务器市场的争夺将愈演愈烈

另一个值得关注的领域在于服务器,标志性的事件是,以Facebook、百度为首的互联网企业已经在服务器端开始大量采用ARM架构作为存储服务器。

对此,楚含进认为,如果把web接入、存储服务器等高并发但轻量级应用作为当前云计算重要的落地形式,则云计算反而是ARM服务器在服务器的主要切入点。而在大数据、科学计算等领域,ARM要走的路很长。毕竟通用处理器在高性能计算,尤其是密集型计算中还是占有得天独厚的优势,包括其软件。但这并不妨碍大家看到,在移动终端硬件竞争和服务器硬件竞争上面,实际上服务器还是属于蓝海。

“百度用ARM不完全是基于价格的考虑,而是基于未来百度把自己的软件按照专属领域的业务特点然后来配备相应的硬件而做的规划,这种规划会使自己从供应链、软件、硬件的生态系统当中变得标准化和开放,同时也会降低整个的成本。毕竟百度是以软件为生存的一个公司,而ARM的服务器也只是有限的部署在在百度的某些服务领域,占很小的一部分。”

那么未来服务器芯片领域的格局是什么呢?以前服务器领域传统的格局只会是HP、DELL、IBM这些公司,而ARM服务器的出现会使得芯片公司有机会在设计服务器,或者说是类服务器的技术门槛降低。因为原来只能在x86服务器上做的东西现在有可能用低成本的ARM服务器来替代。而对于芯片厂商来说,会使许多原来认为“在x86领域做服务器门槛很高”的企业进入这个领域。这也对以前老牌的服务器厂家提出了巨大的挑战,也就是说他如何去面对现在终端和云端这种相互的格局下能够定位自己的产品。第二,在移动端,有着很深厚背景的公司,比如某些移动芯片制造公司,他们进入服务器领域也是有可能的,因为他们本身对ARM的技术并不缺乏,而且对自己所做的业务也很熟悉,软件能力也很成熟,唯一缺乏的是制造服务器芯片的一颗芯。其实,很多公司已经制造出了具有服务器功能的ARM架构芯片,可是我们要看到,这并不代表他们能够制造出真正意义上的基于ARM服务器和打造完整的ARM服务器软件生态系统。

“很多ARM的服务器要考虑的不仅仅是功能上的,还有背板总线、内存技术、主板布置技术、电源布置技术等,这都是做服务器厂家和做移动端厂家不同的地方。现在ARM的服务器刚刚开始,原来的服务器一家独大的场面会逐渐变得市场细分,会使更多的芯片厂商进入服务器领域中来尝试走出自己的红海到另外一个蓝海领域中扩大自己的阵营,AMD是有限的具有制造服务器芯片和打造服务器生态链的基因的公司,这一点是其他厂家无可比拟的,对于AMD 的ARM服务器未来一定会引起产业的格局变化”

从公司的长远技术趋势来看,AMD肯定不会放弃x86的;ARM短期内在科学计算等高性能领域可能不大有很好的作为,因为其指令集架构和应用生态系统不是完全为这方面服务的。那么AMD基于ARM的异构和x86的异构在未来会不会在高性能领域成为主导呢?

楚含进表示,未来基于APU的服务器,不管是ARM异构还是x86异构,一定会为高性能领域带来非常非常重大的影响,会在很多在非结构化数据处理方面能够产生非常深的影响。因为在现在大数据的前提下,一些非结构化数据的处理,有的时候不能完全靠CPU的处理能力,要靠GPU和CPU的协同处理能力才能更好的有效的完成。目前中国有很多客户对异构服务器都非常感兴趣。而其实APU服务器的出现,并不是简单的CPU和GPU的合成,而是整个系统框架的变化,是主板布局的变化,最重要的是业务模型,编程模型的变化,整个业务的部署也会随着在不同级别服务器的部署产生很大的变化。这些都会为业界带来很好的机会。至于下一代高性能计算的趋势,我认为不是简单的CPU的编程或是GPU的编程,而是要看业务,而且业务应该是与云计算绑定在一起的。开发人员与业务人员会去考虑是单纯的利用CPU还是异构服务器。

而在高性能计算领域,GPU现在还是作为CPU的协作处理器存在,通过PCIE传输数据,对异构计算而言,这似乎是一个严重的瓶颈。

楚含进认为,GPU现在有两个问题。第一,硬件瓶颈问题,就是GPU与CPU之间的通讯和数据搬迁造成成性能功耗的问题。第二,GPU作为一个协处理器或者将来作为一个可编程处理器,如何让用户更容易编程,这是GPU如何作为通用处理器的第二个瓶颈。

“AMD目前做了两件事情,公司的大策略是低功耗,包括嵌入式,所做的一切都是为了低功耗。APU实际上是把CPU和GPU结合起来做了一个架构叫做Heterogeneous System Architecture(HSA),这是一个异构的架构。目前LG、三星、高通都已经和AMD在加入HSA基金会之力于异构系统结构的标准化,涵盖服务器终端到桌面的领域。这个架构最大的解决了两个问题,第一,把CPU与GPU进行更紧密的结合,不仅在实际上减少了数据在CPU和GPU之间传输时产生的功耗,更对很多程序来说是莫大的帮助;第二,我们在HSA上为GPU开发出一套非常容易让高层的编程语言人员能够使用的工具,这个工具不用太多的考虑GPU里专有的编程语言。我们立足于希望这些开发人员利用这种工具能够对自己的业务了解即可,而不用考虑GPU,而最终把GPU变成通用编程的模型。为了做到这一点,我们提供了HSA编译工具、可调式的工具、基于开源的中间件。”

“在未来,我们真正的基于HSA的APU产品出来之后,你会看到对GPU的编程模型会彻底的改变。因为在CPU和GPU的通讯架构上做了很彻底的改变,而使得CPU和GPU的数据的传输可以不通过内存拷贝,这也就达到了省电和低功耗的目的。AMD把这种技术作为长足的发展,这种技术会用在我们的服务器领域,也会用在未来的PC机领域,同时也会用到低功耗的产品领域。”同时不要忘了,当我们说异构,不单单是指GPU和CPU,AMD的APU的SoC内同时集成了如入视频编码,解码,音频处理,内容安全等专用的处理模块,同时提供特定的编程接口,这也是异构的表现。

给开发人员的建议:如何避免同质化开发?

在中国,好的开发人员非常多,这一点从异构大赛可以看出,有些产品的创意,性能和应用领域都非常有商业和学术价值;好的产品规划师也很多。但是中国做出来的产品同质化非常严重,针对某一应用领域做出自己专属产品的框架前提的指导下,以前只要掌握编程可能就能开发出应用,但是现在就不一样了。楚含进认为,对目前的中国软件开发人员而言,目前的市场大环境对他们提出了几个方面的需求:

首先,架构人员应该有全局观,不但要对业务领域有所熟悉,而且更需要拓展与此专业领域相关的知识领域,要想办法利用现有的各种技术来时自己产品在性能,特性产生差异化和提高技术门槛,从硬件,软件,算法,性能综合考虑,而不是单纯吧摸个产品功能实现就可以。这样就能使你们的产品变得与众不同。

第二,要有原创精神,培养自己内功,现在的技术,流派太多了,软件人员一辈子也学完,等你学会了这个,结果新的潮流来了,好像总是落伍。有一个例子,大家都去学hadoop, 我问了很多人去学Hadoop干什么,居然没有几个回答我,只是觉得这个东西很热,所以去看看,盲从的心理不会产生好的软件产品。所以我建议要对自己学习的东西有所判断,要关注新的技术产生,对新技术要敏感,用于尝试。现在的代码程序员太多,思想成员太少了。

最后,对于软件人员,我特别希望无论你是应用层还是底层的开发人员, 都应该去了解计算机体系结构,了解CPU和GPU的方向。CPU和GPU一定是未来硬件的两大软件承载核心,所谓先知者先行。以前GPU很多停留在游戏行业,但是随着异构计算的到来,GPU和CPU融合产生应用的变化,很多有前瞻性的软件人员早已开始涉足此领域来占领先机。(文/谭茂 责编/包研)

posted @ 2013-02-19 08:40 jackdong 阅读(425) | 评论 (0)编辑 收藏

2013年2月17日 #

http://blog.csdn.net/zhang0311/article/details/8224093
近年来,基于CPU+GPU的混合异构计算系统开始逐渐成为国内外高性能计算领域的热点研究方向。在实际应用中,许多基于 CPU+GPU 的混合异构计算机系统表现出了良好的性能。但是,由于各种历史和现实原因的制约,异构计算仍然面临着诸多方面的问题,其中最突出的问题是程序开发困难,尤其是扩展到集群规模级别时这个问题更为突出。主要表现在扩展性、负载均衡、自适应性、通信、内存等方面。

一、    CPU+GPU协同计算模式

CPU+GPU异构协同计算集群如图1所示,CPU+GPU异构集群可以划分成三个并行层次:节点间并行、节点内CPU与GPU异构并行、设备(CPU或GPU)内并行。根据这三个层次我们可以得到CPU+GPU异构协同计算模式为:节点间分布式+节点内异构式+设备内共享式。

1           节点间分布式

CPU+GPU异构协同计算集群中,各个节点之间的连接与传统CPU集群一样,采用网络连接,因此,节点间采用了分布式的计算方式,可以采用MPI消息通信的并行编程语言。

2           节点内异构式

CPU+GPU异构协同计算集群中,每个节点上包含多核CPU和一块或多块GPU卡,节点内采用了异构的架构,采用主从式的编程模型,即每个GPU卡需要由CPU进程/线程调用。

由于每个节点上,CPU核数也比较多,计算能力也很大,因此,在多数情况下,CPU也会参与部分并行计算,根据CPU是否参与并行计算,我们可以把CPU+GPU异构协同计算划分成两种计算模式:

1)       CPU/GPU协同计算:CPU只负责复杂逻辑和事务处理等串行计算,GPU 进行大规模并行计算;

2)       CPU+GPU共同计算:由一个CPU进程/线程负责复杂逻辑和事务处理等串行计算,其它CPU进程/线程负责小部分并行计算,GPU负责大部分并行计算。

由于CPU/GPU协同计算模式比CPU+GPU共同计算模式简单,下面的介绍中,我们以CPU+GPU共同计算模式为例进行展开介绍各种编程模式。

在CPU+GPU共同计算模式下,我们把所有的CPU统称为一个设备(device),如双路8核CPU共有16个核,我们把这16个核统称成一个设备;每个GPU卡成为一个设备。根据这种划分方式,我们可以采用MPI进程或OpenMP线程控制节点内的各设备之间的通信和数据划分。

3           设备内共享式

1)       CPU设备:每个节点内的所有多核CPU采用了共享存储模型,因此,把节点内的所有多核CPU看作一个设备, 可以采用MPI进程或OpenMP线程、pThread线程控制这些CPU核的并行计算。

2)       GPU设备:GPU设备内有自己独立的DRAM存储,GPU设备也是共享存储模型,在GPU上采用CUDA或OpenCL编程控制GPU众核的并行计算。CUDA编程模式只在NVIDIA GPU上支持,OpenCL编程模式在NVIDIA GPU和AMD GPU都支持。

根据前面对CPU+GPU异构协同计算模式的描述,我们可以得到CPU+GPU异构协同计算的编程模型(以MPI和OpenMP为例)如表1所示。


图1 CPU+GPU异构协同计算架构

表1 CPU+GPU异构协同计算编程模型

 

节点间分布式

节点内异构式

设备内共享式

CPU

GPU

模式1

MPI

OpenMP

OpenMP

CUDA/OpenCL

模式2

MPI

MPI

OpenMP

CUDA/OpenCL

模式3

MPI

MPI

MPI

CUDA/OpenCL

二、    CPU+GPU协同计算负载均衡性设计

下面以模式2为例简单介绍多节点CPU+GPU协同计算任务划分和负载均衡,模式2的进程和线程与CPU核和GPU设备对应关系如图2所示。若采用主从式MPI通信机制,我们在节点0上多起一个进程(0号进程)作为主进程,控制其它所有进程。每个节点上启动3个计算进程,其中两个控制GPU设备,一个控制其余所有CPU核的并行,在GPU内采用CUDA/OpenCL并行,在CPU设备内采用OpenMP多线程并行。

由于CPU+GPU协同计算模式分为3个层次,那么负载均衡性也需要在这3个层次上分别设计。在模式2的编程方式下,节点内和节点间均采用MPI进程,合二为一,设计负载均衡时,只需要做到进程间(设备之间)的负载均衡和CPU设备内OpenMP线程负载均衡、GPU设备内CUDA线程负载均衡即可。

对于设备内,采用的是共享存储器模型,CPU设备上的OpenMP线程可以采用schedule(static/ dynamic/ guided )方式;GPU设备上只要保证同一warp内的线程负载均衡即可。

对于CPU+GPU协同计算,由于CPU和GPU计算能力相差很大,因此,在对任务和数据划分时不能给CPU设备和GPU设备划分相同的任务/数据量,这就增加了CPU与GPU设备间负载均衡的难度。CPU与GPU之间的负载均衡最好的方式是采用动态负载均衡的方法,然而有些应用无法用动态划分而只能采用静态划分的方式。下面我们分别介绍动态划分和静态划分。

1)       动态划分:对于一些高性能计算应用程序,在CPU与GPU之间的负载均衡可以采用动态负载均衡的优化方法,例如有N个任务/数据,一个节点内有2个GPU卡,即三个设备(CPU和2个GPU),动态负载均衡的方法是每个设备先获取一个任务/数据进行计算,计算之后立即获取下一个任务,不需要等待其他设备,直到N个任务/数据计算完成。这种方式只需要在集群上设定一个主进程,负责给各个计算进程分配任务/数据。

2)       静态划分:在一些应用中,无法采用动态划分的方式,需要静态划分方法,然而静态划分方法使异构设备间的负载均衡变得困难,有时甚至无法实现。对于一些迭代应用程序,我们可以采用学习型的数据划分方法,如先让CPU和GPU分别做一次相同计算量的计算,然后通过各自的运行时间计算出CPU与GPU的计算能力比例,然后再对数据进行划分。


图2 CPU+GPU协同计算示意图(以每个节点2个GPU为例)

三、    CPU+GPU协同计算数据划分示例

假设某一应用的数据特点如图3所示,从输出看,结果中的每个值的计算需要所有输入数据的信息,所有输出值的计算之间没有任何数据依赖性,可以表示成outj=;从输入看,每个输入值对所有的输出值都产生影响,所有输入数据之间也没有任何数据依赖性。从数据特点可以看出,该应用既可以对输入进行并行数据划分也可以对输出进行数据划分。下面我们分析CPU+GPU协同计算时的数据划分方式。


图3 并行数据示例

1         按输入数据划分

假设按输入数据划分,我们可以采用动态的方式给每个CPU或GPU设备分配数据,做到动态负载均衡,然而这种划分方式,使所有的线程向同一个输出位置保存结果,为了正确性,需要使所有的线程对每个结果进行原子操作,这样将会严重影响性能,极端情况下,所有线程还是按顺序执行的。因此,这种方式效果很差。

2         按输出数据划分

按输出数据划分的话可以让每个线程做不同位置的结果计算,计算完全独立,没有依赖性。如果采用静态划分的方式,由于CPU和GPU计算能力不同,因此,很难做到负载均衡。采用动态的方式可以做到负载均衡,即把结果每次给CPU或GPU设备一块,当设备计算完本次之后,立即向主进程申请下一个分块,这样可以做到完全负载均衡。按输出数据划分,无论采用静态划分还是动态划分,都会带来另外一个问题,由于每个结果的计算都需要所有输入信息,那么所有进程(设备)都需要读取一遍所有输入数据,动态划分时还不只一次,尤其对于输入数据很大时,这将会对输入数据的IO产生很大的影响,很有可能使IO程序性能瓶颈。

3         按输入和输出同时划分

由于按输入或按输出划分都存在不同的缺点,我们可以采用输入和输出同时划分的方式进行数据划分,如图4所示。

从输出角度,让所有的计算进程(设备)都有一份计算结果,设备内的线程对结果进行并行计算,每个设备都有一份局部的计算结果,所有设备都计算完毕之后,利用MPI进程对所有设备的计算结果进行规约,规约最后的结果即是最终的结果。

从输入角度,按输入数据动态划分给不同的计算进程(设备),这样可以满足所有的计算进程负载均衡。


图4 CPU+GPU协同计算数据划分示例

posted @ 2013-02-17 13:27 jackdong 阅读(1645) | 评论 (0)编辑 收藏

2013年1月9日 #

     摘要: http://devgurus.amd.com/thread/158866VLIW on Cypress and vector addition此问题被 假设已回答。cadorino 2012-7-2 上午10:31Hi to everybody.I'm thinking about VLIW utilization on a 5870 HD.Suppose you have ...  阅读全文
posted @ 2013-01-09 16:37 jackdong 阅读(459) | 评论 (0)编辑 收藏

http://devgurus.amd.com/thread/158866

Low ALUBusy and low FetchUnitBusy

此问题 未被回答 。

NURBSNewbie
NURBS 2012-3-19 下午1:35

Hi,

      When my kernel performs badly, the APP profiler reports a very low ALUBusy and low FetchUniBusy, (Both less than 10%)

      What can be the bottleneck here? Could it be because of the high number of code paths?

 

 

Thanks

NURBS

有用答案 作者 pesh 
  • 140 浏览次数
  • 有用答案Re: Low ALUBusy and low FetchUnitBusy
    peshNewbie
    pesh 2012-3-26 上午7:07 (回复 NURBS)

    Hi, NURBS!

    Can you provide information about your device? If it's an AMD APU then there were problems with performance counters in previous versions of APP Profiler.

    Also, check ALUPacking counter, if it has low value, then you code is VLIW limited and ALUBusy is poor, in this case try to reduce some data dependencies across sequential operations, it will allow compiler to better pack ALU instructions in VLIW, and utilize ALU resources. Try to reduce control flow statements, they affect counters to. In your situation, maybe you have if-statements, where in one branch you do fetch operation, and in another do some computations? That will cause some part of wavefront do fetch, and only after that remainder of wavefront will do ALU operations. So you will use only part of resources at time.

    • Re: Low ALUBusy and low FetchUnitBusy
      NURBSNewbie
      NURBS 2012-3-26 上午7:57 (回复 pesh)

      I have dual Radeon 6950 with either 12.3 or the new beta driver. It seems control flow was the issue, things are much better now. Is there an equation  I can use to sum up the numbers of counters to 100%, so that I can be more certain I am not getting bogus numbers?

      • Re: Low ALUBusy and low FetchUnitBusy
        peshNewbie
        pesh 2012-3-26 上午8:46 (回复 NURBS)

        I guess no, there is no such equation. First of all because when fetch instruction is applied by wavefront executing on compute unit, this wavefront goes to fetch unit, where it sits until fetch is done. At this time other wavefronts are doing calculations, or wait unit fetch unit become free, to execute next fetch instructions. So when some wavefronts are doing memory read or write other can do computations, and in the best case both counters can have 100% value, and ALUFetchRatio counter will equal to 1. Another important counters is FetchUnitStalled and WriteUnitStalled, try to keep them about 0 value. If it's too big, then many of wavefront are waiting for fetch unit to do memory read/write. To improve performance first of all, try to use sequential memory access pattern, then try to use local memory, if your algorithm reuse data several timers within workgroup.

posted @ 2013-01-09 16:26 jackdong 阅读(404) | 评论 (0)编辑 收藏

     摘要: http://devgurus.amd.com/thread/159558Understanding performance counters此问题被 假设已回答。chersanya 2012-8-5 下午12:03I have a kernel, and each workitem processes tens of elements (firstly perform som...  阅读全文
posted @ 2013-01-09 13:36 jackdong 阅读(486) | 评论 (0)编辑 收藏

     摘要: http://devgurus.amd.com/thread/158655ALUBusy question此问题 已被回答。viscocoa 2012-2-20 下午2:39What does ALUBusy in APP profiler really mean? If there is branching in a kernel, the SIMD unit wi...  阅读全文
posted @ 2013-01-09 10:35 jackdong 阅读(343) | 评论 (0)编辑 收藏

仅列出标题  下一页