设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    . M! z' Y( u6 m; M# m! x4 W/ y% t7 `. @9 l& ~
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。8 k, F8 k* T$ r6 k1 l0 e' k( ]
    + c) V8 ]; k$ t/ [" i6 ?, `6 P
    速度优化问题真的很有意思啊。2 T# j4 s6 g# P$ \% F$ v- U

    1 ~& c1 P, E  j1 q5 p; y欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    4 B; Z; T0 |2 C" Y- A- L* J把代码贴上来看看?; K6 ?& G9 L" ~  ]

      i) I9 F; Q; k( D2 }难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    9 L6 ?" B% k0 H# H% |7 u
    数值分析 发表于 2022-9-24 23:04
    . K& m1 f/ i' g1 o3 m# Y$ q% n拉下来?拉多少?) k9 H. T& V! q  |8 M
    把代码贴上来看看?
    8 s3 w9 I& B( k8 i5 E) Y
    7 Y( _$ D( ?9 C2 ]: q3 z
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 X; y* T+ v+ t' d! O2 d: t+ L{
    0 O. P8 F, E' h; n& ~        comp temp, xtimesy;' d6 a1 E" O& N3 e: U% K
            xtimesy.re = 0;
    : h, p% h' }9 T( M% T        xtimesy.im = 0;
    4 u# K6 g/ u" U8 [+ ^" b        int j0 = lenB - 1;' ?, X. p* J: h& k0 F  `
            int    i, j, i1, reali;
    0 m& ?8 [: V$ X8 f        if (lenA % 2 == 1)
    , d! h7 w, y, A" L# s                reali = lenA + 1;( X. _, O% g( |1 P# T8 q
            else
    4 v# h& S/ A, c5 J1 ^0 J                reali = lenA;: H: b6 l$ H' T! M! ]: \
            reali /= 2;
    % l" I' R9 f) n* ^! `# u
    . d- T8 S# M) `: ]5 y        int nconv = reali + lenB;2 L' C2 y4 M) C
            //#pragma omp parallel for# M( r5 |8 o9 P- ]
            for (i = reali; i < nconv; i++)( W# I7 k& b4 I8 s
            {. c3 p* d; h; u# A5 Q1 g$ Q5 _
                    temp.re = 0;
    7 w; A4 s9 p3 E& i- c                temp.im = 0;
    ' ]) D7 N& G5 q0 X                i1 = i;
    7 L' l" r/ S2 w& N0 h                for (j = j0; j >= 0; j--)- i3 S  X) r5 k) A
                    {5 O3 i' T  m% ]* l8 H. c  f
                            /* floating date operation */, c+ W' i6 s$ p( u8 }1 L6 n
                    }

    3 t1 N. v* `8 E$ a! ?        }
    6 _( m) M9 S- ?6 U4 X; p* S}, U2 z+ E5 [, }* S

    2 r( t- j0 [3 R1 Kxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样. K2 y) v! t0 x4 G. W, v: y$ S
    $ M  b4 Y; E1 X; D
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。4 }/ D9 j4 ^# J$ z; ~) Q( m
    现在call xcorr 100次,耗时78s." i4 A4 W  Q2 M
    ) [5 X# @" w0 Z! r5 d$ R
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ; i6 s5 f' q& p9 L" U$ |6 t, H* f. R; f6 @' \
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    8 z4 K, l3 B/ b% J* OMaybe Debug mode?

    4 s  x/ k* R  m% E" P. {: v
    : m; i3 Z8 l  `5 M/ f. a1 Z* D不应该,看我上面的回复。
    3 m: [. x1 i0 I; h" H7 t) A* j) S& N" t; I8 k% L8 j
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    & q" C) D& I" ?7 ^$ f  x  ~
    雷达 发表于 2022-9-24 23:54
    7 F! o0 D9 ?5 D+ ^" U0 l1 @8 jvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / a; e5 F, b; o2 o, E) y{
    - m5 z4 D, u$ r4 L" |  P        comp temp, xtimesy;
    ( H0 u+ m3 T; v! b. b! k/ W* O" |
    8 P: G9 ~; H) y& ~' M
    这个不是这么比的吧。。。
    % ~( Z& y# N6 k9 m- B( P9 p& |2 l5 V8 b
    ) n4 n6 v/ C6 s4 n/ w; O您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 a8 M, h' B( u1 N4 U* V+ r
    " J" d/ @: \9 k/ M而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    . P. |. {% a# c6 x" m
    数值分析 发表于 2022-9-25 00:208 u" H3 v+ j6 g) y0 ]9 o+ I6 P
    这个不是这么比的吧。。。5 n7 W; ~/ q- A

    / n/ i4 a7 Z* z3 X您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    $ d- O. n4 r. M; E6 Z

    ! N; n, X& g; _+ N有道理。6 N0 \. A( ~' s
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    9 t/ G; p2 w- i& Y+ Y5 L  j8 n
    . I0 Y; }. m8 }8 U我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ! ]7 e0 j0 b# [/ P有道理。3 p! {# }7 M3 G7 Y" B
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    / y9 S( y  f: K7 W/ D3 \$ G: h你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    - b+ _! c' H" Q$ YWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:204 V6 _0 }2 P2 q7 E3 E0 }
    这个不是这么比的吧。。。
    / N& `' I* V7 B5 i( r' L9 m3 s8 u7 I0 Y4 h
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    - |( {* O2 G2 a: R

    , r# b% {! g1 V. b0 Z# L. \# O, c现在的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 编辑 8 |# Z1 {- c. W/ b7 j. j
    沉宝 发表于 2022-9-25 01:48
    # ?* @0 W5 N6 c% G; ~) O现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    * ^1 e0 c( W' W4 E( q8 @- R

      b" {7 E" d  n: t是的,兄台说的对。
    ' j+ A* d* @6 P; p) P0 j
    % r! R# B; S6 `8 U# q5 E其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    % `+ _" N7 B1 N) Q: l
    + ~% B0 h% y, }, p& O% l! B雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。: W8 L8 C5 o. [" Z$ O

    * z" b; a6 P  z比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。- K: P* [; n: P$ g" l

    8 |) m5 {/ x; Z" v' ?& N6 r当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ; l  G; I% e" C/ V: N+ x8 ]
    沉宝 发表于 2022-9-25 01:278 Q! ~" A. t* n; |( O' Z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    2 w! t6 |* D9 G: m; T5 q6 x

    0 c4 H6 r, h9 l1 `0 C又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。5 M6 u: G+ K: s! ~* F% ]
    3 G0 ]$ E$ a! v0 J$ h* u! ^
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:474 s! J. {( p; l0 G8 t: R
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    / ^& I0 b  @% z7 |( E* J时间差一倍的结果可以接受。  F4 E/ }$ A1 v8 \5 _+ t

    % j! ]9 A' |( {& _7 ?5 O你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 . D; W9 ~/ Y9 A2 F
    雷达 发表于 2022-9-25 04:47' ]; |  ?! a. t, s
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ' D- J  G+ A7 |+ Q
    2 B0 o6 d9 ?3 a, V$ x! B$ \# @
    * p% d' q8 }. B0 D5 r- g( I
    5 w3 |3 b& ?! e) h4 d/ a6 W
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    0 g, H8 L) X$ W
    数值分析 发表于 2022-9-25 14:58
    & A5 Y6 {+ s' j, u能不能把这个也贴上来,看看和上一个有什么不同?

    ; k3 p  y5 }4 P) }2 Z* G理了理思路,重新做了一个测试。! ?% f& g# e2 W8 B. n9 \
    做了两个 vector 和 两个 float *, 都长 100000
    : i0 p2 d! j/ X+ D7 O8 L8 @6 B外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ; E+ t* b8 `% Y- @. o0 |: K- u! y9 `, [
    内循环试了4种方法,) u* l3 h* T) E6 x' W( ~
    1. 直接调用 vector inner_product 247s 5 n! e* a* f4 \; b
    2. vector 循环点乘累加 237s7 E6 R5 A) [4 z0 l* w. J
    3. float * 循环点乘累加 204s
    / ~4 R; H0 @* E0 F- w! ]4. 空循环 100000 次 202s
    * L2 u* e' u4 Y# e6 V$ L! e
    9 |# g6 n) e! f) U不做内循环 200s! h* f6 s; y% [4 q' H" g$ c7 y
    9 N$ Z/ D) O- \  i* v% c" \
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ( q( A: K2 ~- G1 y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。  b2 ]' o5 \. S# Q  o

    + I0 o0 Y7 \; y" f3 t. _( `# p. c1 A至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ @- b! W$ v8 j3 H

    $ d( @0 p9 U1 U5 s0 l(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)6 [3 x3 [- G8 i* D+ O3 _
    6 j0 E! I1 ~* D$ B5 W
            std::vector < float > vec1(N);
    - h6 x9 g- _- R8 H        std::vector < float > vec2(N);
    ) a' w, P* A! V        float* b1 = new float[N];7 _" A/ [3 d2 b* q) u6 q
            float* b2 = new float[N];
    " M0 C' G1 V& E' \% K8 E% d6 d. j; A* @. L: _* n1 h
            for (int j = 0; j < 6000; j++)( |7 `: X; ?- L% \$ m5 x
            {/ @3 X5 c) o" u' o- y3 E6 l
                    std::generate(vec1.begin(), vec1.end(), []() {
    * R7 g' h6 f* F; T, E: q6 q3 @0 @                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;9 [, k8 E3 Z9 n2 m' {3 \* H
                            });
    " ^9 k1 _# ~' c! E) A1 {! `4 [8 f, b5 D5 h* M* d
                    std::generate(vec2.begin(), vec2.end(), []() {
    3 ?% `0 r1 o! a; A& }2 ^: `                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    + @) o7 _' [# |  o                        });0 V" a* P) ~* o

      B" Q( [; U( u& m7 A                for (size_t jj = 0; jj < vec1.size(); jj++)% X/ E9 [& N6 N( ]; G1 w( r6 D
                    {
    ! k! m4 G5 u$ k2 g$ `                        b1[jj] = vec1[jj];1 V  A1 x) k9 c1 K0 O! O
                    }
    2 D1 v+ v9 I1 {6 H
    , B3 _: F# r4 ], A6 w                for (size_t jj = 0; jj < vec2.size(); jj++)1 {/ ?6 l: ~# O% d7 W5 @4 u# u4 ?
                    {
    % D- r, @: B. B                        b2[jj] = vec2[jj];# O/ p" Y3 E+ U) j: Z
                    }3 v5 Q3 P' D7 W7 ?. E7 F

    ; r' L4 h% D3 l9 F! {                //Method - 1  N=100000 247s  , l: p$ p6 Z" Z  p9 q  {
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    % U% }& a# ^0 \: l& d' u2 }                                
    - t( g6 B' l: J/ J$ l$ F0 Z                //Method - 2  N=100000  237s) w9 c9 S9 G8 S: q5 S" o
                    /*
    ) w+ o6 n, ~9 \( z. K2 B                for (int jj = 0; jj < N ; jj++)2 J* ^, p" `( R/ b6 u! S
                    {  M$ s2 ~9 `& B) [) ]# s# r
                            fresult += vec1[jj] * vec2[jj];; S5 u! A9 c) k  @# d5 g" B
                    }
    / c# \; w2 w+ |8 }$ v                */
      G  {& r" {& L6 ?                                
    ' [) J+ M8 H( X7 \. z, R! m" X                //Method - 3  N=100000 204s
    / D" C! X& G! g7 B' d) d8 ?8 ]                /*
    1 ?, ?2 n* e; F# z' E                for (int jj = 0; jj < N; jj++)
    5 B' Y; O7 ^& A0 V8 b, S( {0 W, k                {
    : ?' e3 x; E$ v2 d! Y( h, k. a                        fresult += b1[jj] * b2[jj];" o' U5 L1 B5 C; h& E, s+ i
                    }* M: w5 Z& T) U) M
                    */% |/ [4 @2 ^3 m
      [( ~9 o3 ?  A/ v1 ?. O2 C
                    //Method - 4   202s
    ( K( p$ ^# _; U# X4 f. N                /*1 v( S# `4 s6 q9 t) |* x- X
                    for (int jj = 0; jj < N; jj++)
    1 z7 F# |! {0 W8 C$ ~, L+ H                {
    ) L/ Z* v3 |" d( F. ]6 z- Y2 p9 {0 }                        2 t/ _# A  `( s" B
                    }6 h) H- g, E5 o: ^
                    */
    8 t& h! e9 u% C" J0 R1 _& D2 ]+ I                //comment out all methods, N=100000  202s               
    ) D0 d9 Y/ X5 G' E6 l        }+ c( C) E8 H/ Q5 C+ U
    . T" f0 n' d! i7 }- ~+ P& E4 E, F' J
            delete []b1;: r2 n, v  H8 d) ?! v1 k* D
            delete []b2;
    5 Y1 A; ?) t* T0 j
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    " d( N; J0 o# n& L) M( }6 K
    8 f$ |4 }7 Y# _* B$ d+ y你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    * m9 }  |8 e5 T: v+ O9 v& |& c! n
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    5 W4 f, x3 F4 k$ J; u$ o: `瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 |( K8 c: Q5 G

    + [9 [2 i$ w0 O* g5 R' a你第二个试验里面的j在循环里面又重新定义 ...
    ' z, b- a) E8 b3 c* K$ v
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    . A2 F; w5 [# o* N! e; {3 N# Q* B8 c) h5 C
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:166 f! W6 Q5 M% f4 k# C! M% \: x2 {
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' c% N+ O  o+ [8 W4 i4 N8 [& ~: y0 U8 \  S' {0 J
    不和它 ...
    " b6 J) [+ T# e. |, y
    $ r6 n( Q5 Z; p6 t9 y, E% K
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
      J. l3 U0 p( y4 S! X# a: ~后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    8 B# @% K- }" V4 @+ evoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ [* |7 h: ?. a4 i8 g
    {
    7 {; S' v6 q+ \: p        comp temp, xtimesy;

    ) R+ i" v# Y+ G5 [( {# b% p& M这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    0 ]: O% b: E1 L- @内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?$ l# J: q; C( |# p3 E
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-9 08:19 , Processed in 0.077748 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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