设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?5 Z, ^7 G7 q' u$ [" \! c
    ; c5 i8 z' J: B" u
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ' w4 b0 _1 x& `; {7 C
    . e, d& R- q# C速度优化问题真的很有意思啊。1 g" b9 l) P5 O+ p- H) o; n5 X7 j$ I9 l
    8 y; [" L/ Y9 Z3 M+ e% b
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    , [1 x4 ?9 J. R把代码贴上来看看?8 y* W1 `7 \. S! P# \) H# C) Q3 n
    # Q: ]3 q9 D, `6 i, v) c9 ?/ B. }
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 3 y& w( S( `7 t
    数值分析 发表于 2022-9-24 23:040 @" W" |9 K" {
    拉下来?拉多少?/ i+ x, B! t, T" O0 T* j0 E- m
    把代码贴上来看看?
    : ]5 v$ [; F& i" V
    4 Y  X8 V' Z; D) X9 Z: K2 W
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ f$ O6 T) @1 ?/ Y+ c& g1 A
    {
    * L% e3 K) j4 d% F: C% \        comp temp, xtimesy;
    / K3 C- w# C% I, h/ V        xtimesy.re = 0;
    * t& w3 t8 f7 m! ^  f        xtimesy.im = 0;
    . c0 t% p; l! ^: b% }0 r5 t        int j0 = lenB - 1;3 v, Y8 }, w3 B" Y/ g6 Y! {$ Q
            int    i, j, i1, reali;3 V* h2 r9 y  {. D, `6 N7 y8 O* i
            if (lenA % 2 == 1)2 O" x( [4 T# V$ T
                    reali = lenA + 1;
    / R$ f6 }$ J) `; e$ {4 i$ _6 R        else0 T& c$ d8 M! n
                    reali = lenA;" C  Q2 h; T% {$ z. V6 T+ [  Z
            reali /= 2;
    ; X1 v/ F+ ~' z6 ~2 G: c+ T1 u2 |5 Z9 B
            int nconv = reali + lenB;
    2 E0 S; q# m' {/ j" n4 Z        //#pragma omp parallel for8 c6 y4 h$ v7 f" a7 V: B
            for (i = reali; i < nconv; i++)! _5 u& e4 ^6 U; D# `- n5 z0 ]
            {
      F  F1 y' m- o8 e# r, H                temp.re = 0;( Y) c* X7 Q* D( {, ^
                    temp.im = 0;' Y2 L- Y9 p$ r, c2 ~- Q9 f
                    i1 = i;3 ~# M6 k7 K, G* j) }( z; b; M
                    for (j = j0; j >= 0; j--)
      o: i; _& j. Y; M& R+ N& Y                {' G, h2 K% F# [5 D
                            /* floating date operation */
    4 R' Q& @- Q" F( f8 u* O6 R! q                }

    7 @; S3 {  d1 R3 L        }; |' U) m. E  ~3 A
    }
    & S. e, l- e0 j' d
    0 \% z3 D& E, ~( Q5 t% txcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    8 v; v6 o8 U7 k0 V, ]' i& P8 C) w. S2 h( F
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ) s6 Y' ~0 m7 q: n/ u$ `( l现在call xcorr 100次,耗时78s.
    & ~  Y8 {  z; Q/ V+ w. Z* }' d( D5 l" x- {( p, h" ]- q2 @" [3 i
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. % l3 T1 K+ M9 ]% H3 E* ^$ e5 y0 G
    4 [  Y/ b/ {6 r4 Q2 R
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33" c4 c+ W1 J& G, m. i+ P
    Maybe Debug mode?
    " q+ K- F/ f+ F: e1 f  e5 l

    2 O& E! V1 S# G6 b不应该,看我上面的回复。
    2 B* s3 e1 d& U+ T* \  [# E4 f& Q. e; j7 b" ?
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ; b! ~: o3 v& A
    雷达 发表于 2022-9-24 23:545 @1 Z% F5 J! H. z
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ ^* e, D6 F1 K$ n
    {
    " n- I1 O' j$ M0 _2 \- p* C        comp temp, xtimesy;

    / N! Q3 t* K- D; v8 O  D2 Z
    1 x" T  A+ o% Y; y( c这个不是这么比的吧。。。% j( {' f, T  u3 {

    " l- ?; |# ]8 K! [% u3 P您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 C1 B$ s4 P, _4 m' P, L2 T6 |- D  x$ t1 }" y* f/ |3 C
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    6 j, r' f6 W4 p! K  \: @
    数值分析 发表于 2022-9-25 00:20
    $ N0 B4 o$ \. a; i这个不是这么比的吧。。。. y, G" a! Z  U6 t9 k1 Z3 }

    . p3 t7 N0 d" t5 i您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 V( d. c: `* D  d" d

    ' A# Z& U2 G7 @" w* Z- ?有道理。
    ' t- ^9 r. }0 t) k! {  g1 z所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ( F# M9 F- A9 s1 p; D1 @, r& H7 n- K: e' T9 d& k3 y
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46" R2 W0 m8 R8 M! g
    有道理。
    8 t" V* ~( {8 B1 S; O所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    , `) B* K! k- ^  L, ?2 I3 x你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多. K0 x% ^- l& `) 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
    - `$ U' A# l/ g3 V7 y7 h这个不是这么比的吧。。。
    9 U& k' Z& a& \; T1 l5 V: q( C) O2 G$ \' v
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ( `! _/ m3 F) O4 P. T

    - [( n$ A8 t, _! W0 }; p" e& N6 [现在的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 编辑 0 U7 ^* C( a# Z$ Y
    沉宝 发表于 2022-9-25 01:48+ C( x) |4 |  l5 J3 Q1 u) r, s+ y- n
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    # m: \4 u0 n: K% Y" |& Z7 d" v
    8 a# ?; ]- }. q; X
    是的,兄台说的对。
    * L& D4 J1 w  n2 o2 V& a: r1 m+ ^' h, D
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。4 k& C* F) ?( B1 x

    " H1 V( b( J: W6 A  E# z) i雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    - w" c9 S2 F8 Q. |9 z( d4 c  n5 h6 `* @3 `8 S8 @, u+ Z
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。, Z1 d( h/ `, `# v" h7 e/ y

    ! \% w* A) r/ K6 Z6 E当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 6 h+ Q+ z1 h1 c0 A2 y6 `
    沉宝 发表于 2022-9-25 01:27
    0 X4 Z# q# |9 I+ k3 r/ \* c你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    8 Y! `1 l4 G/ z$ ?+ E3 }

    ) E& l* D5 t0 O- K8 R  M又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。; e, @% p1 g1 N8 z  `: i' E) d5 D7 c
    9 B% z' H+ `5 n7 E. V5 S% [$ M. ]1 G
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    % [0 C8 d% {' z3 l  c又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( c! c4 v9 l7 [: i9 `
    时间差一倍的结果可以接受。
    0 R* O' X" {* M: |4 |3 j- m/ @: [0 a& s& C  [: L# u
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    % a" X+ L+ |7 e' x7 R6 g
    雷达 发表于 2022-9-25 04:47  w% n  g: X3 R& u; X0 l- E/ A% f
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    & t5 P4 r; A+ K6 x

    4 w* Z( W* s  v( D. s" g* u7 _$ Q7 j. r
    1 X. T& z' t2 H/ I7 p% X; a6 T% c8 j+ [3 B
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 @" u4 Y  J& K& g3 F0 y8 U1 b. B* O
    数值分析 发表于 2022-9-25 14:58
    9 `8 ?( Q0 G' b& [  k2 T能不能把这个也贴上来,看看和上一个有什么不同?

    & o# n. t7 j' i. c9 ], e! W0 O理了理思路,重新做了一个测试。
    4 K. d$ p9 T8 o" p% k; h做了两个 vector 和 两个 float *, 都长 100000
    $ a: j7 b2 g6 S7 v* d外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
      s5 i& o+ ?1 _8 ~9 r; v! S: K0 u3 I2 d8 b% Q3 h
    内循环试了4种方法,+ T# q6 W7 ?0 L, c: X9 W
    1. 直接调用 vector inner_product 247s   V6 y) d2 t1 [: m# c+ `8 M9 {
    2. vector 循环点乘累加 237s* _8 V  h: k4 X/ o9 X4 x
    3. float * 循环点乘累加 204s
    , V1 @3 d" W# H0 r% \, x4. 空循环 100000 次 202s6 i% H; ]% o. A0 f) |

    8 ^/ [" x/ X. G; {! v2 A2 `. i不做内循环 200s
    % N. E9 A/ g( @5 a1 J2 F
      |% e$ P. h& q1 K- p你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    3 P1 c+ M. @( n" W; n) Q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ) U. V: j; c, c! G1 r) s7 H
    + Q' r" w8 B  ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 R$ O: ~* D$ q- E* l5 E/ M
    * n: W! h& k, u. S6 ?* h' [
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)# n8 I$ L4 b8 Q% {1 y) n/ C

    ( |& l$ k% ~% P
            std::vector < float > vec1(N);5 z7 J1 L9 a& ?+ f. h7 A! M% F; d
            std::vector < float > vec2(N);2 j, d) U: E( {
            float* b1 = new float[N];
      o/ f; T( t" x5 P7 e        float* b2 = new float[N];# V4 q" U  ?3 x

    ! i  W* s0 ?$ ~8 Z# D        for (int j = 0; j < 6000; j++). i9 q$ `* e) o6 D# m, z/ W3 s
            {; k* A) x; O- f1 ^( ^5 {5 w& |
                    std::generate(vec1.begin(), vec1.end(), []() {
    4 M: V* [3 G. H0 ^                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    8 W  @+ E! y4 a! B9 D! j* k- g, M                        });
    1 x# N9 h5 a# ]0 J' d* r" i3 S& F& Y* U2 Y* U3 R0 x4 c
                    std::generate(vec2.begin(), vec2.end(), []() {
    , g/ F5 ]8 I: {* T3 T                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    & ]; _* b! [: |- D0 ~+ A% ~                        });
    ' `) _& M# P8 K% `
    + Y& U8 `% }+ [$ l- Q/ @+ p                for (size_t jj = 0; jj < vec1.size(); jj++)
    " r% X3 W! u5 X                {
    7 {2 M- Y  k% I+ ?. w2 ~6 b                        b1[jj] = vec1[jj];
    ) V# y9 _2 M5 q: J3 ^                }
    2 F* Z. L2 V. T3 Q1 }* y8 s# Q$ M2 I9 D7 D3 z4 K
                    for (size_t jj = 0; jj < vec2.size(); jj++)" s. l, l) r2 l2 J. C5 W9 n
                    {$ o0 q# u( ^* s, W/ X
                            b2[jj] = vec2[jj];+ Y7 b3 E/ e4 P1 x
                    }/ A/ D2 A" f- w( o; n- U$ b5 c

    - V' e7 P4 m+ ~                //Method - 1  N=100000 247s  : Y% K2 x1 S; o
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
      p% X$ ~# j+ z$ I. I, P) n                                , Q- R8 ?- o- c& e" [. M8 k. c
                    //Method - 2  N=100000  237s: {) ~  L( Y5 V+ T+ x
                    /*. H4 z. A: B" s2 L5 P8 g7 s1 `
                    for (int jj = 0; jj < N ; jj++). g, J: V: ]: |1 B$ A' Q( L- W
                    {- R# n7 |8 \( }
                            fresult += vec1[jj] * vec2[jj];
    6 K$ w1 g# N  T. \6 l3 N                }
    9 w- H9 s$ F$ U6 N$ q. g                */, G" [& d0 e1 P) {! s
                                    
    / R# G" S* M* \2 z  ?                //Method - 3  N=100000 204s
    + z/ j2 v$ D- `! J( a                /*
    % _3 O% v) J" S! `! Z: c$ j! {2 n% h                for (int jj = 0; jj < N; jj++)
    9 _/ ^2 |, E' ?$ c2 H                {5 Y2 w, R+ w- {4 Y
                            fresult += b1[jj] * b2[jj];- K- H/ m( J& N3 V: f, d2 I/ [/ j$ G6 c
                    }
    ) y, T. w1 d2 s9 O                */
    4 N: w' ]8 F8 E+ \, N0 X+ N: J
    ( \  W5 L2 ?8 O! ]/ {* c/ c                //Method - 4   202s' q: N$ h" f" U/ f7 H* G
                    /*
    & |& H( g$ m  |2 ~$ e; C                for (int jj = 0; jj < N; jj++)
    ) d, z0 {2 k+ r/ ]( [  j2 q                {8 ~. Z' t! @2 y$ _& _1 C! O
                            % R& f5 [5 J5 \- a, S1 M( T
                    }5 Q% |& ~' u2 a' j$ L3 \! P
                    */
    + j7 {7 C- a. @                //comment out all methods, N=100000  202s                7 R! V! q/ J2 Q  p/ j
            }: ^( Q. }+ b9 W3 y

    8 m( _, Z# F$ p6 l4 k; t+ J        delete []b1;, v& R' K% U, Y9 Y
            delete []b2;
    3 G- v8 k7 N9 J2 b" y# V
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?' K* z( |! J2 K* n

    9 B' y" ]) F# x4 s9 s3 q* {* O你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ( X/ F2 t4 L8 n
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15; W" a8 A/ |7 V0 N: d/ f+ c
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?& F' Q7 r5 V7 D5 Q. w  H. H( {) Q

    ) U2 M' f( Y' D+ J你第二个试验里面的j在循环里面又重新定义 ...
      T+ f4 A3 @/ R) p4 q" i- j
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL* t$ A% K) J8 T

      Z  N2 v, S; a$ m: p不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% b0 t; e* Y+ ^- T4 [# v4 \
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; P3 Z9 o+ K; k" Z- C% K4 m
    ) I. B' B7 i/ A+ c1 B不和它 ...

    2 t9 d* R1 s& R5 @, y% [5 ^
    9 B, Y9 b7 S9 j, d5 B2 H# Q) g不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。) K6 `# O. }% C% ?- y1 z
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:541 T4 E! w0 c1 r% Y5 A
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    2 v( e, a3 N) ]) Z, q6 @{
    8 y# t$ l6 J) z' U" n: |& p( r        comp temp, xtimesy;

    / ^9 n" t" l4 G( t) X; o这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    + y3 i; J9 a: l) d$ y+ F) }内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?: l# u6 M* @4 s* d$ Z; b
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-19 00:19 , Processed in 0.071490 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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