设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    2 f7 o, n) t" F: I; F5 i# J8 [; U! C. ], U
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。! A) Z  W5 {5 y: L+ ], B1 m' H

    $ z4 q, b, }) ^& }' A速度优化问题真的很有意思啊。
    # E) u4 _, G+ B2 c5 G! v* w1 F1 T  t! m. Z
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?& v, }% ]! e) M- d* i5 C
    把代码贴上来看看?
    ( n1 K0 R& i( f: g. f  |7 x3 a7 f+ {7 y* K  S' @3 \
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 125 天

    [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 编辑
    6 K$ y$ q0 k1 S
    数值分析 发表于 2022-9-24 23:04, {. W" h  P* f
    拉下来?拉多少?" `2 o- ?' Z( \$ H
    把代码贴上来看看?

    3 Z: b: [# J6 h2 T  w) H- s2 o
    5 r& ?0 X* J* Wvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % N7 U8 @* S" Y  y8 w% Z8 z{
    : K+ o7 Q7 x& P" f/ u        comp temp, xtimesy;3 J4 y; ~4 A4 a  k; D5 S2 w$ B
            xtimesy.re = 0;, s! }6 J6 q! F' O
            xtimesy.im = 0;
    * b7 P4 p7 w/ B- i7 G, \/ A        int j0 = lenB - 1;- w9 J% B3 J" U2 i# l
            int    i, j, i1, reali;( F' t; h- Z- G* ?
            if (lenA % 2 == 1)
    $ ]: ~$ E. x; R' N0 x1 H                reali = lenA + 1;
    9 O4 j% Q3 ?0 X# Q+ G6 Y' r. e( B        else9 G" v' P) l5 w; R5 N6 z
                    reali = lenA;
    ; x# _. g4 K2 }3 d( q        reali /= 2;
    - e1 i  L0 K  E! M
    8 R) H' m: `; |. y6 a+ J6 v1 {        int nconv = reali + lenB;
    7 N# Z7 M4 R/ e# z0 `+ D        //#pragma omp parallel for* z" b$ o# n5 j+ b/ o: \1 Z
            for (i = reali; i < nconv; i++)6 M" l  }# b- j# W
            {- s$ y; N$ J1 u/ R8 b, s! I2 y4 @3 T8 _
                    temp.re = 0;
    2 i# M: F9 X1 O                temp.im = 0;
    + O! P$ V; E6 n  J) B- q- k7 {                i1 = i;
    0 o" ^# T, N2 |9 s5 V  w                for (j = j0; j >= 0; j--)
    * z7 I9 C" r" A% i% x                {
    $ V  c/ ]! A& Z, V                        /* floating date operation */; V& n2 e1 R2 Z7 T# O
                    }
    ; |4 V4 Y) B; \
            }
    # L3 N2 y; f, R) l/ e/ K  l! z1 p$ z}
    " ]$ a) {3 n$ b; E  P+ R) J+ o, s( W8 a! n; E) s8 M8 M
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 I3 t8 I1 s( J7 ]: q4 z6 M/ F& X4 I: E
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    6 n: Y& C, K6 E5 @& w% x现在call xcorr 100次,耗时78s.  z7 }2 s  N4 Y7 G

    3 w+ k# X( W, z: m如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. . O1 ^1 Y) e8 d: X4 K

    / G& J4 j" ^* Q# V! V
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33: o- I$ x) f1 V& w8 y% X4 Y
    Maybe Debug mode?
    " N$ V) M7 X! i' Y4 V* ^: q# q8 M  `

    8 ]8 W7 S7 d1 Y0 n' F$ E( r. E不应该,看我上面的回复。
    : w& G3 C+ b# x5 z' |5 W' y/ q/ c
    ! _' Q' G' t! [+ \! n. n$ l( R/ \0 ^+ D我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ( f& G! j/ V' U/ Q. Q, ?
    雷达 发表于 2022-9-24 23:54
    9 [3 i9 I8 M- tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      ?* \' D* c# Y{* Q: L2 N, l$ Z: Q
            comp temp, xtimesy;
    ! S3 E0 P& d4 X8 ?; v
      j/ |' b* J5 H/ A
    这个不是这么比的吧。。。
    5 o4 O& H& a' Q. A
    9 ~8 z$ X9 R) D$ _# A3 C3 `; l- s您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    & o( e8 _# n: r' w, V
    9 v1 e' K; E: o/ g而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    * m) s. `& b. K# w6 H( D7 k+ V1 C" \
    数值分析 发表于 2022-9-25 00:20: `- k: e" x+ X
    这个不是这么比的吧。。。* j4 Q, q6 {: T6 E: @  G3 U: W

    " q# ~: Y, D4 s' c  i6 W& V您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 X' e/ z+ c6 N' J* p- ?% v
    1 P* w! `( y% [4 Q1 e
    有道理。
    & E' \- V, }! A3 a所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。, g0 {- k( p" \" S. g

    / K" A1 u$ `- v0 j$ ^3 O4 A我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    6 e7 |. C8 ?7 g/ J  ?7 c# W8 `有道理。' F( d5 d# k5 ]4 U1 h8 T
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    & x0 p: d) Y" Z. {* I9 v6 i3 \1 |
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    4 b$ M! }# T' v6 q* h# [& A) ~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' A- q9 p  Y+ U6 g0 F! C6 Q
    这个不是这么比的吧。。。7 U' j9 a  c! L4 n+ W. i) T4 b, @
    . k, n* X( t. O* ]$ X
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    6 e3 h/ z( @! l9 M/ t. M5 |2 |  Z

    2 i% U7 {4 E& |, o/ }9 J现在的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 编辑 # E# Z% ?# u  Y7 ]+ c  A# M- L
    沉宝 发表于 2022-9-25 01:48
    & S0 M' ?# S- p现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    3 v/ d3 I; A# m8 r" P1 Q
    ' B2 T  ~; g2 {' ~, f8 a: g  v- m
    是的,兄台说的对。2 e2 p7 t& W  v/ G" ^
    0 V4 c" m6 P' A9 U) e) T8 {/ d
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ' Z! d+ J9 B2 F2 H7 X8 s
    ; |! }  W3 X( z5 E雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    $ K! `2 |7 A3 k, o
    0 M' w# {& f3 E% Z' j# m比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。# h9 I2 j1 z! p. C  \3 W

    3 ?" m" `; ~$ C( O当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 2 T# [1 L& x8 u& [- @/ F7 F
    沉宝 发表于 2022-9-25 01:27
    ( F8 F- f/ p# d! E" @/ F# i你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    7 B/ |0 B& m$ u" W6 M; V
    ; n, ^. |9 M# s7 U8 k6 u* U, p又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    " t1 ]& U# A, i# D, f+ P0 a. Q0 T/ B
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    5 J( V; v8 T3 \: \/ a又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ( m9 R4 x2 B- U+ Z8 W时间差一倍的结果可以接受。
    7 L$ ?7 r- L! \# P) Z- q0 b3 j! e8 D2 y; _
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    $ g& v' x9 _1 o
    雷达 发表于 2022-9-25 04:47# J7 t8 _9 j1 R
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / Y3 a) z  ]  W8 Q4 m) y) t0 ^2 q

    ; B6 {+ J3 x- \# o9 N. R! X' Y- U* \% L
      w5 d0 }" O3 W  Y8 |) s
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    2 s$ u) ~, Y" a# z/ l6 x+ T# P
    数值分析 发表于 2022-9-25 14:58
    $ ]8 P; f+ `, x能不能把这个也贴上来,看看和上一个有什么不同?

    ( W# U3 d8 r& l- [9 r# X1 b& b: p理了理思路,重新做了一个测试。4 A# Z% l3 U, [7 h1 f9 J
    做了两个 vector 和 两个 float *, 都长 100000
    ! H* D8 c/ F3 _: K4 t" U' g& O外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    7 |$ R. _9 S0 d& d: m" V- y% X: E' {! f; o: D
    内循环试了4种方法,* @7 s) T) x" Q+ t* N* p+ Y4 Q4 D
    1. 直接调用 vector inner_product 247s
    4 s) k" J' B% l3 o* d" ?4 Z2. vector 循环点乘累加 237s" T- W2 o1 \" ]5 U! X' I
    3. float * 循环点乘累加 204s2 E0 U2 O$ V) p) m  }$ J
    4. 空循环 100000 次 202s
    5 Q3 d6 \2 P) K0 x0 a$ v4 b; |7 H
    * I& e: A6 X1 R不做内循环 200s
    * G2 M9 v2 s4 F# ~+ x/ i
    & A: b! A2 V- Q2 s; l你昨天说的对,内循环本身占比是很小的,大头在其他处理。9 i; t/ R7 A8 a: L- ?; |
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    - U, C% P4 h* x$ n. [2 ?" j; R/ _$ q8 y/ p7 s, P: p
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    5 D9 J% l7 b  D5 z& v9 n2 w3 a& V- y
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    9 n& B0 r+ c+ d, o6 a* C, U' L! E% N, k. H' `1 f8 [) Q# z
            std::vector < float > vec1(N);0 r) d2 Z8 l. v8 j. x
            std::vector < float > vec2(N);, u$ |9 Y3 g3 t' R6 d7 c# ^
            float* b1 = new float[N];
    0 M5 x) K" l+ B& h% E! ^, c. c        float* b2 = new float[N];
    * O0 I; F( k6 R, M
    , A, U& \9 ]9 _/ I* X        for (int j = 0; j < 6000; j++)7 u: t* A& p# W3 M+ y
            {% G  d: f* O% P: p; ?
                    std::generate(vec1.begin(), vec1.end(), []() {
    7 O  S) o' L( y  D. \) K5 o  E                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;7 H3 y; g0 u8 I  h
                            });* d" f1 H1 T1 L+ F4 T- d' b* c$ J5 Z
    6 d$ z) [$ A# _. s
                    std::generate(vec2.begin(), vec2.end(), []() {2 @' h& b3 X# ~/ u2 A5 M  Y! }
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    $ c; g/ y( c+ K" A7 H) g$ [& D                        });
    : F* e" w( j" ^# g+ I' e1 M: _' ~/ ?5 I; @9 I4 M0 D# [+ y" }
                    for (size_t jj = 0; jj < vec1.size(); jj++)
      l+ g* q  O4 S6 x9 O                {
    ( V1 `$ R! r1 l; W% D1 c: o7 m                        b1[jj] = vec1[jj];5 L7 X) F5 X2 T
                    }& b1 o0 @/ l! G8 S% ~8 Y5 Z

    $ J+ O% V/ X3 q+ n; `                for (size_t jj = 0; jj < vec2.size(); jj++)9 D' x$ e! u- L& O; [# S
                    {
    ) L" v" P9 o4 V' L                        b2[jj] = vec2[jj];% y+ b3 f' Q6 a% R( P/ S( R! O
                    }
    ) D  @* Z8 u3 C, H$ i; V. J4 ~
    4 d+ Z, D& H( a6 ~" v9 z                //Method - 1  N=100000 247s  ' ]5 ~# r3 k' ~5 }' l9 j
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    9 ^6 M6 f  h3 ?& w                                ( M  T9 Z) G/ O! V2 g, }. R( j+ V
                    //Method - 2  N=100000  237s
    # }( p4 |& |* w' Z! n9 M% U3 m% G                /*/ n. }# F: A' V+ p  C, _: c
                    for (int jj = 0; jj < N ; jj++)
    8 J8 \6 O5 H8 v; {' S, r) D                {, {2 f8 h8 x2 I* S
                            fresult += vec1[jj] * vec2[jj];
    9 L9 {; y) Z* R) p  R1 v                }
    6 m  Y& N- w$ W" T                */$ _. x8 B" B* f- u7 z6 x/ p
                                    - _% r/ D' @, ]1 m7 _/ L8 [: p2 c
                    //Method - 3  N=100000 204s/ o  y! I3 ~1 a5 U0 X' G( E
                    /*
    8 ]! z: }: X! `3 @/ @+ c4 ?                for (int jj = 0; jj < N; jj++)
    1 ?2 {" Z2 R. [; L8 P( V                {: r+ c" x, U. t8 V
                            fresult += b1[jj] * b2[jj];6 v5 o6 Y4 L$ {: E% t
                    }
    0 e# C1 E& X# L; n& d$ O+ m                */
    % k1 Y4 h/ P  f1 B
    4 T# U7 a4 j" F, o$ Z/ F! R                //Method - 4   202s, z2 g" d- _( q
                    /*; q3 x2 w- _( Z( z  ]# [. L: f9 D
                    for (int jj = 0; jj < N; jj++)
    ; r: l8 Z1 R0 |/ W                {6 A4 c! P8 U4 R9 P2 w% V8 e
                            
    # B; }+ J- A0 ]$ O+ P                }
    + R9 K/ @1 o, L8 G" v, _0 |3 n                */
    6 c8 H$ t7 v: K# ?                //comment out all methods, N=100000  202s                3 m8 F; u# W! O
            }4 y; D- S; w" o) I' d1 `

    $ ]: K- ~; t6 u  V        delete []b1;6 I$ ]" z: ?2 _/ [" j) D
            delete []b2;
    & K  a" _4 N3 N; R: |3 R
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?& p& |  v+ x: \8 B

    , ]- A3 g. B2 @6 A9 t你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?# Q- [# K! e; m  a7 v0 _8 i+ C
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ' _0 ^0 S4 F& |瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( p7 j- W  Z9 b3 C4 ]5 b& `

    4 J9 `/ i# G6 D7 P  O3 g你第二个试验里面的j在循环里面又重新定义 ...

    ( U' K4 f* {; |$ y$ Q内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 l5 N/ \" ^7 b* u8 K1 i9 y, l- m- M: u9 v
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    0 Z, l; D  \: B/ o( K内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 Y2 ~6 K" K; I2 G- \

    7 {/ N& o+ m) X  Y不和它 ...
    ) m$ z+ F% N6 r% _

    : R; Q. F' r6 V4 a5 S( ^不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    8 `/ t! B5 p6 }  j9 U* J: S后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    " y" h6 t% e# v7 y' c* C. rvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 i. s, O- x) p+ a  g) U
    {
    0 X$ f2 z+ u7 {: r9 H, \& U7 @5 @- a4 `) H        comp temp, xtimesy;

    5 b5 s$ p/ F7 x0 v8 w* n* q. a这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。# ~' I+ Q- x# r5 V3 k0 u
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?$ T/ i7 N  o/ O8 U( a: W
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-22 07:34 , Processed in 0.069161 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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