设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    8 n8 D# M5 \! f% G0 o7 Z
    $ R0 U! g5 ]( ]) I$ ]自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。3 o0 l! M1 t: V& @* Y, q6 t# R5 _
    * L, y$ p# {9 b7 m
    速度优化问题真的很有意思啊。! Z& t+ w( ~6 m  a
    9 @; B7 O- F) R' \2 P, [$ |9 F
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ; p5 u8 H' m7 m4 \8 R# p* K9 Z0 \把代码贴上来看看?* b2 a0 ~+ _2 f9 U& l  f6 l' [

    6 K! S7 ?. v! W+ ^6 D2 x7 ?难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 : n4 \% k. }* {
    数值分析 发表于 2022-9-24 23:048 K- `) z/ K& n7 Z
    拉下来?拉多少?
    0 m$ C9 w8 f7 V: u把代码贴上来看看?

    3 e  K' _1 e. o! i2 d4 _1 W; N) I8 E% `+ X/ v! F4 ?5 I
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' q8 u. l( J$ M+ i2 F( l0 v' g, s
    {$ Q& x+ f! w7 X: r/ f; {
            comp temp, xtimesy;( \+ Y7 n1 a" c8 {$ @
            xtimesy.re = 0;
    0 M  e: g7 e6 |; a" s6 V        xtimesy.im = 0;
    ) W% _- v* P* q5 e3 \+ h        int j0 = lenB - 1;
    ) @( c# j. R$ n  m+ x        int    i, j, i1, reali;$ ?' R7 h0 h; O0 @
            if (lenA % 2 == 1)
    8 J& n0 N, P$ f: H$ p                reali = lenA + 1;+ N0 |; `9 o1 ]& e
            else& n: T# Z& Y0 D# M. T2 c
                    reali = lenA;
    ' X! j$ j6 \; I7 z: y) J; ?6 c( m1 x, y        reali /= 2;( @1 T0 `+ k' z1 ~8 a

    % x5 o9 d/ }( R1 m& B4 ^        int nconv = reali + lenB;5 e$ g! S9 Y- I( D  ^
            //#pragma omp parallel for
    8 B5 D+ M2 z1 o+ t: z        for (i = reali; i < nconv; i++)+ L: @% t2 B3 A" z
            {/ x3 J7 y; v$ _& C5 P5 K
                    temp.re = 0;- p; ?. p5 O' y
                    temp.im = 0;
    ! Z( w0 w" E6 ^5 X+ {                i1 = i;" |2 T, v( E+ Q
                    for (j = j0; j >= 0; j--)
    ; C# U/ \0 u* r  {7 l$ t( o) |                {8 C4 M0 X7 ?" g
                            /* floating date operation */
    6 k0 x4 z$ {- ]' I8 Y5 d                }

    ! K8 f' e# D3 q8 g        }4 D; h/ S7 ?6 s" N
    }* d$ x8 X, ^; E9 Y4 K5 E

    9 }6 l5 U3 c  A, kxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ! u/ o' j2 _/ s  b# d4 s3 H& [6 I% v; q. L; q
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    % ], a9 ]* b* m, Q: H2 l! h  C现在call xcorr 100次,耗时78s.
    / i9 i$ X5 j- g! \8 X3 w. R
    7 l, V2 F; r( i2 }如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ) f$ k: x: b# x: g: w' i/ m3 C: h0 [
    $ g( K9 i& J% f( W# N7 O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    1 N* m5 q7 `1 o* i  Z& [% C$ S+ n3 [. V3 KMaybe Debug mode?
    ; v8 R# I  Q; a: K) @9 F

    ; G5 U* C0 S% a5 }- n不应该,看我上面的回复。
    / O6 t3 z4 f5 N; z( P, X# E; T$ p% S6 n% O. W! I& J# K. M$ [
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    : Q( w) j4 @. T; s; t. y
    雷达 发表于 2022-9-24 23:54
    0 Q+ _9 o( o; T7 qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    # t9 w/ t& \; _% r3 H{6 ]! A& X4 i, s8 \% C
            comp temp, xtimesy;

    ! n- B7 d1 V4 u
    ( Z+ X2 V# \6 R+ E这个不是这么比的吧。。。6 n- ]5 K* K( E' S* E9 L

    2 q# `' w: x* y( \, j" A5 O您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! t( e0 ]; K; Q& ]  K6 o4 Z/ p: a3 }( h  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 编辑
    % ~1 Y% O( J9 z# K% ^- M
    数值分析 发表于 2022-9-25 00:20& I" J- z0 L5 }% T
    这个不是这么比的吧。。。
    & W. H* g: _, ?+ b. l* W% r# f7 e" V8 e% B$ {2 A: s
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    7 u4 y$ k/ n8 P$ G! Y5 P: C
    3 T' h9 ~% h6 V. Q& P9 i8 A) r有道理。
    - T& k$ [% }8 K所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    4 X# y* l1 `6 _& Z) }& O/ Q# U' r# S6 A  ?* R9 J$ }
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    1 y1 a) g' [: `5 _- K: U" B有道理。
    $ Y1 D4 H3 A) |5 I所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    " _5 w8 ?7 Z1 Z# K+ Z$ A; k" Q你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    + C3 w& Y$ j' ~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
    2 _8 I' j  J9 |; x6 u( |" P5 a: I这个不是这么比的吧。。。
    1 P/ _3 N, o0 l2 v/ m: }9 U2 o. a3 g+ [, V# Z
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    3 ]: \+ |3 G* K  ^5 T5 d
    5 i. A( S+ k, b
    现在的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 编辑 * N) p' W8 h" u8 `: [5 G
    沉宝 发表于 2022-9-25 01:48- Q- b$ n" ?: P# c, g' N/ ~. v
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    6 H+ d' l/ C. Y, J
    9 e# p& {+ P; H7 [是的,兄台说的对。& F8 T% k/ V( D0 _& b
    $ _- |* I2 c) q9 N! |: U
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    # R- d( x- T0 G6 K5 `/ R  c( k% p2 K+ u$ M' g
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。( y! [. a5 a4 P

    , Q: o0 M2 B# |; N+ s比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ; M2 o. o7 s" R: ^7 T* }, y% N3 }4 N# h$ t) n
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    : m4 b7 Y1 b: W. u, ?
    沉宝 发表于 2022-9-25 01:27; V3 y) p' w5 E( O. c: u
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    4 f- t0 T+ S# {5 ~7 A2 I
    4 b1 E& I. G9 O! C% H8 T4 f又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。) Z. t4 H9 X4 M" j! u. `& b! D
    9 Q6 b$ t2 r! C0 A, |
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47! Q; E0 E! ]0 u9 ]( _
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ( P) n% c- G' b8 H) q8 X, t时间差一倍的结果可以接受。
    8 U& w0 p% n" b0 K
    - N/ ~4 @* s( f0 U  C你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 6 Z. z" ^% I3 I  f, Z& ~
    雷达 发表于 2022-9-25 04:47% G8 ~0 {3 o  b
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    : l# }* B; v. B, b" V6 t# _1 E
    9 z6 L5 }4 K5 Q2 s2 U! n& Z
    & m& q4 g+ }; i- V  |

    ! D0 H+ p2 Y/ c( d' I能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 0 Z' h( F+ J- l  K
    数值分析 发表于 2022-9-25 14:58
    * K: T; `4 c2 F能不能把这个也贴上来,看看和上一个有什么不同?
    8 F/ k% T( j: C7 ]. H3 \
    理了理思路,重新做了一个测试。5 P0 O2 d" M* o; m
    做了两个 vector 和 两个 float *, 都长 100000
    : ^. z2 V0 m. U. L外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 u0 Q0 V1 z% m& E8 n

    : G! T& V8 R9 r2 c- J内循环试了4种方法,
    ; {$ F+ q: F! G3 W$ m8 U1. 直接调用 vector inner_product 247s
    3 n$ X! v8 p4 V/ h! c( H2. vector 循环点乘累加 237s
    7 U) Q4 `7 c3 Z- C/ n9 M3. float * 循环点乘累加 204s
    4 R: Y$ w, y4 M3 Z% U! q1 ^: s. b4. 空循环 100000 次 202s, b3 @( t( D, n6 z5 @

    5 j# m5 H  J9 J! L, w  A不做内循环 200s% y  W; H3 X& t) q5 l

    , q4 U8 A$ q+ _; I你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    0 X( N9 X$ B# V+ Q$ p& {$ z& }另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ( o9 B1 F# s# A6 u, P
    5 A$ L7 a, T( k- X* Z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ r# m9 Z; h' \, U

    ( }% t' S" q' l  G(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL), B; ^6 _* n& s8 M+ s5 w

    9 o: q" D+ @) M+ |/ L$ B8 p
            std::vector < float > vec1(N);
    3 a/ b6 W4 M; @7 e7 T- _0 i% v4 r        std::vector < float > vec2(N);
    2 I: l, [* h! @8 L        float* b1 = new float[N];
    ; K5 w* ~+ e( R& ?+ o6 a        float* b2 = new float[N];
    8 c2 a, g% R0 `0 Y% b5 [3 t
    9 I4 n( B) j! k' a7 a        for (int j = 0; j < 6000; j++)
    6 k7 z6 b) ?9 W5 X) h* S/ L        {! N9 E3 @$ [7 u: d7 s6 G9 e5 r
                    std::generate(vec1.begin(), vec1.end(), []() {
    . v; F5 u# C( C8 r                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 ~- i' V4 r9 \) F
                            });  b& {! x" r& ?: O

    ) R$ U8 p* {9 d$ w                std::generate(vec2.begin(), vec2.end(), []() {
    ) U( h2 [2 [* p1 ~* n                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    3 C! D+ n5 Q, H" B7 X                        });! j- |# Z3 B# e2 W, f- M2 ^' U2 V

    $ N6 ?/ b# B9 R* l, n% |                for (size_t jj = 0; jj < vec1.size(); jj++)' E8 ^9 V' N. ~3 W  c  U
                    {7 E2 n8 I: y( U: h
                            b1[jj] = vec1[jj];
    $ f$ p% N! |' [, q4 f% t                }
    9 ~, b4 _- E8 l7 E. q, d" E$ C2 ]" c* Y7 j+ Y
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ( j! ]7 b" _( H  R/ A; o                {
    ) v8 r9 p+ L! `' A) ?                        b2[jj] = vec2[jj];
    & b7 S: h$ F/ ]" X/ J# `+ R+ h                }( m' N6 }, a/ P; `' H% M

    0 i; f0 s: [; R) O! _                //Method - 1  N=100000 247s  4 T4 ], D7 }, k+ R) ?
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. z# K. s1 {4 ]; p
                                    % }( }: |3 C6 T; q; f
                    //Method - 2  N=100000  237s# }$ r9 r' t5 y& L; x
                    /*
    % f7 n% Q% q6 |9 L% [( q; b" y                for (int jj = 0; jj < N ; jj++)3 J) s) `! e- \+ g2 j
                    {
    / m5 T/ y4 N+ O) i6 ?" [                        fresult += vec1[jj] * vec2[jj];
    " R. i2 X; T- k( @/ H3 V                }$ a9 [$ n( S6 s! {) [% M
                    */
    ( r5 I: }9 y" y* @( f                                2 f1 H& l' m1 W7 f) N4 C
                    //Method - 3  N=100000 204s0 [( P; Z* e5 Z2 Z
                    /*! k& Y1 t* m3 f6 `
                    for (int jj = 0; jj < N; jj++)
    ) r! k4 R7 B, T                {( A7 s9 I! {4 s: u, l: A1 K
                            fresult += b1[jj] * b2[jj];
    / J/ q% ?  j/ A: U9 q: n' `                }7 V: x6 h5 D7 g
                    */& I: F$ u' d3 V! u, d. G( I. a
    1 W3 _- n9 l4 m. C4 G+ i
                    //Method - 4   202s
    1 x4 _  u8 ?7 t$ V* E5 q                /*
    ! _0 W/ @7 i' X! S3 M6 r2 u                for (int jj = 0; jj < N; jj++)8 [0 g7 G5 F0 ^
                    {8 T# L# {% C6 Z4 `  Z( F5 c
                            . m/ c8 k7 X& `
                    }- D/ J" E3 z! l, d* S( _
                    *// r# F/ {" y6 T! a
                    //comment out all methods, N=100000  202s                : G" J: d! ^' ~' z/ U9 v7 e
            }
    9 W* [/ S" u' @3 x/ Z; }9 V
    ' C+ k- U4 @( H* e/ c4 P! @        delete []b1;* |4 i$ X+ H2 o0 W& A
            delete []b2;
    ) x  o% S8 l7 E- X4 e
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    / _- D4 `* b5 }" \8 G
    8 m' G) ?. U; F/ `你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    3 z+ l  L1 D1 D, }$ c. w/ n& V
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    5 {# m3 j7 U5 {瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    9 ~; E8 {: i; @# v& ^/ D8 l. N
    4 w' b5 a% b  A0 S( z5 `2 B1 O" ?你第二个试验里面的j在循环里面又重新定义 ...

    7 Y/ Y1 H# z  w2 q* c内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: Z+ I8 B7 s! z/ m6 Q

    ; t" B0 j* A# d0 B5 e# Y; \不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    & i2 d' j/ {2 a内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + b/ S/ K% {$ g# R( e
    ; ~2 C6 p5 B* _5 T不和它 ...
      ^5 E6 D" F6 n, `

    % u% p, q6 ?5 |0 h3 N: i8 k不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ( u4 t3 j# S# K, e后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    - A9 E$ _9 N" |, r- `" ~5 |2 \& zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / K) N( z0 m) ?' A% G{# ~, V1 x4 Y/ U" i0 [6 X
            comp temp, xtimesy;

    ) T' d$ a# Q# `( G# Q! e这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
      x; c) S' u6 P/ j内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ; \9 S, [4 Y2 L+ TVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-11 05:36 , Processed in 0.070504 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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