设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    3 W: }5 h. ?. Z' [
    - \3 ~: D# o, w& D: a& k1 O自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    3 \# u% F* Y4 _5 `& ~( q* g' y& o2 V' I$ z6 T( I: `; Z- l
    速度优化问题真的很有意思啊。
    , H, t2 i; |1 Q6 [5 p  e/ {+ H  o' O. ~, X( Y/ Q) e: L
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?. D4 B0 G) X6 V9 s' J: U
    把代码贴上来看看?4 U( c; r1 T! T
    1 W8 H& _& p$ J) H9 d5 F6 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 编辑
    6 M4 ~$ ]& _& i* q
    数值分析 发表于 2022-9-24 23:04
    9 r' h5 a; \/ g9 ?3 \拉下来?拉多少?' t1 E) i& [# }  m+ H
    把代码贴上来看看?

    ! F0 N/ t. x4 B, ~% U
    : @  F0 a2 F/ E; ^4 {void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    - O  Z/ j6 ?8 W2 K: U{4 Z: x+ F, ^+ j" t) _! t( Y
            comp temp, xtimesy;/ F7 D  N+ V' w1 t  N1 u& ~
            xtimesy.re = 0;
    0 K, G" m4 S3 D3 c        xtimesy.im = 0;
    ! k: H, ?0 T- U2 v. @  w3 j  j) a        int j0 = lenB - 1;& D" T9 E1 s5 @! w: w2 ?- S
            int    i, j, i1, reali;0 _1 u- ]# X! W5 [! i' t0 w/ W# J
            if (lenA % 2 == 1)* `8 o/ U# w& d1 t- V% x9 t- z
                    reali = lenA + 1;  [1 S" {& d# x5 c' ~
            else" [4 o, Z7 H% v2 W# B
                    reali = lenA;2 L/ T4 d" @+ l1 W( [5 x4 C% ^
            reali /= 2;. g& u2 X# z; q& W" x" M5 K9 T

    & k1 l) E; V- X! i8 O$ y* B7 a        int nconv = reali + lenB;" }% d3 h, B. j* K1 I6 r; U4 B
            //#pragma omp parallel for
    , D& M9 q5 z2 {; ^# A" u        for (i = reali; i < nconv; i++)
    0 w6 R0 v% Q' K6 D2 l+ Y, E2 s' p0 z        {' k9 t5 T3 u, ]
                    temp.re = 0;: r6 V8 j9 H: i7 N; t5 M
                    temp.im = 0;) Z; g" U1 K- P- A% W& R
                    i1 = i;0 T) j1 Z8 d: S9 U" h5 b2 s' Y0 K
                    for (j = j0; j >= 0; j--), ]4 Q$ i$ d9 z( _; G
                    {
    ! W  m  `. F/ Q' n6 M! E' q                        /* floating date operation */8 V  L/ B5 c( o* ~% \& W
                    }

    ( n4 L! l' w3 V. n5 Z& D        }
    + z- y# Z5 h1 C- a7 [}
    " v" K* y. |, L1 P6 w) `" ]0 [. T5 U  A9 ?# ^$ _  J, b* X* H
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样1 [3 g- `  \9 b, _; b: c

    9 E# ]' e. z; Q+ Y; q- F红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。, k8 u& C- _& C. e+ W0 j8 y
    现在call xcorr 100次,耗时78s.( n2 p6 H* _$ K

    0 D' t8 t! b0 j! c如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    9 n$ S) y+ t4 _) v! ~2 j# C$ f3 O2 L
    " T" l! X' z  l6 i
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:331 e# D& }5 s2 Y. \
    Maybe Debug mode?

    1 Z  Q2 x1 n, d
    , m6 s9 q/ N8 z0 F2 y不应该,看我上面的回复。% A& b% r& b; i; h: s
    7 _  h; J3 k' ]* z$ G
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    8 y! i5 `) s, O4 ^# ]. Q
    雷达 发表于 2022-9-24 23:541 u" g" Z+ ]2 F( s
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB). g# a; J7 T( u8 _6 t) ]7 k
    {
    7 y. ]' g$ {) f, u2 A+ l8 |* {& M        comp temp, xtimesy;

    / s1 U8 ?0 [' _+ O3 j$ m" Q' f' [" {; Q
    这个不是这么比的吧。。。
    - N7 J8 `: Z7 g4 w% _8 h. }3 L1 Q/ e. o& i* g
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    1 o) I. ]: I, R
    : u' C8 w8 s9 ?, e+ M而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    * K" q3 G9 K0 ^
    数值分析 发表于 2022-9-25 00:205 u. N( V9 F$ J, a* K
    这个不是这么比的吧。。。, N# F: D9 c( _5 W4 H$ Z

    7 g0 Y0 s2 \* U) S您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    9 A7 t! n: s% t; e. H; w9 D' @; g/ B; Q5 h: ]1 K$ o+ V
    有道理。
    / w4 X5 h: x$ y所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    6 Q- x* c3 f* G# x
    ' d  v* \+ r5 N2 R6 a* b2 V我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ! [+ b4 V, ~2 W0 A1 L有道理。
    ; i8 ?0 ?" h4 y" R, D. f所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    $ @8 z9 I, w5 @9 V5 y& [  K$ m
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多$ F+ I& b) D0 k/ J
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:209 H" t1 g7 F& h  z9 {1 O2 S
    这个不是这么比的吧。。。' B! D# Q5 B+ m

    1 q% N) I" C/ ~5 G您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    " B6 W5 W& u' ^2 m9 c' o! L, z9 ]6 d+ V: H* F# y1 }- L0 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 编辑
    : w  i' j% n  m0 d/ r4 G
    沉宝 发表于 2022-9-25 01:485 l2 N8 e: |1 l5 _' L" ]' p! r
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ( }" w4 J. Q. ?8 a+ P. D
    $ [, @- ~1 o9 W: L
    是的,兄台说的对。
    8 [  ^  G% a' ~& b. ]" T' f! v8 D7 T' @6 }6 k$ @: V; y: o4 @
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ' q% `% j- w% m' E+ H4 q; d" ~2 X& D$ r
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ; ~& |6 z  I7 V! R7 Z* w* D
    9 u$ H$ y' ^: H8 C. @比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    0 x& p  o( z, y9 |3 D0 R2 K5 F
    ' ]2 a% C; f8 G( X% H当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 5 A3 J4 p3 r, z. N$ x9 U
    沉宝 发表于 2022-9-25 01:27
    # g  J  a0 R0 h你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    $ W. A4 J' l8 u1 ~2 @1 w
    3 K2 L3 _; u2 N0 Q: t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。! k1 ?5 C, X3 X9 p& b  f/ l7 z

    3 e; e0 ~9 r* m3 ^+ R5 b0 n我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ; I; M* a1 S$ V: e  p, t: M又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % g; s% e, c; k$ k时间差一倍的结果可以接受。
    4 K. Q! o! [2 F) o( V6 \: |# U# i4 d  L* H/ N; Z
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    & X4 p: w2 \! I( O
    雷达 发表于 2022-9-25 04:47" L: X, B) m1 A$ f' d- h" I
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ s1 x7 V* j4 v; W9 A
    , w% ~) L* t0 d' _' Y8 A( s. Q# U$ \

    1 U7 Q6 S' A; N) u$ P7 H. `* u1 u" [7 A) _" k( F
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ' A' a2 D! D" ?6 W' j
    数值分析 发表于 2022-9-25 14:58
    ) u. E1 K5 a) M7 _  S) F, B能不能把这个也贴上来,看看和上一个有什么不同?

    5 N/ S; q, y! g5 i, M( c* F" }理了理思路,重新做了一个测试。4 k- \! h0 C) x% x9 W$ |
    做了两个 vector 和 两个 float *, 都长 100000; `2 G0 ?: n* h/ U( b- H- ]
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 o" x0 d+ P8 }4 I

    4 `. s+ F$ q( }5 ?/ W9 ?内循环试了4种方法,
    6 S0 |0 R, G, j. x1. 直接调用 vector inner_product 247s ' p# f$ Y7 u& J7 v6 e& \
    2. vector 循环点乘累加 237s* o  ^. n3 ^; x0 E( Y
    3. float * 循环点乘累加 204s
    3 Y4 @, k8 ~  e% a# T$ ?' \4. 空循环 100000 次 202s; K3 Y3 u' N, {: e( n: ^
    # A+ K& i5 s6 l- A
    不做内循环 200s
    3 ^8 h+ o- [# u; _3 ?7 v1 S7 u4 b' X, Z2 {: q7 l9 L
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。* \, b' I/ _! l6 v5 i9 Z
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 H/ l/ K3 p- _3 c% |: d
    # M& I+ B- g$ v2 U! \+ i
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    3 r8 q, S- E& x5 g7 m; W0 ^8 H, W; ?
      [7 h/ |1 I) B(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 w* u6 B/ Y7 P
    ( @$ _# \3 f7 P3 ^" W
            std::vector < float > vec1(N);5 y' ]# d/ y+ J$ h/ S% f) M& B
            std::vector < float > vec2(N);* F  n9 z5 K2 E; b+ V
            float* b1 = new float[N];
    9 g1 w7 {( A/ L) a  h% }8 ]        float* b2 = new float[N];- t( B7 M% g: p2 ^* }

    3 U0 i3 B+ m3 y        for (int j = 0; j < 6000; j++)
    1 i! A% f4 v. b: T9 r        {; _, \% u0 p% ]* |
                    std::generate(vec1.begin(), vec1.end(), []() {9 W) e* Y5 G% ]7 d8 h# c
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    . \( E: m' ^5 W- `8 U6 B" h                        });: T) t3 s( L9 x& p) H% ~% D
    3 m+ r% K! l3 z. c. C0 f' f, V
                    std::generate(vec2.begin(), vec2.end(), []() {
    ! H& U+ s* {2 c, q                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 R1 l' j. ^6 f3 b
                            });5 E+ {/ g% L2 _

    # _! ?# R' r' Y: M+ C                for (size_t jj = 0; jj < vec1.size(); jj++)# ?3 s& o1 S0 a: w- t+ g8 q5 Q
                    {
    4 ^/ L* I2 Y$ y                        b1[jj] = vec1[jj];
    % V5 d  a3 M+ x6 P4 ]# L                }8 n' @% n: }+ a2 o( q0 F
    8 y% A% J( G- g# P$ m& |0 s
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    - z' Y! l8 Z9 V8 B                {2 H8 o% I$ n  B) }: F1 H8 @/ S
                            b2[jj] = vec2[jj];" u4 f: G% X0 N& X. Q( P
                    }, }: k& U6 ], ?; e. N9 B6 S' d

    * e+ m" Z6 f' Z% f8 f                //Method - 1  N=100000 247s  * e3 G3 n( F& [
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    $ [1 L& H+ a! A( O                                ' `3 E5 r% v( A3 v6 A( G
                    //Method - 2  N=100000  237s. Z: X! b1 a! ^" N! @7 l
                    /*( M' b/ Q. O; J* B7 W4 }4 Q" E
                    for (int jj = 0; jj < N ; jj++)
    ( g5 n4 X5 w5 b  @! C* z; L& _4 r9 ]                {
    9 Q- ^6 {& o+ M4 ]+ c% ^8 T                        fresult += vec1[jj] * vec2[jj];% a2 c- U% A) E" h+ J7 k
                    }7 n% I0 O/ A) c$ N/ p9 T9 ?* h
                    */
    ) e' n8 N* W( P9 r                                
    / J; N5 _% s9 X& _2 W                //Method - 3  N=100000 204s
    : Z8 @# J* N" Q; I4 W1 T( s& I                /*
    - d% T4 _  |$ i5 o' d# m2 a                for (int jj = 0; jj < N; jj++)
    7 x+ t& f# u3 x( r6 P                {
    6 @; i- E1 R) j6 T. s& S2 ~+ y7 Z3 w                        fresult += b1[jj] * b2[jj];; {$ C8 s2 K% O1 ~$ c$ D
                    }
    " T! U. r. U: K6 o( e$ U0 Y                */' [  @+ ]9 M8 t) V( B. D, r) f! g6 V' s
    . M- x, C0 J1 }3 @( l4 c
                    //Method - 4   202s
    ! I# ?( A# K- F                /*5 C5 W* Z; B2 j1 e/ w( O8 i- L
                    for (int jj = 0; jj < N; jj++)
    % @3 R* _" S7 y                {
    2 L  j+ j; k& O5 A  m                        . ~6 S2 @7 i+ w
                    }* F* C8 ^% M  p$ L
                    */. `. u7 p/ ~/ }+ W
                    //comment out all methods, N=100000  202s               
    & l. K$ B/ h' b' e. b( A( |        }
    : C: ?# r( k+ M( p0 C2 `! E9 D' K7 S* V4 f
            delete []b1;
    6 D& f$ X; c/ h% q8 Y        delete []b2;

    1 M/ _" D, b1 P, q% l7 w
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 d$ Z. J( ]( ]8 T4 J9 H% t3 n. F

    ; W0 B2 E7 i- u/ A& O) m% m; @* q你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    # a) q* w# d! N9 ]( a
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15$ _8 W1 {6 s( k
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?# f( m; u/ Y9 j' ?& o6 d8 \
      F4 o* t; D# [3 j3 n, R5 u% I
    你第二个试验里面的j在循环里面又重新定义 ...

    7 P: n* `- R' ~' m+ ]% d. a7 W内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL$ u8 H8 i8 X/ t! q1 z
    , t* o9 [( E4 d4 \$ x' z  r
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16* V' F. q4 A- h) g1 F
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    4 j, k$ l: p0 {3 f; t5 F5 x" u- \, I8 l; Q: I
    不和它 ...
    6 B5 j+ ~) _3 f4 X1 x) _/ y& Q, f, p
    7 l6 t% o3 u1 q/ A* S7 W  D1 r6 H1 G# m* t2 K
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    / k6 i: n& Z0 z0 e" r5 c后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ; O- b; X) H# d% Zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ s8 p! H0 J+ d
    {
    , N8 t; O3 I. _5 U" F: ~5 C        comp temp, xtimesy;
    ' D! @+ k# y9 `0 E
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ G# W# i( o  K  S  ?) m# `5 l
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?! J( N0 k; N- L$ \; ~
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-7 09:56 , Processed in 0.065103 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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