设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?! K# I# f1 {/ N0 q2 f$ D3 X
    + _$ I* A$ ?: c3 c7 ^" n8 j
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    7 v/ F. _% `' w4 k' F# d( y, h. S3 {" L* Q5 X! A, N
    速度优化问题真的很有意思啊。
    9 C! Y2 t# z2 }- e/ C9 g( {, {3 f4 ?
    . c7 V/ o+ v9 S! ~8 m欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    . e3 }1 e, K. P9 [把代码贴上来看看?; J8 C6 _0 e9 ?2 P" u8 t
    4 y& }1 i$ @* j
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    , b6 N3 u% p7 E% P8 S& [
    数值分析 发表于 2022-9-24 23:04
    7 Y( I4 f; F+ A' |, E拉下来?拉多少?' _; q7 V6 i' s9 i, W3 r9 s- J' t+ K
    把代码贴上来看看?
    5 B; l; z2 D/ j+ E! g
      Y/ v2 X. G4 L6 x8 u& q4 j1 y9 d$ ~
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- O7 o/ P0 F; f; m  ^
    {0 \& q/ L/ Q8 y: ~9 }$ F! m4 s
            comp temp, xtimesy;' ~& p% n; G# ]: y" Y7 D: |( C
            xtimesy.re = 0;7 h3 [+ I  i; C) A+ X
            xtimesy.im = 0;6 c! }1 V6 l& ^+ }$ m- r. Y
            int j0 = lenB - 1;# N7 O# `  A9 E+ P
            int    i, j, i1, reali;3 U+ P- D2 s8 f) b, o& B
            if (lenA % 2 == 1)
    4 \8 ^" {2 Y) s# L( n# x                reali = lenA + 1;
    8 S  u. C' z1 b1 R        else
    7 l4 {4 H% L- T' V, v# [& d, ~                reali = lenA;  h6 @- f9 S2 N$ l: r9 [
            reali /= 2;9 r6 B' @3 p( Y
    / W$ n& o  P5 l2 U  I+ h2 }
            int nconv = reali + lenB;
    $ J7 i6 Q7 i1 P; `        //#pragma omp parallel for) C/ ?5 k2 X% I* m, h* S
            for (i = reali; i < nconv; i++), r6 Z" \" w  i1 d1 W! \% x
            {
    % Z# d  F0 C3 K8 \- g2 W3 r                temp.re = 0;
    8 \; X3 s% [2 `  K' s                temp.im = 0;  D" Q& [1 H, ^  e: B! [' C$ n7 w
                    i1 = i;" ^$ [* Q6 G- g- ^! B
                    for (j = j0; j >= 0; j--)
    / J" s9 g% c+ c0 q                {, f% J1 X% I# T5 J# I/ O
                            /* floating date operation */
    & ]8 \3 F/ T' V; N6 I' ]. T                }
    , t- x( [6 s0 n3 P; q8 x1 q/ F
            }% V# c+ r4 Z2 c7 o" A
    }
    5 V5 E% L6 t$ H- ?3 X" O' j) f4 m. I3 m7 @7 C
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    , k& y! D/ p) G+ S/ c4 C- S0 k
    % u/ k: M% W/ }# M红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。5 ^1 J) K2 o! i/ f3 L& }
    现在call xcorr 100次,耗时78s.. ^! Y8 ?, f) I, {* X
    7 E8 s8 X: M  z) e; b, `
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 6 u2 \5 K5 T4 |$ U3 k& J0 G  v

    & j* l0 i# y. v! g, ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:335 ]# b1 m" h6 {; F0 a) M! O. w! r
    Maybe Debug mode?

    * ]. N6 I, g* v/ @9 ]4 {
    6 Z. @; p8 t/ c! u不应该,看我上面的回复。
    - q& f5 k1 ~* J. S8 j6 M. `
    ) r! ~3 J) j& e5 ]! i4 s我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 5 i" V7 D1 l1 B6 P  ^% j
    雷达 发表于 2022-9-24 23:54; V+ F& ^% S3 f) I- ~
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB). t& u9 Y2 G5 F% |; D* G" o
    {
    ! d; Q9 b$ g; R; Y8 n9 V0 K2 T        comp temp, xtimesy;
    # N1 P7 ]* d$ d# C1 S

    2 Z5 ]$ D( V' h. M( ?$ f9 ^7 J这个不是这么比的吧。。。
    ( k% Z( W$ v4 d. \0 D3 D' V! [, [4 [
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。' m6 S! [5 B% p: b2 o

    ) ]0 ]5 V$ c( [; w: D而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 2 i9 C& J. g' X' M9 A4 x
    数值分析 发表于 2022-9-25 00:20
    $ Q9 n$ W# i" K+ D6 z+ }, ?& a这个不是这么比的吧。。。' n# l) ~5 e+ Y( D

    & k6 ?; I. y& \2 Q您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    % V! e* K, V9 g* J- f9 D3 O  s- W% W

    - L' n6 u  N( M. s6 \+ R0 q- z有道理。
    - E8 C5 d3 U' P* U  l所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    0 }  w& R# t4 h
    ) J$ z$ k$ p/ ^( y! c; z我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    + K! C7 Z' v6 ?" j1 G4 U; ]& P' ^% F有道理。5 N+ w7 m# T  {5 x( R1 r+ ~
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    * ^: C% I, ?/ k% C7 I# G+ F5 d# r% L4 ^
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多7 B' ]2 f% r% S3 s
    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
    # a4 a) s( G- ^7 b$ C0 e7 r1 d, K这个不是这么比的吧。。。
    + [7 A$ C( J5 f3 [: k' v% W4 S5 m  U/ k
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    * h! G/ `2 R9 x

    9 G$ O2 h. @5 H) A8 G# k6 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 编辑 ( S2 s& L1 P9 n: h- g
    沉宝 发表于 2022-9-25 01:48
    : F3 [2 i5 K- n% q现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    5 z% ?. x' S3 M5 Z8 O' X

    ( P& l- o6 x, Q2 s是的,兄台说的对。7 u1 V( ~# q/ G
    # Y7 z# m/ s  a  ?- V& S. g
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。; H5 G/ u7 I7 ], C2 `
    & E2 `: H2 X! d: `0 q
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    , H- j7 U" m: s9 M, {) n4 ~  T' F+ b* F( x7 m
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。! b2 ?! S/ K) K  d% i
    1 U& w4 F. s- A; g
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 2 X% }$ F; U1 a6 F
    沉宝 发表于 2022-9-25 01:27  h3 w4 Z  H$ c
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    : Z2 T) e8 c* H5 W, I7 Q2 V2 G4 l8 _9 M6 @$ I. @) k1 G. K( H5 ?8 p+ [
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    % f8 ~0 m% |" }; m6 E' f
    . D, c: H" J% m我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:476 [& Y# e* l! `' `6 m5 _+ \
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    3 N+ E# @( O+ `6 A" q3 c$ j' a时间差一倍的结果可以接受。
    / Y2 F: k; D" Q. C5 I5 J4 s  D, @  p" I$ I  x5 f8 ~! {
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 " B" ~, k6 Z' j' X0 n
    雷达 发表于 2022-9-25 04:47
    & B. S  N9 ]$ b, `$ R8 m, ~又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    : ?5 ~( N9 z8 P% V: [5 Z! h; ?5 g7 ^$ J% N8 B. j
    ) [2 h8 }( |! f1 e+ N

    0 q( h. j8 G# l/ q1 n能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 H! o% M+ U7 w) s( b
    数值分析 发表于 2022-9-25 14:58; s# J/ G8 N7 T7 C
    能不能把这个也贴上来,看看和上一个有什么不同?
    5 w: c$ d  y" U' q  P- t# L
    理了理思路,重新做了一个测试。
    * Z5 {0 V4 X+ m4 L% h做了两个 vector 和 两个 float *, 都长 100000. {- \) l, C7 a
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ) W* }! g( W0 p6 C9 H2 j7 m  E: h8 v6 q$ g0 Z3 T+ F
    内循环试了4种方法,
    8 u  A& o% n7 p9 _1. 直接调用 vector inner_product 247s ( r  r+ a- [9 J
    2. vector 循环点乘累加 237s# c  f# o8 E$ {" i
    3. float * 循环点乘累加 204s% w2 z& I$ i- Y* h( I, o0 c; l
    4. 空循环 100000 次 202s- c* ~  \. V0 }) s9 Q4 }
    5 w9 G1 w$ [" Q5 ~* X
    不做内循环 200s4 l  g) S! {9 d9 T& o. g

    2 }5 Z- C+ Y6 d) K( f/ U  t7 E你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ Y$ L* A3 @- O5 I) a# y  o
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    : q6 C, ]1 q8 o0 X( @+ A! r3 ~9 v  `* ^* v8 \: O2 m
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* t5 f+ ]1 p) {' p2 Y- E3 d) _
    ) U( Z8 A, U& M/ y, I, n
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)2 Z* t% ^! V7 j, F' b' @- X" m( J
    1 L: t1 X/ l0 S6 v1 B
            std::vector < float > vec1(N);7 Y0 S- o/ V5 t! |' S$ X5 g
            std::vector < float > vec2(N);* z1 p9 J& F! ?& g9 p" Y0 z
            float* b1 = new float[N];
    # I) K3 s/ e( W9 [/ Q1 `        float* b2 = new float[N];( Z7 O3 ^8 U9 O4 a1 v( `: P% z
    9 g- A) U( z! \, @+ K
            for (int j = 0; j < 6000; j++), a1 ?! N' c. n& T/ e
            {
    : d5 A  w6 n/ g' ~# f5 f                std::generate(vec1.begin(), vec1.end(), []() {6 L5 ~$ n% E" Z% n, g
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" e$ l' Y4 P* N$ L3 c3 M
                            });& R: F% m8 j- d* ?  ~( s6 ?+ |

    " m" g4 e: A' D  l                std::generate(vec2.begin(), vec2.end(), []() {
    ! ]+ ?0 B! B& k: Z, I7 @                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    1 ~# x( M1 F/ j/ k3 l  [                        });6 y' x0 ]9 C  W. k4 r$ v

    $ [7 }' \+ n: e0 g. y. }                for (size_t jj = 0; jj < vec1.size(); jj++)9 W& y3 ^4 L# G
                    {
    # Y3 H- y+ |* T* X( \% I' S* |                        b1[jj] = vec1[jj];
    ' y* J: w3 }0 a1 i" f# ~% \, C                }: d! C! R( q+ I# F) M( Y( o1 i

    $ j) Y( T, A( x8 g+ H                for (size_t jj = 0; jj < vec2.size(); jj++), h. \" ?8 v) W
                    {" H/ B# a+ J( T! e. D4 ]* d
                            b2[jj] = vec2[jj];
    ( `( w8 x0 h0 Z  O: I                }
    9 E3 O* Q. H2 d- P# A  L) z) Y6 |
    $ O( ]' v5 r) }/ \! Y- K! q                //Method - 1  N=100000 247s  # ]# u# O% R6 ]: I1 J9 o
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! m# T9 {. b" t& m  B1 M
                                    
    . r: `; t: X& M! _. H$ p                //Method - 2  N=100000  237s
    / x3 o0 P7 b9 ^  q# D, S/ `; j                /*6 j  b% o8 w- u' v/ R
                    for (int jj = 0; jj < N ; jj++)
    " r# T6 u# F3 o0 p- t                {
    - u7 P. T' K5 |& l8 \                        fresult += vec1[jj] * vec2[jj];
    & ?/ t+ R% S: e" c6 ?6 B                }
    0 q  V) l0 u. V# J* ]& r! u                */$ Y6 C' ?6 {( L6 D
                                    
    " ]6 W4 @- _( ]% B0 D                //Method - 3  N=100000 204s
    9 B3 s; }2 N# A                /*( |$ e+ R7 h3 m) g% y
                    for (int jj = 0; jj < N; jj++)
    , p5 |% }3 _/ h3 E* r# ^                {# g; A+ p# p( u. C" Z" f
                            fresult += b1[jj] * b2[jj];) q6 I0 ?" e% D/ D: B0 s# C4 I
                    }
    . r, j0 o3 Y/ S3 B: `' H                */$ q3 u/ p* B5 q7 C0 w

    * S$ x) j. U# ~9 v- b                //Method - 4   202s
    4 r" [7 p3 @! L0 }7 |                /*3 z5 F! n. s& b! A7 j5 }0 M
                    for (int jj = 0; jj < N; jj++)
    ! e+ |' }: K  Z                {7 ~" R! M. v$ g% K2 U! i5 {
                            2 O8 S* V5 v) K1 ~% N( [: s( c
                    }1 S. y$ Q, R- R% ^/ S5 H
                    */
    ! i9 b/ F% Y" g4 u2 \) d& g                //comment out all methods, N=100000  202s                $ d) U8 ^/ O* K0 m9 f- P2 h% Q
            }. f! v( z& p2 ]

    * P! S/ ~) x/ q- V        delete []b1;" A* i& l9 U. q% X5 i; d, X4 W
            delete []b2;
    9 X7 s. D+ @/ ^
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?9 S& F- G2 `8 ~! k6 v( y1 T4 i$ n

    8 V" V$ ^9 u" r+ U你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?$ ]1 \% o& H# m& [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    : }  `+ X. P; R瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% \. ]2 D& j8 Q/ s

    ; g& _- Q4 ~- x3 l你第二个试验里面的j在循环里面又重新定义 ...
    : H% d+ d- L9 d: g! K( \
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: M# x+ F2 P7 Y; ^* {% k
    ( p# {/ w  [0 r; Y5 a$ z
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16/ q5 d+ b: `; b& N/ i
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ l0 ^3 S  \7 T. N- ?  H

    " k+ \! T; j$ _5 Q! u9 D不和它 ...
    & g, v0 z( P! N4 q* H/ j6 k  [- o& F- F

      S# I4 e" |' s2 d不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    2 F1 K3 V5 j( x4 E. o0 ^# @后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54; t' y5 E. D9 I
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* x2 Q1 `, n# h2 U- T
    {
    * x) @8 c) o: P; `- k6 i        comp temp, xtimesy;

    ( n/ o# O: s5 [- u这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。. m1 @  I% _2 M" A9 ^& G' R
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?- i" x- B2 @6 \& ?0 C8 @! P4 ?$ ?
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-18 18:02 , Processed in 0.075068 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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