设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?3 a: c" Y: x) G+ O' H% N
    9 E8 K' Q& w6 R: a* d& c) A
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    9 k2 E+ _# G4 ?. Z% p# K4 `1 ^0 u2 K5 Q* ?- T# Z( N# ?" ^% y
    速度优化问题真的很有意思啊。
    9 P5 ~* v! O6 q! h1 Y, f, \( b
    0 j* Q$ T8 i' d3 `* l欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?4 P/ J! I5 c2 W, J! \- y' J
    把代码贴上来看看?; D' h3 N; d& {# V

    ) g7 Z  y% ]/ L. H) m难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    / ~. }) y; R) s3 p. h
    数值分析 发表于 2022-9-24 23:04$ m" F, Y, q. g
    拉下来?拉多少?6 C+ b% L* N, W4 k* V" c8 \
    把代码贴上来看看?

    # y$ d6 p- c$ `) @: x9 L* w8 V2 w* o$ {. l
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* b3 c/ {. x- M  x7 J9 i! w( R
    {9 z9 _$ V, x' M. e$ Z9 s; q* a: q0 I
            comp temp, xtimesy;$ {  u' ]0 J" S4 d- y
            xtimesy.re = 0;4 Q7 [! y0 F5 j* h" L
            xtimesy.im = 0;( p, h; L6 n* b
            int j0 = lenB - 1;
    ( T2 r9 j# s0 |( W' [: {  {        int    i, j, i1, reali;0 m/ c# i+ ]  r6 c1 M; G
            if (lenA % 2 == 1)% x- a, C; e5 M1 L4 r) x7 t1 ?# P
                    reali = lenA + 1;  q% o* R" Q: j5 R( @- B
            else
    $ {( |3 `5 f2 |. S                reali = lenA;
      ?* L8 \% z2 ]" w& F        reali /= 2;' ^% q, ^9 m3 q; c, Y4 b

    * W2 g5 b5 f! s  f  Y- T! A3 H        int nconv = reali + lenB;  j: b: U* H$ ^  r
            //#pragma omp parallel for
    * G) g( U% C: ^        for (i = reali; i < nconv; i++)7 P4 Q6 t5 [' X$ ?
            {  V' L! X5 d( g
                    temp.re = 0;
    , a' q6 i' V4 X$ ^, }  x# t6 H                temp.im = 0;  a  i1 R5 v% f5 J/ e8 e
                    i1 = i;9 w5 E- \! O: l( }" c1 c# d
                    for (j = j0; j >= 0; j--)
    9 H% {; b# d& Z                {
    2 g5 V7 G1 s  \: m. M  P! M: n                        /* floating date operation */* l. e, c. t8 y7 a, C1 L4 t
                    }

    2 E# Y# _# c+ @4 u3 }: d! t        }3 s# Q1 ]9 M- i4 |6 o
    }
      F2 _1 x7 n' Y0 G8 A) ^
    & d; X3 x& U( ]7 ]xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样2 ~; h2 m) O8 n

    " }0 T6 G+ F5 \红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。  C" R- x- {4 `- u
    现在call xcorr 100次,耗时78s.% l8 f3 b2 H- O# ~( O

    / n$ j- V6 E3 m) u如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ) b* H! I7 X$ P, I

    6 q) O- x! a% b( m6 G
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    7 I. K1 c' s! Z8 h* aMaybe Debug mode?

      B# U  N5 Z( W$ A# Y
    6 E/ M! S4 ~+ n6 J  ^9 H不应该,看我上面的回复。( E/ {& a& w$ e& L. w% N4 h+ L

    9 z5 P6 w1 m) Y+ H; `我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 * b5 K2 B  J4 y1 N. f% {, V
    雷达 发表于 2022-9-24 23:54
    ( E  h+ k  e2 P6 F% {  cvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 u" Y+ o8 o$ P* y% Q$ F, i( L
    {
    4 ]* Q* n& R* C8 q5 S3 [        comp temp, xtimesy;

    / W7 x& H* R+ S  s) T
    0 m3 S9 g6 B' i6 m0 z' }6 A这个不是这么比的吧。。。. L. K1 C2 W. _* c) V: _8 V8 g" ~

    ! p2 D( ~1 B: C您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。0 E) n& ]. i1 p! u) c9 M; \6 p
    2 ^* z& F5 b, V( i) v" v4 U
    而加上内循环,光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 @5 L) h1 p8 }8 s3 w' }% R
    数值分析 发表于 2022-9-25 00:20
    , R" y/ F* x6 Y- ~2 y: H# e4 h这个不是这么比的吧。。。
    , L0 j; n5 w6 Y6 a, O) b. G) I' [+ m  V; c! d- r+ ?
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    + ]" P( `. k" D: [. {* A* r% K+ A

    1 f; Z' z5 m- i. b1 c# u/ \! f. L有道理。
    ' u5 s6 X/ e$ q" D, Z0 ~5 {1 m所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。  j# \6 E+ A* t; p% V$ |! R. z
    + f: p' q0 Z# {6 s' J
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    . \- k2 [4 G# m/ z+ H) m有道理。& d1 \$ \# m2 q6 r1 K; N) ~
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    6 t. Z; ?6 E. K0 M5 d" q/ f你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多2 l: j. I# b: D$ c6 H
    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
    ; L, S! G. _! d# I2 V. O3 \! q这个不是这么比的吧。。。, W2 w3 B  j1 }+ n0 z, R  T; k

    % W' g; w/ T6 P2 z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    " u$ e# ~; j4 |8 y6 x* g
    3 O/ r/ x4 [4 e7 {! L, E7 A! Q现在的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 编辑
    ) N3 r4 d- J9 a1 C5 k
    沉宝 发表于 2022-9-25 01:48
    4 C8 I  _# e/ J9 ]& h7 |现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    9 L' C/ `6 h( H' ^9 W# h
    + b. Z5 j+ A( v+ D5 R是的,兄台说的对。
    . @$ N+ O  r3 b% T5 w. J; Q- ?
    0 v6 J, q$ Q5 x7 M+ F其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。& }" K* ?- W. k/ x! o9 p5 V9 {% p
    3 I- q$ G7 b4 x: l9 G1 g) D
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    # y, {7 r% I* i) s: D* e
    9 l6 e: ^# w' [. R) `' a. E# |比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    # i; v; l' W% v# b4 b6 g/ f( R0 G! P4 z
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    5 h/ |) h. K9 d+ c
    沉宝 发表于 2022-9-25 01:27
    ; {5 T$ ], t. H) y* `9 m0 z3 L你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

      g% L. R$ t2 U+ [( K( Z& d4 z% C. A8 T3 V- |( W/ f
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
      K- r, f/ V# }" t
    6 Q; n1 m3 w1 z+ |我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47& V; R3 i* M+ u* T
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    + O: i; x; C) |+ {/ @& F时间差一倍的结果可以接受。
    6 ^1 y" s& U# y( q  q; k1 z; B: A& B. }; d& u* k7 b
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 1 d5 l$ V; E% D( x: L
    雷达 发表于 2022-9-25 04:47
    8 y. }0 v3 n1 q, t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ Y( l7 `1 p2 c: H" z8 |7 l5 q
    5 H% j/ C6 a5 q: t/ q( t

    2 J7 @5 `; r; x3 A$ X
    5 {5 [1 F: h: m+ K+ j能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ! x: U9 ^* C) j$ B+ O: y
    数值分析 发表于 2022-9-25 14:58
    3 {5 K6 y( T9 Z+ ]3 t- }能不能把这个也贴上来,看看和上一个有什么不同?

    8 |4 d& H2 x8 z0 v1 G% Z$ Z* O理了理思路,重新做了一个测试。( T' @, W& o  G
    做了两个 vector 和 两个 float *, 都长 100000; Y6 k  k; V6 Y/ C# |
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    . u! b# D# n; ^1 Q
    + w4 n! d! \4 w% s6 U! V内循环试了4种方法,
    . w. d! D8 z! c  v1. 直接调用 vector inner_product 247s 3 E# B8 w3 S# v" B
    2. vector 循环点乘累加 237s% n! j, \0 i! B, J4 v5 }
    3. float * 循环点乘累加 204s
    ' z+ s* s: P2 M+ v4. 空循环 100000 次 202s+ }# M; e; N0 E3 ^% [; c

    2 m3 j( F( [6 t) e1 V不做内循环 200s
    % I' i5 c7 v3 J- ~" c8 ^  m7 d$ o# O2 D) l/ k2 }4 F8 n) Y
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    4 x0 p* Q+ ]2 q0 i, T: I  j另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    2 p9 e5 w" y' a: S) ~4 O% ^1 t( K7 B5 u) L, h( T
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ; B8 t9 w" Y- S) ?6 m/ \1 m
    4 a3 ]) T1 ~" G8 a& u(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)" T) S0 G% }1 h& j
    8 F7 V* [/ N- z
            std::vector < float > vec1(N);
    ) c* m6 T! Q* {7 j6 W( E/ ?        std::vector < float > vec2(N);+ r0 N: o* B) d8 ~$ ?7 t
            float* b1 = new float[N];
    6 d4 |0 f8 \' k. y  g5 e- a4 ~+ t& h        float* b2 = new float[N];
    . C: f! H# B; _  a0 I. C2 V$ |0 P1 ^: ?
            for (int j = 0; j < 6000; j++)3 w# N* p; \4 ?2 w% z2 h
            {: o+ h+ }- r* \# y# v  F% {
                    std::generate(vec1.begin(), vec1.end(), []() {3 P" h  K  ^/ M" p2 b' K+ c5 R# M
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% b- i* J9 i) @; R$ t: V6 Y
                            });
    % |/ d8 `+ n9 z# S" o3 }$ a8 `7 e1 h% h7 w, {4 K+ g. Y1 c
                    std::generate(vec2.begin(), vec2.end(), []() {
    0 F5 I4 a+ ~. f: i7 ]                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 \' A. `! D6 q
                            });& c% E+ }0 j+ D  |' a2 m
    + ^1 K: S5 q/ t
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ! B1 n7 T- \3 m# r                {
    ) n- |, ~5 D% j# @& j; V                        b1[jj] = vec1[jj];
    2 _2 G2 i" n# F9 z2 ?                }
      o) q0 p/ a4 a! P8 ~0 C: O9 t/ }, l: K# |; s5 e1 Q: M
                    for (size_t jj = 0; jj < vec2.size(); jj++); |' M. a" D4 i8 }
                    {
    0 j/ N4 {& }( t9 R/ ~7 ?0 I  U: ~                        b2[jj] = vec2[jj];
    + ]& s+ {( X& B: k) N                }8 l$ \& F# \/ k5 h

    6 B. j; s: M# ?8 [% q* R                //Method - 1  N=100000 247s  3 n7 |6 m! D8 m
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    + f6 w5 c* i: [9 {4 I: s' _" C6 L+ M                                
    ; h8 [8 A- M9 o' h! d                //Method - 2  N=100000  237s1 a- o* U! P+ G( Y
                    /*+ Z6 N8 l0 x/ p+ k
                    for (int jj = 0; jj < N ; jj++)
      I  I6 o9 K7 W: L9 x                {- l' G8 W# J) f6 _# L& }! K, }
                            fresult += vec1[jj] * vec2[jj];
    : v. b) ]1 `, n# j: z' W; Z$ S. ]                }
    & b& s7 ]5 k: ^8 i                */7 m. G1 I1 @/ o: @3 s& y5 h# g
                                    
    ( z( v: `+ I8 l6 @                //Method - 3  N=100000 204s
    " s7 L! ^9 W6 r1 C9 r9 D3 Y- V                /** q: d5 T) L( {$ l2 X6 }
                    for (int jj = 0; jj < N; jj++)3 X( K- N8 V1 _* W2 g7 o
                    {
    , z  m4 l+ q% E# Z/ z: K                        fresult += b1[jj] * b2[jj];. F( c: \) Y) g8 |/ o
                    }3 g# A9 Y4 F4 w. w! Y$ I
                    */! E' i: K2 P2 B3 `5 Z) L. S# u
    $ ?: x# |8 {& y
                    //Method - 4   202s
    / O3 K. x$ T1 e                /*
    ) \1 p6 W3 C* r5 J$ P/ E                for (int jj = 0; jj < N; jj++)$ A( V1 q  l* n7 v6 a
                    {
    % \  H; E; J" o  N: x: O! v                        ' f7 r% X- f8 \  ^0 q. }
                    }5 f% }: |) J2 I0 k$ [9 s
                    */( H' J8 I; G' w9 ^' O* {4 F' W4 [
                    //comment out all methods, N=100000  202s                . U' h, `6 T. q$ U: j* C
            }/ Z/ \6 u* j2 o' d0 O1 s' @! ^& u3 ]
    ) Z% r& z9 x5 b2 Z- |. e/ x9 K
            delete []b1;1 H9 S7 P6 a- z6 @
            delete []b2;

    / O9 e  q7 Y1 e* ]; c, `: s9 Z
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    6 Q% K9 o0 X! g1 n7 o: n+ G; L: @5 e
    % T. l9 j% G. j( @! w# E8 B8 ?你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ( a- I4 ?. j/ M0 v
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15; g; U# H! p' {
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    3 z" E  V- ]$ O3 k
    " v7 g/ ^1 A; A( p你第二个试验里面的j在循环里面又重新定义 ...
    $ }6 ]9 G7 `- W, `  u  }! x! @
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL; P$ u3 ]  P; q( Z$ t
      ^2 h! l3 `2 b/ n
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:160 \# @+ C0 u" }( \; Q) K
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL% ?* y% n* p3 A% l7 F- L1 g

    / @& q9 j1 W. ]* }) n9 C不和它 ...
    ! _! w' `, z2 D/ ?+ d% `6 O
    3 @6 n- N5 E, C, q  Z( W
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。) }! d9 U# E/ A7 ?( w9 ?3 T: e5 N
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    : Q2 `+ Q3 ^: b. A! evoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ u( v$ r- x7 }' C0 X
    {
    ! e, A+ h- ?; ?( J9 A        comp temp, xtimesy;
    - `8 R7 _% ^( a
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    9 j9 q7 }. c# z" y' B- O内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    " |+ Z$ @. ?; j7 |VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

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

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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