设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?2 E6 F8 F3 _) V3 ]% G" J/ l

    $ Q7 |9 x2 ]2 S$ Z, H自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。" g% u! G' m9 D
    * o6 k! V+ ~0 r# S3 Y
    速度优化问题真的很有意思啊。
    " A7 p' H/ E& x* d2 @/ q* p& i2 N
    ; L' W- a" |2 ?) Z3 Z( Q0 E欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?1 I. x' t! N# _, k( B
    把代码贴上来看看?" B& |; t" w# i0 b4 R, e. ?
    : j# I+ Z2 t/ x  l$ y8 B" O2 k, z
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    + A2 ?7 z" x& ~9 J: g
    数值分析 发表于 2022-9-24 23:04
    1 h8 A9 f  P6 l' w0 l# L6 l- r拉下来?拉多少?
    8 I- }# ?$ H8 S5 i- S把代码贴上来看看?

    2 P- e1 F! {' v3 M  o
    $ D1 S% V' }7 ?void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 K4 ], Z& e7 k4 u6 R+ |( D{# h/ c4 k5 Y& z
            comp temp, xtimesy;; B9 K$ R' P! `: ]5 C, @' l) L" X
            xtimesy.re = 0;! f8 M3 \" \! T5 L8 x
            xtimesy.im = 0;
    . G0 h, H4 @; {9 ^' o2 [; H        int j0 = lenB - 1;
    ; `- W2 ]8 k& Z) c+ {        int    i, j, i1, reali;  q+ U& [1 t$ ?5 E1 d% x7 D3 v
            if (lenA % 2 == 1)
    : y- u- X  i; p. I8 j9 N' ^                reali = lenA + 1;
    7 Z! E4 a( T5 L8 ?        else
    # y) Z9 p2 |6 r, p0 D' e                reali = lenA;
    , k4 X3 ~/ D) Q) E6 i- \        reali /= 2;3 }7 T+ |+ [/ {* @! U  [
    ' ~2 K  B2 E- q
            int nconv = reali + lenB;6 h2 \- {9 z1 T: \0 k- n
            //#pragma omp parallel for
    " P* l2 P4 |- P' y4 Z) ?( O5 t        for (i = reali; i < nconv; i++)
    5 t+ ]% W) h& m: J4 J* Z        {
    - ?7 Q2 E6 N: R; D4 F                temp.re = 0;
    6 K) o8 ~. ]% @/ z. G4 E/ D                temp.im = 0;, m* l8 V0 G4 d% l5 X8 U
                    i1 = i;
    * f$ [( g6 [9 D                for (j = j0; j >= 0; j--)
    # b9 C: x" M! s( k( ^4 j7 P                {4 ]" M! B0 {4 l  K1 t
                            /* floating date operation */
    % g7 T/ |6 E) J8 `; Z4 b                }

    / Z' t1 S/ K' g. f% P- u) a8 t        }" ~( ^& O# l+ F' \. X$ a5 h
    }
    % h% Z& p6 p: q& f$ t1 q8 \
    8 X) w1 {4 h; D% }( ?xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    3 t. v; C# k& q* D
    # ]: Y& x/ b) m0 m. z5 w$ C, d  T红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。, T2 [+ n) H3 \# R- j) H4 c) `0 f
    现在call xcorr 100次,耗时78s.( M6 x  ~6 |! h

    ! ?8 E' m' e% X( i& X如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    4 a+ G+ T8 X% _1 {7 K/ x
    5 ~6 U0 J9 C- O# H1 v
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ; C# U* Z, t4 m9 R2 ?5 B5 vMaybe Debug mode?
    - _) g% f( N3 I; j9 E. L6 |

    . m0 k  g4 n. [! z/ H: y, X+ O' d不应该,看我上面的回复。
    4 r1 d; t4 J6 H& F, f7 E
    1 s+ y' `% [+ s6 \6 P+ A8 L我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    6 a- n/ u# S" c1 d/ j
    雷达 发表于 2022-9-24 23:540 q( N' Z; g' z. ^- p
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + h$ ?- c! L, a* r8 t: m{
    7 k+ X9 P  h1 ~2 E        comp temp, xtimesy;

    0 i# V: N5 c. }( x6 `3 M: e4 Z+ E' E
    这个不是这么比的吧。。。$ b8 ?" }# v/ j, \# {& v2 E
    1 N( n2 S* ]! M" {6 H  M" {
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 {; ]$ g1 I4 ~" k% ~- t$ q
    + s) r( t# w$ d1 J& B而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    1 |9 W$ d9 j& _
    数值分析 发表于 2022-9-25 00:20  {, t# B9 P$ V: [; m1 }3 g
    这个不是这么比的吧。。。
    / j9 x) s5 X4 m; z8 x1 t+ w& @* n3 r
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 }8 s" _5 S) q5 o4 E

    7 K& G, x  H$ z  g有道理。
    / k4 M5 k( \# w+ u4 g5 T  q所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ; w6 x. s6 Z6 U6 o5 g  H0 E# b; r
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    5 i4 N& u" e# J. ]  R  g有道理。
      [$ ~+ D3 n8 G5 y9 x  G所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ) a6 Y' `* n1 b
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    - Q, K3 G/ Y% |! p. Y# u* h& vWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    8 S+ X. T- R# ]; p这个不是这么比的吧。。。4 N8 l" x0 ]* [' P" u
    : U# s% _/ h; {/ R- Q$ |/ I% |
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    - i  k) \6 T! z. P1 w8 k* I- }
    6 H4 A5 m" R, a! T; L
    现在的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 编辑 3 W3 K6 V6 y; I9 [  E( p* W
    沉宝 发表于 2022-9-25 01:48( I6 n. q+ \0 r* @
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    8 i$ w  G8 x1 l& h5 ^) }- t
    " l+ o, D( g; ]是的,兄台说的对。
    . a, g+ j1 {! G  i$ X4 t& m. _' d( [7 O' n
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。, f9 p/ o; J7 p5 F/ o# i6 r
    , O. `! j" J6 k1 ^
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    6 q6 ^1 X" W" r" n% R# K" a5 s4 g( |* j5 U* u6 E
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    5 \5 v) Z4 _+ r+ \0 X; o/ n7 a+ }! p; M3 h" O2 H
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ; Q5 X8 u) Y- t$ M
    沉宝 发表于 2022-9-25 01:27
    : o! t" e' v. t7 G1 R. U你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    5 @* s3 @0 d- V0 i: P

    * ^  q3 D4 @! r5 C& T- x又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
      `; O, p( U% X; y. q3 s
    1 N3 g( Y, f+ x, l9 b) C$ B/ t我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47' P0 @- V& G5 Q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 R' T. D$ E8 w; H$ w3 s3 E7 n
    时间差一倍的结果可以接受。* w5 z& i; d' T) B. V! @+ ]! c
    + U$ ]/ Q' y- q9 H  x& t5 [
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 6 C; v* p- h+ \; M4 Q
    雷达 发表于 2022-9-25 04:47
    0 H- d6 o  ?) U- h  ^& V又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    0 O" @; P, Z. }  ?

    : r% V  a4 m9 `  ^  N+ q: ~7 i& c( W! C) j

    6 O# l9 @; q  q- _7 m能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 # {! n) Z0 J. Y
    数值分析 发表于 2022-9-25 14:58# T4 ~5 X+ ]5 I3 W; q1 b: }- ?
    能不能把这个也贴上来,看看和上一个有什么不同?
    " c+ M# @& i. h- D$ a+ a- v4 ^* ?' }' m
    理了理思路,重新做了一个测试。- c. r4 j  o8 J1 u/ s
    做了两个 vector 和 两个 float *, 都长 100000: R8 v2 T3 \7 P: D( `. ]8 e
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    " e0 c; n. f' i+ Q' F& L1 H2 V5 e9 ]& d% z
    内循环试了4种方法,
    * ^( f4 y% ~( d3 Q& ^1 Y* [% r/ r1. 直接调用 vector inner_product 247s
    : O: s+ Z- K8 W/ W" J2. vector 循环点乘累加 237s
    & N0 ^; D$ F# b( k2 ]; e5 x3. float * 循环点乘累加 204s7 ]/ \8 Q' o8 `6 \" h
    4. 空循环 100000 次 202s! P4 U0 u8 B+ s, A( {# u

    ' P5 A) z6 Y  @& k不做内循环 200s
    ! V+ C- t" B9 N# o; D- n
    2 A6 E4 D/ e0 [" j% l8 W你昨天说的对,内循环本身占比是很小的,大头在其他处理。# [" a$ _8 q$ O6 h6 R( e- _0 w
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    5 p5 j# V2 K& M6 X( P) B" f. ~- b) r4 t  W5 L# i
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), Z1 ?, r& L# j" q9 O

    ( E; u& |2 K0 e( b/ r1 J(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    * n& I- }( Q4 W/ t! Y3 q1 e$ {
    * P9 s$ R0 s( q- P3 K5 h- v7 N
            std::vector < float > vec1(N);
    4 a  v* d, e8 i: h. y9 m& {        std::vector < float > vec2(N);
    . C7 H" [+ s3 z! F) n. a0 @- L        float* b1 = new float[N];
    8 Z' `, o/ L8 m- }/ W( _, d8 t        float* b2 = new float[N];$ C' B1 k7 X( K

    ! p6 ]+ V) N8 A. n- W' h        for (int j = 0; j < 6000; j++)
    6 _/ i5 m! ?9 [, T! E6 P8 z        {
      A3 T  V5 ?7 T% \                std::generate(vec1.begin(), vec1.end(), []() {
    1 F& H/ O" w' y- H* D1 O                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    / ^/ {+ R  l+ `! f8 J                        });4 j, [# {2 L. U3 j

    * a9 T" a6 f4 X, ?$ Q                std::generate(vec2.begin(), vec2.end(), []() {
    " B$ r9 j5 A: E1 t) l5 h5 @                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    - ~" E) J; |8 P0 }2 p2 i                        });
    # s& [0 h  ^8 M9 Z9 B" t! k" b# @" L" ~; d3 Y
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    0 H' J5 N2 X  E4 g                {2 W3 i8 y7 S+ ?/ O9 z
                            b1[jj] = vec1[jj];+ c* r4 j6 }! W( U  H- I
                    }
    , Z# `( Z" [: `; u: }* d& ~7 M+ T. P% W5 D8 w
                    for (size_t jj = 0; jj < vec2.size(); jj++)- I2 A4 w9 b( w1 v6 I8 `% |
                    {
    + J) D$ k% u8 ?* A3 A- [                        b2[jj] = vec2[jj];
    * e0 f' ^$ J7 `9 v! k  |                }# T+ J7 J4 s6 x4 B: h

    5 A( S1 W! [; K7 ^5 K6 e                //Method - 1  N=100000 247s  
    ' _$ O! i; P$ k5 V                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, }- \- P. f* t1 Z( X+ y* A& a
                                    + |1 _% K; R6 e2 @- J' C) U
                    //Method - 2  N=100000  237s! o! q( d! w  Q  @+ I; D5 T8 p
                    /*
    " i! C" L: p& R# r, g2 q. v7 a+ u* G                for (int jj = 0; jj < N ; jj++)
    0 H5 R2 T% _. K( T6 O& Q& }: a                {
    4 O# |' ^) J" M3 W7 Q+ ]* Q: [                        fresult += vec1[jj] * vec2[jj];5 X% h0 E: O8 {: g' F
                    }6 F& e/ N  t! F
                    */
    * I$ h1 K! A2 q2 h                                
    - F. J+ h# e  A. y+ W                //Method - 3  N=100000 204s, h# e+ `; e8 q# q
                    /*
    0 q" N# L. j0 l- e( Z                for (int jj = 0; jj < N; jj++)
    ; w8 c4 n/ ~, b+ c                {+ X" j2 s( l. I: o+ q! l9 M4 L
                            fresult += b1[jj] * b2[jj];6 V7 j* C0 I4 n: {
                    }' i8 ^" Q7 y/ o9 I! U9 h
                    */2 R1 |8 w9 L4 M& D! g* K7 k

    3 O- g8 E; m% l5 U% u                //Method - 4   202s2 T0 `! C" L8 R8 p2 ?2 s
                    /*5 o: g, m1 m$ E, U5 Z0 J
                    for (int jj = 0; jj < N; jj++)) R+ G/ Q2 i4 c3 ]
                    {: C2 l1 }7 B' r; t. c! @9 r+ M
                            
    , K1 @+ S6 ^0 R( d& C7 p6 l                }% L8 R. J6 \5 I4 N+ V& j1 v
                    */5 u) ~; f$ H3 m  j2 K
                    //comment out all methods, N=100000  202s               
    3 u% ?+ B& p+ e0 g/ n8 ?        }2 q: I+ w) ~* |) o, z2 [

    8 S: j+ d! d  L1 z9 R        delete []b1;  A  @% O! O4 C
            delete []b2;

    % Z+ r: W9 W- S
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 ~+ J9 y$ p2 ?- U! H# }! O4 L
    8 c" H5 E' v2 a8 K. L4 {% y你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?1 \( B6 z, v5 G* p' J2 Z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    " n3 z7 v1 e! l; r8 f瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?+ H, \1 N6 \2 K1 M# y+ A

    - f! W6 C6 E& q, L* @你第二个试验里面的j在循环里面又重新定义 ...
    ; d5 H+ }- `2 ]7 z- m( q3 s) Z
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' n8 c# ?5 Y/ E3 U/ K2 ~" s1 r
    6 ~) s4 l5 `3 q8 S- p, ^0 p4 O1 R0 l不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    , c9 \, k$ |8 `, O( H& _内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 ^% C% D0 Z# s0 g
    + _: @% W" j- H, E; R- i
    不和它 ...

    , e% @+ A3 Z/ w# |: C$ f
    . t( A6 c2 h- ?不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    0 z2 d* x" {7 e  O9 R+ n1 |后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:541 c- V/ e# ^+ {  O! V
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ K( j. x9 C9 M1 p- w9 i& z
    {; W8 _3 Y% e0 Z
            comp temp, xtimesy;
    2 G! G, E, s( S* A: G2 U) j! ], p
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    , `' G7 k" K* ^# g内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?* N! p3 D' A6 ?) ?, F9 D
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-12 08:43 , Processed in 0.073623 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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