设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    - k8 j& `# Y# Y& G, o7 {: g$ ]! G9 h
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    + ?6 o& o" ~1 L5 Z- L3 ]% ^) c
      m0 _, j8 ^9 d& x) A0 r速度优化问题真的很有意思啊。/ \9 R' [- Q1 l. v
    2 i/ y/ T. X. H( _& P* q7 [
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    4 N. |% w( ?/ X把代码贴上来看看?
    * ?" t2 w3 f: f6 G; d2 [4 _
    - o" k5 z0 i3 e5 m- R, r& U+ E4 H' F难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 1 d7 y$ p5 {* w7 e
    数值分析 发表于 2022-9-24 23:04! a- v" H7 P" I
    拉下来?拉多少?2 C7 {8 {8 i2 ?: ?
    把代码贴上来看看?
    + S! C# t  V5 w

    % q9 R/ o9 i& {0 m& Wvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    . x$ o: w7 L$ N; J; R1 N$ \) }  a{
    / p9 Y1 d  r( g' {7 A2 }        comp temp, xtimesy;
    - g$ Y& N/ g( A        xtimesy.re = 0;/ |* ?5 C/ `# ^# c  m- H
            xtimesy.im = 0;
    8 Z0 u5 q6 \  W( c3 e1 G  h        int j0 = lenB - 1;
    ; C( e' v3 W1 a' s        int    i, j, i1, reali;3 G% @  @7 a* ]
            if (lenA % 2 == 1)
    # C7 |, @8 ~! M' i. L6 m# Z                reali = lenA + 1;
    & t0 p3 c1 ]; |9 s' [% N$ ^        else4 R- V+ w6 [% r9 u# _, V$ v
                    reali = lenA;
    ! ^2 t9 j0 M1 L5 T7 T& K* \        reali /= 2;: g! Y$ {4 I' F+ r2 N
    # ]/ y; p7 A, b
            int nconv = reali + lenB;
    ! r  w4 d6 {& A: f8 G' d$ O        //#pragma omp parallel for0 B; U6 c3 H6 Q! P" }
            for (i = reali; i < nconv; i++)
    % T, k1 ?9 T' m0 C        {( [: u& K: z3 @' Y7 s  W
                    temp.re = 0;* A+ O' \( J2 Q9 G* ]7 V* j
                    temp.im = 0;( f3 x( K) X5 d' q$ W# l% d
                    i1 = i;+ j$ ?3 c: |! _" S( p2 z' i5 h" |* f9 ^
                    for (j = j0; j >= 0; j--)
    9 l& f* Z' f# B, d/ `                {2 z7 K1 s; w. [- _1 `9 f% L5 _
                            /* floating date operation */: h: {7 V1 @5 y/ j3 ^$ v7 Z/ W8 e' \
                    }
    3 v6 E" L) u5 M  _: m8 j- Z$ A, e' e
            }- r3 I- W# [- Y
    }
    1 O  J4 _8 Q) R3 y: f! B( g8 @0 {9 m3 m, [8 _* o
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样# l# |' t- V" {; _% Q7 V

    7 j: T$ U1 I6 h2 O" Q  S红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。/ ~4 k2 Z, V. F( u
    现在call xcorr 100次,耗时78s.
    , `" ^# ?8 J: a% S" T1 `# r# L9 i! J) @% v
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ( j/ ~% w$ @% Z& W4 P
    3 S0 B+ e. G0 C/ A: d9 R# B
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ( ^# K2 O2 D' V0 a: g* B6 y% {Maybe Debug mode?

    $ {( q  O- e+ H4 O9 O# w
    8 Y: N( z3 e* E+ D; f不应该,看我上面的回复。2 q( |$ Q; }/ D, y) F- P' W5 F
    7 {3 s% Y/ h# C7 ^9 c. |
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    , v8 C3 q# e+ m% E1 N! M" `. e
    雷达 发表于 2022-9-24 23:54
    ' f. x0 D9 Y0 l7 mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    5 P$ z4 l7 }. a5 e! f, U$ T/ E# ]{/ a- y2 V& Z( z5 y1 a1 m
            comp temp, xtimesy;
    ; o* z3 [2 ?$ h- I1 p

    % R! {2 x6 e  u" Z5 m: d& ^这个不是这么比的吧。。。
    : r2 l! y: w( m! n/ B/ y' e, R4 e- i( Q6 @/ o1 v& h+ }
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ; C- ?# l/ @& s  ^8 V& l
    9 ]9 P/ [/ l9 ^而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 6 g5 @4 v4 S, G/ f3 V; X) |4 c
    数值分析 发表于 2022-9-25 00:208 ?7 H/ u  Y! b3 W% X6 c
    这个不是这么比的吧。。。
    " T/ E$ \2 O' k, G' ^) v8 f8 b9 d
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    - Y. w* v' q  N( u0 T9 p8 Q; @( T5 w
    有道理。
    . t1 D# [- @. L所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。" B6 ]9 W. _, R
    ) t( N% D  r$ Z7 E7 P
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    . a/ A/ O9 g: k# C# N. E/ Q有道理。
    + B3 n- `$ G9 f( r; l* o$ u所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ! l0 z$ s2 c" r你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多, `4 v7 U* V& D* g+ ?- V
    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, B  L/ L% H3 F: ^0 G# Z
    这个不是这么比的吧。。。9 g# q& {- m: D* ~; J% n4 I
    $ B, U* r% y' Z4 t2 R
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    # p) ?2 Q" f" A, H0 N# d! G1 o+ n; Z+ G' c" a. h2 ?* k
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 + ~0 h/ q1 e8 `2 k5 I& R. D8 {
    沉宝 发表于 2022-9-25 01:48
    , _6 B' H6 x( G6 ?7 i; |/ i现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    * u4 O- l3 b5 r# y
    . O' r9 Y* `' J4 W1 X是的,兄台说的对。
    4 X# b& A% A. T9 o5 P" g; d: U+ L5 w8 p0 @& ~% [
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。* k& a: o" ?# ^

    & H0 N) h# V0 W雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。- \$ z3 H  V% i/ X7 E9 ?

    5 K( _$ u. }$ _( i2 I% Y0 O3 Z比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。# V( m7 {! Y2 {4 `1 A- F
    / T( D( ~5 n8 @0 s) i( Z! x; S
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑   \8 P& _% X- M/ a
    沉宝 发表于 2022-9-25 01:27
    6 N) R  X' e: g; q" `  h; x: D+ o: y你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    " Z3 L+ V0 N7 C- u3 u# `& N: }# z- ?9 r9 k
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。" M0 X  s1 {: }
    0 s* t- W, z: T* a) X, ^% q3 ]5 H
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ! \# J, L9 W+ j5 p9 ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    " Z; z# y; V- I/ C) X时间差一倍的结果可以接受。7 y+ G, H2 Q# B0 e; T3 H% p# s
    * F, X7 L4 k: u
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    9 L: V6 s; u  S6 o
    雷达 发表于 2022-9-25 04:47
    5 K1 H$ U6 F5 ?- V; O又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / u2 ]6 ]& u% e# Z

    8 q2 [% R& M: N
    ; g0 j8 _& a6 X& X6 |; ^
    5 W4 J/ N* Z/ w: a6 V0 p能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    - [- \  j( S; h0 F
    数值分析 发表于 2022-9-25 14:58
    / _- o5 ?/ }% L) I能不能把这个也贴上来,看看和上一个有什么不同?
    + ]  {( y7 n1 N' l1 o
    理了理思路,重新做了一个测试。& e, Y' ?6 Y/ a: y8 T( q! R/ o
    做了两个 vector 和 两个 float *, 都长 1000001 s; r% z9 R) l0 f& p
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ' ?1 X9 x; b8 n0 N- }" a
    ' L# t1 p" H1 `4 k! w; G内循环试了4种方法,! y% O. r- G- \7 s$ Y: m
    1. 直接调用 vector inner_product 247s
    : E; T, y3 U. O: O2. vector 循环点乘累加 237s
    : c9 G/ ?: [) Q: |3. float * 循环点乘累加 204s
    * P  P) ?. E) [' \$ j5 J4. 空循环 100000 次 202s8 P2 C* z% X+ ?' H% W. ^
    3 N" y9 E2 N# ?' J; s2 w- n
    不做内循环 200s% L# j, Y; s! w; S9 Y

    - A5 t% _( |7 t4 r, H你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 L. k4 ~/ |! a7 c$ ?; A% m4 C
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. q( e1 Q! A4 B5 G6 k
    9 B5 r9 o% @* X4 p
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ( b+ x& T0 O/ j- }5 O3 Y8 @* [7 }7 L) y
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    5 V/ D7 Y, x0 d1 r; h, p# w8 d+ j, x, B& k) r
            std::vector < float > vec1(N);! b- @4 X3 l" r+ ?
            std::vector < float > vec2(N);
    1 f3 X1 j+ }9 v% V. q7 K        float* b1 = new float[N];2 Q  J* f% C. n3 D# Q; H7 ~3 _
            float* b2 = new float[N];. o( @! a- L7 Q0 O
    9 p/ c& E2 s9 ]
            for (int j = 0; j < 6000; j++)5 q% E. @. N+ u
            {2 w4 Y5 w* {+ ~: |* L- t6 P
                    std::generate(vec1.begin(), vec1.end(), []() {
      g) }. l% l2 e- A5 O# h                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;  J1 y8 N6 t5 A
                            });
    8 @6 S; s! [- K: [, T7 t+ t% S' D+ I# q
                    std::generate(vec2.begin(), vec2.end(), []() {2 f0 [, [4 o1 v) i
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* i  c5 a: f4 D: }  p$ i9 K
                            });* b7 x' o* X3 T: N& v
    % ]7 {7 E0 M/ L  t5 q" l
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ' E6 B9 Q  F6 C9 s( d' X7 E                {
    & u" h  C+ Y  X& X# w5 f* N                        b1[jj] = vec1[jj];, |; ]/ [# D" Y- N  K' A
                    }
    / Q, Z' B  E, Y' ]$ U& h+ f9 Y; g- w
    8 e  _0 ~8 ]1 T" |4 u( @2 e7 X5 O                for (size_t jj = 0; jj < vec2.size(); jj++)* v! h+ ^7 d$ K- D! Y
                    {2 C7 S4 i* I* ]0 T# X
                            b2[jj] = vec2[jj];
    : C! n! k" [7 O  L2 h                }
    2 B; o! H2 k& ~  O. j6 X1 O
    , I9 \4 N1 |; G; ~9 a, L' l$ H& n                //Method - 1  N=100000 247s  2 L- t, z/ p6 d3 A4 x
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! J3 T2 w7 {5 O2 T3 W
                                    
    2 D4 @8 t: n2 q% P( s                //Method - 2  N=100000  237s
    1 S6 I2 t( g2 T/ ~. ]0 D                /*
    1 c! D: x  a6 {8 m& L/ Z4 ~                for (int jj = 0; jj < N ; jj++)- k1 @8 O1 h8 c$ o* J# t$ }
                    {
    9 C+ }% t/ D8 J5 I/ J- u* R* @6 U5 `                        fresult += vec1[jj] * vec2[jj];
    ' `' m5 ?) @$ f  f                }+ n" x3 E9 b0 N6 i9 ~3 z
                    */
    0 T: y. B( a) I! c                                , o- D4 R0 F3 a3 H
                    //Method - 3  N=100000 204s
    ) t! x' ?2 b7 |* i                /*
    ' `; |0 \6 Y2 ~                for (int jj = 0; jj < N; jj++)
    9 i" H: Y' @* y+ ~                {( D  v% ?6 P; Z# w; N( P
                            fresult += b1[jj] * b2[jj];
    : g2 [& ?9 i: o* w( {                }/ ^1 ~* P% l- h8 _
                    */
    ! A% i1 [- k" b1 z+ ]
    / B5 m3 z  f9 ]6 h                //Method - 4   202s* Z, u" R, C$ O9 G
                    /*) ?; w* d  A4 d& F( q+ e
                    for (int jj = 0; jj < N; jj++)0 k$ s* b* s  |2 n8 d8 H) I% u
                    {, r, }2 _; {8 M( |3 w* W- E
                            
    ( t; p" M# n! s/ P# ~1 [; W7 h/ w                }; O1 a$ `3 [) H" y
                    */
    + p( f8 \5 p) {% l0 a, `8 a                //comment out all methods, N=100000  202s               
    , U( t/ \3 P) A        }
    8 G& y* }3 g( W7 B9 X& g5 e; j) |3 A9 w
            delete []b1;
    * R* b. H3 k+ b8 M        delete []b2;
    * P8 }+ s* V' z$ Y( l' P( N
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    / c+ \# l3 c0 M7 k7 n
    7 X9 t" m# ]- Y# e, ?( A你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    , o, s- ~% Q+ ^$ X' C9 k0 Z. V9 }& g
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    . R" d$ s  \5 E2 ]瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?' c$ f* j1 h; C( {! L# j4 G

    + `3 u( Y% a# ?* Q1 U2 F- Z, Y你第二个试验里面的j在循环里面又重新定义 ...

    ) p0 S+ L2 U1 @% p内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL6 Z0 Y& U1 L" O; a# m' N
    8 s8 H- G0 G, Q3 t% P4 z2 I1 a
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    + L: V% L8 l$ ^内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & Q& o, P5 U1 v( R, ~: l1 x+ u* n
    4 Z! j8 o3 L4 ?5 d不和它 ...

    ) a# l; |/ S9 `% U6 R& K8 ]: d" I6 X4 i$ _( U/ \# o7 O2 }$ W  w
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。2 R# w6 C, r; z) M
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    6 D0 O& x- a4 {void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    # T* _) v3 f  J! Y. K1 u9 K4 h- H{. a9 E* p+ t+ ]
            comp temp, xtimesy;
    + @& @2 ^& X- Q
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    8 n& j# k. L; }( w# u' A内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    1 d% ^& u" Z; @7 ^2 P6 ?) b! QVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-10-14 13:45 , Processed in 0.048507 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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