精华内容
下载资源
问答
  • 利用并行子空间优化方法实现复杂工程系统并行设计优化,张科施,李为吉,介绍了应用于航空航天领域内复杂系统设计的一种基于全局敏度方程的并行子空间优化算法,分析了算法的计算结构和参数设置,根据其
  • 通过分析基于响应面的并行子空间优化算法的特点指出并行子空间优化算法学科级优化的作用在于向系统级优化响应面提供性能优良的设计点。在此基础上,建立了不要求学科级优化的改进的并行子空间优化算法,进一步降低了...
  • 提出了使用并行子空间协同优化设计方法对复合材料加筋板结构的布局参数和铺层顺序进行协同优化。该方法分为3步:(1 )以筋条型式、数量、尺寸和铺层厚度为变量,考虑静强度和稳定性要求,建立3个并行的子优化问题,实现了...
  • 针对无监督分类问题, 提出一种多尺度并行免疫克隆优化聚类算法. 算法中, 进化在多个群之间并行进 行, 不同群的抗体根据群适应度采用不同变异尺度. 进化初期, 利用大尺度变异群实现全局最优解空间的快速...
  • c++ 对for循环的并行优化例子

    万次阅读 多人点赞 2018-08-17 16:14:53
    什么是并行优化并行优化是代码优化的基本方法,从大到小一共可以分成三级:异步框架;任务并行;数据并行。在实际工作中,一般是先设计异步框架,包括异步处理任务以及异步任务的异构化等;第二步一般是做数据...

    什么是并行优化?

    并行优化是代码优化的基本方法,从大到小一共可以分成三级:异步框架;任务并行;数据并行。在实际工作中,一般是先设计异步框架,包括异步处理任务以及异步任务的异构化等;第二步一般是做数据并行优化(SIMD),利用CPU的向量指令来对多条数据并行处理;这两步是代码优化的重心,一般做完这两步,系统性能会有明显的提升。今天要讨论的是第三步,for循环的并行优化。与前两者不同的是,for循环往往是处理同一类任务,且通常会涉及到对同一个变量的读写,所以异步是不能用,而且for循环中往往包含多种结构比如逻辑判断和算术过程等,所以通常也很难用数据并行的方式来优化,那么怎么对for循环进行优化呢?

    怎么对for循环并行优化?

    直接看两个例子

    例1 内存操作

    void testfuc(int num){
        int a = 0;
        for (int i = 0; i != num; i++) {
            int *b = new int[10]();
            delete [] b;
        }
    
    

    for循环的目的是申请一段内存空间然后释放,假设num = 1e7;一千万次内存操作在我的机器上(2.6 GHz Intel Core i5双核)运行耗时在900ms左右。
    为了对这个for循环进行优化,首先将for循环拆分成若干部分,比如两部分:

    void testfuc(int num){
        int a = 0;
        int num2 = num >> 1;
        for (int i = 0; i != num2; i++) {
            int *b = new int[10]();
            delete [] b;
        }
        for (int i = num2; i != num; i++) {
            int *b = new int[10]();
            delete [] b;
        }
    }
    

    然后使用c11的future+async来启动两个异步任务分别处理一个子循环:

    void testfuc2(int num){
        int a = 0;
        int num2 = num/2;
        future<void> ft1 = async(std::launch::async, [&]{
            for (int i = 0; i != num2; i++) {
                int *b = new int[10]();
                delete [] b;
            }
        });
        
        future<void> ft2 = async(std::launch::async, [&]{
            for (int i = num2; i != num; i++) {
                int *b = new int[10]();
                delete [] b;
            }
        });
        
        ft1.wait();
        ft2.wait();
    }
    

    将testfunc1和testfunc2放在一起测试,运行结果如下:

    time1 = 992.360000
    time2 = 475.182000
    

    显然testfunc2要明显比testfunc1快,在本次运行结果中,时间少了一半,但是这个时间不一定每次都是一半,由于线程切换和CPU状态的影响,testfunc2的时间会比testfunc1节省40%-50%。

    例2 复杂计算

    原函数为:

    void testfuc1(int num){
        for (int i = 0; i != num; i++) {
            a = cos(tan(i));
        }
    }
    

    优化后函数为:

    void testfuc2(int num){
        int num2 = num/2;
        future<void> ft1 = async(std::launch::async, [&]{
            for (int i = 0; i != num2; i++) {
                b = cos(tan(i));
            }
        });
        
        future<void> ft2 = async(std::launch::async, [&]{
            for (int j = num2; j != num; j++) {
                c = cos(tan(j));
            }
        });
        
        ft1.wait();
        ft2.wait();
    }
    

    运行结果为:

    time1 = 806.438000
    time2 = 407.875000
    

    问题来了

    前面两个例子,for循环内部都是局部变量,也就是说使用多线程异步处理并不涉及数据竞争,但是现实中我们遇到的for循环大多都包含一个或多个for循环外部变量,在使用多线程异步处理这些变量的时候,要谨慎处理数据竞争,否则会引发未定义操作进而程序崩溃。处理异步任务最常见的是加互斥锁来保护有竞争的数据,那么在for循环的并行优化中是否可行呢,我们感受一下

    例3 互斥锁带来的竞争消耗

    原函数为

    void testfuc1(int num){
        for (int i = 0; i != num; i++) {
            global = cos(tan(i));
        }
    }
    

    优化版本:

    void testfuc2(int num){
        int num2 = num/2;
        future<void> ft1 = async(std::launch::async, [&]{
            for (int i = 0; i != num2; i++) {
                unique_lock<mutex> lock(mtx);
                global = cos(tan(i));
            }
        });
        
        future<void> ft2 = async(std::launch::async, [&]{
            for (int j = num2; j != num; j++) {
                unique_lock<mutex> lock(mtx);
                global = cos(tan(j));
            }
        });
        
        ft1.wait();
        ft2.wait();
    }
    

    运行结果

    time1 = 802.468000
    time2 = 46057.028000
    

    是不是大跌眼镜?一个小小的锁,会带来如此大的影响,其实这个也是必然的,因为高频for循环中加锁,会导致CPU频繁切换,甚至可能会导致内存总线被锁住。有关锁的讨论不是本文重点,所以不加讨论。我们关注的是,怎么避免这种情况,或者怎么减少这种情况带来的影响。
    有两种思路可以尝试,一是从理论上避免数据竞争,可以给每条线程一个独立的变量,用来保存该线程的结果,然后在各条线程运行结束之后将结果恢复到一个全局变量中;二是从代码上考虑,使用原子数据或者无锁结构,来保证过程中的无锁,对方法1再举个例子:

    例子4 局部变量替代全局变量

    原函数:

    void testfuc1(int num){
        for (int i = 0; i != num; i++) {
            global += cos(tan(i));
        }
    }
    

    优化函数:

    void testfuc2(int num){
        int num2 = num/2;
        future<double> ft1 = async(std::launch::async, [&]{
            for (int i = 0; i != num2; i++) {
                unique_lock<mutex> lock(mtx);
                local1 = cos(tan(i));
            }
        });
        
        future<double> ft2 = async(std::launch::async, [&]{
            for (int j = 0; j != num2; j++) {
                unique_lock<mutex> lock(mtx);
                local2 = cos(tan(j));
            }
        });
        
        global = ft1.get() + ft2.get();
    }
    

    参考

    futrue参考
    数据竞争参考

    展开全文
  • Oracle优化08-并行执行

    千次阅读 2017-01-04 15:04:37
    这新启用的用户处理传递过来数据的进程称为父进程,用户传出数据(最初的4个并行服务进程)成为进程,这样整个并行处理过程就启用了8个并行服务进程。 其中每个单独的并行服务进程的行为叫作并行的内部操作,而...

    思维导图

    这里写图片描述


    概述

    在讨论Oracle的性能问题时,通常要假设一个前提,那就是这个系统是OLTP还是OLAP(或者说数据仓库系统)。 只有在这个前提下,讨论一些性能问题才有意义,因为这两类系统太不一样了,甚至很多技术是相悖的。

    举个例子 我们说绑定变量,这是一个在OLTP系统上有意义的话题,而对于OLAP系统却完全没有意义,设置不需要它。 再比如说内存命中率,OLTP系统中这个指标非常重要,因为OLTP系统中内存的效率决定了数据库的效率;而OLAP系统中却不太需要关注它。 在OLAP系统,SQL语句的执行效率决定了数据库的效率,而OLTP系统中,SQL语句的执行效率通常是很高的。


    并行和OLAP系统

    如果讨论数据库性能方面的问题,这个技术就不应该忽略,如果要把并行也像上面划一个使用范围的话,我认为应该是OLAP系统的一个重要的技术。

    我们下看下并行执行的处理模型举例:

    这里写图片描述

    首先,Oracle 会创建一个进程用于协调并行服务进程之间的信息传递,这个协调进程将需要操作的数据集(比如表的数据块)分割成很多部分,称为并行处理单元,然后并行协调进程给每个并行进程分配一个数据单元。

    比如有四个并行服务进程,他们就会同时处理各自分配的单元,当一个并行服务进程处理完毕后,协调进程就会给它们分配另外的单元,如此反复,直到表上的数据都处理完毕,最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果,返回给用户。

    并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集,Oracle 会启动几个并行服务进程同时处理这些小数据集,最后将这些结果汇总,作为最终的处理结果返回给用户。

    这种数据并行处理方式在OLAP系统中非常有用,OLAP系统的表通常来说都是非常大,如果系统的CPU比较多,让所有的CPU共同来处理这些数据,效果就会比串行执行要高的多。

    然而对于OLTP系统,通常来讲,并行并不合适,原因是OLTP系统上几乎在所有的SQL操作中,数据访问路劲基本上以索引访问为主,并且返回结果集非常小,这样的SQL 操作的处理速度一般非常快,不需要启用并行。

    话不多说,上案例:

    注意 alter table t parallel 4;

    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 
    Connected as xxx@xgj
    
    SQL> create table t as select object_id ,object_name from dba_objects;
    
    Table created
    
    SQL> create index ind_t on t(object_id);
    
    Index created
    
    SQL> exec dbms_stats.gather_table_stats(user,'t',cascade => true);
    
    PL/SQL procedure successfully completed
    
    SQL> alter table  t  parallel 4;
    
    Table altered

    我们查看下下面SQL的执行计划

    SQL> select * from t where t.object_id=10433;
    
     OBJECT_ID OBJECT_NAME
    ---------- --------------------------------------------------------------------------------
         10433 KU$_PFHTABPROP_VIEW
    SQL> select a.SQL_ID ,a.CHILD_NUMBER from v$sql a where a.SQL_TEXT like 'select * from t where t.object_id=10433%';
    
    SQL_ID CHILD_NUMBER
    ------------- ------------
    1afhswsarn20q            0
    SQL> select * from table(dbms_xplan.display_cursor('1afhswsarn20q',0));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    SQL_ID  1afhswsarn20q, child number 0
    -------------------------------------
    select * from t where t.object_id=10433
    Plan hash value: 4013845416
    --------------------------------------------------------------------------------
    | Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |       |       |       |     2 (100)|
    |   1 |  TABLE ACCESS BY INDEX ROWID| T     |     1 |    24 |     2   (0)| 00:00
    |*  2 |   INDEX RANGE SCAN          | IND_T |     1 |       |     1   (0)| 00:00
    --------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       2 - access("T"."OBJECT_ID"=10433)
    
    19 rows selected
    
    SQL> 

    上面的SQL是OLTP系统中比较典型的SQL,尽管在表上启用了并行属性,但是CBO并没有选择启用并行,原因是T表object_id字段重复率非常的低,这种情况下访问索引的代价非常小,可能只有几个逻辑读,所以没有必要启用并行.

    在看下下面的SQL

    SQL>select  object_name ,count(1) from t group by object_name;
    ....省略输出
    SQL> select a.SQL_ID ,a.CHILD_NUMBER from v$sql a where a.SQL_TEXT like 'select  object_name ,count(1) from t group by object_name%';
    
    SQL_ID CHILD_NUMBER
    ------------- ------------
    0vk7jbup3dxbh            0
    SQL> select * from table(dbms_xplan.display_cursor('0vk7jbup3dxbh',0));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    SQL_ID  0vk7jbup3dxbh, child number 0
    -------------------------------------
    select  object_name ,count(1) from t group by object_name
    Plan hash value: 552882851
    --------------------------------------------------------------------------------
    | Id  | Operation               | Name     | Rows  | Bytes | Cost (%CPU)| Time
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |          |       |       |    13 (100)|
    |   1 |  PX COORDINATOR         |          |       |       |            |
    |   2 |   PX SEND QC (RANDOM)   | :TQ10001 | 19568 |   363K|    13   (8)| 00:00:
    |   3 |    HASH GROUP BY        |          | 19568 |   363K|    13   (8)| 00:00:
    |   4 |     PX RECEIVE          |          | 35249 |   654K|    12   (0)| 00:00:
    |   5 |      PX SEND HASH       | :TQ10000 | 35249 |   654K|    12   (0)| 00:00:
    |   6 |       PX BLOCK ITERATOR |          | 35249 |   654K|    12   (0)| 00:00:
    |*  7 |        TABLE ACCESS FULL| T        | 35249 |   654K|    12   (0)| 00:00:
    --------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    ---------------------------------------------------
       7 - access(:Z>=:Z AND :Z<=:Z)
    
    24 rows selected
    
    SQL> 

    上面的SQL是OLAP系统比较典型的SQL,它的特点是需要对SQL做并行处理。 因为处理的数据量很大,所以这种情况使用了并行将更能提高效率。

    上述就是并行执行的执行计划,如果还原成1

    SQL> alter table t parallel 1;
    
    Table altered

    执行计划如下,区别还是很明显的。

    这里写图片描述


    并行处理的机制

    当Oracle 数据库启动的时候,实例会根据初始化参数:

             PARALLEL_MIN_SERVERS=n

    的值来预先分配n个并行服务进程,当一条SQL 被CBO判断为需要并行执行时发出SQL的会话进程变成并行协助进程,它按照并行执行度的值来分配进程服务器进程。

    首先协调进程会使用ORACLE 启动时根据参数: parallel_min_servers=n的值启动相应的并行服务进程,如果启动的并行服务器进程数不足以满足并行度要求的并行服务进程数,则并行协调进程将额外启动并行服务进程以提供更多的并行服务进程来满足执行的需求。

    然后并行协调进程将要处理的对象划分成小数据片,分给并行服务进程处理;并行服务进程处理完毕后将结果发送给并行协调进程,然后由并行协调进程将处理结果汇总并发送给用户。

    以上是一个并行处理的基本流程。 实际上,在一个并行执行的过程中,还存在着并行服务进程之间的通信问题。

    在一个并行服务进程需要做两件事情的时候,它会再启用一个进程来配和当前的进程完成一个工作,比如这样的一条SQL语句:

            Select * from employees order by last_name;

    假设employees表中last_name 列上没有索引,并且并行度为4,此时并行协调进程会分配4个并行服务进程对表employees进行全表扫描操作,因为需要对结果集进行排序,所以并行协调进程会额外启用4个并行服务进程,用于处理4个进程传送过来的数据,这新启用的用户处理传递过来数据的进程称为父进程,用户传出数据(最初的4个并行服务进程)成为子进程,这样整个并行处理过程就启用了8个并行服务进程。

    其中每个单独的并行服务进程的行为叫作并行的内部操作,而并行服务进程之间的数据交流叫做并行的交互操作。

    这里写图片描述

    这也是有时我们发现并行服务进程数量是并行度的2倍,就是因为启动了并行服务父进程操作的缘故。


    读懂一个并行处理的执行计划

    搞清楚了并行执行的内部机制,就很容易读懂一个并行处理的执行计划了。

    这里写图片描述

    缩进最深的首先执行,依次类推

    执行步骤:

    (1)并行服务进程对t表进行全表扫描。
    (2)并行服务进程以ITERATOR(迭代)方式访问数据块,也就是并行协调进程分给每个并行服务进程一个数据片,在这个数据片上,并行服务进程顺序地访问每个数据块(Iterator),所有的并行服务进程将扫描的数据块传给另一组并行服务进程(父进程)用于做Hash Group操作。
    (3)并行服务父进程对子进程传递过来的数据做Hash Group操作。
    (4)并行服务进程(子进程)将处理完的数据发送出去。
    (5)并行服务进程(父进程)接收到处理过的数据。
    (6)合并处理过的数据,按照随即的顺序发给并行协调进程(QC:Query Conordinator)。
    (7)并行协调进程将处理结果发给用户。

    PX:Parallel Execution (并行执行)

    当使用了并行执行,SQL的执行计划中就会多出一列:in-out。 该列帮助我们理解数据流的执行方法.

    常见值的含义:
    - Parallel to Serial(P->S):
    表示一个并行操作发送数据给一个串行操作,通常是并行incheng将数据发送给并行调度进程。
    - Parallel to Parallel(P->P):表示一个并行操作向另一个并行操作发送数据,疆场是两个从属进程之间的数据交流。
    - Parallel Combined with parent(PCWP): 同一个从属进程执行的并行操作,同时父操作也是并行的。
    - Parallel Combined with Child(PCWC): 同一个从属进程执行的并行操作,子操作也是并行的。
    - Serial to Parallel(S->P): 一个串行操作发送数据给并行操作,如果select 部分是串行操作,就会出现这个情况。


    一个很常见的并行执行等待事件

    在做并行执行方面的性能优化的时候,可能会遇到如下等待时间:

                PX Deq Credit: send blkd

    这是一个有并行环境的数据库中,从statspack 或者AWR中经常可以看到的等待事件.

    比如在一个statspack的报告中有如下的信息:

    这里写图片描述

    QL> show param parallel
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ---------------------
    fast_start_parallel_rollback         string      LOW
    parallel_adaptive_multi_user         boolean     TRUE
    parallel_automatic_tuning            boolean     FALSE
    parallel_degree_limit                string      CPU
    parallel_degree_policy               string      MANUAL
    parallel_execution_message_size      integer     16384
    parallel_force_local                 boolean     FALSE
    parallel_instance_group              string      
    parallel_io_cap_enabled              boolean     FALSE
    parallel_max_servers                 integer     480
    parallel_min_percent                 integer     0
    parallel_min_servers                 integer     0
    parallel_min_time_threshold          string      AUTO
    parallel_server                      boolean     FALSE
    parallel_server_instances            integer     1
    parallel_servers_target              integer     192
    parallel_threads_per_cpu             integer     2
    recovery_parallelism                 integer     0
    
    SQL> 

    在Oracle 9i 里面, 这个等待事件被列入空闲等待。一般来说空闲等待可以忽略它,但是实际上空闲等待也是需要关注的,因为一个空闲的等待,它反映的是另外的资源已经超负荷运行了。 基于这个原因,在Oracle 10g里已经把PX Deq Credit: send blkd等待时间不在视为空闲等待,而是列入了Others 等待事件范围。

    PX Deq Credit: send blkd 等待事件的意思是: 当并行服务进程向并行协调进程QC(也可能是上一层的并行服务进程)发送消息时,同一时间只有一个并行服务进程可以向上层进程发送消息,这时候如果有其他的并行服务进程也要发送消息,就只能等待。直到获得一个发送消息的信用信息(Credit),这时候会触发这个等待事件,这个等待事件的超时时间为2秒钟。

    如果我们启动了太多的并行进程,实际上系统资源(CPU)或者QC 无法即时处理并行服务发送的数据,那么等待将不可避免。 对于这种情况,我们就需要降低并行处理的并行度。

    我们通过show param parallel查看数据库中最多可以启动480个并行进程。

    parallel_max_servers 480 

    报告中同时也可以看到大量的direct path read ,direct path temp ,db file scattered read

    一般direct path read 或者 db file scattered read ,通常来讲都是使用并行操作。


    当出现PX Deq Credit:send blkd等待的时间很长时,我们可以通过平均等待时间来判断等待事件是不是下层的并行服务进程空闲造成的。

    该等待事件的超时时间是2秒,如果平均等待时间也差不多是2秒,就说明是下层的并行进程“无事所做”,处于空闲状态。

    如果和2秒的差距很大,就说明不是下层并行服务超时导致的空闲等待,而是并行服务之间的竞争导致的,因为这个平均等待事件非常短,说明并行服务进程在很短时间的等待之后就可以获取资源来处理数据。

    所以对于非下层的并行进程造成的等待,解决的方法就是降低每个并行执行的并行度,比如对象(表,索引)上预设的并行度或者查询Hint 指定的并行度。


    并行执行的适用范围

    Oracle的并行技术在下面的场景中可以使用:

    • Parallel Query(并行查询)
    • Parallel DDL(并行DDL操作,如建表,建索引等)
    • Parallel DML(并行DML操作,如insert,update,delete等)

    并行查询

    并行查询可以在查询语句,子查询语句中使用,但是不可以使用在一个远程引用的对象上(如DBLINK).

    一个查询能够并行执行,需要满足一下条件:

    (1) SQL语句中有Hint提示,比如Parallel 或者 Parallel_index.
    (2) SQL语句中引用的对象被设置了并行属性。
    (3) 多表关联中,至少有一个表执行全表扫描(Full table scan)或者跨分区的Index range SCAN。

    如:

     select  /*+parallel(t 4) * from t;

    并行DDL 操作

    表操作的并行执行

    以下表操作可以使用并行执行:

    • CREATE TABLE … AS SELECT

    • ALTER TABLE … move partition

    • Alter table … split partition

    • Alter table … coalesce partition

    DDL操作,我们可以通过trace 文件来查看它的执行过程。

    查看当前的trace 文件:

    SELECT      u_dump.VALUE
             || '/'
             || db_name.VALUE
             || '_ora_'
             || v$process.spid
             || NVL2 (v$process.traceid, '_' || v$process.traceid, NULL)
             || '.trc'
                "Trace File"
      FROM            v$parameter u_dump
                   CROSS JOIN
                      v$parameter db_name
                CROSS JOIN
                   v$process
             JOIN
                v$session
             ON v$process.addr = v$session.paddr
     WHERE       u_dump.name = 'user_dump_dest'
             AND db_name.name = 'db_name'
             AND v$session.audsid = SYS_CONTEXT ('userenv', 'sessionid');

    然后用tkprof分析。


    创建索引的并行执行

    创建索引时使用并行方式在系统资源充足的时候会使性能得到很大的提高,特别是在OLAP系统上对一些很大的表创建索引时更是如此。

    以下的创建和更改索引的操作都可以使用并行:

    • Create index

    • Alter index … rebuild

    • Alter index … rebuild partition

    • Alter index … split partition

    一个简单的语法:

    create index t_ind on t(id) parallel 4;

    监控这个过程和上面一样,需要通过10046事件。

    使用并行方式,不论是创建表,修改表,创建索引,重建索引,他们的机制都是一样的,那就是Oracle 给每个并行服务进程分配一块空间,每个进程在自己的空间里处理数据,最后将处理完毕的数据汇总,完成SQL的操作。


    并行DML 操作

    Oracle 可以对DML操作使用并行执行,但是有很多限制。 如果我们要让DML 操作使用并行执行,必须显示地在会话里执行如下命令:

     SQL> alter session enable parallel dml;

    只有执行了这个操作,Oracle 才会对之后符合并行条件的DML操作并行执行,如果没有这个设定,即使SQL中指定了并行执行,Oracle也会忽略它。


    delete,update和merge 操作

    Oracle 对Delete,update,merge的操作限制在,只有操作的对象是分区表示,Oracle 才会启动并行操作。原因在于,对于分区表,Oracle 会对每个分区启用一个并行服务进程同时进行数据处理,这对于非分区表来说是没有意义的。


    insert 的并行操作

    实际上只有对于insert into … select … 这样的SQL语句启用并行才有意义。 对于insert into .. values… 并行没有意义,因为这条语句本身就是一个单条记录的操作。

    Insert 并行常用的语法是:

    insert /*+parallel(t 2) */ into t select /*+parallel(t1 2) */ * from t1;

    这条SQL 语句中,可以让两个操作insert 和select 分别使用并行,这两个并行是相互独立,互不干涉的,也可以单独使用其中的一个并行。


    并行执行的设定

    并行相关的初始化参数

    parallel_min_servers=n

    在初始化参数中设置了这个值,Oracle 在启动的时候就会预先启动N个并行服务进程,当SQL执行并行操作时,并行协调进程首先根据并行度的值,在当前已经启动的并行服务中条用n个并行服务进程,当并行度大于n时,Oracle将启动额外的并行服务进程以满足并行度要求的并行服务进程数量。


    parallel_max_servers=n

    如果并行度的值大于parallel_min_servers或者当前可用的并行服务进程不能满足SQL的并行执行要求,Oracle将额外创建新的并行服务进程,当前实例总共启动的并行服务进程不能超过这个参数的设定值。


    parallel_adaptive_multi_user=true|false

    Oracle 10g R2下,并行执行默认是启用的。 这个参数的默认值为true,它让Oracle根据SQL执行时系统的负载情况,动态地调整SQL的并行度,以取得最好的SQL 执行性能。


    parallel_min_percent

    这个参数指定并行执行时,申请并行服务进程的最小值,它是一个百分比,比如我们设定这个值为50. 当一个SQL需要申请20个并行进程时,如果当前并行服务进程不足,按照这个参数的要求,这个SQL比如申请到20*50%=10个并行服务进程,如果不能够申请到这个数量的并行服务,SQL 将报出一个ORA-12827的错误。

    当这个值设为Null时,表示所有的SQL在做并行执行时,至少要获得两个并行服务进程。


    并行度的设定

    并行度可以通过以下三种方式来设定:

    • 使用Hint 指定并行度。
     SQL>Select /*+ parallel(t 4) */ count(*) from t;
    
    • 使用alter session force parallel 设定并行度。
       SQL>Alter session force parallel query parallel 4;
    • 使用SQL中引用的表或者索引上设定的并行度,原则上Oracle 使用这些对象中并行度最高的那个值作为当前执行的并行度。
      SQL>Alter table t parallel 4;

    Oracle 默认并行度计算方式

    • Oracle 根据CPU的个数,RAC实例的个数以及参数parallel_threads_per_cpu的值,计算出一个并行度。

    • 对于并行访问分区操作,取需要访问的分区数为并行度。

    并行度的优先级别从高到低:

    Hint->alter session force parallel->表,索引上的设定-> 系统参数

    实际上,并行只有才系统资源比较充足的情况下,才会取得很好的性能,如果系统负担很重,不恰当的设置并行,反而会使性能大幅下降。


    直接加载

    在执行数据插入或者数据加载的时候,可以通过append hint的方式进行数据的直接加载。

    在insert 的SQL中使用APPEND,如:

     insert /*+append */ into t select * from t1;

    还可以在SQL*LOADER里面使用直接加载:

     Sqlldr userid=user/pwd control=load.ctl direct=true

    Oracle 执行直接加载时,数据直接追加到数据段的最后,不需要花费时间在段中需找空间,数据不经过data buffer直接写到数据文件中,效率要比传统的加载方式高。

    展开全文
  • LightGBM的并行优化

    千次阅读 2017-12-06 23:15:04
    在时间和空间上都更胜一筹,准确率也比其他模型表现得更好。这些模型在处理一般规模的数据时,单机即可以解决,然而当数据规模更大时,即需要进行分布式计算,分担每台机器(worker)的压力。这篇文章

    上一篇文章介绍了LightGBM算法的特点,总结起来LightGBM采用Histogram算法进行特征选择以及采用Leaf-wise的决策树生长策略,使其在一批以树模型为基模型的boosting算法中脱颖而出。在时间和空间上都更胜一筹,准确率也比其他模型表现得更好。这些模型在处理一般规模的数据时,单机即可以解决,然而当数据规模更大时,即需要进行分布式计算,分担每台机器(worker)的压力。这篇文章介绍LightGBM的两种并行学习算法(Feature Parallel & Data Parallel),以及他们较传统并行算法的特别之处。

    - Feature Parallel

    特征并行算法目的是在决策树生成过程中的每次迭代,高效地找到最优特征分裂点。特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。

    • 传统的特征并行算法

      1. 根据不同的特征子集,将数据集进行垂直切分。(不同机器worker有不同的特征子集)
      2. 每个worker寻找局部的最优分裂特征以及分裂点。
      3. 不同worker之间进行网络传输,交换最优分裂信息,最终得到最优的分裂信息。
      4. 具有最优分裂特征的worker,局部进行分裂,并将分裂结果广播到其他worker。
      5. 其他worker根据接收到的数据进行切分数据。

      该方法不能有效地加速特征选择的效率,当数据量#data很大时,该并行方法不能加快效率。并且,最优的分裂结果需要在worker之间进行传输,需要消耗很多的传输资源以及传输时间。

    • LightGBM的特征并行算法
      LightGBM并没有垂直的切分数据集,而是每个worker都有全量的训练数据,因此最优的特征分裂结果不需要传输到其他worker中,只需要将最优特征以及分裂点告诉其他worker,worker随后本地自己进行处理。处理过程如下:

      1. 每个worker在基于局部的特征集合找到最优分裂特征。
      2. workder间传输最优分裂信息,并得到全局最优分裂信息。
      3. 每个worker基于全局最优分裂信息,在本地进行数据分裂,生成决策树。

      然而,当数据量很大时,特征并行算法还是受限于特征分裂效率。因此,当数据量大时,推荐使用数据并行算法。

    - Data Parallel

    • 传统的数据并行算法

      1. 水平切分数据集。
      2. 每个worker基于数据集构建局部特征直方图(Histogram)。
      3. 归并所有局部的特征直方图,得到全局直方图。
      4. 找到最优分裂信息,进行数据分裂。

      缺点:网络传输代价比较大,如果使用point-to-point的传输算法,每个worker的传输代价为O(#machine * #feature * #bin). 如果使用All Reduce并行算子,传输代价为O(2* #feature * #bin).

    • LightGBM的数据并行算法
      1. LightGBM算法使用Reduce Scatter并行算子归并来自不同worker的不同特征子集的直方图,然后在局部归并的直方图中找到最优局部分裂信息,最终同步找到最优的分裂信息。
      2. 除此之外,LightGBM使用直方图减法加快训练速度。我们只需要对其中一个子节点进行数据传输,另一个子节点可以通过histogram subtraction得到。
      3. LightGBM可以将传输代价降低为O(0.5 * #feature * #bin)。
    • 基于投票的并行算法
      基于投票机制的并行算法,是在每个worker中选出top k个分裂特征,然后将每个worker选出的k个特征进行汇总,并选出全局分裂特征,进行数据分裂。有理论证明,这种voting parallel以很大的概率选出实际最优的特征,因此不用担心top k的问题。

    下篇文章介绍一下LightGBM Data Parallel的Reduce Scatter并行算子,该并行传输算法非常有效的解决传输代价问题。

    展开全文
  • 同时考虑设计变量的不确定性影响,将序列优化及可靠性评估方法引入到并行子空间优化过程中,顺序执行可靠性分析和多学科设计优化以提高执行效率。在优化过程中应用响应面近似并不断提高模型精度,降低了计算成本。利用...
  • 在响应面构造上引入试验设计法,子空间优化中引入子空间设计的概念,系统级优化中引入Pareto遗传算法,提出了更加适合于气动结构多学科设计优化的基于Pareto遗传算法的并行子空间优化设计方法(CSSODM-PGA,...
  • 基于MPI的H.264并行编码代码移植与优化 范 文 洛阳理工学院计算机信息工程系 洛阳 471023 摘 要 H.264获得出色压缩效果和质量的代价是压缩编码算法复杂度的增加。为了寻求更高的编码速 度,集群并行计算被运用到...
    2010 03 25
    
    基于MPI的H.264并行编码代码移植与优化
    范 文
    洛阳理工学院计算机信息工程系 洛阳 471023
    摘 要 H.264获得出色压缩效果和质量的代价是压缩编码算法复杂度的增加。为了寻求更高的编码速
    度,集群并行计算被运用到H.264的视频编码计算中。分析H.264可实现并行计算的任务单元选择;采用
    了片(slice)级的H.264并行编码计算方法,实现了基于MPI并行环境的X264源代码移植;针对实验室的小
    型集群平台,通过测试给出较优的并行任务分配方案,结果表明对标清视频在分8片以上并行编码时能够
    达到实时编码的要求。
    关键词 H.264;视频编码;并行计算;MPI
    引言
    随着计算机、通信、广播等技术的发展,数字视
    频(Digital Video)已应用于许多领域,如可视电话、会
    议电视、安全监控、高清晰度电视(HDTV),视频点播
    (VOD)等。多媒体视频应用的广泛普及,高质量的视频
    服务市场潜力巨大。实时的高清晰视频编码传输技术成
    为视频发展重点。视频业务的实时应用,面临着视频图
    像的大数据量、有限的通信信道的传输率、存储容量及
    计算机的处理速度的瓶颈。如果单靠增加通信信道的带
    宽、存储器容量及提高计算机的运算速度,效果有限而
    且也不经济。而对视频数据进行高效的编码压缩,不仅
    可以提高通信传输效率也节省了存储空间。
    数字视频压缩技术在各种需求的推动下,不断得到
    发展和提高。由视频编码专家小组(VCEG)和运动图像
    专家小组(MPEG)成立的联合视频专家小组JVT (Joint
    Video Term)共同制定的H.26L标准草案,其成果成为
    MPEG-4的第十部分,于2002年底正式命名为H.264,
    并且成为ITU-T和MPEG联合专家组JVT制订的下一代
    视频编码标准AVC(Advanced Video Coding)的基础[1]。
    它具备很多以往同类标准没有的优点,适用范围广泛,
    发展潜力巨大。
    为了获得更好的视频编码效果,视频编码计算的复
    杂性也就随之极大的增加,它对计算机的处理能力要求
    也越来越高。仅依赖于单核计算机处理器速度的提高,
    现在还无法达到高清和标清视频的实时H.264编码压
    缩。因此需要寻求一种利用现有的资源能够更高效地完
    成复杂任务的方法:通过高速网络,充分利用网络连接
    的计算机资源,实现复杂问题的并行计算。本文研究利
    用MPI来实现视频编码的并行处理,实现H.264并行视
    频编码计算,从而有效提升了H.264编码的速度。在实
    时的高清、标清视频编码压缩方面,对H.264编码压缩
    代码的并行处理移植实现,是一个较新并具有应用价值
    的研究,这也是本论文研究的主要课题。
    1 并行计算
    并行计算,简单地讲就是在并行计算机或分布式计
    算机等高性能计算系统上所做的大型复杂计算,其物质
    基础是高性能并行计算机(包括分布式网络计算机)。并
    行计算的发展基于两方面的认识:第一,单处理机性能
    不可能满足大规模计算和工程问题计算的需求,而并行
    计算机则是实现高性能计算、解决挑战性问题的唯一途
    径;第二,同时性和并行性是客观物质世界存在的普遍
    属性,具有实际物理背景的计算问题在许多情况下都可
    划分为能够并行计算的多个子任务。
    实现并行算法的常用软件环境是操作系统( 如
    Research & Development
    研究与开发
    Research & Development
    26 信息通信技术
    L i n u x , Windows等)配合并行计算环境加上工具
    语言(如C, C++, Fortran)。并行计算环境随着近
    年来分布式M P P 系统与工作站集群系统的发展得
    到了迅速发展,相继出现了PVM,MPI,Express,
    Linda,PARMACS,P4,Nx和Zipcode等基于消息传递的
    并行计算环境,目前常用的是PVM和MPI。我们选用
    MPI并行环境进行研究。
    MPI(Message Passing Interface)是并行计算机的
    消息传递接口标准的简称,提供了一组可用于消息传
    递的通信原语。MPI的标准化开始于1992年4月29日至
    30在威吉尼亚的威廉姆斯堡召开的分布存储环境中消
    息传递标准的讨论会,由Dongarra、Hempel、Hey和
    Walker建议的初始草案,在1992年11月推出并在1993
    年2月完成了修订版,这就是MPI1.0。1995年6月推出
    了MPI的新版本MPI1.1,对原来的MPI作了进一步的
    修改完善和扩充。MPI仅仅提供并行库,而不是一门语
    言,是一种对原来的串行程序设计改动最小的并行化方
    法[2]。这样,原来的串行编译器也能够使用,不需要任
    何修改。编程者只需要在原来的串行程序中加入对并行
    库的调用,就可以实现并行程序设计。
    MPI库可以被Fortran77,Fortran90,C,C++调
    用,从语法上说它遵守所有对库函数/过程的调用规
    则,和一般的函数/过程没有什么区别。MPI是目前最
    重要的并行编程工具,它具有移植性好,功能强大,效
    率高等多种优点。
    2 H.264并行化编码分析与实现
    H.264的码流数据层次包括一个表头、一个或多
    个图像片及序列的结束标志码。如图1所示,视频序
    列(Sequence)是由一系列的图像(Picture)组成,每帧图
    像由一个或多个片(slice)组成,每个片又由多个宏块
    (Macroblock)组成[3]。
    为了追求更高的压缩效率,去除图像序列间时间冗
    余度,同时满足多媒体播放等随机存取要求,H.264将
    视频序列中的图像帧划分为I帧图像(帧内编码图像)、P
    帧图像(预测编码图像)和B帧图像(双向预测编码图像);
    组成图像的16×16大小的宏块(Macroblock)又可以分为
    4个8×8的块(Block)。在H.264中,组成片(Slice)的连
    续宏块是按照一定编码顺序排列的,Slice表示的是一个
    独立的编码单元,也就是说它不需要参考同一帧中其他
    Slice来进行编码。通过有效的调度算法,从以上这些数
    据结构中选择一个合适的并行任务单元,能够获得一个
    高效率的并行编码处理器[4]。
    主从模式并行处理的工作流程模型如图1所示。
    本论文试验环境为小型的工作站集群。工作站机群
    是将联网的多台工作站组成一个并行集群,适用于中等
    规模的并行系统,价格便宜、配置灵活,但规模及并行
    效率受网络设备的制约。所用的节点机器是由5台DELL
    工作站组成,由千兆交换机和千兆网卡连接组成的小型
    集群,采用Windows操作系统。每台工作站的配置为
    Intel Xeon DualCore CPU 5130 2.0GHz两颗、内存
    4G、千兆网卡。每台机器安装有MPI的MPICH-1.2.5
    实现版本。本文选择X264源代码作为实现H.264并行编
    码的原因,是由于X264中采用了一些算法优化,程序
    结构优化及MMX, SSE, SSE2等指令优化,对原本消
    耗较大的去块滤波器等做了较大程度的优化。
    具体实现过程如图2所示。
    3 结论
    移植后的并行H.264编码程序可以运行在不同的
    系统平台上。根据实验室使用的Windows平台小型集
    群,每个节点有两个双核2.0GHz CPU的特点,我们
    用多个不同的视频序列,采用不同的任务分配方式,测
    试并行编码统计数据。
    通过测试结果及实验分析,得出以下结论:影响
    大分辨率视频H.264并行编码加速比的一个主要原因是
    网络通信问题。提高并行编码速度的一种方法是做并
    行编码时先把要编码视频数据存放在各台节点机器上,
    让每个节点机器上运行的任务程序从本节点机器上读取
    相应的数据片进行编码。因为YUV的视频序列数据量
    很大,这种静态的数据获取可以节约大量的通信开销。
    但是这种静态的数据调用,对于要实现实时分发并行编
    研究与开发
    2010 03 27
    码是没有意义的,所以我们的H.264并行编码方案是直
    接从主机向各从机实时的分配图像帧片数据。由于要通
    过一个节点机器的网卡出口,同时向多台从机节点并发
    数据,所以主机网络发送就成为一个提高并行编码速度
    的瓶颈。虽然对于目前的720*576数据可以达到实时编
    码,但是更高分辨率的视频图像,数据增加必然给主机
    端的网络发送造成压力。这些可能需要双网卡的绑定,
    或者其他的数据获取方式,提高并行传输的数据量。
    实现并行编码还要根据不同的平台,实现不同的策
    略。如上述的实验室5台工作站组成的集群平台,根据
    它的特点我们得出适应并行编码的最佳条件:
    1) 当分配相同工作任务数量时,在主机上工作的
    任务数越多效率越高,因为每台机器是2个双核CPU相
    当于有4个核,可以同时执行4个任务。在主机上工作任
    务多就意味着可以尽量少的通过网络传输数据,节省整
    体的通信时间。
    2) 同样并行片编码任务数目时,在充分利用主机
    的处理器条件下,相同的任务数量分配机器数越多速度
    越快。因为H.264编码对内存的要求较高,当多个任务
    分配在一个节点机器上的不同CPU核时,在一个节点
    机器上各处理器共享内存,工作时对内存资源的需求造
    成了冲突。所以要获得高的并行效率,需要根据集群平
    台的实际情况优化任务分配策略,这也是同一个程序能
    获得不同并行效果的因素。
    3) 经过多组视频图像的测试,发现在8片时编码的
    平均速度为27.32fps,并且每组视频序列也都达到了实
    时编码的要求。
    在实验室5台并行机器能实现上述任意任务的分
    配,是由于我们可以写配置文件来指定任务工作方式、
    任务分配节点位置、数量。在这种小型的集群平台上我
    们可以按照我们的要求,最优地分配任务。学校集群平
    台上的实验结果与实验室5台有所不同,是因为我们不
    Research & Development
    图1 主从模式并行处理的工作模型
    28 信息通信技术
    图2 X264程序并行执行流程
    研究与开发
    2010 03 29
    作者简历
    H.264 Code Parallel Implementation and Optimization
    Based on MPI
    Fan Wen
    Computer and Information Engineering Department, Luoyang Institute of Science and
    Technology, Luo Yang 471023, China
    Abstract The cost of H.264 geting good coding effect and quality is algorithms complexity increased.
    The High Perfermance Parallel Computing was used in the H.264 video coding for getting faster
    speed, Choosing slice as a unit for H.264 Parallel Computing and implementing X264 codec Parallel
    Computing with MPI, then the best Parallel task work effi ciency based on lab´s cluster was got and test
    results indicated that the parallel coding speed of SD Video can meet real-time requirement when sliceses
    are more than 8.
    Keywords H.264; Video Coding; Parallel Computing; MPI
    范 文
    洛阳理工学院,计算机与信息工程系。
    能像实验室平台那样可以在主机上多分配执行任务,节
    省部分通信时间。学校的集群平台上完全是把每片数据
    都通过网络发送给从机节点进行编码计算,耗费网络通
    信时间较多,这是两个平台实验数据有差别的一个原
    因。学校这种规模较大,为众多公众服务的集群,我们
    不易按配置文件来指定任务在节点的工作方式,因为可
    能同时有别的用户在使用。对于不同的集群平台要根据
    实际情况优化并行任务。
    参考文献
    [1]
    [2]
    [3]
    [4]
    Iain E.G.Richardson.H.264 and MPEG-4
    Video Compression Wiley.2003
    都志辉.高性能计算之并行编程技术—MPI并行程
    序设计.北京:清华大学出版社,2001
    I T U - T R e c . H . 2 6 4 / I S O / I E C 1 1 4 9 6 - 1 0 .
    Advanced Video Coding.Final Committee
    Draft,Document JVT-F100,2002.12
    孙彦辉.基于H_264编码码率控制方法研究[D].中
    南大学大学硕士学位论文,2008
    Research & Development
    展开全文
  •  给定并行算法,采用并行程序设计平台,通过并行实现获得实际可运行的并行程序后,一个重要的工作就是,在并行计算机上运行该程序,评价该程序的实际性能,揭示性能瓶颈,指导程序的性能优化。性能评价和优化是设计...
  • 针对并行全比较算法存在的高空间复杂度问题,提出一种适用于模块化多电平换流器(MMC)实时仿真的电容电压均衡优化方法。在模块电容电压的排序方面,采用分组排序的均压策略,组内子模块采用并行全比较算法以减少...
  • 并行计算复习第四篇 并行计算软件支撑:并行编程
  • 并行数据库

    千次阅读 2006-03-03 10:06:00
    并行数据库系统是新一代高性能的书局库系统,致力于开发数据库操作的时间并行性和空间并行性,是当今研究热点之一。并行数据库技术起源于20世纪70年代的数据库机研究,希望通过硬件实现关系操作的某些功能。研究主要...
  • 嵌入式ARM多核处理器并行化方法

    千次阅读 2017-08-24 15:06:05
    程序并行优化目前在PC平台上有一定运用,但在嵌入式平台上还很少,另外,嵌入式多核处理器与PC平台多核处理器有很大不同,因此不能直接将PC平台的并行优化方法应用到嵌人式平台。本文分别从任务并行和缓存优化两...
  • 计算机并行计算考试重点总结

    千次阅读 2016-12-06 22:21:28
    **计算机体系结构由程序设计者看到的...计算机系统的层次结构 现代并行计算机的组成 ü硬件核心:处理机、存储器和外围设备组成了计算机系统。 ü互连:外围设备可以直接或通过局域网和广域网与主机相连。 ü映射
  • 这篇文章就计算体系结构展开讨论,从计算框架特别是异构系统下的计算模式和并行计算结构设计的角度,分析异构并行计算架构设计和软件编程技术。 并行计算体系结构 不同层次的并行化设计已成为现代计算体系设计的...
  • 关于并行

    千次阅读 2015-07-05 17:13:33
    所谓并行性(parallelism)是指计算机系统在同一时刻或者同一时间间隔内进行多种运算或操作。只要在时间上相互重叠,就存在并行性。它包括同时性与并发性。 同时性(simultaneity):两个或以上的事件在同一时刻发生。 ...
  • 并行计算基础

    千次阅读 2012-11-16 09:51:02
    并行计算是一门交叉学科,涵盖的内容非常广泛,包括并行机体系结构、编译系统、并行算法、并行编程、并行软件技术、并行性能优化与评价、并行应用等。从交叉学科的角度,并行计算可以定义为连接并行机系统和实际应用...
  • MySQL优化技巧

    万次阅读 多人点赞 2017-09-10 14:14:00
    MySQL优化三大方向① 优化MySQL所在服务器内核(此优化一般由运维人员完成)。② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行参数调整。③ 对SQL语句以及表优化。MySQL参数优化1:MySQL 默认的最大...
  • oracle 并行原理

    千次阅读 2013-09-17 16:26:19
    oracle并行是一个很好的机制,但是他是不是一直是有效的了,那么我们需要了解它的一些细节,本篇结合官方文档,简单的描述了oracle的并行原理,希望对大家有帮助
  • PostgreSQL并行查询介绍

    千次阅读 2017-06-14 10:28:00
    【导语】2016年4月,PostgreSQL社区发布了PostgreSQL 9.6 Beta 1,迎来了并行查询(Parallel Query)这个新特性。在追求高性能计算和查询的大数据时代,能提升性能的特性都会成为一个新的热门话题。作为关注...
  • Python并行处理

    万次阅读 2017-11-02 14:37:36
    该规则的典型范例就是使用进程并行执行。这背后的想法就是: 单个进程包含了可以单独运行的代码段 某些代码段可以同时运行,因此原则上允许并行 使用现代处理器和操作系统的特性,例如可以使用处理器的...
  • 将波前校正器光学孔径分成多块子区域, 每块区域对应着的所有驱动器作为一个整体控制单元, 从形式上可以得到一个空间分辨率较低的分区域波前校正器。该校正器与原校正器同步工作, 并采用随机并行梯度下降算法对同一...
  • 在第五讲中我们学习了GPU三个重要的基础并行算法: Reduce, Scan 和 Histogram,分析了 其作用与串并行实现方法。 在第六讲中,本文以冒泡排序 Bubble Sort、归并排序 Merge Sort 和排序网络中的双调排序 Bitonic ...
  • 计算机指令级并行

    千次阅读 2012-12-17 22:17:46
    提高桌面级计算机指令级并行度的方法 ... 作者:未知 厚朴教育来源:转载 点击数:525 更新时间:2011-7-24 ... 并行计算从其并行的粒度来看,分为指令级、循环级、过程级、程序级、作业级;而从并行
  • SQL优化最干货总结 - MySQL(2020最新版)

    万次阅读 多人点赞 2020-06-29 16:55:47
    MySQL - SQL优化干货总结(吐血版),别辜负了自己的梦想,欢迎白嫖、点赞、收藏。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,791
精华内容 26,316
关键字:

并行子空间优化