设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?  g8 R& Z0 C: r7 X3 V
    , a( m3 |8 u. C5 z6 P; |5 W9 i
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。( g* G8 E! _/ q; T2 |; I
    1 y( Q) o: G8 ^! [  d: u
    速度优化问题真的很有意思啊。4 n% J! f# m7 G2 B2 w( q
    7 C$ v1 c. r2 p. R5 J
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    , M$ J" J! }$ Y. I, ]把代码贴上来看看?7 _3 N( n9 V9 j; u4 E0 `
    8 U3 L0 J1 w9 {% w) |# y" 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的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    : x8 `* T& ], A$ x  \! J, h
    数值分析 发表于 2022-9-24 23:04
    . x6 f# ]' p7 Z8 Z( T2 P3 {: c拉下来?拉多少?  I4 E& z( R  V1 C6 G0 R
    把代码贴上来看看?

    , M- N0 z0 B6 V, O9 s4 o6 N/ B- H8 t" i  z4 D1 X# k! O( o
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 l" m- y2 ~" F2 s{
    5 ^' a% N7 w- i7 L5 V6 v! V( h1 T8 Z        comp temp, xtimesy;! d+ L8 P8 _' G
            xtimesy.re = 0;
    + Z& p; R+ j# g/ n        xtimesy.im = 0;
    & Q0 v% M5 l) X, ]1 k4 P& N        int j0 = lenB - 1;5 X7 u/ v; S7 Q  h& f6 M
            int    i, j, i1, reali;
    : H( I3 z4 T" Q. g        if (lenA % 2 == 1)& _: a! A4 E/ a+ L
                    reali = lenA + 1;; j$ q6 D; G9 z
            else# E8 `# m3 V" y) `
                    reali = lenA;, o* N5 R" J. }, f; S* L& R
            reali /= 2;
    . M# u: P& r% A& n8 X9 X7 f( C# ]9 {8 q) a
            int nconv = reali + lenB;8 i9 J7 F; \9 x' X- T$ F- W- Q
            //#pragma omp parallel for
    1 P0 Z7 [7 v/ X        for (i = reali; i < nconv; i++)
    ( k# ^+ }# e. i% u9 F        {
    ; t# Y# q& G; r$ s! `! S% M6 t                temp.re = 0;! J' i) ^" @% Q  Q; L& T8 |
                    temp.im = 0;; e" z3 l4 {1 r& y8 X  k
                    i1 = i;
    3 Q0 P/ r' A1 g# u/ Y, L' f* A                for (j = j0; j >= 0; j--)
    % |+ p1 h; J/ }* n$ j1 G                {
    , z6 j! `- R4 _/ B3 H                        /* floating date operation */5 F  ^5 @' _% p) _$ u
                    }
    : n1 |7 N7 }9 }  j& u
            }
    ) a& d1 `! R0 H, v& T7 s/ x}8 r; o  q% o+ V6 _' t1 @0 d

    + E- h; M$ n7 `$ }3 jxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样# X3 {. t# C. c3 m# H& l
    / {# c1 w1 [: a0 {7 r
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。- E. a, _+ I! o. o6 Y0 g! R' Q
    现在call xcorr 100次,耗时78s.
    5 @" r" b, F9 s4 a5 M' Y- Y3 b% m- |' u7 [
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 1 N5 U5 c" h# ^
    . K% e/ s; F# Z9 ]. |
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ( m- A$ S' a: S; j; dMaybe Debug mode?

    " f) w# x. U7 Y. Y
    ; M5 q) }8 u& `! G不应该,看我上面的回复。9 E* R& L3 H" q3 ~& t
    " U' {; R: Z5 w7 `: D+ Y7 y
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 / H/ {, y& n, H
    雷达 发表于 2022-9-24 23:54  E  y" ?+ x/ I2 t2 S* B
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB), u/ ]4 h6 p. Q' \6 Z- x7 F# H# u
    {
    4 h/ S0 A  |2 |6 b( [, u1 F        comp temp, xtimesy;

    # t4 J0 W! S( ]1 \, }/ K  g  l- W1 v6 P; b7 [
    这个不是这么比的吧。。。3 d- {% p0 ^2 k' H0 ]
      u4 w7 J% v& J7 o' g# i
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。6 |" y# r$ S" v! |3 x
    ; V+ G( I: D3 r9 O& 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 编辑
    : @0 C) C2 s" a8 S; a2 |
    数值分析 发表于 2022-9-25 00:20& a3 Q1 ]( H$ E7 m$ ?4 V
    这个不是这么比的吧。。。9 T" a7 o4 ^) D) _$ a' i

    4 A3 T- K# [) S- w您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    , f7 z  p6 f3 H& @+ _7 N: J7 i  B. s$ M1 p5 F
    有道理。
    8 `1 Z; @; a$ G/ V: }$ R) }, Q2 S所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    0 p8 ~) U  \  H8 _! c3 e: x6 M# Y. \
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:464 p9 z8 R2 e) W" M  r+ E9 U7 ?
    有道理。( g( X2 \, f: ^$ C7 Z( Q
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    & ~$ g7 X$ T+ ]- u" h$ t9 t你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    : ~, C! N2 ]3 v7 A  BWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:203 P6 h/ z4 F/ t1 ?- s% C  P
    这个不是这么比的吧。。。
    3 U1 ]0 e8 w" d! |# ?2 \0 |7 f  ^+ Q/ M$ m
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ) `0 r* y4 l! I4 O% P) u2 V; I3 {, ^' V, Y
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 4 r6 |# E1 q% W% u* K% V" ^3 M
    沉宝 发表于 2022-9-25 01:48% f5 R& \6 z: v$ h) {
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    . V" `) b$ [: D; h
    1 L8 U" L* u; E; f. I8 O
    是的,兄台说的对。- H1 N/ x2 o& b. ^7 @

    9 x: \; v* E' }- I8 j0 S+ P0 g其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。/ P2 d" q. _& l% h: k

    ( A1 A7 K' q+ P) b2 P( d& Y* c0 v雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。" y% j8 k# P! E0 o0 U

    2 Z" o# n7 {  [6 s6 T比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    7 e+ K. h0 f  w3 y2 I( C
    $ `. U+ r; k6 S% Y当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑   N+ m6 U% q/ g
    沉宝 发表于 2022-9-25 01:27: v- _" P: @  k4 _2 R: h8 J, h
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    7 Z& H: V1 z. `! P/ d, T8 [3 v, F& g' q* z1 x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。& _/ j- a2 i9 D. H
    " ?4 d0 l7 [% d7 C  b  W6 s) `4 g
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    3 T* F' Z; z( g: p/ F4 K/ O9 }又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ! y; B5 D. V% k; y$ Q0 d
    时间差一倍的结果可以接受。7 D7 p1 r" w. f# {& `3 \

    3 _- Z# s' Q( ?6 Y) f  _& c5 B  r你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 3 L3 m3 ^: h) q, h, ^6 \" p2 M
    雷达 发表于 2022-9-25 04:47; N! L  e& l* d* J8 W4 O6 s
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 e3 d. U. |3 m9 l) ^. W( X7 ^. ~2 V8 V) ^# J

    , P& ?- ?* ~; P# a1 O3 e" Q0 y# z, Y& ~/ i- ]
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    2 E6 M& T# l. l0 H, S3 ~+ j$ x! h
    数值分析 发表于 2022-9-25 14:58* c0 i9 T+ d* W0 T: N
    能不能把这个也贴上来,看看和上一个有什么不同?

    4 i$ h& q8 [7 V理了理思路,重新做了一个测试。, v4 {0 T8 G; p# [
    做了两个 vector 和 两个 float *, 都长 100000
    / n! C( E, a8 ^- r) \$ C外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    6 W& C& h" a2 m0 u( i& P+ B: W8 ~6 h% H1 J
    内循环试了4种方法,
    / W" X' l! p/ S8 n+ E! H# g1 X1. 直接调用 vector inner_product 247s 6 s* i9 ^: f* r2 j5 j
    2. vector 循环点乘累加 237s
    9 Z/ l4 Y6 Y1 C$ z0 o8 y3. float * 循环点乘累加 204s) A1 p4 V- R& e8 j
    4. 空循环 100000 次 202s
    1 j" I4 b, C) E9 k" o
    7 w# U% V; ~3 |+ j不做内循环 200s
    1 F6 r1 u& u8 E' Q% ~
    4 n' r/ I- i8 Z' y: a) h你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ \) C1 r; @  D/ w! N5 E
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    4 L; e# L! D* `) I/ Q2 u, S5 e2 c6 X
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    4 W9 @4 Z* f; L
    + m0 V% |2 K8 S8 Q% j! V(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)4 \5 B. f" P, h9 ?' H: ~

    * V% R) t' G* P8 @
            std::vector < float > vec1(N);
    0 a7 l$ w2 U6 X' f        std::vector < float > vec2(N);1 w) Q( o+ [& I
            float* b1 = new float[N];
    " r6 v8 e, Q1 I* `+ G7 |% N        float* b2 = new float[N];, g/ x7 {. N* e$ {; i3 e& m

    2 Z' C+ K0 F  T2 x        for (int j = 0; j < 6000; j++)) N, I: R4 C" P8 X
            {0 a4 o" I) t' j
                    std::generate(vec1.begin(), vec1.end(), []() {
    4 o, R1 v" h3 p- u4 I9 q; Y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 l* [! S1 f6 ]& u% C' V: b! d
                            });/ W2 K- w  }7 e5 L' q7 K4 ~1 L
    & O+ l" M: _1 N
                    std::generate(vec2.begin(), vec2.end(), []() {
    - E2 z& c6 N# r& A5 s# X                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' U' P/ ?' I( D9 U
                            });
    $ N0 ~% q$ o  o1 J; c& ^! u, ?. `1 L
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    : X: H7 ~2 p6 t( A  a                {% E* m. p7 I! z/ C7 b* O: M9 j
                            b1[jj] = vec1[jj];" ?5 O' r. J3 E" g/ A
                    }6 z5 \( G. S  u' R, G
    2 \" S$ ?3 b& W0 Z: g# Q
                    for (size_t jj = 0; jj < vec2.size(); jj++)4 p% \7 C6 m' Y) t  _4 |
                    {3 z) |; z0 d! g8 i" Q
                            b2[jj] = vec2[jj];6 N+ Y% V0 r% S' H( k, z" t) t
                    }& u/ Z- i: l/ q
    9 u( ]! t, N% [/ n$ p6 n+ a! ~% p
                    //Method - 1  N=100000 247s  ' t- D2 F! Y- m% c! p5 q# z
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 Y6 [" B& e: N/ X8 y
                                    
    % h5 l( Y) F, U* @9 y% O                //Method - 2  N=100000  237s2 f# D. G8 g* ~# H( y8 S4 c
                    /*
    # u. `2 [) U$ T                for (int jj = 0; jj < N ; jj++). f" w1 G  `+ ?0 q+ Z
                    {
    * M$ R3 N4 U, a/ u' D( h                        fresult += vec1[jj] * vec2[jj];
    7 [: N- f7 t, Q9 e2 D+ i* {                }$ E0 X$ ]/ \! {1 _) Y+ I+ S& j1 ^
                    */0 E/ A: ?1 r  \  o/ L
                                    
    % S6 k7 I6 [' f2 \( \                //Method - 3  N=100000 204s
    2 f  l, |% j7 u1 r$ l8 P. p                /*
    % e, B8 ~0 ]# o0 Q' J8 |+ Q! F                for (int jj = 0; jj < N; jj++)
    * X6 ]. }' {! Q! J8 j                {2 r9 W) x, V! J# V( r& i
                            fresult += b1[jj] * b2[jj];  v* \# ^! E* ?& d. P
                    }( }8 ^1 ?6 Z: \! ?( C* U/ M
                    */7 @- @. K0 q4 i& E7 D
    0 Z" x" ~& ]/ w# C8 E2 t
                    //Method - 4   202s
    + r4 q1 h# u$ Y  i0 e                /*
    6 M, V' I: D2 I+ ^                for (int jj = 0; jj < N; jj++)
    ) G4 M! ^: C7 x! n$ e; W                {
    7 s, A9 v* o1 Z) k- E                        
    $ @' ^3 S! C- U  m2 p: N                }+ }4 A7 m( k5 N6 n: }4 s
                    */
    ; r5 I1 v1 V3 R- e% v. d! m- O                //comment out all methods, N=100000  202s               
    1 @+ F  t, N9 n$ i- D' D        }6 l7 x1 H6 D2 ?7 n

    6 W  f% y4 S( e        delete []b1;+ D; D+ ~! K- `5 F/ W* H- a, [
            delete []b2;
    , ]% H$ E  i4 |3 ^: A) p* f
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 i+ D( q. J2 i% d( f$ w. Y
    & ]' f  |. u, f! z7 q5 a9 L3 {你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?  D' k4 n; i- L. {/ a
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:156 t# ^, ~2 ]' G! A5 O6 [
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 `( v% A" e2 m  O

    0 B" G4 n! V( S' f你第二个试验里面的j在循环里面又重新定义 ...
    0 n. \. ~' j. x+ w
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & j  y: Z3 v; }: u* D5 H. Z4 c; I0 \
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
      j7 n! ?5 k0 {内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    $ f/ F& g8 w) ^, a; p8 |1 _1 S4 p# @, ?, }1 H* U/ [$ f( p
    不和它 ...

    $ }7 ?; O+ d5 v7 z0 s" V; [/ W
    ( U: ~' x5 R- }  _( H9 w" c不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。4 K6 i  e- X& \
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    8 T  \( p5 `5 P9 [% Uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* n* l3 I; Q+ X: k+ |+ o8 `5 t0 o: W: ]
    {. m" A+ J- {+ E6 t+ V6 W
            comp temp, xtimesy;
    % ?2 K5 C) f: {3 U  \3 A
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。2 Q; ]5 S9 o4 n5 K7 I
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?0 s$ j3 Q1 H( {6 |$ x' y( u) t8 g
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-10-17 05:31 , Processed in 0.035916 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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