设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    3 [# M. M1 V+ h  O/ ^! o6 T3 `( a
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。: M6 K) c# R) j$ ?
    2 ~" Y# M! o+ S/ A
    速度优化问题真的很有意思啊。: z- ~: A8 U$ c5 P9 s9 s, Z6 p

    $ Q7 Y4 G% Q5 u3 i  E$ P7 V欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?' K% v; F4 O% |) P. ^1 Z
    把代码贴上来看看?
    ( a- S- ^( c# \3 U# Q
    ( ]4 Q4 l* i2 P1 y/ X7 o难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 4 f9 J- j5 }9 F! Q! P
    数值分析 发表于 2022-9-24 23:04
    , w* W" b. i. C# [  ?# L/ f拉下来?拉多少?
    ; q3 B2 q. _3 G9 a9 a3 s# P" K把代码贴上来看看?
    # I1 g8 d4 T! F# c1 \
    / z1 W5 `7 _9 w, E. G
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % K1 P$ ^$ t/ A" d& A; {$ T{
    4 k( ~5 f$ [4 |" L8 K' ~2 s        comp temp, xtimesy;
    ! q4 i. I0 a1 y; }1 A% i: G        xtimesy.re = 0;8 m3 l1 B6 l  i9 _; b
            xtimesy.im = 0;0 v! T  Z- p  D
            int j0 = lenB - 1;$ X/ D6 g  C1 Q/ w7 L) C5 i
            int    i, j, i1, reali;9 }$ c; h$ n/ m* S, g1 n( A( O
            if (lenA % 2 == 1)5 k) L. ?8 _. u9 I' Z6 a
                    reali = lenA + 1;$ n" N" b- d- n6 ~! k
            else" L4 i  n8 P+ X$ G9 {
                    reali = lenA;
    $ `5 `. p3 \$ V+ n& @$ o" G        reali /= 2;
    9 J* t1 X3 [! x& q, F$ L( A( [- [2 \" [/ Q- u# g
            int nconv = reali + lenB;& q) w' x0 E" g, z# x; B+ E
            //#pragma omp parallel for7 i' P) a& Q" B9 P* d0 X
            for (i = reali; i < nconv; i++)
    / Z6 x# ^1 C% W# W9 x/ ]        {
    - H* c, b" j2 D$ V                temp.re = 0;' k# O4 }2 q& q8 d0 `9 R
                    temp.im = 0;4 M* ?$ {6 Q" F8 S6 t* \+ K, b
                    i1 = i;
    4 Y1 ]0 S2 `! X0 _                for (j = j0; j >= 0; j--)6 g# W* D+ ~! X0 q
                    {) `* t: n* C" k0 _
                            /* floating date operation */+ C9 u+ W; M$ N
                    }
    + K; F/ x0 F( P* E: Y" f2 I
            }: f; |, q% D( X! r; V# v+ @
    }
    # a+ q5 B$ ~) h  x2 D, V7 M$ n2 Q9 i
    4 m0 Q. P* x. x. l4 f8 d2 m; A7 f' pxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    1 h! d3 v, |0 z& O1 F! H6 L2 O) n+ Y1 ?
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    6 o, h7 u8 m9 m现在call xcorr 100次,耗时78s.
    * i7 w2 ~. U/ D% a; _7 g' H
    * \, Q# a7 H, }- |如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. , o# c1 q) m4 L1 k0 g, J* @; a6 v

    # ~( c& R/ f8 H. H
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    / {! w' G5 v" Y( F8 mMaybe Debug mode?

    ) p! Y/ A* [) \6 R( v" h5 t- \# ~0 m. f0 b& U7 t
    不应该,看我上面的回复。, m* n. {& `. h+ E3 u8 `  n* w1 g

    2 l6 U: i7 Y. p/ C* j我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 8 B4 u! l6 [( L( m3 i8 B
    雷达 发表于 2022-9-24 23:541 j' i4 `; ~/ C" ]) |0 v5 ~
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 ]6 A+ v- u3 {. u
    {% ?- l( C5 d- V* R9 A: U( Z
            comp temp, xtimesy;
    + |# G, q2 Q3 `4 `1 |/ G

    1 Q! L) g6 O, L0 s3 Y这个不是这么比的吧。。。# T7 j+ H9 v& F9 w: C
    " F* g* x9 c& k( n, k. w- j# V+ l( q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    * Y% `$ M5 Z3 _$ {% c/ E3 h% n8 ?( b. B& W1 k5 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 编辑 ' |7 W% Y0 b# C1 P
    数值分析 发表于 2022-9-25 00:20" L$ K# }, G, B1 h' A+ a, q- B% n
    这个不是这么比的吧。。。
    ( o: z, U/ h! V8 P4 F4 N
    9 F% U. k( H* j( V! X- F您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    8 l8 z8 |  w, ~: e6 P6 g( d; ], {7 h+ y( D; k$ @% H; K2 q" e
    有道理。2 u0 n* C' b! ~2 ?8 a
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    " b, R- z" y3 q# F  X4 @" B- ?" `$ d1 Q( u6 A' F: M. `/ R7 j/ Q
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46$ [, E8 }: k$ \% g$ \6 c3 c
    有道理。. o- w- ]1 j' L5 f$ b! s+ u5 i! e
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    " y0 B( F2 ]- V- T/ N你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多% p' e& L8 N! M  c/ E2 i( O
    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* [. M" u& ?- B! E/ y. C! r
    这个不是这么比的吧。。。- z. s4 ?) P" X) R" A7 T, q
    7 k% O" _7 C9 D! s* r% X
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    - p. I2 \" P% c. @- u- G; g4 Q( ?" m
    现在的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 编辑
    2 A' T) ^3 o- n8 l7 n; M# h
    沉宝 发表于 2022-9-25 01:48
    7 T; ^9 f6 L) w6 o" D3 T: ^现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    % a8 L' d' G' u6 @  r7 t. L. h3 z8 P, ^& l! V7 Z9 V1 _  R
    是的,兄台说的对。8 ]* z* L+ Z9 s7 H
    0 }8 s: Q$ ~3 g! T
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。# ]6 H" p; t! e" c: e

    : q* n/ l/ d2 g2 n8 {% q/ a' p8 v雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    0 w( z) R; X* p% O
    : [, t) L8 Y; c1 W' N比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。9 X) J8 K  ~3 l6 H

    2 h$ J3 j/ Z" w当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    5 @* p6 S, n3 h* Y# |  ]3 B
    沉宝 发表于 2022-9-25 01:27- V& c1 |& B) ]+ C6 t* X+ O
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    5 O( x3 p: y* {. C+ d
    7 y6 W4 B9 }" h又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    . v, j4 `: `/ q; o" o$ ^) a' C, x
    0 J  N# o  P) X我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47# l- v$ ~% A% F$ V
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    + d! H7 H- k8 I
    时间差一倍的结果可以接受。
    7 m" N$ M" s/ i5 U: A, ]3 k+ F2 }& b7 j
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ' @8 {, |; g. S9 a( v( p- C
    雷达 发表于 2022-9-25 04:47
    2 R* ~; ]5 g8 E* D3 v. }" @7 R/ Y6 |又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    5 L7 m" [5 ^. t6 _& K* U$ R, }9 F
    / J6 x  [% H/ R
    2 q' D7 s! Z$ V$ f6 Y# c, D
    7 E) |4 c3 P' b$ f" u/ {: `能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 - X& S" D, V9 ~* W2 w7 K
    数值分析 发表于 2022-9-25 14:58
    1 H2 V! ?5 f7 n" ?/ i' c  b) U能不能把这个也贴上来,看看和上一个有什么不同?

    - ^6 Y  X! {; O( s5 p/ W理了理思路,重新做了一个测试。
    + H4 \- F3 j* J' j/ Y做了两个 vector 和 两个 float *, 都长 1000002 Z7 V# d1 ^  _' F) X; u" i
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 W: g2 a0 s( r. I& M
    / n7 s% ^5 x9 `
    内循环试了4种方法,, }9 l0 p  L; K2 Z' t4 W
    1. 直接调用 vector inner_product 247s % v/ i* [" p; j: s
    2. vector 循环点乘累加 237s7 \0 l. \" G4 h* K
    3. float * 循环点乘累加 204s8 z4 s: ~, [+ i! d
    4. 空循环 100000 次 202s
      i' K/ x* T/ w1 M; o4 }* p* S
    % F, A& |4 k5 \/ \9 u不做内循环 200s
    ; I5 ~8 w( o: ]5 i2 |' i) L( `0 h& v) i1 R" t
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。, D: t+ |) j; _* F
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ R& C3 T2 e$ L$ V0 ?$ ?
    ! q7 X$ d8 e8 q7 b3 x
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) d" A  ^  s" N
    % b7 N2 z7 N& Y9 v4 a
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)- X6 _3 p5 a; _4 n) l/ G
    " e" w5 @% H9 {5 y7 Y" }& W2 C7 J
            std::vector < float > vec1(N);* u% I  r: M$ s% V, }, e
            std::vector < float > vec2(N);
    ) O* b: O3 G: y2 m6 @, O        float* b1 = new float[N];5 i" Z2 M- L- Z1 S; M
            float* b2 = new float[N];6 X. o$ y2 k" o& _
    # S0 x0 c1 _+ @# H3 ?# Y0 m
            for (int j = 0; j < 6000; j++)2 ^$ d8 i, F! W+ o: t# h2 n4 l/ b  R
            {/ l& `; j: e$ h/ L% N
                    std::generate(vec1.begin(), vec1.end(), []() {& e( v! c. e/ t/ c* H" M" x9 Q
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
      H; y/ w/ ^6 r+ Q2 R0 `$ f' i                        });) E+ E  H. i, k

    ( Q$ ^. u3 r4 @$ Z1 m                std::generate(vec2.begin(), vec2.end(), []() {
    & L/ ]/ l! l  ?8 |                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 Z5 N6 k; J' q9 s& T; P! u) l+ a' ^' s
                            });
    - ]% z4 ~. t- u5 N4 Q/ e
    1 q3 e6 |% |) U& `0 y5 f+ }2 R! }                for (size_t jj = 0; jj < vec1.size(); jj++)8 G+ {; W1 G8 B4 L* V+ A
                    {# Y/ J6 a0 T; y: C% a# A1 N- b2 T2 u
                            b1[jj] = vec1[jj];
    ( @" z8 |& I- I% ~                }
    ! b) `  u( S5 `) a  L# e& G  g( C2 L; d3 A- Y! [+ g
                    for (size_t jj = 0; jj < vec2.size(); jj++): L; x7 |1 p2 [7 l  f
                    {% ~  f# c6 N. r. ]7 E
                            b2[jj] = vec2[jj];
    ( ?' S9 }& H$ s& y6 }0 m( k7 M                }
    ( y' [# |/ J3 X& D" R1 E# N4 b6 B( M
    # R. k( y) S4 \                //Method - 1  N=100000 247s  ! f4 U) ?  S  H
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    / v- Y0 l6 g- O+ M) @) Z! \% {                                $ L5 \  w. j. b& T9 b( P& ?
                    //Method - 2  N=100000  237s
    9 E3 C# @; t1 S5 w                /*
    # x0 @1 K# W6 p1 N1 ^  M                for (int jj = 0; jj < N ; jj++)
    9 L+ }# s$ s- ~+ _& X                {) n- Z1 n: V6 T5 o
                            fresult += vec1[jj] * vec2[jj];/ w) f& P1 T1 r5 `, m- d" Y  O$ U
                    }
    4 v( ]) `6 d: Q                */
    & Z3 o' z' d+ C. g+ @                                8 N  a& g1 \3 [4 t7 M" y
                    //Method - 3  N=100000 204s
    9 ?$ E( O  \0 |- w% u! |                /*4 V6 ]% e4 B0 t; r2 h
                    for (int jj = 0; jj < N; jj++)
    # \: o4 ]7 q) H0 Q( ]4 @                {
    / Q6 ^# t. F3 ~% F* E7 J                        fresult += b1[jj] * b2[jj];7 T& K. f$ Q# X" V& Y; h  x
                    }
    4 ]5 D( T, O! W3 _( {                */6 ~+ ^3 A, p0 G6 `1 e
    + j, q% x( m5 r1 V1 x* o
                    //Method - 4   202s. ^$ M/ G& R5 |5 e* |2 U" N: N
                    /*! z8 S- B$ ?% G/ s4 u. m9 t
                    for (int jj = 0; jj < N; jj++)
    5 t$ U6 G6 e, {, k                {
    2 a9 C- b4 I$ Z- z4 F                        - c  p, R+ a7 J& b/ q  ~/ x- P
                    }1 h. b5 k- T3 z' C7 c! D% i
                    */" N9 x4 c1 V* w) f: Z5 U3 \. s
                    //comment out all methods, N=100000  202s               
    ; y; N0 `/ p+ f) n        }* j7 y; x2 ~0 w, B7 u( _( S
      l' _$ L' v9 C' E% `  I
            delete []b1;! q1 H- K. }4 w, }' a# P
            delete []b2;
    5 c1 g8 c* `: u9 Q
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 H6 n& u; p8 ?' m) d" o
    8 e; z4 J7 m! k$ N9 C' m你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?* Y0 _/ \1 m: N3 h! \. Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15, w6 ~# a' b4 Y* I! I
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * n$ ]' }4 u1 m' y$ M9 Y0 p8 {* U3 R
    你第二个试验里面的j在循环里面又重新定义 ...
    $ r3 y+ f+ D6 a
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! S& a' _1 `. g" e2 A/ h* C: x! `' V4 _1 V: u* k) @/ g/ I
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    0 W% u1 v! V7 q: W0 b2 v$ u$ w内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL& R. Z7 a# Q( `: x1 z- V

    / |% K" w9 T* i: V不和它 ...

    1 l, e  s3 f2 [8 J7 s5 V9 m
    $ s! ?) K0 o! _! _; G6 l6 V( g不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。) k2 |$ Z& a: a
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    9 Y+ W5 }8 P& Z. x9 Bvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / y5 T% C0 T4 N- e0 p  x- W{, s& z1 i$ Z" }' r6 b
            comp temp, xtimesy;
    # g. M  U( h9 s2 a: I
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    2 \. Z% R% }9 m6 U; \6 o7 Y内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?; R6 z; L0 @8 }% i/ @
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-4 12:05 , Processed in 0.090800 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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