设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    " r* a9 |7 Z" E- {3 N) a/ ?/ I5 i2 E) K: Y
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。! S7 p' s/ C* a
    7 ~6 a9 }/ A8 X7 Z# P! l
    速度优化问题真的很有意思啊。
    / s* D1 V" K% N+ \9 _$ {& L; k0 h" b  q
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 1927 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?; d5 _; g+ @! U, k$ g
    把代码贴上来看看?4 d% L9 }1 J4 z1 T* J, w! T: R( B

    4 w5 w9 q! q! a+ }; R! |难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 # S4 Q9 [: V  y
    数值分析 发表于 2022-9-24 23:04
    & m1 B& Z& }5 D- H7 M拉下来?拉多少?% R' E2 {) a- z; a9 a" y6 L
    把代码贴上来看看?
    # _" L8 q4 q+ e0 X0 p% `" z& d

    4 W, E* z! P$ B+ o# evoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB): m  f; K3 \$ `2 k% U1 A5 f
    {9 r. a$ @  Z* G7 `
            comp temp, xtimesy;
    * \' u, m6 W8 U* R8 @: H  ^& I        xtimesy.re = 0;2 w9 E5 G: z- H! `) U+ n! f) t2 B) o/ J
            xtimesy.im = 0;
    . c2 e8 v; R5 |2 }/ X" |        int j0 = lenB - 1;! N  X& |7 V0 v7 V- c5 b
            int    i, j, i1, reali;8 T' e0 [* d* Q- g$ @  A' D
            if (lenA % 2 == 1)
    4 z8 \/ C8 I# C1 R. g& s0 ?! N6 l& X                reali = lenA + 1;7 }3 Q$ ^% w) e7 p. `3 u  }
            else# _* L1 W- \8 ?) A  o3 f2 \
                    reali = lenA;! O, e# M( E5 D2 C/ X' @2 }$ S. F# j
            reali /= 2;) s- K8 u! A7 W1 f' [

    % K, m( S2 i! H# O        int nconv = reali + lenB;
    8 Q) k4 \$ f1 G4 U: u' s% ~  s        //#pragma omp parallel for
    0 p- d2 X( u# S+ q) H! Q        for (i = reali; i < nconv; i++)  z7 X: S: W( E
            {5 w# C1 c* h# e1 S, A# b) ?( L
                    temp.re = 0;
    5 E: D& H* d; \* H2 V- S                temp.im = 0;1 T- o7 Y! |8 e  ^$ f1 T
                    i1 = i;3 u  Y3 s3 e  t. p- M
                    for (j = j0; j >= 0; j--)
    % _5 p5 y+ c6 k                {' Z- y/ {7 n, W0 o6 [% T3 r
                            /* floating date operation */0 c. j+ x6 e- x# A- @( S2 {
                    }

    . V; a/ E, c# ?; a9 M, {) c6 M& F        }
    / K& r4 ?" C6 r- P# m! _4 T4 }  {5 e}+ s. J7 L- |. I8 q: X

    6 G( `0 r  u9 k( x. e  W. Ixcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    - k: c  a" t& e# k/ \4 a- Z0 B2 h6 c) U- g, \
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    , H7 S, H3 d, H: w  c# P现在call xcorr 100次,耗时78s./ W, L( i9 ~3 ]7 t: d& W6 v
    & ~9 c! b$ t4 V  c; b
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    / {/ O. q& h/ Q1 U5 x# G& B* P$ L. Q! F0 b7 {  Q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    " m, u) G+ h+ k# y. i2 d4 SMaybe Debug mode?

    4 _2 i+ I7 ]3 h$ `7 T) Q! ~
      w* x: h" ]0 {6 B3 _不应该,看我上面的回复。
    & I/ |- U  r% I5 ?$ `
    7 s! a. H. ^% d4 s$ [5 T/ P我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 1927 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    + U9 M5 \8 ^) Q- l  z
    雷达 发表于 2022-9-24 23:542 b, V; V4 C5 {* s; X, K! I
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# ~' V* {3 S, s+ R2 O5 J. ?1 c
    {
    ( P1 [9 n8 t4 K0 }! g! B        comp temp, xtimesy;

    + w8 @8 Q/ l- k$ C. x( I! ^' p) [. p1 |* p
    这个不是这么比的吧。。。
    . ]) C6 _/ Z3 ], Y/ m6 N; G3 \* b( L
    * g9 G9 j) `# V+ V4 n您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    2 v- j# `' b5 }9 U0 h7 W9 H
    ; h1 G7 ]  o/ b3 n, u而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    " C+ z9 B6 L3 F$ S5 Q6 A
    数值分析 发表于 2022-9-25 00:20
    8 |/ R- I' j  y这个不是这么比的吧。。。5 |& X3 f: d1 t; @8 p7 v
    ( Y: u% _( n7 p2 K, W  n
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ) k: g1 h  v- w
    1 T2 {1 n' c# O4 Q% j2 k$ t3 P有道理。
    ' Q3 S) d' `+ w- z* P所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。& e. y" G& S- ]
    8 k2 A: ?5 r- \& |
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:469 v3 O. C: @/ m' D- f
    有道理。( @9 N1 H/ y" B- J% i* c
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    # Q# ?2 X& E! p- z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多/ \0 b1 O/ Q; Z% d
    Why 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 i7 s, C' P$ z这个不是这么比的吧。。。; Y2 N% G8 v6 W; u4 m5 t$ n

    0 m8 i, u7 G, S  b1 r, ?您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ; L: h# Q8 ~  o! i( P' g7 S, c
    " \: |$ O8 l* f$ n* S7 Y
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 1927 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    . ^8 _  r% x  Z6 w
    沉宝 发表于 2022-9-25 01:48
    8 L2 G0 q1 l/ {' V* ^- c& [现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    : f0 M0 S0 ~' v+ |
    $ ~0 n9 b7 |6 h% e' l是的,兄台说的对。
    ' ?4 ]1 z  `6 s, h4 k3 u
    0 t% I% O4 E' W- O. K  Q其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    6 b! ~" u5 K. @9 I; ^
    2 O  c9 M* B  w雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    / {/ o. L! D8 u5 I) Z; Q5 R& ~) e0 Z/ T' l
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。( E5 `$ g; C5 v

    7 Z; j/ X, Z) w" D9 F  g' U当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    8 q0 D; u7 E/ E7 K/ M  z4 P
    沉宝 发表于 2022-9-25 01:275 o! a8 E, N. B" d) S4 D
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ! w% {5 k' f0 {. E

    $ k3 ~% d: J6 ?% ^- }又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    $ @) f# V& I# N. |# x. k
    - C: X6 `! E* n' V) R我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47$ d; ~% J+ P+ P) y. l
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    - Z% v* ?9 z" A时间差一倍的结果可以接受。
    - S+ W8 `5 g: F
    , o* E# N5 _! Z& J) ^+ ^6 d你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 1927 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    7 m1 Q, E& h" A) J" W% G0 C
    雷达 发表于 2022-9-25 04:47  l, Y9 e1 n5 k: L5 f# V# D; U; W
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    8 z2 y) H; m$ ~2 S
    0 C0 L9 U; h1 k# |4 W  m& |; G. U8 ~( i! k$ y0 V4 S- Z
      P% Z1 w# `3 }" O6 B9 N( O
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ) X7 @1 f9 R9 K: G/ L- U% R6 u8 m
    数值分析 发表于 2022-9-25 14:58
    3 {5 f) |+ e, ?& T能不能把这个也贴上来,看看和上一个有什么不同?
    2 j/ P& Y2 w5 Z' Y
    理了理思路,重新做了一个测试。! K% f) n' x% i3 |- X: C1 v
    做了两个 vector 和 两个 float *, 都长 100000
    * F" k/ i2 X9 a8 ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    - h5 a% F0 z& W6 z! X4 I6 B+ |% Y+ c- T8 O* D& Q% {6 V0 L$ |9 E
    内循环试了4种方法,
    " u; H0 w# t2 U5 Z% w1. 直接调用 vector inner_product 247s
    " R0 S0 q. u# }' n/ Z( i2. vector 循环点乘累加 237s
    * G5 ~3 T/ N3 r7 ~' |) G3. float * 循环点乘累加 204s  s# M: {! Q! |! L
    4. 空循环 100000 次 202s
    5 W8 Q2 Y: v. k& M# q
    4 @/ h' X  X7 Y. z! k# i+ ~3 ~不做内循环 200s
    " h# s$ s, B% b0 w# d6 S# k3 B  _9 |- A9 l3 h" h: Y9 ^
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    % R. t$ B2 L! m9 n: z. c另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    6 P' F0 |4 b) ~6 f2 X
    $ ~" l& R2 m) B( x至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 S6 p  H( }3 a: ~7 k0 b( C5 O* c

    7 G. A  ^" |( s" k+ A& X! {(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    3 D! q4 V+ x, W8 R) c+ \& z
    3 k5 h( t  U0 v$ O! P  o8 d
            std::vector < float > vec1(N);
    4 M. A$ u& a. T- C) s% p$ R        std::vector < float > vec2(N);
    ' Q. f* \0 p  o$ c8 |        float* b1 = new float[N];8 N  ~0 h4 {" b! x5 o
            float* b2 = new float[N];
    ! \9 [( ]% A1 S! q% c; r6 z- _( \" F0 d1 x/ x+ E" r& q
            for (int j = 0; j < 6000; j++)  j5 ]& s( r+ g5 ~+ z3 c
            {+ {& W$ k4 c* P% [( s+ \
                    std::generate(vec1.begin(), vec1.end(), []() {
    1 ~* A6 d) r& q7 ~/ y& f; g! B                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ |  ]" K% N9 u& O) D+ N* _+ ^' r
                            });
    5 c1 j( C( j* u0 U# q) b* S( W' a% K, b' z; a" F0 j
                    std::generate(vec2.begin(), vec2.end(), []() {) B4 O6 t2 H/ l' N
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 F7 V, D) X5 r" a. g3 A$ v2 X
                            });9 F# r& x* O4 ?" c: Z
    ( F3 M. o/ @" q" O
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    # v2 x0 @" w+ z7 _; t! @                {
    3 F1 l, `1 m) Q2 B- Z                        b1[jj] = vec1[jj];
    $ _9 b4 k; d2 w* Y5 {( Q6 [- E                }
    : e: J# B1 A  [# r# H: q" H" m* P" l$ i
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ; b! e" ]0 ~+ s2 s; k6 ]' v                {
    : F2 O4 p; R: J# E                        b2[jj] = vec2[jj];$ \7 ~1 u( P- P- _+ K3 m
                    }5 ]* d  b( R+ z6 a- M9 _0 J
    7 i' ?' \! x3 r& ]
                    //Method - 1  N=100000 247s  5 }7 Q+ i( |. @& _' p" A0 G7 @
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);  M# j: D1 C2 Y) B* T/ Q
                                    * \$ U4 N- V7 X, ~. g
                    //Method - 2  N=100000  237s
    ' J- s9 I5 s. P( q                /*5 {' [. r# Y3 w2 a- P1 f- F
                    for (int jj = 0; jj < N ; jj++)" p4 |$ Z& y, h+ t7 L$ N
                    {
    " b2 v/ _( x8 ]: {- j/ [                        fresult += vec1[jj] * vec2[jj];9 ?9 d. z" c$ e3 t
                    }
    4 e* i% m9 b9 [0 X" }                */5 v: G* L. H2 J8 J5 G, M$ k
                                    . P. i; |7 q) `$ }
                    //Method - 3  N=100000 204s' d1 D$ X; |; c, @: v: a9 _
                    /*; m# o% @9 C2 t, Q1 Z
                    for (int jj = 0; jj < N; jj++)8 D+ [8 A  Y" G
                    {
    : Z  }. Q, J7 j0 b                        fresult += b1[jj] * b2[jj];5 E) @4 O, B$ _& h# {4 |
                    }% @- |, J% [+ G% D
                    */" @) w) r. r3 J9 d# O# U

    ' w! v& `+ W6 t3 @* a                //Method - 4   202s
    4 d- P% y* v5 p0 m- r( a                /*5 |/ a. m; ~0 R2 C" U  {0 Z
                    for (int jj = 0; jj < N; jj++)9 S7 \7 _  c- W1 O4 G7 t* E+ y# R4 Z
                    {! o& R& I2 a- n/ Z9 |/ Q+ J
                            - I7 M0 y0 m' X0 ^
                    }7 S3 ?, X+ S, C  n) Q0 ~# o' U
                    *// a, d. s3 Z! X# X) U
                    //comment out all methods, N=100000  202s               
    $ F5 j% [; E, G5 V3 e        }
    , g/ c# N) L* h. _7 n$ m( q2 c" m, Y0 o  m/ {: q
            delete []b1;& Z) a  `$ d1 s% |+ {
            delete []b2;
    2 H1 ?" z4 \, O
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 |$ D/ ^2 r  }

    0 V4 T5 k* F8 G: b2 {, R: v) K你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    2 E  ^9 f8 ^/ Y, M/ Q  v
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15& V0 A# J8 `& V8 C) \9 D9 k$ ?
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ; S6 o! _$ w: F% @/ @: }. D! \+ z/ k# b4 i6 }  |. e% _
    你第二个试验里面的j在循环里面又重新定义 ...
    ( V- i! z8 u* e3 L" a
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' b3 f  [/ t. P7 G0 ^, ]  r9 `
    ( t/ _3 g5 a- ]/ D& ]. S不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:166 J/ @* I- D9 h- i( c2 w2 r7 x
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL. x: A' n6 e: K. X
    : f9 a) t8 `' q& n6 k' c7 g, [
    不和它 ...

      I, d/ v3 I2 J' V$ d9 S6 s: }3 L- Q6 p, I: R
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。5 t' W9 U" E! F6 q. i$ j2 x7 O
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54. _6 j7 S+ R; ~
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB); d' q% s$ ?6 e) e' n5 g
    {
    ! z$ t6 c% Z( _. j4 L* S9 I. G        comp temp, xtimesy;
    1 g4 _# J; l% t) Y# t
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。, l3 z5 U- @2 Y0 H* U4 z7 M
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    1 r1 G' N: x# ?  @2 J7 k. y/ r1 U" |VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-5 18:43 , Processed in 0.044820 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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