设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    $ L/ Q- e. s" f9 @
    5 g8 G; d6 S! {0 F( q! E' S8 c  D! l4 d自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ F. j( A0 i/ ^- K# _# d( I

    1 _  C7 ~( J* J' |! C8 Q* o% z速度优化问题真的很有意思啊。
    1 I8 @# K5 n1 q7 D3 \; }) G9 _8 k9 x" n9 [8 B4 B; y( C/ P
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?9 H3 e6 n4 L3 f, I* D4 [
    把代码贴上来看看?: l' j8 \0 Q" P3 z/ o7 A

    + X# q+ M! B& K! E" z" [难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    8 c! u$ Q, V% G
    数值分析 发表于 2022-9-24 23:04
    8 r" J8 |% d" S3 q8 ^) f拉下来?拉多少?
    5 p! v" n. u7 m8 r3 G' J把代码贴上来看看?
    * W8 z( o2 r) ^9 J& Q# W
    ' k2 i. N/ E: Q1 z: B" W; A
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)7 z9 \) m3 F5 `6 n& p  V
    {
    " M5 ]5 Y, J! s. Q# b, U/ l+ f  S$ ?+ h/ `        comp temp, xtimesy;$ D; f, w6 P" |3 W$ q4 Q: O9 x
            xtimesy.re = 0;
    1 n/ \% p. I" ~% Z7 o" O        xtimesy.im = 0;
    ' Z. c- @: T  m# k: i% E/ x" z        int j0 = lenB - 1;
    & S, b* @* }/ N6 g% g        int    i, j, i1, reali;
    ! `7 L$ @2 g& q: l3 X3 p        if (lenA % 2 == 1)
    1 D4 x3 Q1 C3 [1 R' I1 C) |                reali = lenA + 1;
    . C- @% {. y$ a" u* N+ S7 _        else* ^& |/ u' q) h* G% s1 ~
                    reali = lenA;
    0 @& f+ y3 N4 k6 v% k5 O/ V4 U        reali /= 2;
    $ [% E3 R, ^& M+ ]3 c; I+ N
    3 o# _3 }/ Q0 Y        int nconv = reali + lenB;
    6 o# b6 t+ [9 Y  p: Q        //#pragma omp parallel for1 B9 }+ r5 E" d  y! f9 k5 c
            for (i = reali; i < nconv; i++)
    8 f8 E- u  I4 Z/ @        {" \& _; B, g1 H0 `, j# u+ f
                    temp.re = 0;$ X2 L3 [+ W' O# I
                    temp.im = 0;
    4 i* ^! G8 y8 _5 P# N& n# g5 P4 @                i1 = i;
    ; n; m+ M2 Q9 M- P7 K' {  P2 o. g                for (j = j0; j >= 0; j--)
    : r6 ]" U. @1 O9 I8 a: u7 ?                {
    ' u9 ?: v/ v5 I' Y9 B8 A                        /* floating date operation */. f- S- u! U! G0 q# m
                    }

    % P% `2 {5 g# A; O& O" d        }7 `1 ~! `6 f, F* C3 }
    }( J- e4 c0 _/ D1 p
    6 ]2 k6 g- Q4 k5 s4 Y8 {9 C& t* f
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样. L) o* N$ I- \5 |& A* h& [

    % |' c7 X# q0 \1 F红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    1 ^1 Q+ U6 a, C7 b: H现在call xcorr 100次,耗时78s.
    4 S$ ?  p( [4 ~( g8 q! H0 R
    ; \( n* K& p. M如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    1 \) ~4 Z" h7 o& T/ [5 ~2 ?& T4 ]- [# F4 T- M
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33) H) n0 Z8 H. T" M
    Maybe Debug mode?

    0 T9 U$ J4 w0 U! F# l5 L0 I/ P" h
      i1 Q/ Z" K" P; v" i  m不应该,看我上面的回复。; Q: Z/ [- M  b- k
    # }2 @9 I2 A# Q: i6 l! S
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 5 _2 @+ ^8 [1 g% P6 g7 ]+ Z
    雷达 发表于 2022-9-24 23:54
    , `* p" J8 w+ l- C9 svoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    * P# y* h! U, k, [( T& I  s{0 k7 k2 o! h! O4 M3 ~; b7 W- \
            comp temp, xtimesy;

    " Y0 [0 M$ N) T+ ^) A4 i7 p9 D) z1 M
    这个不是这么比的吧。。。
    . d; c9 F$ f+ ~9 a6 ~
    ( y' a9 @, L$ [2 a4 \; C您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。3 F% F9 S, b- ]. v
    . b( w5 \6 m2 ^  y" |) G
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 . [0 s2 b4 k$ ~* T& V
    数值分析 发表于 2022-9-25 00:20/ B; h5 x7 q( l# v
    这个不是这么比的吧。。。/ F/ v' e5 g# d' c+ L9 N

    1 O6 O* `* s5 U; |2 d您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ; ^. N  v0 t: R6 k2 A$ {& T
    1 R" K$ [" D) u: L2 o! m$ ?
    有道理。
    . `: V5 }, l5 M" a所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    / v- J5 L" u5 }( l7 g* L4 p% s- v* f9 s0 N5 u$ ]' t
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    " b# \* S& A# G4 i" U4 l8 q有道理。
    $ B" }. U$ T$ F& F, _8 q所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    2 Z/ r' b( K$ P7 z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    1 e# C& g6 }7 T. ~; qWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20& C# M2 x5 ?* A+ Z0 s1 P: c
    这个不是这么比的吧。。。
    ( v) b; v5 Q) W! y7 [8 Y7 }" q
    ' f* r% K8 T  z( C  s6 c$ [1 @* c您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    : a( Y+ L$ c! m. p, G# C' i" }
    $ E; @/ |' t* N7 ^现在的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 编辑 $ B  u" s0 b+ ~/ \# L7 `3 l3 i
    沉宝 发表于 2022-9-25 01:48
    9 [* B" R9 c( a1 j! l9 Y现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ( j0 @, Q* k2 _: E# x$ e2 C1 c% n

    5 {! D- ]. K$ K是的,兄台说的对。1 t9 ^% j; u. z* e- v- @

    - Z/ [. @, a$ C% H$ O- J2 S9 {& \) {其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    : X6 V9 C/ _7 B* y8 F3 @" k9 w- x% Q8 `$ L) U" q
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。5 H2 [0 E$ J; J. q% \; Q
    7 n# M$ I; a; n- X" }% l
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    # h: C0 g+ j9 F; c) G9 U
    $ y7 p; K8 c- F. W当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    6 z0 [' o  q! `2 q3 n: @7 i  k
    沉宝 发表于 2022-9-25 01:27
    5 ^9 S0 e) y' l/ K你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    4 ?/ b0 y) `5 @- D. ~

    1 H7 X4 X8 d$ h8 b8 a3 {: Y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。0 V; d- G/ w% E' U' ?( @
    6 n. R" p5 ^9 t3 j8 |
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47( l6 r* x( v. i* J; k) A
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % `( E5 j  J+ R! j' Z$ N0 ~时间差一倍的结果可以接受。
    : k/ K  J( [6 ]) ^/ ^6 U! h- f8 o- Y- Z! K1 r
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 9 X0 B* r, o) k- D; Z. l
    雷达 发表于 2022-9-25 04:47
    3 B8 O. ^% m$ @& L又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    4 {1 S! y6 R3 h
    8 O8 r% B5 z9 a* U* J6 v7 d6 `

    # P* D# Y5 B$ D
    ! ]1 {: e, U& @能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    2 N) `" {' x& C
    数值分析 发表于 2022-9-25 14:58# o/ i& F0 r0 P9 a1 s
    能不能把这个也贴上来,看看和上一个有什么不同?
    0 _' c6 |6 `& N" i- O/ P" o
    理了理思路,重新做了一个测试。* y. ]4 i* r7 y  Z, y/ S
    做了两个 vector 和 两个 float *, 都长 1000008 O2 H8 F; @, ]! A( K) f) e
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ) C3 ?7 |  l( f' ], C' w2 P- n' X  c" b0 c! l' L7 y, D# m4 U. T
    内循环试了4种方法,) g- [' a5 z  V
    1. 直接调用 vector inner_product 247s
    " E" D4 Y- I/ |+ \5 n* m2. vector 循环点乘累加 237s
    8 u6 S; Y  n; Q& B8 ^3. float * 循环点乘累加 204s4 _. ]3 v8 T* ]5 p- H$ S' R, a
    4. 空循环 100000 次 202s) g& z+ m5 |& A" h6 w3 \

    ) b+ D/ A# W& l% u5 X不做内循环 200s
    ! O0 o5 x/ o' |8 \$ y- T' N3 i1 T% g' p
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 U# b1 A& R5 j" X8 v
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# H- Q* o2 p0 M, h8 \

    / I- K0 u2 `0 H  F3 @: p  ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    7 \/ G- @1 h9 a
    9 P! m9 b& z% y! v4 z' d* F' O(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    " O/ A% J2 [& m# H+ M1 _& y4 u; x7 x  }) m: Q+ @  \
            std::vector < float > vec1(N);+ G2 W  O' H- U) u% g4 Y% J( u
            std::vector < float > vec2(N);3 _3 \! P) ^/ q: [. [
            float* b1 = new float[N];
    1 ^; u2 f( a6 n        float* b2 = new float[N];. U5 x6 |* R8 q; ?4 H
    . C2 r% B! c* d$ s
            for (int j = 0; j < 6000; j++)( n5 b6 a$ s. I$ g) I
            {# N5 l0 T( I& ?' J
                    std::generate(vec1.begin(), vec1.end(), []() {. y6 l! N9 t1 {: P, ]5 _0 P/ c
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;& z2 C3 g0 M" O/ I1 u5 l
                            });
    0 U" Z/ F5 x9 q9 u( S! B) `( G4 n9 l, U2 I+ Y& S3 L7 i7 d0 v
                    std::generate(vec2.begin(), vec2.end(), []() {
    - c1 O$ @: W" ~% W' e" t& _! k                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 l! U; ?) ]  Q0 d& u
                            });% X* u. h' a7 ~! ~# `4 v

    ; S8 _# A/ f5 K/ \4 G9 Y/ `9 Y                for (size_t jj = 0; jj < vec1.size(); jj++)
    , r! {1 h; i5 c1 O  o                {8 {: D% D; a. i1 B. i& e! t
                            b1[jj] = vec1[jj];9 t( G! N! a! B) Z# {1 L- ]
                    }$ h# R' t0 i) U( \

      j" s% C' D  v% d0 t/ X, |                for (size_t jj = 0; jj < vec2.size(); jj++)
    9 W5 p' o: m* Q$ f4 M; r/ o7 [& ^                {' z: x: g9 L* d
                            b2[jj] = vec2[jj];
    # J* ^% ^2 B$ p$ v                }5 r4 n& j& C, U1 h

    , k. n* k* W: X. X1 |$ I                //Method - 1  N=100000 247s  
    % G! Y5 O. ^. l' g8 ]% q                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 ?' v: a4 M5 k: F1 J' b4 G
                                    3 ?: z( S  C+ R( v2 i$ \
                    //Method - 2  N=100000  237s. z. i, e+ d/ W- ^% H" s% z
                    /*+ Q8 v  Q5 |5 C$ o6 i
                    for (int jj = 0; jj < N ; jj++)
    $ H7 n2 J/ @' Y/ R& Z                {
    ! R  L6 D5 P- R                        fresult += vec1[jj] * vec2[jj];. W5 _% q& ?- W0 c& y" _
                    }
    ! V" V( G* `6 W0 ]$ v                */7 x* @* H- ]8 a! M
                                    
    6 E* P7 K/ Z( L6 Y                //Method - 3  N=100000 204s
    % o. @- K. k9 k; a4 L                /*2 Q% g% o/ v3 n& i
                    for (int jj = 0; jj < N; jj++)
    & q% W/ f( `5 x                {, g, m: }  V: H
                            fresult += b1[jj] * b2[jj];
    . n1 S3 M7 g. a  T7 O* E+ w                }
    % \! o5 C( m4 O# K# @) s                */
    : Y, L- u9 g/ r& `' X
    - I5 i5 C2 O. q# k/ l2 w                //Method - 4   202s) e7 K* u! d8 u+ W( c& s
                    /*4 c2 k( S" t3 S9 }4 ?4 Z% [
                    for (int jj = 0; jj < N; jj++)
    9 S7 H& K) ?+ b1 ~4 \                {
    ( e7 a; k5 M$ C6 G. j% n! W                        
    / b* y; X+ a1 ^                }
    " ^1 {$ a! @" m% S6 ^                */
    5 ]4 J6 R+ i* g( ]                //comment out all methods, N=100000  202s               
    % ^) f  A: [1 C        }
    ) [4 w# |9 i' v$ p* k& D8 X1 P, _$ i- A
            delete []b1;
      d/ }( ]' K6 ^3 D% C        delete []b2;

    1 a- q; ~. c# k, h! p) J
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?' j. z- t& N7 r3 T2 i6 d. }

    : ^1 \. G2 C, H, m你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?: f8 B1 D: n) `" \2 T( c
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15/ Y" o% W; C) V5 p; ]
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    5 @! F/ B9 l3 j2 P
    - J5 E& }. V( C! C: l8 ]( ]+ V你第二个试验里面的j在循环里面又重新定义 ...
    & Y, a# o: c- j: f. v  t( h
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    : q1 h2 p: S7 j9 Q& Z1 ~- _; I2 a4 Q3 |9 r3 l" z/ g1 z8 X
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16  l9 H& Y0 Y% S" j
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 p  ~$ I7 H+ A- m& ?2 E* i1 ^

    $ x& `! A) [( `5 _- a& @不和它 ...

    , S! {+ X/ }! M. O- T
    & L0 d: z2 _7 p$ \7 a/ n3 q不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ) \. R; r7 k5 |( S" i8 l1 j后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    " y- b) O1 P+ [; _4 R7 A+ ^void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 s/ k( C1 A& F6 g6 v{
    . P6 O; J: u+ Y        comp temp, xtimesy;

    3 `6 x  N7 [# D这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    * p1 \+ b; X( {% i) _内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?' U8 L* D6 ]3 b2 k2 i. _
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-4 15:24 , Processed in 0.070001 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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