设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?% z: x5 R. i/ H, U" T. i0 Z) M, @

    . m. F  ?' L6 g! M; F自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。# U+ m' {$ Z8 i5 b' ^% @

    ( S2 C% t% {: t. g0 A速度优化问题真的很有意思啊。
    - F6 k2 w# g4 [7 V
    / J; d- K, K' A  a7 U9 H欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?( I* J. q2 Q; D$ _/ l4 {
    把代码贴上来看看?7 D- e1 E, {) m' v* @* F5 X2 m) E

      B# d& g& G- V8 a. p# E难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 % A5 H/ u' q0 a' }
    数值分析 发表于 2022-9-24 23:04
    ; u* m: W+ A' |+ d' T拉下来?拉多少?& Y" A/ p3 p# n% V* F
    把代码贴上来看看?

    % z/ O1 u, O7 _1 F* Q9 z( q
    ; W* N( G0 x2 {0 v7 h2 Mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* ^- F! [: ^8 ^+ ]  |7 f; N4 H
    {. T2 _: {' u% U2 E' y
            comp temp, xtimesy;
    , m& |3 N5 ?5 |+ ~+ C& l        xtimesy.re = 0;1 R5 q% V5 n* n. d. m  T0 {
            xtimesy.im = 0;
    - z* X/ K# k# Z3 ?        int j0 = lenB - 1;
    3 g5 T9 e8 t, T$ k% g        int    i, j, i1, reali;
    * N! S, R, t, b        if (lenA % 2 == 1)0 }$ ^3 z! U' a: P# [9 A- q3 d, }+ H! s
                    reali = lenA + 1;9 }5 L' U5 }5 m2 E  o
            else
    , s9 ^; h# |: Y, g" e0 R                reali = lenA;9 C2 p$ r  `. u# ]* G3 b9 {
            reali /= 2;% p( M) K" e% r

    , W% |' {' ~7 {: b        int nconv = reali + lenB;
    5 ~0 A7 b9 h& y  |5 y        //#pragma omp parallel for
    " K$ ^/ k& D7 P        for (i = reali; i < nconv; i++)5 V3 r8 E# F5 u9 i& s9 v( T
            {8 Y# C+ ]: Y$ q0 W1 N. o  B
                    temp.re = 0;" H+ e! L/ E- A/ S$ ]* i1 H
                    temp.im = 0;
    9 w2 t, N9 C) |                i1 = i;1 t: ^' `+ k8 p% l
                    for (j = j0; j >= 0; j--): c6 j, x  [* M
                    {1 P9 l8 |6 ?: I% V, H: z2 K! c4 z
                            /* floating date operation */$ S/ [* a: q/ b
                    }
    6 u; i7 ~1 s3 ?" r# C
            }" g6 B: u; V% ]8 E& k
    }8 {( x# y& F+ V) a- k5 |, b( z: N! @

    ) r. d1 q* s. C* lxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样  Q/ k: `1 p6 I$ _$ X# ?
    - Q9 C& ~" W9 W
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    5 w4 j2 S8 W$ C" f现在call xcorr 100次,耗时78s.% k' h, ?' g! e+ G7 ~, f

    - h3 u4 o1 b  `如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. * M# ~: L& L+ Q, X" u# o4 r8 U

    7 P& _% q* I) l5 c+ q8 w
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33# S3 ]/ I9 ]1 H4 u
    Maybe Debug mode?
    & z' l: S; B1 E3 k, y- H5 N$ _
    / w( d! O; c" G$ a
    不应该,看我上面的回复。
    1 f0 x. {" ~5 ~, x- B# X! W
    , b, w5 p5 O6 c; Y6 u: O5 A我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 % l* M) @6 W% G! S" [# Q7 v/ y/ S
    雷达 发表于 2022-9-24 23:54
    & U" H4 u1 L& j( d5 z& p$ V, k( qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB), f$ q6 Y5 A: i6 Q5 G/ M
    {
    . u! R4 Q( Z/ B6 N3 `        comp temp, xtimesy;

    2 b2 i* \) P  ^; y8 C' ^3 w, f5 O5 }6 L/ d$ Z# B& m) a1 {
    这个不是这么比的吧。。。, O# M) ^5 m6 ]  s$ L2 H* m6 X0 T. I/ V
    ( ~$ D6 T+ x8 W
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。2 s- Q4 J9 L3 Z7 d: Z) C& y+ r
    # e4 b0 T1 b/ S+ e# v' _' Q' [
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    5 `  g+ n  @$ @! j3 X# B) G) m
    数值分析 发表于 2022-9-25 00:20! _. V) L( f% `2 h+ D; V
    这个不是这么比的吧。。。
    / D$ j: l% R! Z
    2 E% `% g  }8 O4 j, b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " u9 c$ a4 s% J! f* W( M+ N
    3 X) f9 L8 W) r! Y) M
    有道理。
    9 p  q$ Q0 g0 h* @9 F( ]所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。  g* A2 T0 ^2 A, n
    % O/ V3 l' S3 h6 V# r5 G% x8 H: ?! k
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:467 f( U5 N* P1 S1 U
    有道理。' S3 G: c0 T& Q+ Z9 b& b0 f. d4 K
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    % H1 P, d- x; H3 k& H+ z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多: Y1 S( J* M* O* c2 }
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:204 S' r2 d& G. W: H
    这个不是这么比的吧。。。& I1 h' l7 H' Y; h, x
    4 a' g: U2 X& |* `% g( h
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    % @9 F( W  t: q0 z% k: ~
    5 L+ o  W/ c7 G现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    0 O& ^' m4 `) g2 r
    沉宝 发表于 2022-9-25 01:48
    * W/ y# _6 ~. s; ]/ Z6 |0 a现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ; H! I  h$ X# c5 \5 M" S9 y! U7 u9 K$ M  C. b1 y( @
    是的,兄台说的对。
    6 d+ d% e$ y8 e; Z$ B0 B
    6 w+ r7 t7 A/ |5 g' k; n其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    - I' R; A3 V# b* |; P6 W5 T8 N2 E$ m
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    " q. o; D9 K+ s6 m9 S1 e) l8 W
    % ^0 W# S3 [7 \比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    + @5 M: c& N' H: U. t0 `: b/ F
    . E9 k) i  V) N! R( ^当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 + c& G1 G6 Y, c
    沉宝 发表于 2022-9-25 01:279 _" T' e( v5 `- k
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ( Z: k5 t" d, \( z' z

    8 E, H0 k) M1 F; Y& E又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    & k% @. Q8 S' G% |* ]9 S" f! Q6 j8 y4 z6 ]. ^/ T5 T7 d
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    2 b% t4 h, a; m: U9 u又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 g( c  G% P& R& j# y时间差一倍的结果可以接受。
    " M5 _4 ~& m0 K$ Q* y+ J7 V  M4 k% ]5 z; S8 N
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    : R! B: W8 j& C: N
    雷达 发表于 2022-9-25 04:47; F( J; z8 X' S) J/ J
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    2 Z# |2 P! j$ y/ m+ J. n1 w$ ^  E
    " D- ]# B  U3 I- m- E
    . o+ F$ A: y; m/ n, Q( @# L  I. `
    # d5 l% c* f; H, Z$ V& Y7 G" D/ d
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 X! m0 Q; z& b! `4 x5 P  L6 H
    数值分析 发表于 2022-9-25 14:587 @  W2 O, S( p. ]6 R* p; H# E
    能不能把这个也贴上来,看看和上一个有什么不同?
    ) D. G1 q- v% \0 E: |6 U
    理了理思路,重新做了一个测试。% G/ b8 |" Z% Y! I! r- _. L- W% F
    做了两个 vector 和 两个 float *, 都长 100000; u/ S! r1 _; E, K
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    2 r) U. K& `+ o0 t5 D4 v( \3 N* `, ?& F: m) i! A; k1 v0 Z
    内循环试了4种方法,
    6 c3 J% P$ V1 c3 M1 I+ a1. 直接调用 vector inner_product 247s ( p( O, c$ Z8 F$ l1 @/ E
    2. vector 循环点乘累加 237s
    5 [4 F8 J" p% i' Y& O" K* x$ w3. float * 循环点乘累加 204s
    5 U5 h0 C6 d. E0 [: M4. 空循环 100000 次 202s7 P; P, r! @; i7 K9 K

    ! n; m, {& T; q+ I& @4 g不做内循环 200s
    3 Q+ h  e) e. L9 j9 h# v8 ]) }- J4 ^9 a$ W# ^5 R9 h
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    6 R$ o7 Z$ t- T- Q$ j4 }% B另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ! ]# T" e0 z0 ^$ J, _: d
    . y8 \7 t1 Y' ~$ ~; }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    # f( j/ C5 f' P: I0 {7 P3 J# j) H5 o, ?- {! @
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    9 @: s! Z  ^: v$ f8 M) ~
    $ F% d( n" V# r  u3 |$ a9 K2 n6 n
            std::vector < float > vec1(N);
    5 E% @  U" d4 }5 }9 l4 J        std::vector < float > vec2(N);
    ' }. y+ N5 f7 \; L  B        float* b1 = new float[N];
    4 |( l  F4 |! h2 W5 _        float* b2 = new float[N];7 P- w7 m: T  V1 y' N* l
      y  k, p. h5 `% s2 @1 d
            for (int j = 0; j < 6000; j++)
    6 W: q0 ]6 t2 J9 b  z7 a- D* t6 d5 H        {& T+ ?# }1 `  d
                    std::generate(vec1.begin(), vec1.end(), []() {
    * l1 D" C0 U  M% n/ }! C1 S                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! o; S# Y+ f' r" W6 A
                            });
    + o2 L8 t! r: m2 z' k
    $ u: G# h5 J5 I/ F2 q; B                std::generate(vec2.begin(), vec2.end(), []() {
    & w4 G7 i7 T) W& T                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* Z  a& p3 N6 ~2 ~5 B
                            });
    : ~  V# x& ?& R0 _8 f) a+ M9 \+ J
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ) w5 @& J* q; {0 V+ L                {8 U) f, {7 ]1 ~. T. {, P
                            b1[jj] = vec1[jj];
    7 h" J3 `& t6 x                }) q5 F- f( N9 a- |! x6 q% l
    5 s5 Z+ }9 c, r! n
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ; T9 ?* O# h# B8 M5 C                {
    . f3 `, l* O4 h. Y! K, O                        b2[jj] = vec2[jj];
    + Y% E% L+ _2 g5 z5 K; {7 r0 O                }: J: a* h, y2 t( o

    ! J9 \; v7 a1 ]                //Method - 1  N=100000 247s  
    0 |+ g; Z& ?% r5 @                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);$ n4 n% f; b# O
                                    
    7 X; z2 J9 R: f0 u9 u+ Q- E                //Method - 2  N=100000  237s( P6 k$ R- y1 T# L% L
                    /*  b- R: [: I8 }! J" b& R
                    for (int jj = 0; jj < N ; jj++), j! `: F  _1 `, j: ?% o
                    {  G" K) f, G3 i
                            fresult += vec1[jj] * vec2[jj];
    + k9 Q+ X) S( g! v8 t, u& G  ]! n                }
    ; U4 K* A; R% H7 h. S                */0 i) ]& J0 M5 Q! F. H9 T
                                    
    " V& `( b# ^# U. o- T* ]* l  z                //Method - 3  N=100000 204s" {* g# \9 ?  Z' N1 B1 O8 n
                    /*" E& U; T! x+ U3 H5 ~
                    for (int jj = 0; jj < N; jj++)
    - a1 T1 |/ C: C                {& D" G- V, j' a' V: G( L
                            fresult += b1[jj] * b2[jj];
    : c' @* Q3 X( n8 \& m; C9 \* J                }
    - _- G# K' `* K( ]4 }                */7 I2 a1 T  `7 n! e( q
    ! i  e5 }' e" J: k7 E* f
                    //Method - 4   202s) l( ^. K; p* v( M5 `. r3 I  \2 \
                    /*- o6 |" d0 {' c) s4 l0 c# A
                    for (int jj = 0; jj < N; jj++)
    : [: C% v8 q# v+ c; o  O# k                {8 g  O! V) f; Q8 m3 D( L- Q
                            
    2 V4 Z- {+ I, |5 w                }
    # T, `# U) @0 W* X9 ~" p                */; ]0 }: n6 t( j- g' X
                    //comment out all methods, N=100000  202s               
    ( }- B5 [: e6 L9 j; r) k        }
    + O6 g5 }6 T# ^& e) F  F; \3 s! i. A( }. o% P6 b
            delete []b1;
    0 Z5 Z, o! k8 ^0 G! M# b! w3 s0 S" G        delete []b2;
    ) d3 [5 M; H$ z2 y9 ^
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    $ c! x- O8 g1 W& B6 ]( B& o0 k- y- B  D  f; z& j0 A+ f
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 Z$ N. y" [+ d( K% l
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:150 }" f$ Q% ]! @0 j, s
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 R& P8 v1 C7 U9 h0 c9 y

    ' ]6 J3 Y: t% A) h4 `) l) @4 v( J你第二个试验里面的j在循环里面又重新定义 ...

    $ N7 f  m3 B7 r/ y内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL& |6 C2 w. u5 a( I: y  O& z+ W

    5 i) F$ Z% e3 R& L, |不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% h6 y, Q' b( T  _; {; h
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL; {$ |0 _0 E$ n2 {# m) d! c5 b
    + ~( l/ O( H4 h4 S1 C
    不和它 ...

    $ u' T& y/ m* K+ C9 u6 |
    * f" u# B/ v7 ?/ }5 C不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。6 R% w! Z. A- I
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ' j+ f  O/ j7 X0 p/ G: tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ ^& {0 S9 H3 A
    {
    ! O9 ^, \4 h9 n4 Y        comp temp, xtimesy;

    8 k9 J* F( \/ q0 O% @  E这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ A! o2 H- m% ?. [5 s
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?8 c% U1 K) L9 o! ~
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-8 05:34 , Processed in 0.043617 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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