设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) c' o% O9 \2 |" p' |& ^
    ! A5 O6 W) L( L0 b' l0 B
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ( @6 U7 N  p3 K! y2 `6 Q* u; e3 F# e% N; X
    速度优化问题真的很有意思啊。2 Z; h. d3 {: ]  ~% K

    ' [$ `% Z* z+ N8 T: k) b欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?9 x$ Z" Y5 {9 V
    把代码贴上来看看?* I: d3 X% T% P7 j  h6 Q/ _
    " n0 [3 ~, A/ o' W6 n* k5 {* D
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    前天 02:53
  • 签到天数: 125 天

    [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 编辑 ) m3 s. T$ S$ U! Y3 F5 T; M
    数值分析 发表于 2022-9-24 23:04
    8 c/ y" i' R6 ~+ x拉下来?拉多少?
    6 M: P+ Z# ~% k3 `把代码贴上来看看?
    2 o5 C. K9 z7 F5 y* T
    / z& N6 h, c0 ]) R$ N) M
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 k/ c/ t. a( ]& W0 _3 q
    {; J( Q$ z/ x* J7 X4 p
            comp temp, xtimesy;
    7 Q! K' m3 l4 I! e7 O) |        xtimesy.re = 0;( C' `1 W* ?, r+ ?0 q
            xtimesy.im = 0;* X" N! @% T  E: b
            int j0 = lenB - 1;% J$ U; w5 N% c" p4 z
            int    i, j, i1, reali;, d) S) ]8 I# o- U$ d0 D5 w3 @
            if (lenA % 2 == 1)% l' q+ k; Q1 L1 j. F
                    reali = lenA + 1;: F/ N0 K8 b6 f2 @+ R
            else6 D" \7 @9 N% J
                    reali = lenA;
    . c( ^  p# t8 U$ X- G        reali /= 2;; j1 t2 u5 R3 e

    * v: B* i1 D! t# C  M7 K3 \; H( J) |        int nconv = reali + lenB;) Z7 C6 p9 h7 Y, z
            //#pragma omp parallel for" [5 d' N: {( |0 i* {
            for (i = reali; i < nconv; i++)# v- @: ?0 g5 z* W
            {7 k4 `" b7 D$ O0 R' I( V
                    temp.re = 0;
    $ h2 v: l% z' `8 t                temp.im = 0;# H2 N0 b' b" d0 W# y3 y' R
                    i1 = i;
    3 J/ d& N$ \7 Y' R4 O' k                for (j = j0; j >= 0; j--)  s7 D$ N! Z+ r
                    {; Q' p1 j# [0 m
                            /* floating date operation */6 k9 Q6 L( P# v3 N- N. M: H# \6 S
                    }

      N) l* B; c  a; o  ]        }
    $ H2 _: W9 ]3 y2 x. O}' c/ n4 f; z5 c1 E

    ( O& F! ]. n, z0 _/ u  ]: M: G# }xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ; V: j7 i+ L/ P! A' B3 o. ~  z, o# _2 J$ M+ x3 d% e0 C
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    + `$ I) D2 K. p! |6 P9 `# {, o现在call xcorr 100次,耗时78s.
    3 h  @  l5 a  s
    : g! Y. _+ A8 L; N3 q" T4 {9 j: m" [如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. , r) H: [' K% f" g/ ]. ]
    . ~; S+ L; |; ]- J. [' [7 f" R
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    + X0 m0 i: ?7 e, c0 y6 |6 ?Maybe Debug mode?
    1 M2 w3 M0 i; u, G7 {: e& p/ p5 g, }5 `

    . K' r$ W6 G! j9 q4 x$ O3 j" ~不应该,看我上面的回复。7 z3 D( U, }7 [1 Y
      b0 e- j3 \- [" O) g
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 / F; p9 }3 e4 |3 r2 F2 L
    雷达 发表于 2022-9-24 23:54& Z) G7 X- s' u. ~. {0 L( V
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' \: J" k" j4 [" x, ]{
    ) G* N2 `9 G* |) C' f9 X6 n        comp temp, xtimesy;
    6 k/ o3 I4 H1 Z8 ?- {& V7 B7 T# p, V! Q
    * t' Y/ P. G* V& g0 Z1 c! M. S, x* |
    这个不是这么比的吧。。。5 P  ~4 Y- R: t

    9 `) U- D6 y, a1 ]$ B您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。* z# Y0 `4 H& \1 t

    1 y) Y1 x6 n( F; T+ n! Z4 z而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    9 b# Y& ^8 Y) j8 v8 Z( T* @' S
    数值分析 发表于 2022-9-25 00:20" G5 m; y5 v* |: `, [) ]
    这个不是这么比的吧。。。
    + ~, G+ H2 E+ g: ~9 i; O0 r& Q: ^9 m* w% u. n
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    & g/ ?9 c  Z- K$ J: y, E/ \+ f- d: s! \8 y9 U* d  o8 K
    有道理。+ z% {) H" t  S/ V
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    6 L) k& o5 s' ^+ ~
    , `+ q( l4 ^3 V" C我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    + P  T! t. s2 t9 E+ Z5 b有道理。! t$ L% M. j7 |2 [6 K' ^3 \: V  h) g
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
      F! b/ f! W+ `9 Z" y! l6 x1 N: B
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    * D2 n* X, N+ Q6 rWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    / n+ W1 q+ t9 x这个不是这么比的吧。。。) S3 ^8 B% L, e
    6 O# s- G& e: V; o: x! ?4 Q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ! l' q' l1 V  O8 c5 X0 T
    . G9 U7 ?1 P; y! |  y# ?% S8 v现在的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 编辑 ) {, u$ D$ l& p6 p% _
    沉宝 发表于 2022-9-25 01:48- C- j8 ]0 z7 X8 o
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    # e! _! |! g' K
    5 y( o/ M* i3 W! M2 B$ ]是的,兄台说的对。) x% l. g' A/ }3 I) a0 J
      T2 R6 v3 n' O; f' t
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。4 X( a4 A6 S: p, X5 i. Y& l3 [
    6 J) s. `/ s$ Z6 P
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
      Y! i6 q- U! k# r1 Y3 l: ?! H/ Q1 B
    + O( X, s' W- d# D9 B) f比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    $ U( E+ q6 i! w* Z7 b' o; a
    + B) `; _$ \" a: R) ~; L: t当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    9 A- r0 T& S- k* e. Q
    沉宝 发表于 2022-9-25 01:27% p$ m% X$ B, ~% s4 T4 g
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    " V+ W( J. l& W( |! x( x
    , [+ r. t9 d) R% U
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。. C- R% P  X% }) W

    / c- N% T* @! N我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47" p5 u8 e) \9 K- ^: C4 A5 E
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ) q6 C2 r4 R, K8 A7 g时间差一倍的结果可以接受。+ R, \: `# E3 H

    & M( F" t: C' @/ ~& ]你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    1 s" X: Q. Q! z( U% Q% }+ J3 P
    雷达 发表于 2022-9-25 04:47; Z* y' c6 t: b) s, z3 s+ ?1 m
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
      o2 u  K( }8 f* Z) d

    % N) A& q; [: T; L3 ~; ?# C, G; e3 W8 E2 T0 Y

    8 i' G; e& ?8 R/ k能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    8 |: B) p" X; g5 S, z7 O# a
    数值分析 发表于 2022-9-25 14:58
    ' C  F0 H7 a. ?2 |# s4 n能不能把这个也贴上来,看看和上一个有什么不同?
    - c; b* O5 J, ]  I& b1 P4 K
    理了理思路,重新做了一个测试。  y# @9 M: A# ?' F* b
    做了两个 vector 和 两个 float *, 都长 100000( l: a3 J/ v! [) l' O) R; q
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    * e4 ]- L9 U; s- g  [
    3 V: C' g( j. ^2 N; ]7 o' {内循环试了4种方法,
    , a0 g( F6 Q0 Z, ~1. 直接调用 vector inner_product 247s
    7 C  {1 B' w, D& k2. vector 循环点乘累加 237s/ t4 B8 G- @) v
    3. float * 循环点乘累加 204s
    7 V  j- t1 q9 x5 d3 C4 V6 L4. 空循环 100000 次 202s
    % x+ o4 l. \! B* |! x  J
    ; l: a) U0 f. x7 z; E; Z不做内循环 200s( Z+ S  s' w& w6 o
    8 f4 O" d( S9 a" x1 l7 v% d/ A" [" {
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。) w" {, _* [+ q- ]7 d0 h
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    0 f9 Z% u- J& Q+ N" Y$ p
    & n2 E3 W4 c( h% {9 v+ p至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    : i  q2 f' k5 X+ n1 ]8 ^
    : m2 i0 T* q' b! q( {' T+ M(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    4 A& e6 V6 J6 V! {1 F# A4 X. k( n% Z/ F# {: Y
            std::vector < float > vec1(N);
    - t# j, M7 }5 Y7 F        std::vector < float > vec2(N);# Q; o- w& |/ @) f9 @7 j% t8 f
            float* b1 = new float[N];9 j7 w) X5 P4 o& v) I( ]
            float* b2 = new float[N];# _" ~3 F2 g3 T$ P
    ; u4 k+ B3 ?6 t5 u5 o( x( ?+ z
            for (int j = 0; j < 6000; j++)
    2 [/ k( z6 p7 G" v        {' f- C" R8 ^* X% S+ k5 n
                    std::generate(vec1.begin(), vec1.end(), []() {
    7 Z& Y9 @  Y0 s! c- r& e, Y0 [                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" v$ A" x6 g5 S/ `2 }
                            });; r$ d3 U+ T# H3 O! W( r/ N
    7 Y3 x5 k/ [' j  ~" I
                    std::generate(vec2.begin(), vec2.end(), []() {
    ! d8 p0 e" a7 T( t                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ! f" u2 O! L8 G                        });
    : N* {3 j1 b# q- s8 e4 l$ \* a# J" H) c! O# V: H
                    for (size_t jj = 0; jj < vec1.size(); jj++)" ^6 I; E# W: W" @. L
                    {
    0 o3 K  N: k6 H2 I' M% ?. D" b% J+ a                        b1[jj] = vec1[jj];
    + R$ ?6 s; \) C/ ^- ?, l) e                }4 A7 p; F9 z3 q( F5 V7 M

    6 L, }( J2 M& R7 G- P                for (size_t jj = 0; jj < vec2.size(); jj++)! N3 H) C! u; U1 e* L! R  x$ T: h
                    {
    0 ]& b. F$ \$ m                        b2[jj] = vec2[jj];
    " l! ~# X' R8 l8 N( L$ b5 e1 H0 r+ o                }
    % Y( l# c/ i% _: Z! J' E$ n
    $ X7 h; y4 g" w1 j9 ?6 d                //Method - 1  N=100000 247s  
    # n  e' g9 B% g                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    $ n( ~' J1 D' Q; g/ q                                # L& {* f" i: L9 Z: X
                    //Method - 2  N=100000  237s
    - i& v) x( C' y" S1 L' T& M0 H8 F                /*! T% U& n, I; x6 M- v+ s2 b$ w% r' z
                    for (int jj = 0; jj < N ; jj++)% c! a* u! n$ h
                    {
    + l4 O  Y3 {$ D' s2 o0 i5 }                        fresult += vec1[jj] * vec2[jj];/ Y7 o$ ~1 O+ o, s1 A. @, V, q( S
                    }% \, e. c5 g; {, y( X( v
                    */6 j1 }& c/ Z/ E
                                    ; s7 b3 E* l* B0 q! F, [" O& u
                    //Method - 3  N=100000 204s8 L& J  U' ?/ J. a
                    /*% q! L6 m9 _$ A+ ^7 Y
                    for (int jj = 0; jj < N; jj++)
    1 t: ]! B8 e4 j. L% O, E                {% o4 c1 s+ k4 g
                            fresult += b1[jj] * b2[jj];
    + d* Y9 E1 N0 _3 B                }" A' Q) ~4 b0 B) j- Y
                    */3 S! G2 B2 G4 M' y9 i! S" L

    2 ^2 b" p: R- ?2 D                //Method - 4   202s" ^1 U3 h3 L! u0 Q
                    /*
    7 ^( j: _# l& l- P) D+ r7 s                for (int jj = 0; jj < N; jj++)
    # \* i2 h# a' I7 y5 B                {
    8 D8 {$ q* W2 L  E                        
    # j) X. K* g/ E$ Z8 p                }+ m8 ^9 X: O. B3 n4 ~$ ?
                    */
    7 d) ~: v: B% N$ U                //comment out all methods, N=100000  202s               
    $ h3 Y- q/ l  T* U        }7 o1 c; ]( S, w) S% s7 X
    : i  `1 X( O" _" n/ B
            delete []b1;
    ! ?' L. T  D- Z- X7 W        delete []b2;

    4 R' z! G# J4 v8 L, w* D6 S
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    6 j% ?+ h% L4 x; B! F7 K; w" }5 F9 @6 G2 v: u: f* e. e* H2 Y
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?* u' G4 U, Q" Q, w
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15( `7 `1 B2 J8 T% X2 O
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?: N+ u! R  d" z) ~
    * v$ P9 r8 _) H
    你第二个试验里面的j在循环里面又重新定义 ...
    7 U. z& f7 S" ~7 B. y4 v0 u" u4 T
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) e3 a/ d2 O7 n* _3 n% B4 P8 M/ v' D+ F$ h
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    5 e# t& q! F" G! j8 Y) I内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL1 V% F9 [: w% w, D9 ?

    : n3 i# s( K/ j- Q3 X0 }5 \不和它 ...
    9 \+ B0 F7 X* Z& w2 Q5 c$ e/ j
    ' P# |  [- W5 m9 \( K  L
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    6 s$ g6 D) B2 K- M; K# m, _" |后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:546 U/ ~3 h" p( g: c: |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + ?) M% V+ C" w3 b- R. `{" k  A1 k, b, J1 u$ C
            comp temp, xtimesy;
    8 W- c8 _5 {  I1 R" i! l6 F' x
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。  D. o' H+ Z5 ^" K% B
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?  `8 U' u% e& s0 Q4 t
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-21 01:43 , Processed in 0.064999 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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