设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 6676|回复: 25
打印 上一主题 下一主题

[信息技术] C++ 提速的新发现

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?9 ~( g. m; b+ u9 V& j

    3 l: f1 r/ y: K( W! t, x2 s  q自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。0 H: w: `2 r$ M! F) Z4 t
    " l' ]! V  }; Y  j
    速度优化问题真的很有意思啊。: w1 ?9 g# x% x: J3 {

    $ G# {& ]: J" b9 B, q欢迎大家继续讨论

    评分

    参与人数 2爱元 +8 收起 理由
    helloworld + 4
    住在乡下 + 4 涨姿势

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?" }, F; X: {6 D8 w( k# d
    把代码贴上来看看?
    6 S; e9 p/ \  h* g* Z) F, d
    4 y* e3 ]% s- \% N# y! e7 |难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    ; d8 b0 P  [! n* B' ], G, j4 ~
    数值分析 发表于 2022-9-24 23:04
    5 u2 Z  c- r' @4 ?, P6 _* c. F拉下来?拉多少?
    * F" e! Z' x8 l7 R; G把代码贴上来看看?

    ) C  b. i. Q  P& q* I
    : Y$ t8 K2 i* g# V! _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! B; x$ J# t7 n7 i{
    7 h3 p0 ^) \+ t% ^9 U        comp temp, xtimesy;' J$ g# W; Q, r. R7 `- t% T# ~
            xtimesy.re = 0;
    % S+ L; p& z) O+ T6 z. C& i3 Q% M        xtimesy.im = 0;- B; U9 K6 w; o% L9 h
            int j0 = lenB - 1;9 n' m7 q* r4 \: ~
            int    i, j, i1, reali;# x0 g& U# g3 @3 v) U9 C
            if (lenA % 2 == 1)
    / Z0 w9 I6 Y, `5 }                reali = lenA + 1;0 [) N6 f: H& Q) L% P8 X- G
            else7 g( x% C8 }; o* Z5 D( z3 w
                    reali = lenA;
    , h* B/ s2 k8 ^! M' z4 o        reali /= 2;
    ! l# z8 C( W  r. f- @# n  f8 {0 F) M+ @( D: A% g; `/ H- K
            int nconv = reali + lenB;" {0 h2 j0 U5 k4 P3 ]
            //#pragma omp parallel for
    0 n) ^8 w2 ?9 G! L( b1 {        for (i = reali; i < nconv; i++): E, Y& P7 J. P; l
            {
    8 ~0 A( S9 a# ^5 Y2 j+ I  a                temp.re = 0;( L, @7 m4 h2 `+ U* t( t
                    temp.im = 0;) a. e( F5 i6 Y$ R* n" G. ?+ }
                    i1 = i;0 R: e4 v+ E4 q1 U% N) \
                    for (j = j0; j >= 0; j--)# ~. }9 V/ s4 X$ k
                    {
    3 e6 k) q6 i3 z  n' W                        /* floating date operation */
    2 F6 Z! ^8 P" b/ \                }

    ( p  Z* w) K- D: K6 V3 e$ y6 P        }
    6 Y* I4 T& f, }2 i2 K& h& Y}
    ' W2 J8 e' h& l7 _4 \. c7 a: p, \3 ^9 U& y$ ?
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样) R1 T4 M9 d1 f7 v' o. ?

    5 X; z9 [$ A- N/ Z; }红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    9 T& s+ V+ c+ G1 N, f现在call xcorr 100次,耗时78s./ n) Y* |& `4 p# G0 h
    , f( {4 k! Q+ J( y, D
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. - f0 }' n( I: o5 u

    . _* l  [! Y; N' k7 m
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:338 l$ M. ?2 k3 m- _# y" z
    Maybe Debug mode?

      D4 Y( N, o  t; [6 ~* ~. V
    * z1 |* E' j  z  o6 f  K不应该,看我上面的回复。/ }/ g& F1 n6 L* k2 m; n
    : q* d. {& `4 g( N
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 9 [3 Z9 I6 w, y! q: o+ k) }
    雷达 发表于 2022-9-24 23:54
    - z- `1 T3 G5 r6 E9 b9 Gvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) f) G9 P* h8 l{9 A; [9 c4 `( H& L  l
            comp temp, xtimesy;
    , ?2 K3 {  F0 M' f  Q& v" R; {

    1 C3 B4 X9 E6 e4 D( B这个不是这么比的吧。。。7 E+ A' |* p/ ]' e) c. h2 @

    ; j0 S4 W$ J8 O' t' r. j您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      M8 ~  @" ?7 X5 X( `9 H$ u
    7 V: V9 e# }8 T) \而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 6 U: X( ~' x" i
    数值分析 发表于 2022-9-25 00:20
    8 f3 w. H% q$ w这个不是这么比的吧。。。
    ! @/ `  f  l5 _/ c! C+ w+ Z. ^( E- |( C
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    , u: ^3 ~+ }& }/ r8 ]; [
    2 S: J3 c6 b( U8 L; o6 R有道理。, n- `' u# @; p% e0 K$ v
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ X$ z% c% d" ~/ A9 [( y, P' M$ d! {# N$ q' k
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    " k) M& j1 `- `9 ]有道理。) V7 z! y: W- x7 M
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    5 P, w5 K/ y9 t2 d
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    % E3 N! X/ M# s) z0 g  Y' bWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    + g9 G" `) P" a! v% z这个不是这么比的吧。。。) e& _  K  d$ ?

    : I# U2 x5 _6 X, v' S您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    + ?& D8 r4 c$ l  q, D5 v
    6 O# _. `- o( N3 q
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    5 g& h' r7 H: B. H( T
    沉宝 发表于 2022-9-25 01:48
    # d% k" r! n# S" r现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    7 q: U* }9 C& f$ Q0 I* K- `. }* z
    0 y! n$ v; s1 c, \. I2 f# D
    是的,兄台说的对。
    6 Q$ z+ E1 t  d9 k( r& K( F3 x1 D
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。" t4 Y" k6 [# W  u+ p; @

    1 W" N9 X  J7 c雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    & Q! p0 {# c( N; k+ x  A3 P6 L8 w+ J( |) v6 N6 T* D2 @/ p4 @
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    - n  l) b  E/ Z( w; c
    ! c+ ]: t8 q6 g: o当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 $ M$ ?1 y" _& Y# [& ^% f
    沉宝 发表于 2022-9-25 01:27
    $ k( ]6 Z; G) r  |% }. D% V. ~你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
      Z3 s1 |& F# w& k

    6 S: Q% j& n" y- r) x' D又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。8 D/ j0 P2 z6 D5 m5 k% G( B5 t

    . h1 q6 q9 W) u0 y' z  u- n我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:477 X( \" U% C- E- T& V2 R* D
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    0 Q! T' w( |" `7 W7 K" a3 d
    时间差一倍的结果可以接受。+ P9 u8 n2 h6 {5 M

    # ?- D- {" _8 z, J$ x4 p9 e你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    8 G3 c; r, f. y% M2 \0 N
    雷达 发表于 2022-9-25 04:47
    ' k* E5 s, T  Z3 n) Z7 p又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    $ P0 D7 N: k) ?0 a
    , F* }4 W: V# p2 Y# h9 J4 h- B: b2 H( t  \% S) k6 T, @6 a

    " n6 s/ t6 r+ M# T0 K* g& L能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    1 t# A( k9 ?4 p$ A* C' k$ c- E
    数值分析 发表于 2022-9-25 14:58
    8 \; z# g  e' f3 {能不能把这个也贴上来,看看和上一个有什么不同?

    7 D$ V0 ?  c/ g理了理思路,重新做了一个测试。
    0 c! S2 y; g3 H: H" [8 g9 w; o做了两个 vector 和 两个 float *, 都长 100000' O$ B6 r6 i* E' a
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 R3 v5 u7 u+ J/ q' L2 N

    ! j5 H+ b8 d& Y3 D5 q内循环试了4种方法,
    5 ]% B: n1 s0 {1. 直接调用 vector inner_product 247s
    * z. Y6 B, N* p2 [2. vector 循环点乘累加 237s- h: l) b" I4 U% q( X
    3. float * 循环点乘累加 204s
    , f/ i2 i+ K4 m$ K# r/ [/ t2 _4. 空循环 100000 次 202s
    ; ~8 w% i$ Q5 H8 R5 o9 v8 {: _7 t* z: k# ^5 |
    不做内循环 200s7 v  q4 ?. r- ?' R" J

    ' v: W9 [2 K9 V- s" I你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    : ]) ~! h; f1 i( D另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* {: |$ g8 Q- c" Q. l5 v$ x8 E

    $ \3 V' o: l! k" _. K3 }- }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# G. v; o: o8 ]/ _$ c. v( K2 e

    ! B& U; H/ _" v: y(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)5 B* r, K8 ]$ i& P1 S( \( W

      B' Y, t/ z# C4 [1 v9 m; F( `) X4 _
            std::vector < float > vec1(N);
    " [4 F4 _9 f- k: W        std::vector < float > vec2(N);7 U- [" ]6 C( U  \0 [$ v5 J
            float* b1 = new float[N];& B( }- N* n4 v& a9 g+ H5 N7 v- q
            float* b2 = new float[N];" K: L& T! y% r4 ]/ G# U( w

    3 @$ J3 h; W1 f7 @        for (int j = 0; j < 6000; j++)
    * |/ R  q, S( p* |        {
    ! H* e. c- |. N7 W$ u9 z- n) h/ O                std::generate(vec1.begin(), vec1.end(), []() {
    " Q. _, c" h( v/ a7 L                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" r2 ?  B4 z" \
                            });
    4 }: f7 |  D" Y2 q- m
    ; N3 U6 y$ I2 S9 @, ~& a                std::generate(vec2.begin(), vec2.end(), []() {6 }0 c2 O0 X, i& c% A
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 B, |6 `+ T- M3 K                        });
    - `) k0 T! E2 c! O9 y- {
    + k* Z# `7 |" x, f& p; |1 k" Y                for (size_t jj = 0; jj < vec1.size(); jj++)5 w6 x% X& X, `
                    {
    & e5 U, O7 r: D' T  M7 L. \8 p                        b1[jj] = vec1[jj];& }7 ]- d  m9 d
                    }8 K" K4 Q0 L5 T& |2 n

    - J% u- K$ c. g/ q1 A4 \8 ]& L+ t                for (size_t jj = 0; jj < vec2.size(); jj++)
    5 O2 O* W8 r8 a  t: A' F2 I5 Q                {& k5 \+ K4 [) m/ ^8 X0 P
                            b2[jj] = vec2[jj];; y5 Z0 j% U* D% A( T2 D
                    }
    7 F( f$ P6 A9 v/ c: w! G
    7 o8 ~$ x, G( h$ ^. I3 V% W. j- f4 r                //Method - 1  N=100000 247s  ; |0 E. {' g6 [: V  @
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    # Z/ t. O+ s, d1 R+ D2 A                                8 L4 g: F3 |2 ~
                    //Method - 2  N=100000  237s/ f3 k' p; \; b9 _5 P; k
                    /*1 k5 r# _9 W+ f" A3 L7 N( F: A. P4 ~
                    for (int jj = 0; jj < N ; jj++)5 e4 l; f5 p$ W# D" g( E  {0 i
                    {& ]: l' g3 w* q0 N3 d. j
                            fresult += vec1[jj] * vec2[jj];; p% q& ~. v& s% I& n7 c
                    }8 _! @* ^5 W& U; b
                    */
      z/ ?1 q2 E3 x0 E! f1 x5 A                                7 D) D7 b% |2 J$ H! `( u' ]
                    //Method - 3  N=100000 204s
    1 [: W. W/ f, u8 N0 ?                /*
    6 C) {6 Z! X  j; y5 L1 o                for (int jj = 0; jj < N; jj++)8 N; E7 t3 ~9 G6 I& r
                    {6 D1 t, W/ X9 P4 n  R+ u2 |. }  c
                            fresult += b1[jj] * b2[jj];5 [" Y0 n( x/ L: a; U$ [
                    }4 O/ Q. n. G2 r2 e6 C. T& C  K
                    */
    ' R# F+ `$ ?- L* _2 Q, t- ^# F% ?) l' \& U
                    //Method - 4   202s
    + ^$ d, q4 T+ _                /*
    2 X8 ?; Q: B' }0 ]: n/ F6 I                for (int jj = 0; jj < N; jj++): s2 p7 P6 \* K  n4 ~5 b
                    {8 k) l7 H5 Y1 v% g/ [1 R
                            
    , y4 m; @0 o+ J( F* H) c/ P( y4 c) w                }
    9 J; a" u" i* n9 R0 j$ P                */
    3 w; j8 C2 h, G  ~+ n# l; S                //comment out all methods, N=100000  202s               
    1 Y$ r$ n3 m3 k& P        }
    1 |: [& q  b* n/ I& @+ W: ^' k, ]. ~, n" f8 \
            delete []b1;
    $ d. T& J1 U" L$ x        delete []b2;
    % g5 w3 S+ e4 n) @* d5 v# o' [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 _. g5 Q: l, B  }! H7 ]. {
    ' H& \& N, B' G- G5 t4 H+ e. j
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    # B$ ~: c$ ?: m2 o0 R) C1 {! O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ! ^* y# \( l' T$ R, p$ L6 \& h瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ; ?/ k6 x8 x: n( V7 s2 W
    9 q; W; s5 P3 k$ W, J, P" J, B你第二个试验里面的j在循环里面又重新定义 ...
      `! r, E) @9 ^7 t9 x5 s0 V; I
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) p& A  q) k/ F; e' P3 O
    # D( y5 u3 U% `0 Q
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:161 \2 C; j4 T2 N5 ^! [# B& N. f$ A  \
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & k) u9 b/ E- D  L* X( w1 o
    , ]; B' b3 X! K8 {7 P不和它 ...
    ( Q7 ?+ O) ~, J) \, s$ `: p
    , Q& M& i! z& _5 d8 z7 t# U) V
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。/ L3 r2 ~( Q1 [/ c
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2022-9-27 07:25:57 | 只看该作者
    一个无关问题,为什么爱坛的帖子里在我这里有好些奇怪的东东在里面,是防拷贝措施吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54; t- u  }1 X: X5 [: ~8 Z
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 ^7 X# z7 S) Y{; i3 O/ A( a" _
            comp temp, xtimesy;
    % [( u" c' E( h8 G: `2 U
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。7 y) L% e3 u  g9 ^: V
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    # X! N1 J1 n. a+ Y; K% AVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2025-12-17 14:14 , Processed in 0.038487 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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