eoe 移动开发者论坛

 找回密码
 加入eoe

QQ登录

只需一步,快速开始

查看: 88258|回复: 1
收起左侧

[资讯] 使用英特尔® 线程构建模块计算pi

[复制链接]

该用户从未签到

51

主题

70

帖子

782

e币
发表于 2015-6-17 10:44:05 | 显示全部楼层 |阅读模式

没有eoe的账号,级别还太低,出门如何吹牛逼?

您需要 登录 才可以下载或查看,没有帐号?加入eoe

x
鉴于许多 Android* 设备的处理器都具有一个以上的内核,了解如何开发多线程应用在移动行业变得十分重要。 英特尔开发了一种名为英特尔® 线程构建模块(英特尔® TBB)的重要工具,该工具可用于开发并行应用。 英特尔® TBB 是一个跨平台模板库,用于帮助用户创建并行程序。 它可以创建和同步数据流,同时隐藏架构详情,支持您在更高的抽象化水平上工作。 英特尔® TBB 可以在所有架构上运行。 对于 Android,请使用 4.3 及更高版本。
构建英特尔® TBB
  • 下载 TBB。 您可以在此处下载英特尔® TBB: https://www.threadingbuildingblocks.org/。 我下载了最新的稳定版(4.3 Update 1)。
  • 将 NDK 添加至路径:

    对于 Windows*:
    • $ SET PATH=%PATH%;
    对于 Linux*:
    • $ export PATH=$PATH:

  • 解压 TBB,转至包含源代码的目录,就在 src 文件夹中。 $ cd /src/
  • 运行面向 Android 的 TBB: $ /ndk-build –C /src/ arch=intel64 compiler=gcc target=android clean tbb tbbmalloc –j 此命令可构建面向 64 位 Android 的 TBB。 若要构建面向 32 位 Android 的 TBB,请更改使用 arch=intel64 on arch=ia32。 它可以构建面向 Android 64 位架构的应用。
  • 库构建完成。 在 build 目录 (/build/) 中,您可以找到包含 libs 的目录: libgnustl_shared.so, libtbbmalloc_proxy.so, libtbbmalloc.so and libtbb.so. libtbb.so and libgnustl_shared。我们会在应用开发中用到这些目录。
计算 π
计算 π 时,您可以从维基百科中选择任何一个包含定积分的公式:https://en.wikipedia.org/wiki/List_of_formulae_involving_%CF%80#Integrals。 我选择了这个公式:
针对该程序,我对这个公式进行了修改:
在积分计算中,我采用了矩形法。 积分函数除以 N = 107 等于子区间长度 h = 2·10-7。 然后将 N 个矩形的面积(底乘以高)加起来计算近似积分,给出以下公式:
创建应用
如果要创建一款新的 Android 应用:
创建 Main Activity
在 res/layout/activity_main.xml 中粘贴以下代码:
[size=1em][size=1em]
01
<RelativeLayout xmlns:android="[color=blue !important]http://schemas.android.com/apk/res/android"

[size=1em]
02
    xmlns:tools="[color=blue !important]http://schemas.android.com/tools"

[size=1em]
03
    android:layout_width="match_parent"

[size=1em]
04
    android:layout_height="match_parent"

[size=1em]
05
    android:paddingBottom="@dimen/activity_vertical_margin"

[size=1em]
06
    android:paddingLeft="@dimen/activity_horizontal_margin"

[size=1em]
07
    android:paddingRight="@dimen/activity_horizontal_margin"

[size=1em]
08
    android:paddingTop="@dimen/activity_vertical_margin"

[size=1em]
09
    tools:context="intel.example.pitbbcalc.MainActivity" >

[size=1em]
10

[size=1em]
11
    <LinearLayout

[size=1em]
12
        android:layout_width="fill_parent"

[size=1em]
13
        android:layout_height="fill_parent"

[size=1em]
14
        android:orientation="vertical" >

[size=1em]
15

[size=1em]
16
        <TextView

[size=1em]
17
            android:id="@+id/title"

[size=1em]
18
            android:layout_width="wrap_content"

[size=1em]
19
            android:layout_height="wrap_content"

[size=1em]
20
            android:text="@string/title"

[size=1em]
21
            android:textAppearance="?android:attr/textAppearanceLarge" />

[size=1em]
22

[size=1em]
23
        <Button

[size=1em]
24
            android:id="@+id/startButton"

[size=1em]
25
            android:layout_width="wrap_content"

[size=1em]
26
            android:layout_height="wrap_content"

[size=1em]
27
            android:text="@string/start" />

[size=1em]
28

[size=1em]
29
        <LinearLayout

[size=1em]
30
            android:layout_width="match_parent"

[size=1em]
31
            android:layout_height="wrap_content" >

[size=1em]
32

[size=1em]
33
            <TextView

[size=1em]
34
                android:id="@+id/pi_equally"

[size=1em]
35
                android:layout_width="wrap_content"

[size=1em]
36
                android:layout_height="wrap_content"

[size=1em]
37
                android:text="@string/pi_equally"

[size=1em]
38
                android:textAppearance="?android:attr/textAppearanceLarge" />

[size=1em]
39

[size=1em]
40
            <TextView

[size=1em]
41
                android:id="@+id/pi_val"

[size=1em]
42
                android:layout_width="wrap_content"

[size=1em]
43
                android:layout_height="wrap_content"

[size=1em]
44
                android:textAppearance="?android:attr/textAppearanceLarge" />

[size=1em]
45
        </LinearLayout>

[size=1em]
46

[size=1em]
47
    </LinearLayout>

[size=1em]
48

[size=1em]
49
</RelativeLayout>



在 res/values/strings.xml 中添加以下代码:
[size=1em][size=1em]
01
<?xml version="1.0" encoding="utf-8"?>

[size=1em]
02
<resources>

[size=1em]
03

[size=1em]
04
    <string name="app_name">PiTBBCalc</string>

[size=1em]
05
    <string name="action_settings">Settings</string>

[size=1em]
06
    <string name="start">Start</string>

[size=1em]
07
    <string name="title">Calculation of π</string>

[size=1em]
08
    <string name="pi_equally">π = </string>

[size=1em]
09

[size=1em]
10
</resources>



现在 Main Activity 如下所示:
接下来,我们需要为我们的 Activity 实施 Java* 接口。 在src/intel.example.pitbbcalc/MainActivity.java 文件中,添加以下代码:
[size=1em][size=1em]
01
package intel.example.pitbbcalc;

[size=1em]
02

[size=1em]
03
import android.app.Activity;

[size=1em]
04
import android.os.Bundle;

[size=1em]
05
import android.view.Menu;

[size=1em]
06
import android.view.MenuItem;

[size=1em]
07
import android.view.View;

[size=1em]
08
import android.view.View.OnClickListener;

[size=1em]
09
import android.widget.Button;

[size=1em]
10
import android.widget.TextView;

[size=1em]
11

[size=1em]
12
public class MainActivity extends Activity {

[size=1em]
13

[size=1em]
14
    private native double onClickCalc();

[size=1em]
15
    private TextView piEqually;

[size=1em]
16
    private TextView piVal;

[size=1em]
17
   

[size=1em]
18
    @Override

[size=1em]
19
    protected void onCreate(Bundle savedInstanceState) {

[size=1em]
20
        super.onCreate(savedInstanceState);

[size=1em]
21
        setContentView(R.layout.activity_main);

[size=1em]
22
        

[size=1em]
23
        Button startButton = (Button) findViewById(R.id.startButton);

[size=1em]
24
        piEqually = (TextView) findViewById(R.id.pi_equally);

[size=1em]
25
        piVal = (TextView) findViewById(R.id.pi_val);

[size=1em]
26
        piEqually.setVisibility(View.INVISIBLE);

[size=1em]
27
        piVal.setVisibility(View.INVISIBLE);

[size=1em]
28
        

[size=1em]
29
        startButton.setOnClickListener(new OnClickListener() {

[size=1em]
30
            @Override

[size=1em]
31
            public void onClick(View v) {

[size=1em]
32
                // TODO Auto-generated method stub

[size=1em]
33
                double val = onClickCalc();

[size=1em]
34
                piVal.setText(String.valueOf(val));

[size=1em]
35
                piEqually.setVisibility(View.VISIBLE);

[size=1em]
36
                piVal.setVisibility(View.VISIBLE);

[size=1em]
37
            }

[size=1em]
38
        });

[size=1em]
39
        

[size=1em]
40
        System.loadLibrary("PiTBBCalc");

[size=1em]
41
        System.loadLibrary("tbb");

[size=1em]
42
    }

[size=1em]
43

[size=1em]
44
    @Override

[size=1em]
45
    public boolean onCreateOptionsMenu(Menu menu) {

[size=1em]
46
        // Inflate the menu; this adds items to the action bar if it is present.

[size=1em]
47
        getMenuInflater().inflate(R.menu.main, menu);

[size=1em]
48
        return true;

[size=1em]
49
    }

[size=1em]
50

[size=1em]
51
    @Override

[size=1em]
52
    public boolean onOptionsItemSelected(MenuItem item) {

[size=1em]
53
        // Handle action bar item clicks here. The action bar will

[size=1em]
54
        // automatically handle clicks on the Home/Up button, so long

[size=1em]
55
        // as you specify a parent activity in AndroidManifest.xml.

[size=1em]
56
        int id = item.getItemId();

[size=1em]
57
        if (id == R.id.action_settings) {

[size=1em]
58
            return true;

[size=1em]
59
        }

[size=1em]
60
        return super.onOptionsItemSelected(item);

[size=1em]
61
    }

[size=1em]
62
}



通过右击 Project Explorer -> Android Tools -> Add Native Support 中的项目,我们可以添加本地支持。
在下一个窗口中输入我们项目库的名称并点击完成。
现在我们要实施原生代码在单线程中执行积分计算。 在 jni/PiTBBCalc.cpp 文件中,添加以下代码:
[size=1em][size=1em]
01
#include <jni.h>

[size=1em]
02
#include <math.h>

[size=1em]
03

[size=1em]
04
double piIntFunc (const double x)

[size=1em]
05
{

[size=1em]
06
    return sqrt(1 - pow(x, 2.0));

[size=1em]
07
}

[size=1em]
08

[size=1em]
09
double calcPi()

[size=1em]
10
{

[size=1em]
11
    const unsigned int n = pow(10.0, 7);

[size=1em]
12
    double a(-1), b(1);

[size=1em]
13
    double h = (b - a) / n;

[size=1em]
14
    double x (a);

[size=1em]
15

[size=1em]
16
    for (unsigned int i (0); i < n; ++i)

[size=1em]
17
    {

[size=1em]
18
        sum += piIntFunc(x);

[size=1em]
19
        x += h;

[size=1em]
20
    }

[size=1em]
21

[size=1em]
22
    sum *= h;

[size=1em]
23

[size=1em]
24
    return 2 * sum;

[size=1em]
25
}

[size=1em]
26

[size=1em]
27
extern "C"

[size=1em]
28
JNIEXPORT jdouble JNICALL Java_intel_example_pitbbcalc_MainActivity_onClickCalc(JNIEnv *env,

[size=1em]
29
        jobject obj)

[size=1em]
30
{

[size=1em]
31
    return calcPi();

[size=1em]
32
}



我们可以尝试在单线程模式下运行我们的应用和 π 计算。
如果使用英特尔® TBB 为我们的项目添加并行实施,我们需要编辑 jni/Android.mk。 Android.mk 是项目的生成文件(Makefile),我们需要将英特尔® TBB 库添加到这个文件中:
[size=1em][size=1em]
01
LOCAL_PATH := $(call my-dir)

[size=1em]
02
TBB_PATH := <tbb_sources>

[size=1em]
03
TBB_BUILD_PATH := /build/linux_intel64_gcc_android_cc4.9_NDKr10b_version_android-L_release

[size=1em]
04

[size=1em]
05
include $(CLEAR_VARS)

[size=1em]
06

[size=1em]
07
LOCAL_MODULE    := PiTBBCalc

[size=1em]
08
LOCAL_SRC_FILES := PiTBBCalc.cpp

[size=1em]
09
LOCAL_CFLAGS += -DTBB_USE_GCC_BUILTINS -std=c++11 -fexceptions -Wdeprecated-declarations -I$(TBB_PATH)/include -I$(TBB_PATH)$(TBB_BUILD_PATH)

[size=1em]
10
LOCAL_LDLIBS := -llog -ltbb -L./ -L$(TBB_PATH)$(TBB_BUILD_PATH)

[size=1em]
11
LOCAL_SHARED_LIBRARIES += libtbb

[size=1em]
12

[size=1em]
13
include $(BUILD_SHARED_LIBRARY)

[size=1em]
14

[size=1em]
15
include $(CLEAR_VARS)

[size=1em]
16
LOCAL_MODULE    := libtbb

[size=1em]
17
LOCAL_SRC_FILES := $(TBB_PATH)$(TBB_BUILD_PATH)/libtbb.so

[size=1em]
18
include $(PREBUILT_SHARED_LIBRARY)



在 jni/ 目录中,创建一个 Application.mk 文件并添加以下行:
APP_ABI := x86_64 APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti APP_STL := gnustl_shared
Application.mk 用于描述您的应用需要哪些原生模块(即静态/共享库)。 在行 APP_ABI := x86_64 中,我们可以指定目标架构。
现在我们可以尝试运行我们的应用。 如果您看到了应用的主界面,则说明英特尔® TBB 链接成功,我们可以开始开发应用。
向代码添加并行功能时,我们应加上英特尔® TBB 标题: #include "tbb/tbb.h",移除周期并添加以下代码:
[size=1em][size=1em]
01
double sum = tbb::parallel_reduce(

[size=1em]
02
        tbb::blocked_range<unsigned int>(0,n),

[size=1em]
03
        double(0), // identity element for summation

[size=1em]
04
        [&](const tbb::blocked_range<unsigned int>& r, double sum)->double {

[size=1em]
05
            for( int i=r.begin(); i!=r.end(); ++i )

[size=1em]
06
            {

[size=1em]
07
                sum += piIntFunc(x);

[size=1em]
08
                x += h;

[size=1em]
09
            }

[size=1em]
10
            return sum; // body returns updated value of accumulator

[size=1em]
11
        },

[size=1em]
12
        []( double x, double y )->double {

[size=1em]
13
            return x+y; // joins two accumulated values

[size=1em]
14
        }

[size=1em]
15
    );



现在,如果您运行该应用,它就可以在多线程模式下运行了。

签到天数: 60 天

连续签到: 1 天

[LV.6]常住居民II

19

主题

746

帖子

4793

e币
发表于 2015-8-13 09:51:52 | 显示全部楼层
这排版真是醉了
*滑动验证:
您需要登录后才可以回帖 登录 | 加入eoe

本版积分规则

推荐阅读
赞助商们

QQ|联系我们|小黑屋|手机版|eoe 移动开发者论坛 ( 京ICP备11018032 京公网安11010802020210  

GMT+8, 2017-11-20 09:44 , Processed in 0.498153 second(s), 41 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表
关闭

扫一扫 关注eoe官方微信