设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?6 y, Y  X1 Y; b6 Y9 o7 n
    " D7 E* L  _% r6 ]; L+ @+ ~! r
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。3 t3 {. A9 H8 q; b  [% n
    ( `8 Y# Y4 r5 V0 Q& ~
    速度优化问题真的很有意思啊。
    ; Z5 \+ Q$ o+ Q! h, i; b
    " P5 Y4 V+ ~5 l$ y8 Q- s欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    8 h: u% F+ {0 J把代码贴上来看看?! B8 Z" p$ S7 f5 E9 J% z6 g9 Q

    / ?" j8 Z! i* h6 U* y$ \# G5 d难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    1 q, M3 M* m( w' ^) w' i
    数值分析 发表于 2022-9-24 23:040 s7 d& h* X! e9 Z; ^' w% P
    拉下来?拉多少?7 }' c( O0 }; G8 V5 m5 p
    把代码贴上来看看?

    2 d1 x+ b% X- l4 U$ u( W6 o
    7 M' A, \2 ~4 s% b6 Zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)7 u) G: l0 z; L) v
    {
    # N' L" @$ h' ?) a        comp temp, xtimesy;+ a* F' @$ [9 [1 `. ]0 W
            xtimesy.re = 0;
    + k9 s1 i/ x4 E& ^; f1 l( v        xtimesy.im = 0;) x  @" w1 a: O, F
            int j0 = lenB - 1;
    5 G& Z; u* l1 b, y0 v- p/ n        int    i, j, i1, reali;# V8 H6 Q6 u9 Y/ ?
            if (lenA % 2 == 1)% g( I( Z% S* f! {& O9 t3 \
                    reali = lenA + 1;% G& \+ D. a0 V1 K! V  G
            else
    . O( f7 C. v* l1 A                reali = lenA;8 H: j/ S/ C9 |6 e. H( G
            reali /= 2;0 I6 m/ p. V- N! i- S, O

    4 h" I0 I. A' }        int nconv = reali + lenB;8 h5 A/ b; q: o# i- P2 `
            //#pragma omp parallel for- k" r# P" c* r+ I" }5 e; O
            for (i = reali; i < nconv; i++)# f7 Z6 {( @+ u* D- {
            {
    ( ^' V4 _$ ^4 C4 g+ x/ T" w  d                temp.re = 0;
    9 C. n3 K# }) R0 X2 \% ?6 G                temp.im = 0;& ]  s' D: {# E, g( f* b
                    i1 = i;/ {" _9 C4 v; s5 C; D
                    for (j = j0; j >= 0; j--)
    ' w% y" S2 `; b# ]1 ^. s3 A                {
    * y' U6 ^8 @( S; a$ q                        /* floating date operation */
    % X0 H  B- ]( Z& O& k: ~  k                }
    7 c' N* Z& R3 K  ~: i% X, O- S
            }, o' ^: }( J& c8 X
    }
    7 ^0 b7 X0 ?- Q* _4 R
    - o$ C  N# |  k0 P6 Y# excorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    " w7 F8 A1 q: ~( y: a4 S: l3 k- A* q( v0 W$ U. Y8 z+ O/ w
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。  ?1 B% i$ ^* i% g  z* h- I% J5 K4 u
    现在call xcorr 100次,耗时78s.
    9 c0 I2 @' Z7 S) l0 a! F/ L8 |2 j- V0 x7 w/ B8 i! N5 k1 O
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ( [* s4 X9 x9 p  f+ v0 c; v0 s  j3 ?; m
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    3 e" L+ r& y4 O7 k2 R$ b( Z* |Maybe Debug mode?

    0 u0 c4 a$ h! ~; Q. U
    * Z3 S1 N# U# x+ N9 O/ `( x$ R- T) F不应该,看我上面的回复。
    # Q9 k, s, a' U1 U6 R! i! T5 R# j
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 : S" {7 o6 l5 T2 \$ l
    雷达 发表于 2022-9-24 23:54+ Y( G5 i2 H# I( w9 z0 c! M
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)% Y" m8 f% \8 @/ _
    {3 {" t& |1 h6 b. V
            comp temp, xtimesy;

    ) u$ e; t, H! x: P- x
    & Q- W" \! r# V5 B' R这个不是这么比的吧。。。' V; y# S- |! u7 V. [6 o
    7 x9 C: S! k: f4 p$ Y! J0 Q# y- E  }
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " j( E/ R3 L, Y. N8 s  }  D
    , U" n" U$ a/ 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 编辑
    7 w* y3 |3 X( Z* \. o- e% O
    数值分析 发表于 2022-9-25 00:20
    + ?8 v- b$ X" l1 }* s0 L这个不是这么比的吧。。。' V- _1 q, |6 ~
    ! F' w# ~4 O/ R, o) t) s# d
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    1 Y$ @+ P4 Z0 `9 y: M# B& g: {! B8 E& m7 R" `- I) Q
    有道理。
    & E5 T4 g; f& O) S/ L所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。9 [& O; K2 ?1 B) I. N$ y7 k

    / e  I5 @3 Q9 Q& N我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:467 `9 D* v5 \# V1 D) P) }4 c8 j8 @
    有道理。
      O( k! }' J* s6 j所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    8 R6 }' v1 E* N* `# i
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    2 C& z$ S# V! q% d5 \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* X* `, }- i- r3 q, T0 _
    这个不是这么比的吧。。。) ?( z  q( \) P: o& A0 e; P, f! `2 H
    ; l7 t2 a/ ]" \
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    - j- z) a: m" f4 x& s" g
    3 B# T: N4 o. K
    现在的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 编辑
    3 r9 w/ U* r# r/ X
    沉宝 发表于 2022-9-25 01:48
    2 K( u8 Q5 Z0 L1 C现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    + G! E4 X. v/ ?

    9 N. d2 Q, J+ k7 a是的,兄台说的对。
    ( J( j! ]/ J# `; G9 W  D( K( v6 C
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    % f" [# }+ q0 G) z% [; d* a3 [
    ' C$ c7 |& A4 h雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ! J4 a( j; w/ @. ?' K! M' i% d! n$ r5 b: J/ z4 u2 D4 r
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。8 r* G$ d- Q2 [* u. \
    4 X1 J' O" ^* b) a- Q
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ( x- H! g& N# _4 e' G
    沉宝 发表于 2022-9-25 01:27
    $ h* P; R$ z- {" l你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    9 [( I9 C, {! y& P2 i5 ^: u' _: W) d9 j
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。5 W/ \+ u$ A+ H. D& a

    7 R3 X- ]/ h* N' d4 }% V我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47. Z5 r6 l5 m  c# T' n
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    # b( G1 O' n  B. F- n2 z时间差一倍的结果可以接受。
    6 b8 H( y1 _9 ]; W* N
    4 ?% t% W, G- d& [7 A6 F你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    . E" B7 v, ]- r/ I/ y9 h0 s
    雷达 发表于 2022-9-25 04:479 j8 J' x' w9 r9 c# w7 u! Q5 G$ r
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 d' }2 N( j- S. E7 s+ |" q9 Z5 |$ m+ s- b5 R4 F

    : J4 p6 C7 }+ r: o! M" F1 f  d) T8 q
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 ]7 Z) u: j0 R4 F7 f; a" V( f
    数值分析 发表于 2022-9-25 14:58
    9 ~2 E2 L2 x9 N% g" |; u能不能把这个也贴上来,看看和上一个有什么不同?

    " \& V; K5 ?- \# L理了理思路,重新做了一个测试。( ~/ }1 c5 r  D! x" d$ \
    做了两个 vector 和 两个 float *, 都长 100000
    , ]; S8 y! z7 @- X* _/ n0 O# k外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    % X3 }6 |. Y% N+ j& d* {# e9 k/ ?- l/ v
    内循环试了4种方法,
    ! [% e* u! ^# h( z9 R. V1. 直接调用 vector inner_product 247s & `# z: I7 z, @
    2. vector 循环点乘累加 237s
    : N' r7 r. ?+ [4 J- o* R3. float * 循环点乘累加 204s
    / R* R# @, S9 h* k3 y, G4. 空循环 100000 次 202s$ i* Z) u5 Q+ L: x/ Z! L. \$ `

    & m' P6 J2 `' W& Y6 \0 F- W不做内循环 200s9 [9 A9 Z* y  D7 M3 b3 V! H

    : N+ t4 A* }3 }2 e你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 s$ E$ l  V& }" O& A0 G6 r
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 l/ w  h& w8 ^3 ]8 I

    . M( v: B2 d* _7 z5 V至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ' ]2 D/ W4 p& G* [/ J- O* k: s4 S* f5 ?- m/ W4 [- X" O
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    % g, s5 T5 S+ R* V: M% @, Y( i
    ; I( x$ ]! e" [
            std::vector < float > vec1(N);, g, K: Y0 P$ T; [( I$ X
            std::vector < float > vec2(N);7 T; E5 o# }* R
            float* b1 = new float[N];1 V" [& R2 ^; R" z: s3 u
            float* b2 = new float[N];
    1 `! k, d4 ]& m( q$ o, }4 Y  G( r
    $ b  h; l+ V8 r8 p* w        for (int j = 0; j < 6000; j++)* p# ^* ~1 q2 E4 j9 F3 V* _# L4 J
            {
    - H" p4 w, t6 a5 [1 \' s0 D                std::generate(vec1.begin(), vec1.end(), []() {
    7 r9 K; f7 H. X. |& M                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    9 U1 N6 p1 [* u' Q                        });5 B( {0 f  ~/ S/ J8 L
    8 }" Q, Z6 U5 f& S9 T+ y( q
                    std::generate(vec2.begin(), vec2.end(), []() {
    * f4 w6 h$ A1 J& P                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    & p2 A& X+ t' q5 ]                        });, h5 O- |4 r& m  d, h

    4 p: \# B3 \$ H9 J4 S                for (size_t jj = 0; jj < vec1.size(); jj++)
    7 L- j9 l6 [2 q4 V" ]5 K0 f9 o                {
    : n9 A8 e+ p* i8 n                        b1[jj] = vec1[jj];
    ) D1 B& ^, O, |1 {& G7 i                }! H4 V+ v. w( S9 ?+ n. q: P+ T% d
    ( v" z* y$ Z4 z( X3 R6 v
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    4 _( {, y2 {3 E' O9 o                {
    1 J: e7 `8 Y  m. b5 @0 F                        b2[jj] = vec2[jj];
    ( J+ Z% M7 b$ Q- i- a6 t9 n- g                }
    + e- _! O; w1 S" J* @) [8 y% ?
    " u1 n' H/ Y( G/ A3 u, o0 R, `                //Method - 1  N=100000 247s  
    " N3 m$ K: O- v4 {& p% h* k                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    9 H& N0 k& ^$ l" q# G                                
    % i, U: E8 w- \& l7 Q7 t$ p5 u2 V; n                //Method - 2  N=100000  237s* |, E4 `1 I' K- p5 O
                    /*1 c+ i5 u2 y/ }( s% y+ q
                    for (int jj = 0; jj < N ; jj++)* `5 p- n2 ^( b9 i0 {" @5 z
                    {  C' P& x+ N6 Y  d$ U6 }6 i) f! S
                            fresult += vec1[jj] * vec2[jj];; f9 r7 e7 e# f$ L5 c: m/ H3 ?2 o
                    }
    7 T8 y9 X: [' P6 q+ a1 V                */6 D. W) _4 @6 T6 c& E2 E
                                    
    , J( d% Z8 m0 C7 A( N+ a& w                //Method - 3  N=100000 204s7 ?7 k7 m- f8 }8 a
                    /*. |: v5 P  z3 _% _3 t
                    for (int jj = 0; jj < N; jj++)6 o1 L, g& i) I" w1 E2 R
                    {
    ; h: I0 O! v' }6 n7 R/ y$ g' k                        fresult += b1[jj] * b2[jj];7 C( b( {+ P3 l' {* O  O" I
                    }
    # `; b3 F3 j' ^5 c                */
    : G' r. Y9 e9 p
    4 e* D8 {, E0 O! P) ]0 Y1 K+ P                //Method - 4   202s9 n, {( R3 x& j( Y. j; J' [
                    /*$ v3 M) M! s9 O8 s( s
                    for (int jj = 0; jj < N; jj++)
    . R; m4 U  i( N3 J                {; ?' f$ G) J5 Y; t
                            
    4 }+ f) S" B) g" f+ }                }
    ) S# x6 y2 U0 Y5 Z/ I                */! P, ]3 A' s3 S* ]8 q3 ]: L5 [- d6 U
                    //comment out all methods, N=100000  202s                7 E) ?$ y5 L& M9 ]3 z6 i% `6 x5 W6 M
            }
    ! o/ a7 q; }( {& ?0 F, p. E/ c1 t& U) W
            delete []b1;
    % f8 d; N' [2 ?& V! b* s) Q        delete []b2;

    + }' J4 {* i/ o' T3 z+ Z1 s3 _) @
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    + B0 J( q1 k- G( o! f2 I- G) F
    $ b+ G1 x) {" D7 z8 h: w& a你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 A: |' n4 b  W3 V3 T$ o$ b3 \6 a
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    / L% |: q, t* J. v) S0 E/ k瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! c6 R: [$ j  y9 v' M3 |' n* d; ?8 f
    你第二个试验里面的j在循环里面又重新定义 ...

    ( C. N% V4 v: U. o内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    9 z) Z: d% Y6 C6 h* h; ]' _- K- G/ X" R7 `+ f% ?$ ~
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:161 q; R5 o* }- C3 W
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL/ J7 }+ [3 Z4 K$ d2 q: T
    9 b! u1 F* T* h3 U( K: i' Z
    不和它 ...
    : @1 V3 y! p$ u4 l
    2 s; j0 Y/ c. A- S  a! P
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。. H( K+ G6 y8 d  U0 o+ R$ H
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:543 }3 a* `+ \" L7 Y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  N: m) J0 @1 W
    {- F6 Z' Y0 s$ _4 T
            comp temp, xtimesy;
    9 W) E" P0 ?6 k! }1 d; }
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。% x3 p' t6 o* k: [
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?, k/ E# k- \2 y3 K4 N
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-29 05:59 , Processed in 0.088963 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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