设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?! @0 y" E6 h4 ?' q# _  S+ D3 X
    2 k+ J" I: X7 |. s8 M0 _, V. U
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。" @, ?: x- F- I+ `/ E* f6 T: e
    ; Y- A  O# Z" x0 Q* m( W" E) y3 r
    速度优化问题真的很有意思啊。0 N6 L( h6 |4 f/ L& x* V( }

    4 H9 }7 ~  [3 M( y! ?4 s欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?3 B* b4 l9 f  |" a  E
    把代码贴上来看看?
    5 H4 n+ l8 M& ^7 Z5 H) D  @+ ?- E4 {! J5 Z" B& u9 X& ?/ T- q- 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 编辑
    # A5 k+ a0 m: s7 h1 l" [$ \
    数值分析 发表于 2022-9-24 23:04
    5 }" d0 y) X3 I9 H拉下来?拉多少?
    : D4 [; X* Z: w! x把代码贴上来看看?

    % {7 I$ P0 g: {( h2 O# C( F- M+ \$ F( g4 G
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 C( o; w* s2 s: C+ K: _6 @{
    4 Y& I. r3 w# r3 W% O1 J        comp temp, xtimesy;, ?2 N; B! @8 I6 t
            xtimesy.re = 0;7 @0 i- f: S4 X! C* E& ^- }
            xtimesy.im = 0;) P! Y0 p& o! G0 I  \, [2 [3 E
            int j0 = lenB - 1;
    3 ~( B  {) O- h: _% q        int    i, j, i1, reali;
    9 Y% m# `1 [. C7 S# i        if (lenA % 2 == 1)
    # C9 m' T" K5 R/ r                reali = lenA + 1;5 I- v3 I7 ^  }+ b: I5 b# s! z. b, Q
            else+ Z+ h7 o5 t2 G* \
                    reali = lenA;
    # S: d2 P8 l( y8 k' `( A        reali /= 2;) I. E: J! i- g% R$ U

    / f, d8 S; c/ }6 ~: [        int nconv = reali + lenB;
    9 {& t/ C% n6 s( _) n; P+ ~: [        //#pragma omp parallel for" V3 C8 l! x0 v! b- M+ ~
            for (i = reali; i < nconv; i++)% v- g8 y. M5 A  j4 |9 k3 Y" ^
            {
    8 M. C& a8 Q6 J: v1 u7 e                temp.re = 0;: ~! I, q4 d7 K, T+ w& \
                    temp.im = 0;
    : q$ i) n, [- b+ N                i1 = i;
    4 q* w; v% B, U+ v( |# _8 ~- v                for (j = j0; j >= 0; j--)
    - q$ \: k/ K' ]7 J" Q: Q4 u, u; X                {
    ; F/ ~7 }" j$ o. H; \: x) n9 @                        /* floating date operation */* W# M3 t0 _" @' w- u
                    }

    ! }2 R3 h" c1 L& k8 d        }
    6 ]6 p+ h: K1 k0 b! b}7 D7 w  u% a  n; T' o
    " D0 s2 E  A! e5 E% E: J
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样) c* Z) R/ f' m# [

    + L3 ~% X1 m5 H# Z6 k红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。0 g( `1 M& [; y  m4 Z  r6 A! E- g
    现在call xcorr 100次,耗时78s.( C. w# f: x. s; p7 l8 E
    ( t9 n- ?; u; c3 a; ]
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    # y9 J, i' J, p# @0 {; o& y  B% A4 |, F. ]3 M
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:336 [$ v5 P( R3 C1 p5 W; V+ [# D
    Maybe Debug mode?

    9 t* z5 }5 E0 v) |- j4 c5 y0 V7 g$ s6 i' E1 F* S6 E* N  w
    不应该,看我上面的回复。/ D* u& ~4 Q9 X9 x5 K# `. C7 n
    % Q  \1 \9 Z2 r! h% q% E+ Y7 Q* A# c  U
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 6 K. \% B3 I. E$ _8 o
    雷达 发表于 2022-9-24 23:54
    ' }# K8 y( |; Q" |4 v4 mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ( P: T) N4 X( R" ]( s+ Y  G{( W6 @5 g9 m6 U" y' |! e
            comp temp, xtimesy;

    7 e) F2 V5 i' r/ Z7 R8 H- _- I, v+ x* s! \/ ^
    这个不是这么比的吧。。。
      P* C% n2 B7 \2 |
    + V0 M3 K/ I+ h; @) n* [您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    1 C; }1 {2 z) C, t  {! s4 S$ b- E. ?9 V
    而加上内循环,光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 L! G: }. c* _" a
    数值分析 发表于 2022-9-25 00:204 K+ h7 \8 _7 X2 x
    这个不是这么比的吧。。。
    7 T8 C' t9 s* A! A
    , r; E3 I. D2 W; v2 p7 W您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 ?! h1 x# ~9 u' n" s

    3 p, l5 t1 s+ o$ B) Z6 e  g有道理。
    5 g0 z& e. m0 U- q# K所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。) G) u: P" U( K7 O* C3 T0 e
    # O, s3 Q7 _4 g  `9 b. j
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    " \, Y' A: Y7 @) ^' m0 f有道理。
    . q4 @, S; t; G/ u5 I所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    $ f& R6 t6 _* H- D, |  a你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多1 m9 z% c2 g; t) C) H  m
    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, r( v; t: B9 B) F: s
    这个不是这么比的吧。。。
    / s6 ]- h+ D) ?* ~# L' c
    " f  N* t+ \- P7 ?) ^* [您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    : {6 \( u/ J4 [& u  n; f3 N5 \8 G8 t) U1 e
    现在的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 编辑
    . Z- H7 q, k1 c/ M, d2 Z& V6 @$ g
    沉宝 发表于 2022-9-25 01:487 |- P" C5 |) q
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    $ C! {3 C9 D- z7 c# }) I. E
    + h0 i9 d1 f7 y
    是的,兄台说的对。
    : L# Y8 `9 z- s8 G9 U/ N: ?* U4 F3 r* h  T/ \
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。" q4 e; M! o& I: u) j

    & o& b: i9 G. M: [  x9 {1 P雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。0 F" L. M. y8 |" y
    # c1 |# o  Z$ \0 W# z- L' V# i
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    / l# F1 D* O+ X( W- r7 D, n6 ^! r' n) y" r& {  W4 w
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    " ?3 \3 w( X1 G0 k7 x0 Z
    沉宝 发表于 2022-9-25 01:27- N6 i( Y- }6 t" G' \) L* M- E
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    4 I: {: e9 ?2 K% d0 v7 ?0 }) m* E+ Y) L/ {; y8 w. `
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。" f3 ]8 a$ f& V1 q2 N
    * y1 }% P! `( }+ R6 W
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    " ^8 q( Y. M* d2 d* O又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 f, V) H3 d; T+ Z
    时间差一倍的结果可以接受。8 H0 ]! ~+ O) m2 ?8 B, ~" d
    1 ?1 o* Y! V  j2 N. o6 Y( i  U
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 - Y) A' h( |  I6 [
    雷达 发表于 2022-9-25 04:47
    ( K" Y" N% [# e6 r9 \  k2 j, @又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    : c" F7 W; i3 p; {) Z3 R4 @1 B/ t  N# C* k3 L

    # _3 Y5 o$ M. d2 `+ Z* u7 J8 ?/ d# s# T) {4 N
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 / q; f! ?0 k3 L0 ]
    数值分析 发表于 2022-9-25 14:582 B: o& \4 b% ]/ f
    能不能把这个也贴上来,看看和上一个有什么不同?
    % |4 y9 P% e/ k  f/ j, \# l, ?
    理了理思路,重新做了一个测试。2 [( b  |8 e( l& C9 ]
    做了两个 vector 和 两个 float *, 都长 1000002 f+ |' g0 {, h5 y
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." A# i+ H2 z* _, E
    ! R) j9 X3 c+ r8 a
    内循环试了4种方法,
    - N; K& M$ _- w5 ~. j- i, r1. 直接调用 vector inner_product 247s ; [( ]! |- T4 [0 P0 k7 p; z% R
    2. vector 循环点乘累加 237s
    + ?7 I3 p$ z) l4 B3. float * 循环点乘累加 204s
    ; t! I  \9 f3 }, |7 o4. 空循环 100000 次 202s/ R2 W& H" E+ q( h3 @6 `

    8 [* o: U* l, o( |- h; f不做内循环 200s
    ( k" c8 r8 ^+ S/ r9 N
    + f' V& N5 I! Z9 s$ J) }你昨天说的对,内循环本身占比是很小的,大头在其他处理。% f& ]3 T7 T1 ^7 Z$ z/ J
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    6 Y! r9 N0 q& W* L) Z
    + A3 \! `' c( u4 v1 {至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    - q. Y1 t# Z5 g9 k$ O8 G
    9 b  t% j0 y- o4 R! _0 z+ T(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    7 U0 P7 x' H, b8 y" D% b2 m
    2 Q+ m  w: J+ w% t
            std::vector < float > vec1(N);3 R& x7 M* w* J
            std::vector < float > vec2(N);, }% g( A/ V0 B$ H$ l+ n& B
            float* b1 = new float[N];) k3 S: c, x+ O: j2 x
            float* b2 = new float[N];
    : w% t$ O: `! S* G. }
      P5 z1 A" ]; y+ U4 i: ~8 g% ^        for (int j = 0; j < 6000; j++)
    2 V' N9 v( e$ S. {        {
    ' j# ~5 S* Z1 k5 ^5 w  D                std::generate(vec1.begin(), vec1.end(), []() {
    ( \: J, L/ g7 }% m' U                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    & X' e# b# N5 _% Z1 j7 j                        });
    ; w$ c: q8 X6 \: {0 r! }2 Q  h: p* I/ ]
    $ {% k& n8 g7 u                std::generate(vec2.begin(), vec2.end(), []() {9 t6 I+ A+ ~' G% O3 m
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 i  x8 A3 y) N* F) T6 i                        });7 \: j0 J5 {  Q1 }. i; a

    9 T9 H8 G( B1 X" ~! Y                for (size_t jj = 0; jj < vec1.size(); jj++)# b3 o& G2 S) v& b. V. v6 y
                    {
    4 [. C& R' X5 X" `/ z                        b1[jj] = vec1[jj];7 u6 @2 P4 K6 ^9 |+ B: p: c
                    }* @+ f  d: R5 s! ]1 a

    # C5 ?' q7 a: i: ^9 }                for (size_t jj = 0; jj < vec2.size(); jj++). J3 V' L( w$ i. p+ u
                    {
    3 P) z/ u3 e6 A$ z                        b2[jj] = vec2[jj];' R# P7 m* W0 A4 F7 n) r
                    }$ [& _% ^$ j7 w/ y% d
    & n3 C. |; ?4 e. e& V/ F& r
                    //Method - 1  N=100000 247s  % i9 f, O4 R* ?, W- A( [( ?
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: V4 ?. B: J; F3 @3 S
                                    4 h, \" {8 g$ q! b5 \' C
                    //Method - 2  N=100000  237s
    2 Q. e6 }+ Y, e" U5 L                /*! Y, c# R3 k0 @; D: {& W- m7 d3 _
                    for (int jj = 0; jj < N ; jj++)3 Y5 S( Q8 A3 N
                    {
    + q. o# e+ z0 ^# W- Y6 q% r3 B% `                        fresult += vec1[jj] * vec2[jj];. a6 t% A% n: g+ s+ A/ p
                    }$ q$ p! M( U9 @( ]" s
                    */
    8 x6 B0 I7 j: X* |                                ) d/ f5 R3 H$ o0 b7 N2 \  b$ C& H
                    //Method - 3  N=100000 204s
    / p+ b& a2 G4 S4 Y5 `                /*, q; y' @4 J9 K% I7 p) Y
                    for (int jj = 0; jj < N; jj++)
    4 J3 N8 V) |: B, T" ^                {
    2 c! d6 x! X4 Y; j2 X0 H                        fresult += b1[jj] * b2[jj];
    3 x' U# m6 o  c1 x. y) v                }# L# L9 k# p6 u$ e
                    */  p+ [- X/ G  r/ M$ L2 b
    : B9 I$ M/ i4 ], R0 }! g) g' c+ S
                    //Method - 4   202s; H8 G* F6 c9 u! C' D
                    /*
    ( f1 L. _5 L* k1 j+ ~! ]% S1 p                for (int jj = 0; jj < N; jj++). l& v* X% c/ C7 E0 m
                    {3 p' K5 i  _" s2 {; y  ^* b
                            
    * m) ~7 `* _$ R$ X: ]4 Q* C& i                }, w6 }! H" T" K. I( K
                    */4 x: E# E' V1 j; W9 E. D
                    //comment out all methods, N=100000  202s               
    # t  q, Q; T2 F/ P        }
    , Y- o) {3 @* _2 n6 g% S  F) f; K- J3 ^8 ~9 @) f9 |1 ~
            delete []b1;
      P( w8 C" @* {1 l: F        delete []b2;
    5 b1 K: k& l6 h5 t7 p- o
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 J9 D; s1 {1 B- P- X7 H" }3 u+ U  r& S
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?9 c7 _; h1 x0 s0 l5 x/ J' O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15% |6 Y# g/ ]1 z# \& X6 ?' m+ N
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?" O) G) n! K' m) R& ]: o# g

    + S8 j& y2 z0 s0 F7 K" \+ U3 D& K2 Y你第二个试验里面的j在循环里面又重新定义 ...
    ! n2 s4 M" `  _% `' G0 {$ ?# u" B
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ ?1 X3 T, K4 i6 K7 e# w. [4 T
    . m! P8 ~# K3 T+ A+ C& `0 d
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ( e* x3 z' U. k( q- z内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    . Z8 N# o* i9 Q; z
    ! f# d% j4 C* ]+ `不和它 ...

    2 \7 s" J) s" q% Z/ V
    / d# s* I2 z) S5 z! H- f6 Q# n不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    1 a5 e. Q2 Z. |' c* K1 _后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    5 a+ N* M! y3 C4 H: Qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    0 H1 g+ u. d7 U* L  E* x% T{) |; t2 d) w0 |1 _5 K6 Y( K
            comp temp, xtimesy;

    3 Z$ J+ U% Q  @  N- x这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    9 L6 r: f$ ^! f& W3 k& I" z% Q内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    " c$ B; c: G) |; X: O4 s! bVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-6 09:15 , Processed in 0.074392 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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