设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?* F  u8 q2 s6 P' u

    9 h& V5 x* B0 H3 s自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ; o& d* w# W" K" M0 O# p+ R) W- _1 K" L1 S4 a. g, T/ X* s' _0 B
    速度优化问题真的很有意思啊。
    * W1 \0 ~" L1 o% N# ?% |8 M2 @+ g+ ]' S; |. I
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?! l7 T2 A+ ]& u! P  z" q
    把代码贴上来看看?# i" Y: r# Z) w. ?, y% {7 Y9 e

    5 o: @/ p2 x) L' H& 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 编辑
    7 [- `6 _( k1 y1 B3 `
    数值分析 发表于 2022-9-24 23:04" b& U% A. C* [# F; l
    拉下来?拉多少?, g3 B7 t1 z% F( N, A$ @. W# A# p
    把代码贴上来看看?

    1 A  k$ P8 F; x6 g  ]7 ^; T' j9 o- b7 O3 T" @! T
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    5 c9 d2 ^5 E8 e{
    % z- A3 S) N3 H        comp temp, xtimesy;) p3 [; L3 Q/ h
            xtimesy.re = 0;. D9 z2 r7 F2 F+ L
            xtimesy.im = 0;
    4 a; V6 b8 G, R, a, T  {: L$ X, ~8 x        int j0 = lenB - 1;
    3 c* g! ]  S5 ^' C! a        int    i, j, i1, reali;
    1 T4 ^5 G: [  P, d; `        if (lenA % 2 == 1)
    ) V4 M" O: o4 W1 F                reali = lenA + 1;
    $ t) K* T# J2 l! X, b        else
      n7 a% N# d. V1 x) a' h4 R                reali = lenA;/ Z! ^; V1 h" Y( G, m; Q9 J& e) W' r
            reali /= 2;% f* _. f9 C9 ^: I% z* _1 v

    % b) n1 ?+ Z. E* N% v        int nconv = reali + lenB;
    ( b) v& i' A" l: l7 k        //#pragma omp parallel for" u  H9 h: j8 r+ F$ R% {6 P# b
            for (i = reali; i < nconv; i++)5 ?9 O" e" T) A$ z% o
            {$ w, M" k$ F+ B+ z* {2 z
                    temp.re = 0;
    $ {# |- m  k) o/ [5 C, a  J7 ^                temp.im = 0;4 V/ n" p3 J$ h; e, L) N
                    i1 = i;3 Y+ a9 ^, q: o, X$ l
                    for (j = j0; j >= 0; j--)- B2 O! c  e, t  ^/ |5 H
                    {
    ' U6 ~6 v( h( X( o. b                        /* floating date operation */
    # z8 ~$ R2 W+ W" m( Q, c$ `                }
    $ f; L! ~9 ~2 y) a" n5 w& {; q
            }
    4 F: M1 |: k8 D}* a: q  D! W5 c6 J6 \) e

      F% [% Z* O3 T* Xxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样  Q+ o  [- s* R; ?2 S! F/ M, G' x, k3 H8 H
    6 l& Z5 [; B8 y
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。4 e# Z9 `# O& H% \6 R& s
    现在call xcorr 100次,耗时78s.
    - G: B  k  y( Q$ x' m- B6 u  [8 X( Z# c2 H1 h+ r" j
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 0 ^( F* h+ Q1 A
    ; r% }' q, L% y& J3 \
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    - b0 v4 O5 v- Y$ \Maybe Debug mode?
    ( U9 ?% y. g  C7 C: M! H
    # v6 g0 [0 c+ `4 e2 Q5 H. {
    不应该,看我上面的回复。
    & V* b: d; ~7 C, d8 C$ ?
    1 g) ^7 k! W8 G我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    1 p6 V( k' I* r/ Y) P* e
    雷达 发表于 2022-9-24 23:54+ B0 `6 l6 h" K+ _$ y7 X
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' @0 g0 ?: R( A4 i{
    9 e# f6 v; M( K1 f) g. M        comp temp, xtimesy;

    # F7 J4 S, \+ ^2 d
    ' h! q9 K, q) s' o4 P. @这个不是这么比的吧。。。
    ) ^: S( X' k- X. w: v! C
    8 {8 F- V/ ~4 i0 V# _您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) s5 U& A) i0 t1 d4 E5 r
    # p2 R& [/ N/ z# d' ]而加上内循环,光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) j8 y/ q, v- {8 y1 A& V
    数值分析 发表于 2022-9-25 00:20! n* f6 D$ Q# f! t' b, T1 ?
    这个不是这么比的吧。。。6 p1 [" W# n! O1 C

    / h/ p! m0 I/ W# |: S6 K您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    1 z, C) I1 g4 E$ y

    ' h! B* z: _/ [4 b# L# {7 E' M有道理。  t3 e* ]6 M2 a; r7 c
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。8 L/ J2 b) Y9 D  j' y0 _; b3 l

    8 F# Z* r. Q: k4 n我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    0 r8 C; A8 |5 o0 k- T( @8 L. \有道理。2 W7 e4 D2 m2 _2 z4 y2 f- r
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    & [# e* s( Y9 l, ~% F4 D
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多0 l; {7 x3 w6 V3 S- ]* u
    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. E) O% e8 C% e9 d/ R4 f* _
    这个不是这么比的吧。。。
    9 D7 o7 E$ z; A" n8 G3 _
    5 e' l" @$ k2 t4 i, G您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    + j0 e5 P6 ^7 D& r- a4 C! O) w( e
    现在的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 编辑 % {1 f( n1 x- K) f4 e9 @3 K! d5 ^0 M
    沉宝 发表于 2022-9-25 01:48
    6 r: u; z5 s. h6 q现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    1 x9 f7 Z0 M9 Z1 g) {. {4 r

    ) h/ B3 k; n* `6 Q7 b是的,兄台说的对。
    ; A  ^( M# ^  O1 a6 f7 [1 t  f  j: d8 J* V& q, |" I
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    4 J' L+ Y5 |3 [6 S7 F9 `: o
    ; @: d& Z) W% r; @$ S雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。8 b5 _) D. Q6 D

    ! h' L5 D  l7 d0 G. ]比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。! w/ k7 p9 Y, _+ a) F2 N

      N( }# M$ p7 E4 J3 X' @2 a7 I# p当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 2 \0 ?) ]* g+ x# w: L/ r0 J
    沉宝 发表于 2022-9-25 01:27% U5 z  T4 a" X
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , O+ U) }, B) p; ]( X* ^

    ' d, S/ t$ q6 F1 H' J% @) O' k又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。1 S5 l* v$ d, q) E3 m5 ?7 t  t
    2 T8 E3 ^; Q! b* c5 a9 y$ o
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    ; Y8 K0 ^! o& J% u) Q8 K时间差一倍的结果可以接受。
    ( s1 s6 y: _$ k+ @$ W1 b9 B$ R" C8 c/ C6 X' l  d3 P
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    1 Y+ J) @2 w4 k% @: Q4 s9 G
    雷达 发表于 2022-9-25 04:47
    / N7 x( u7 n4 c" s' ~$ |9 o4 y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    + W) ^8 p& Z9 v5 H7 @, }
    ; r/ }$ \7 r+ F3 v+ J6 y; C; T, \) r. `

      a) `( ~2 _$ @& {! s4 V1 E  s, J
    " w- }2 U5 l* J% i能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    8 M& W/ X7 S: W" T- L1 @
    数值分析 发表于 2022-9-25 14:58
    6 ]0 {* Q1 j$ j+ P! @! U5 ^能不能把这个也贴上来,看看和上一个有什么不同?
    9 b% U: Y* Q4 P2 T  H4 p, f
    理了理思路,重新做了一个测试。
    + m2 N: p9 c& X1 B8 x3 j( d做了两个 vector 和 两个 float *, 都长 1000007 @7 z+ C( q6 `/ P7 m$ `) N. B2 [
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    7 N0 A" b( E2 m/ U# j7 \! c$ z/ b: o: f
    内循环试了4种方法,& h8 Z2 D8 b/ K1 q% n$ _
    1. 直接调用 vector inner_product 247s ) M- ?7 L2 w& E3 Y, [' ~
    2. vector 循环点乘累加 237s# a, s) e& z" v
    3. float * 循环点乘累加 204s
      d% S: {1 C! `8 s: @2 @/ l4. 空循环 100000 次 202s; X6 h6 ?2 |1 n3 n
    ( a. C3 m) {6 |1 u, s
    不做内循环 200s
    6 S. A) W5 n% C  E2 j: r, Y$ l, E$ B! ^
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    8 v" Y4 Y6 z) ?8 J4 K, d# `$ c另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# ~! h; a6 K( Z# l

    ; u- L3 E5 S3 m6 v2 ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# Y. y9 R3 ?4 P% X1 n' @

    1 M( A1 c# x! e, v& Z(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 w2 r3 C+ u2 G9 Y8 q
    / E- ]. ^. E. P8 A' Q0 N
            std::vector < float > vec1(N);
    ( R% T( S( b- N/ y% e        std::vector < float > vec2(N);4 t" Y1 `2 s3 o+ D9 \
            float* b1 = new float[N];
    7 o( O1 E" Q- O( W+ J0 X! v) w' z* _        float* b2 = new float[N];
    % @# s" P# ~' q, b; i& j. d5 o# M' K& I/ [! S: z9 L1 [
            for (int j = 0; j < 6000; j++)- r# x1 j+ x, o$ q
            {
    9 t# I$ W- `2 W( @" T- t# E/ J                std::generate(vec1.begin(), vec1.end(), []() {
    + ~  d) P. W) w$ l4 |# p                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ q; k" ]6 U, t5 z' q8 q
                            });
    ; F: w2 s0 D7 Y' `* k7 h4 `2 C* ?- z! q4 U) u* E. [% c
                    std::generate(vec2.begin(), vec2.end(), []() {* r) y6 |: U- F* O! ^+ M
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 f& ?. K4 H- ?5 u
                            });
    - C- h/ H" m" m- _; o
    8 k& q, z8 I- T0 u: e                for (size_t jj = 0; jj < vec1.size(); jj++)
    ) D. W# f/ t( X4 h/ \                {
    ' q- f( U1 {& F                        b1[jj] = vec1[jj];; T1 ~! ^7 y$ O$ Y8 [- Q: k3 s
                    }
    + ^/ s% o( [! w8 b0 l2 {5 R+ G6 F# e
                    for (size_t jj = 0; jj < vec2.size(); jj++)+ K) U# b% J6 ]  b
                    {7 Q6 d4 M' c; r  C' X# w
                            b2[jj] = vec2[jj];& s1 t$ s( }( d) l# c- a
                    }- B+ u6 d8 }: ~6 ]6 w1 o/ Y

    9 W) J+ `8 l" i- n% l: E                //Method - 1  N=100000 247s  
    6 q& }* I) p9 W                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    3 a$ {! _: m+ _                                
    ) h4 Z& v0 D8 O$ ~5 ]) |: d) F                //Method - 2  N=100000  237s$ O! z7 G8 ?- O2 _5 H# x
                    /*
    # l* Y, N8 }; {# p( \                for (int jj = 0; jj < N ; jj++)5 V; u2 M7 Y9 i7 G) C! l
                    {
    5 [  V2 ~% Y3 s+ l% R                        fresult += vec1[jj] * vec2[jj];
    $ W% Q$ c+ X, H6 O# l# M                }
    4 l$ F! n3 U' H4 Y4 e" r                */' H1 }0 l  S- ~! a
                                    
    ) K. S7 p1 q/ W7 @7 s0 t9 l                //Method - 3  N=100000 204s
    ; u6 C' ^; ^0 M* v! t                /*
    4 u' R. [! X( t; f' a! ^                for (int jj = 0; jj < N; jj++)
    9 F+ e' P, l& C7 i# i                {
    - R$ D! A! l8 S                        fresult += b1[jj] * b2[jj];0 q4 }; O+ v* u. p# E8 i! H$ k
                    }- k$ n  E' [- K) w, p
                    */. N& |  V1 M" p- I8 h" s7 `' T

    3 a) H. z( ?) M# O7 M                //Method - 4   202s
    8 k/ Q2 B! J' N3 F& _                /*' \5 i% Z) e$ l: }% N' }( s
                    for (int jj = 0; jj < N; jj++)
    " y  A4 ^+ z5 S! ]4 E                {# T9 Y# v; w# T8 ?5 o% V
                            
    2 R7 ?4 X: V9 H$ p2 o! m4 B                }8 e1 F# U/ L5 m
                    */" X/ U- f& ^1 c1 ]
                    //comment out all methods, N=100000  202s               
    5 g6 k2 Q% o; N        }+ t; T* @$ S% g. H; P% P

    # |1 T: |+ u3 \        delete []b1;$ {' p; t' Q& `' q5 ~; D) l/ b
            delete []b2;
    ; ~5 u$ P2 N6 _# q$ E- @
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    4 k# x; w) a2 }5 M9 F6 p; k* Z& h& m, ^+ M. p3 e  z
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?2 O; y& t0 Y2 Y3 Z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    + V  k. c0 ]/ |; q* ^, v: [瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      f# `$ X: X6 r! |+ R( I+ i; q& t0 s( B+ u4 F6 t
    你第二个试验里面的j在循环里面又重新定义 ...
    5 e" ]& Z. C& z9 F% n/ |4 ^
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL* ~$ r% C5 x) l4 N$ {) j3 Z3 N
    " U0 f( A0 R. a6 M: T
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:161 U. [6 ^! G  a( U( d& T# `
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' L- F! g% }4 `$ |
    0 y2 S# M+ j' w( F& ~不和它 ...
    * Z0 c  K$ C' i( [1 }1 C8 x4 L' s

    ! q% F. f7 x, C( C1 r! p  }不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    - O* p- _$ \! w  ~# Q后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:545 m! z9 [, X9 A) n) m6 x
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 s; D' r) p  {( x; g7 d! A! ^/ d
    {
    4 k6 C4 z$ |/ o9 f  _: N; p* N# a% g        comp temp, xtimesy;

    2 a# s- k* x, q/ v: u  H3 B这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 b7 h5 v7 X9 Z3 g; v5 z1 N
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    2 m6 k1 m$ k6 D/ I+ I- QVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-23 07:08 , Processed in 0.073740 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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