设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?2 c! A7 U# _- j/ q/ k1 u1 \

    : x4 N0 f  w0 {) ?: |8 _3 q2 d6 o8 [自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ) T) N: B$ N, O+ }1 j% o, D5 I! w5 v, I' f+ Y4 p9 k& d
    速度优化问题真的很有意思啊。
    7 |5 G* c8 o' E4 x- o/ Q; w: W3 E
    ' c* h: w3 A. L9 V% B欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?8 K7 q; F6 s* v, d2 t( L
    把代码贴上来看看?
    . v" B- o: D* J
    & b& `' L+ Q" M) f1 W0 y难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-24 07:04
  • 签到天数: 126 天

    [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 编辑 ! l8 s/ v# \, w" N. u
    数值分析 发表于 2022-9-24 23:04; u8 i$ B8 t1 {, @+ x) m7 |
    拉下来?拉多少?
    . n: }/ U3 l5 s* [! U把代码贴上来看看?

    ) a; I! T8 L0 b/ _) V6 n" x' {- V; T$ A+ H$ F
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / X( \* H- v3 q# l5 {& R4 b& R9 ?{* w6 M, }$ ]) Y$ x+ G
            comp temp, xtimesy;
    ) H' Z8 E5 t/ E1 a        xtimesy.re = 0;0 A" C( m  P) b7 E4 E# i
            xtimesy.im = 0;* W- X/ V+ T1 t: e2 ^; R$ u3 v
            int j0 = lenB - 1;) A7 u% a- Y1 E  b4 Y* {$ L
            int    i, j, i1, reali;& P1 a( @8 O, ?) y' @7 L4 G
            if (lenA % 2 == 1)
    0 r# S5 Z* `/ E3 O                reali = lenA + 1;- I# J) _& B# C& F
            else% s4 d- j+ N! a# G* @
                    reali = lenA;
    . e4 T7 n$ J0 T5 h        reali /= 2;- [5 x4 h9 T* m" J, b) U, X

    ( d9 X. Q- i( o0 M- o- c: D, H# g        int nconv = reali + lenB;
    ! c, @5 |/ ~6 j4 C0 d* ?        //#pragma omp parallel for/ U  ?& W) [; [0 G
            for (i = reali; i < nconv; i++)* `. Z! C! o) A" a
            {
    5 r& |% p  E  Y7 Z+ I                temp.re = 0;% Z8 x1 Y( F! ~) M
                    temp.im = 0;
    " u& }9 \6 U0 ?. W9 e( K) c7 H                i1 = i;. U, i0 s) V% W3 n- P% i% V
                    for (j = j0; j >= 0; j--)' R" f, e: M7 ?* Q: V2 ^2 z5 p7 f
                    {1 M/ b  n4 }& x3 i' s- q0 @
                            /* floating date operation */
    $ `' c% C3 w3 N( C9 Z                }

    ) m0 `+ i2 c, j" x. J- N( m        }9 g% B" }: L3 E; ?: B1 U) Q) y
    }
    * `" K9 C1 F5 U! E  ]. ?+ V  Q3 `
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 W; I4 f. {  {% O! H3 S
    $ H2 [! i% m* W红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    7 E: B. M$ ?" g现在call xcorr 100次,耗时78s.0 X$ F: ?" a+ E9 w9 a
    + e: F' U- r& A6 o; c3 @" a6 x
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. - L5 m2 y( z" E

    - v' }' c, j: h* e% Z/ B
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33! G! A7 g8 @% q1 K1 G
    Maybe Debug mode?
    0 p6 y8 ]. y' g# r4 e2 T

    $ Y2 ~& |$ A; t; \$ A5 E7 ?不应该,看我上面的回复。6 K& S! b# E9 M/ M' x
    0 ^1 l. i* G' J
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ; |2 g( d! F9 k6 v1 V. k: i1 r
    雷达 发表于 2022-9-24 23:54. i  ]- l5 ^/ _& X" n
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : R$ M" r9 G$ p$ \5 s{4 _- L4 }" n4 n9 S: y) B& S; c( Y( p
            comp temp, xtimesy;

    9 k+ V+ b2 S* b: E8 ~8 V: W
    4 s2 a  F9 c5 \1 S$ g这个不是这么比的吧。。。$ `( k% R2 O$ K" V+ k
    ! Z# f  X+ y/ @3 K3 g7 d
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。( A# j1 m0 n/ ?/ t% m$ b7 }9 P
    ( O/ M5 G8 l+ [3 p9 W
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    0 u, c* N. t! T- f' K$ H2 U! E
    数值分析 发表于 2022-9-25 00:20, O5 }/ A* }6 p" [! j* v' N
    这个不是这么比的吧。。。
    0 p7 z9 z: m' S0 @  x- J( j
    : E& ^' B. {' }" [, r3 @您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    $ a- L# w" E1 ?9 f
    ' C9 @) ]; W+ T" S8 r2 k1 U3 c1 B
    有道理。
    1 [# g# Y! i& I  ]5 w, D所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    : F2 @- f- v; X. y/ d2 D
    " Y8 \: _- l% G/ }( _/ m9 U/ b我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46# u' `+ W# Z2 v- l) O! S$ L
    有道理。) r  K: ?4 j) B. ?0 `( o' d: M
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 i* _8 z7 \  {8 W. L0 l, a你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ; t/ w" P; G/ MWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:207 ~: c* y( M, l* x  ^/ f& u
    这个不是这么比的吧。。。/ \. q4 K! y( f, y- z. R, P- W* p
    ) l3 a5 @" }8 r4 U0 t1 c1 V
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    - e7 |3 b/ [9 s+ z
    9 e' ~9 a* A+ m7 U( h% ~' M, q现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    7 k" N+ O% Q3 G% ]% u3 d! p: l
    沉宝 发表于 2022-9-25 01:48
    : s4 I; j. |3 I4 U现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    $ m$ }+ U" a3 a- Q. \/ D/ U
    " M* R! X1 K. _9 ]$ g是的,兄台说的对。
    ! Z. r/ {0 L; `1 J) g- B7 h
    ; e/ D1 j9 l/ F! H$ i* O其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。; S: b% v$ b% b9 ~6 d* Y1 a

    / Q) O/ Y+ r7 V! z雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ' L  D& {, U7 |5 R3 v7 h! D7 f& j: _$ z% S6 w* k( n" n
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。6 ~+ x2 d7 g0 H" \; P

      Q, C( f+ e: ^" P; B当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 * v1 S$ _& T6 x/ Z  `; Z
    沉宝 发表于 2022-9-25 01:27; V2 ]0 t8 _$ z# D) m$ Y
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ' x, M2 M& g5 ^  a" m, \8 p& ]8 L9 M/ Q! _# Z% L
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。' e; k% @: t) S- {
    2 F# \( i8 P- v
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    " ]6 U, r, b  c# {' }, Q+ q又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 ~$ v7 c; d. ?2 p5 s: G- t8 Q时间差一倍的结果可以接受。
    5 Z, h- {! }- W: T' C) Y1 Q2 y) z4 L
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 6 |/ ?0 c" P9 l5 _$ i6 c2 w$ v
    雷达 发表于 2022-9-25 04:478 `" o. f4 r% B0 t) P" B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( x* i, f% G: ^
    + ]0 y/ Y0 \0 O
    % ^& \) v7 \& F

    . y5 z7 u$ Z( _8 ^1 ]& z+ a能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    & n4 F6 [+ I% a
    数值分析 发表于 2022-9-25 14:58( Q* ]+ c! o8 F) `5 P
    能不能把这个也贴上来,看看和上一个有什么不同?

    ' Q  |! R  ~) \( Y/ q: y理了理思路,重新做了一个测试。
    8 j0 m0 E9 b, r; n2 A& C做了两个 vector 和 两个 float *, 都长 1000007 e4 y/ g* O" V, ]$ a+ o2 T
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    7 M8 i1 K" z& ?2 N- r; q! [! k& V' ?" ~4 a' J. K
    内循环试了4种方法,5 l; A0 m1 A% ?+ A
    1. 直接调用 vector inner_product 247s 6 j5 h) A1 ?5 E' }0 l
    2. vector 循环点乘累加 237s
    ; L/ p  c3 _& }+ g2 I( M. M3. float * 循环点乘累加 204s
    % {- S) n$ u* D) [! G' q4. 空循环 100000 次 202s, Z: c) O" \' ?  o
    ; v2 a, t, z) w  O* N% r- j* O  |
    不做内循环 200s
    $ u& O, t9 w/ I: Y
    ! I8 L3 R0 i3 s. B7 Y6 T你昨天说的对,内循环本身占比是很小的,大头在其他处理。; T* r+ M% L7 W2 L5 y+ C' E; P
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    * i# }. A, s0 A, Z, ^$ d8 A
    ; G  Y6 l% A1 L5 f' x* N2 x至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    6 P+ b( y& e! c" _. O3 z0 E' U
    9 _3 y2 J1 P7 K(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL). l5 U1 E* q1 C

    ; ^3 k  d; S1 p. ^( ^  ?4 Y
            std::vector < float > vec1(N);
    ' r! ^% |: P. K' m- ^9 b        std::vector < float > vec2(N);
    - s8 w' W) k2 H        float* b1 = new float[N];
    " ~0 I$ z) V( ?( D/ n        float* b2 = new float[N];( P8 G1 k$ q' J. K4 ^: v; C- f
    ' ]& v% P+ g3 C9 ?8 i
            for (int j = 0; j < 6000; j++)+ n2 R% v% [7 B+ f. z
            {
      n3 k! J' e: I# Y2 |- u9 q                std::generate(vec1.begin(), vec1.end(), []() {
      N) H4 E* p# z% q# z! A                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    5 h6 `5 c* H. k$ J0 `' H2 w                        });0 u  I; D9 t3 x7 X' i

    ' ~; U! x  j+ _# P5 p9 G6 L                std::generate(vec2.begin(), vec2.end(), []() {
    8 U9 w, S- U* O. ^  }0 g                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;/ c) @# Q* `/ g3 k- w
                            });
    / ^9 O" N9 }2 T2 F% z1 r- s
    7 Y. x0 d0 Q: g( W) F7 O, S3 }2 L                for (size_t jj = 0; jj < vec1.size(); jj++)
    - K8 Q/ h5 z# X                {5 o6 J( N1 A* o# @0 F
                            b1[jj] = vec1[jj];! u) p8 |" l# A; q- q: X: t( _& |
                    }
    6 k. m8 ?1 L  D  y; L: H. |* |0 c" L* F7 f) o! E9 ?8 v1 T0 |
                    for (size_t jj = 0; jj < vec2.size(); jj++)' o  t4 p0 Y. F' J  f7 Y. M
                    {* E# q2 v) N4 W$ ^
                            b2[jj] = vec2[jj];! V5 C  p, c. c/ s8 x% N
                    }
    , q- S2 y, [8 q
    1 r7 h: o! Y  R                //Method - 1  N=100000 247s  
    ! R! v; N. _  x                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! `- `6 H- q# k2 c: H
                                    % n$ s/ Y) I' h6 {4 h% \0 l' C9 o
                    //Method - 2  N=100000  237s6 h+ }" M* X0 Y1 @% V
                    /*
    . R  n8 f; W/ M( |- J, R                for (int jj = 0; jj < N ; jj++)
    # N9 L3 h5 J0 K/ `" p                {
    4 p! a' s1 \9 A8 ~5 \                        fresult += vec1[jj] * vec2[jj];7 [; w7 C& ^% |" _) N6 n4 @/ W
                    }: G9 ]6 x) c3 N0 i1 n
                    */- K% n- C/ B! F: L1 `! U/ m
                                    
    2 v) l! B6 I. R( V- r5 |6 x                //Method - 3  N=100000 204s
    9 e+ ~/ m# ]' u                /*6 b: d0 m; e. `( {
                    for (int jj = 0; jj < N; jj++)
    7 i% l: |1 N# u3 N5 m7 |: j) y2 M                {
    , ?% ~* U& `+ w8 |# ?1 B                        fresult += b1[jj] * b2[jj];+ T0 w6 K* ^7 l( F2 i
                    }
    . A! @" X1 k1 B% g: ~                */- t4 u5 l$ w, g$ L" _
      J: p5 t. }* V- {
                    //Method - 4   202s% v+ T3 w; N5 {8 R& ^3 A/ x
                    /*
    - u' N% R* `1 ~5 l2 ?. v  c                for (int jj = 0; jj < N; jj++). `* Y9 @: {' C
                    {1 f" Q  v" y. ]6 \* k. \% d% h- E1 X
                            
    + l4 U3 {5 J7 Q( k                }
    . l2 P5 y: P' G! Y  r& C                */8 a' K1 E$ w3 M2 J+ a
                    //comment out all methods, N=100000  202s                + A# J% q4 u1 q& p) H/ k, q4 b7 L
            }1 F! ^# ?1 z: D+ k, C4 Q* v
    1 c3 s# b5 r0 a9 j3 H
            delete []b1;$ v, R+ G5 N5 |& R, I
            delete []b2;
    : I5 x; K5 l  ?4 s
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    0 |/ ]  y! |1 V1 L
    8 k+ t3 ]6 t1 ^7 k, ], B你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?& H6 i$ ~! p7 O7 T, N1 m; f
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15& @6 s+ D1 J0 Z) I# h( q$ L. c: O
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 `: R& `+ x* I

    " v* ]% [& }0 d你第二个试验里面的j在循环里面又重新定义 ...
    & R: C4 z5 q$ a# Y7 h+ p
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    $ ]. O* l7 W+ g( x1 E( e: t+ c1 T5 X% i. i6 A# r% B
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16: N, _; c7 S6 v0 v
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL' Y* \) g9 @& m8 r* L

    " S4 u; z# m- D不和它 ...

    + H2 A3 d6 R% ~# q4 l+ K
    8 d. s. U) @, T0 c5 t" n- w7 p$ Z不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。' ~5 b- B" y) |( U4 F
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    - G$ Z1 I( Z( a$ L! [void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) v" H/ r* G. z$ b4 D9 Y/ i) S# f{, ?( R- [2 a; y5 |: g% R+ ?
            comp temp, xtimesy;
    6 x, H) [; s% B; R) p! }) J
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。" F* o3 D' C: b( a  a2 D9 y( O
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    6 Q4 H2 i1 y; D) O9 J* R) UVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-1 11:48 , Processed in 0.072249 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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