设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) g7 B! }0 y* @9 I0 }

    & U9 C0 n  s6 t, R. y9 f1 ]  k8 ~自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    + ~1 ~7 \5 c  D5 }! T! X& m) ?/ n( Y3 j( {# O4 G9 c5 y3 d
    速度优化问题真的很有意思啊。
    ( J3 |2 s* G5 I( P3 t9 C7 }/ |& o7 E( @& D
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ; o1 Z7 @# f* m! e! v把代码贴上来看看?9 e: d0 M5 @- f7 j" t
    5 G$ S' O: a. W4 a& T0 s9 d, @5 |
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    . O2 ~( z* Q/ [/ E* g7 C
    数值分析 发表于 2022-9-24 23:04. J) X5 y3 o0 t
    拉下来?拉多少?& @) m, v% q# g/ X- `; b/ b
    把代码贴上来看看?
    6 e2 V* W  A+ Y; _

    / `6 M) `$ H& |. }( ~+ T+ y, O& jvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)7 N* \1 ^) }; t' t% X
    {
    / k% z1 w. l7 V  B        comp temp, xtimesy;
    / G4 W8 H5 B! g; X4 E        xtimesy.re = 0;
    # D% [! |, S/ K% _/ O4 ^        xtimesy.im = 0;
    . h+ W# d1 S5 D# Z7 `        int j0 = lenB - 1;1 Z& K2 P( q1 I) [7 m
            int    i, j, i1, reali;2 x+ S4 ?: b# ]' e4 J1 Z, D1 y" [# Q
            if (lenA % 2 == 1)
    7 b  g0 ]: e$ t6 m) }8 e/ b: {- c                reali = lenA + 1;
    ) H4 u, |3 \3 T* Z# n) D& _) q        else, ]) X( _* G, o6 D# F  b* F
                    reali = lenA;
    9 l7 u9 s& P( }        reali /= 2;; t8 V' }* w; u

    8 E; f2 k) x* ~- X        int nconv = reali + lenB;3 z/ a/ }3 H) e: T- S8 ?0 N" l. z
            //#pragma omp parallel for
    ) o* ]1 h8 a# ]( Z        for (i = reali; i < nconv; i++)# x6 Y% u" ^. T
            {
    0 L+ M: @( c3 u& F8 E                temp.re = 0;
    4 x5 ~% T  v0 k% m- T) {3 N                temp.im = 0;
    ) n3 a/ w+ R) q3 u                i1 = i;! ~& d3 Y% _# p0 M4 \, K
                    for (j = j0; j >= 0; j--)3 X7 ]8 ^( c9 e# `3 D1 j
                    {4 R' e; R7 v' S' h* F
                            /* floating date operation */& }, R  l- k1 }
                    }

    + K  |; \/ w$ @7 i        }# R6 F" R. Z! y
    }
    ! ?4 P: r2 i- C" t1 f! X
    8 F% ~8 R) r, C0 Zxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样! ?4 e( i4 V! a# {- f
    " }5 G9 o7 g, g8 z
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。) Y5 y+ R- x, F# H0 j; x
    现在call xcorr 100次,耗时78s.
    # L1 Z  }% Y+ G2 a7 j4 H
    4 B" O7 k8 T4 }6 y, n0 A  ?如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    + I; i- e1 w* z4 B
    : k3 Y7 F. |7 t' g% A& a0 S
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:335 Y% P/ F) t8 T  T8 e4 A
    Maybe Debug mode?
    - g$ z& X" L* {3 h5 a$ l
    ) G( b+ J' V  [) h1 R
    不应该,看我上面的回复。
    / x( s% q- e- `/ ]1 {) ]
      v+ i5 `' }, Q0 Y. z+ k我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 - ^, u7 _  P: ~. B$ e
    雷达 发表于 2022-9-24 23:54( ^, C5 u  D2 O1 p% ?9 o
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , V# O2 u& Q6 G* i- V. ]5 B{; I' N3 q1 p" `7 }2 G5 v
            comp temp, xtimesy;
    $ ?9 \3 h+ @% O
    $ r$ k% N; E2 i
    这个不是这么比的吧。。。+ y1 }# W% k2 B+ ^
    ( W: {3 U3 v1 I* E/ R7 i5 [
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。6 f/ q8 z& U  f- Y- a

    4 E2 A. t6 @: N3 O. H1 ]7 [而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    % |: X+ E! Z# D) g
    数值分析 发表于 2022-9-25 00:20
    - a+ \* F- K; w8 a2 ^3 N5 L这个不是这么比的吧。。。( z" l3 N- s( G- m3 M% a
    + k/ M  N/ v6 x* S3 d" P' h1 j
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    8 N" K( }5 x! G1 n8 \. F0 p: q6 n: F6 F
    有道理。
      u, M, A. [) t' `( ?/ ]2 O所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    , [2 r# Q$ v4 o5 C
    8 j0 A9 X1 z+ a  i: \1 u我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    $ \0 u& \* {% ~/ r! ?有道理。3 g9 T9 E8 i. ?; R9 R0 Z# J( F
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 b- H5 J( W$ ^! V9 K& w5 ?$ C你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    8 d" K/ G& s  P# T' D3 {) OWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20- N4 x& w4 D% u8 w9 X
    这个不是这么比的吧。。。" e* L. {: n9 X  `* [7 o
    7 Y) \  d, ]# ^; f" p& |% B" r2 g
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    * p- _4 N& f- ]: c

    5 j! v4 D; T3 G/ x' f现在的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 编辑
    ) L' s: R0 |2 g$ k
    沉宝 发表于 2022-9-25 01:487 X$ u% E/ V% }: g, v3 v4 V
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ; Z- d. z# B& W# c* X- W' W+ ], B
    8 E& a9 V% S! b% `6 A' a  r$ D是的,兄台说的对。
    / J0 ?0 [& k0 u5 [, F/ l- i5 f. o% c8 E% {
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    5 q) P. g7 Z5 t' D8 w9 j* I
    / B+ u! t7 |! b0 A; c8 t' u, b雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。. U9 k. L& ?9 A  s# u0 P
    # h: n  F' \/ f; {
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    0 X6 h; ^# j: n- l: c: t6 |4 z# O; P7 W$ R
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    8 s9 d1 a9 k. j$ F9 m8 `9 Y9 \
    沉宝 发表于 2022-9-25 01:27
    2 M2 O5 Q( h$ o/ @  ]' i/ }/ T, o; T+ T你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ( F6 N0 R: l) N4 B) _, T& D
    ! R7 M, {- N7 J又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。+ Q( b, ^# h7 c* q" T
    . _9 t1 M! c* x7 I# ?7 P$ b. ]
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47; ?$ w! ^  X! C1 @
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / K) g$ f9 [: L9 V
    时间差一倍的结果可以接受。
    : b9 x+ u- S8 v4 A& b/ ~% K9 c: i6 y7 j. W) L
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    / h5 l; [: e6 k7 |% v+ l! U
    雷达 发表于 2022-9-25 04:47
    9 T# m; a' e( H+ b# ]又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 {5 s6 y2 v/ R0 I- C$ n  w" F4 y

    3 r& n$ E7 D0 M$ T" ?0 z: U8 L0 Y3 Z8 w$ ]% {7 u& A

    7 l' w$ |6 A* a& J+ I2 w能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 , c8 d4 T* R+ o7 S6 J! H- h& h
    数值分析 发表于 2022-9-25 14:588 V. m3 r7 E' c; f
    能不能把这个也贴上来,看看和上一个有什么不同?
    3 q- v8 O" c, `3 R6 J- W) `1 _; p
    理了理思路,重新做了一个测试。
    : o$ Z- u$ K! g' j& H  h+ R/ b" |做了两个 vector 和 两个 float *, 都长 100000  t: T1 F; `4 h1 A
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ' B. c5 E4 O: B8 _# ^+ }5 ?! J, @( U( [- R( J* U0 N& M6 Y$ l( y
    内循环试了4种方法,+ `$ ^: t& m, ]7 Y
    1. 直接调用 vector inner_product 247s ) U1 p, `5 z, Z2 ~  J
    2. vector 循环点乘累加 237s
    1 A# w' j9 I; m# p3. float * 循环点乘累加 204s/ w, J; E; w6 M" r# w1 w  j" C
    4. 空循环 100000 次 202s
    7 g9 v0 L% O; `4 I& |* g3 U+ f% R# ~! o+ `5 ^9 G
    不做内循环 200s
    , B' t+ j. f0 v9 K
    6 n+ b# m: V! H1 z9 G- ?6 Y8 Z' A# X; G4 b你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    , e- a9 [" B$ Z( \: T  ~另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    9 o# R" l% I; O  D1 \) j' ]# c
    : D! D! ^- S$ A# w/ o至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    9 d8 ]9 ]! @) z  S' X/ x. a% Z# Z" x4 f( d; Y0 C7 q, T- A
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)/ p# V. r3 v# w
    # }! s5 u6 l: o
            std::vector < float > vec1(N);
    % S5 N- a1 ^7 X+ X8 n  A        std::vector < float > vec2(N);6 x! p0 p% u* K/ Q/ j. S: |
            float* b1 = new float[N];- m' s3 E# C- E( @, @; P5 T
            float* b2 = new float[N];
    . X! \% U1 d# t3 w& |, K1 k, s$ z# Y. G  [" M
            for (int j = 0; j < 6000; j++)
    / D  z2 M& O1 k5 O& u/ k        {
    0 E9 _. [& m, [2 e. K+ V                std::generate(vec1.begin(), vec1.end(), []() {0 t7 |: O. Z4 y$ O( m
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    & j9 T2 A& \) {                        });
    - P9 p: F  v# H7 N. }; M1 ^3 q* }4 l; X
                    std::generate(vec2.begin(), vec2.end(), []() {
    . L) b# w. _2 O; H                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 Z! x- |" B9 G8 {: f# X% A& ?5 Y                        });
    $ l" n* U" y7 u$ h, L7 j3 c4 B- n3 T0 N! C
                    for (size_t jj = 0; jj < vec1.size(); jj++); D0 E- M$ i0 C! Y; s) c
                    {0 i5 h' _" a7 A' ^$ \* V) _% t
                            b1[jj] = vec1[jj];. u; ]& e% c" h4 B& n; }
                    }" I# f, q6 `: n/ T. Y$ n

    - R0 Z% k4 Z$ F# U                for (size_t jj = 0; jj < vec2.size(); jj++)
    / r. C8 g& n% f                {
    : h, F, @' V, @1 d7 |                        b2[jj] = vec2[jj];
    2 n: X5 W# q* ~+ ]3 L7 H                }
    1 \: c7 r  ]: C1 A
    / L3 K7 f9 C& s' M( p% d                //Method - 1  N=100000 247s  2 T: k6 B$ p5 H# z; \
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    . _# C! {6 o- z& A$ W$ F4 ?+ V5 \, V                                & ~9 N3 B. g& X
                    //Method - 2  N=100000  237s/ D- j! T1 S* x2 n8 f
                    /*- ^! I8 u  m" b0 i, A% ~# W6 q
                    for (int jj = 0; jj < N ; jj++)8 ?; m* e9 ?& S/ X1 ?
                    {& e7 M1 i, W! W/ a
                            fresult += vec1[jj] * vec2[jj];
    ; g* Z0 W' }2 Y                }  B, W. B- Q  G/ n, S  B2 Z
                    */
    6 u  h2 k0 }% u3 ^' v                                ! Q# L( v4 @$ Z# \$ A+ O, O2 Y: D
                    //Method - 3  N=100000 204s" j( t% {8 D! Q" X: _8 Q& n
                    /*- ~' |/ r6 s0 \4 y+ C
                    for (int jj = 0; jj < N; jj++). u4 i* q+ }$ v! n
                    {
    % W/ U. e2 Z1 u( {  @1 e7 \, ?* c7 k                        fresult += b1[jj] * b2[jj];& r7 p" V0 p* t+ l0 Y
                    }' o8 Z3 n7 `, k" }7 f# {. w$ E
                    */3 Z9 |. P( X% R

    0 V6 R0 ~4 C( l" Y$ o1 y9 }                //Method - 4   202s7 c: l% C" y. a, G) N- E/ g( g
                    /*
    ; f; z, q9 [( h' f% B6 i                for (int jj = 0; jj < N; jj++)
    1 c# r( `2 |4 C% Y( I* z2 m0 E* B0 T                {1 A2 [. [- C3 |$ Z
                            8 l& n3 @$ D  Z  ~$ q& }
                    }" C( U; S: U2 F; D' n1 w  b9 a
                    */* L/ D' y! e- _3 A
                    //comment out all methods, N=100000  202s                . H& {3 n4 ?) Y6 w& t, K; @# ^
            }
    ( L" `* K4 S( P
    ; _  K+ g8 I  n$ s* \' o        delete []b1;! k1 w" b' [8 g+ `9 N) `
            delete []b2;

    + R! k6 I4 k+ w# n6 R! ^3 o4 |
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?$ Q6 h5 r/ I& c# U" k
    / B- \- N' O. D$ Y8 g% n% ?
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?1 O( T/ y5 o2 ?9 d1 q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:158 G" i" n; M$ Q9 p/ q
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! t3 `# R: K! y0 q5 z$ b: T1 H0 O0 }* ], o' L3 W
    你第二个试验里面的j在循环里面又重新定义 ...
    $ c* X1 _9 d, y- o7 E" h7 j8 c
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( A3 I% Y3 I) \. ~3 x6 ]
    ) E# q/ Q: @: u
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    & i& W8 @/ _4 w. w$ z内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    9 h  H% X0 e! m! b7 A& m5 D+ c( f2 q$ w# b2 y0 T
    不和它 ...

    + \" P2 h, M0 t, \6 y1 F5 @, @, g3 _; K
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。1 u5 _7 i" i+ j4 v/ B2 C
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:541 H: |' `. s/ }! [6 n8 s
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 |" @' r* R. |* l& y{' C; z5 c- X- d' D' O9 Y
            comp temp, xtimesy;

    1 o( n* r# c/ |3 h$ E- H  [8 T: s6 E这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    . o# F" o$ b+ F/ k内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    + ]8 j, L& E/ M! _/ a4 b- E7 t0 lVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-22 06:24 , Processed in 0.065570 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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